6.1.79-rc1 review
Subsystems (4)
Greg Kroah-Hartman
maintainerPATCH 145/197 mmc: sdhci-pci-o2micro: Fix a warm reboot issue that disk cant be detected by BIOS
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fred Ai <[email protected]>
commit 58aeb5623c2ebdadefe6352b14f8076a7073fea0 upstream.
Driver shall switch clock source from DLL clock to OPE clock when power off card to ensure that card can be identified with OPE clock by BIOS.
--- drivers/mmc/host/sdhci-pci-o2micro.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
drivers/mmc/host/sdhci-pci-o2micro.c +30 -0
@@ -602,6 +602,35 @@ static void sdhci_pci_o2_set_clock(strucsdhci_o2_enable_clk (host, clk); } +static void sdhci_pci_o2_set_power (struct sdhci_host *host,unsigned char mode,unsigned short vdd) +{ +struct sdhci_pci_chip *chip; +struct sdhci_pci_slot *slot =sdhci_priv (host); +u32 scratch_32 =0 ; +u8 scratch_8 =0 ; + + chip = slot->chip; + +if (mode ==MMC_POWER_OFF ) { +/* UnLock WP */ +pci_read_config_byte (chip->pdev,O2_SD_LOCK_WP , &scratch_8); + scratch_8 &=0x7f ; +pci_write_config_byte (chip->pdev,O2_SD_LOCK_WP , scratch_8); + +/* Set PCR 0x354[16] to switch Clock Source back to OPE Clock */ +pci_read_config_dword (chip->pdev,O2_SD_OUTPUT_CLK_SOURCE_SWITCH , &scratch_32); + scratch_32 &= ~(O2_SD_SEL_DLL ); +pci_write_config_dword (chip->pdev,O2_SD_OUTPUT_CLK_SOURCE_SWITCH , scratch_32); + +/* Lock WP */ +pci_read_config_byte (chip->pdev,O2_SD_LOCK_WP , &scratch_8); + scratch_8 |=0x80 ; +pci_write_config_byte (chip->pdev,O2_SD_LOCK_WP , scratch_8); + } + +sdhci_set_power (host, mode, vdd); +} +static int sdhci_pci_o2_probe_slot (struct sdhci_pci_slot *slot) {struct sdhci_pci_chip *chip;
@@ -911,6 +940,7 @@ static const struct sdhci_ops sdhci_pci_ .set_bus_width = sdhci_set_bus_width, .reset = sdhci_reset, .set_uhs_signaling = sdhci_set_uhs_signaling, + .set_power = sdhci_pci_o2_set_power, };const struct sdhci_pci_fixes sdhci_o2 = {
Greg Kroah-Hartman
maintainerPATCH 146/197 ASoC: amd: yc: Add DMI quirk for Lenovo Ideapad Pro 5 16ARP8
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Limonciello <[email protected]>
commit 610010737f74482a61896596a0116876ecf9e65c upstream.
The laptop requires a quirk ID to enable its internal microphone. Add it to the DMI quirk table.
--- sound/soc/amd/yc/acp6x-mach.c | 7 +++++++ 1 file changed, 7 insertions(+)
sound/soc/amd/yc/acp6x-mach.c +7 -0
@@ -245,6 +245,13 @@ static const struct dmi_system_id yc_acp .driver_data = &acp6x_card, .matches = {DMI_MATCH (DMI_BOARD_VENDOR ,"LENOVO" ), + DMI_MATCH(DMI_PRODUCT_NAME, "83AS"), + } + }, + { + .driver_data = &acp6x_card, + .matches = { +DMI_MATCH (DMI_BOARD_VENDOR ,"LENOVO" ), DMI_MATCH(DMI_PRODUCT_NAME, "82UG"), } },
Greg Kroah-Hartman
maintainerPATCH 147/197 tools/rtla: Remove unused sched_getattr() function
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Bristot de Oliveira <[email protected]>
commit 084ce16df0f060efd371092a09a7ae74a536dc11 upstream.
Clang is reporting:
$ make HOSTCC=clang CC=clang LLVM_IAS=1
[...]
clang -O -g -DVERSION=\"6.8.0-rc3\" -flto=auto -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS $(pkg-config --cflags libtracefs) -c -o src/utils.o src/utils.c
src/utils.c:241:19: warning: unused function 'sched_getattr' [-Wunused-function]
241 | static inline int sched_getattr(pid_t pid, struct sched_attr *attr,
| ^~~~~~~~~~~~~
1 warning generated.Which is correct, so remove the unused function.
--- tools/tracing/rtla/src/utils.c | 6 ------ 1 file changed, 6 deletions(-)
tools/tracing/rtla/src/utils.c +0 -6
@@ -243,12 +243,6 @@ static inline int sched_setattr(pid_t pireturn syscall (__NR_sched_setattr, pid, attr, flags); } -static inline int sched_getattr (pid_t pid,struct sched_attr *attr, -unsigned int size,unsigned int flags) -{ -return syscall (__NR_sched_getattr, pid, attr, size, flags); -} -int __set_sched_attr (int pid,struct sched_attr *attr) {int flags =0 ;
Greg Kroah-Hartman
maintainerPATCH 148/197 tools/rtla: Replace setting prio with nice for SCHED_OTHER
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: limingming3 <[email protected]>
commit 14f08c976ffe0d2117c6199c32663df1cbc45c65 upstream.
Since the sched_priority for SCHED_OTHER is always 0, it makes no sence to set it.
Setting nice for SCHED_OTHER seems more meaningful.
--- tools/tracing/rtla/src/utils.c | 6 +++--- tools/tracing/rtla/src/utils.h | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-)
tools/tracing/rtla/src/utils.c +3 -3
@@ -478,13 +478,13 @@ int parse_prio(char *arg, struct sched_aif (prio ==INVALID_VAL )return -1 ; -if (prio <sched_get_priority_min (SCHED_OTHER )) +if (prio <MIN_NICE )return -1 ; -if (prio >sched_get_priority_max (SCHED_OTHER )) +if (prio >MAX_NICE )return -1 ; sched_param->sched_policy =SCHED_OTHER ; - sched_param->sched_priority = prio; + sched_param->sched_nice = prio;break ;default :return -1 ;
tools/tracing/rtla/src/utils.h +2 -0
@@ -7,6 +7,8 @@*/ #define BUFF_U64_STR_SIZE 24#define MAX_PATH 1024 +#define MAX_NICE 20 +#define MIN_NICE -19#define container_of (ptr, type, member)({ \ const typeof(((type *)0)->member) *__mptr = (ptr); \
Greg Kroah-Hartman
maintainerPATCH 149/197 tools/rtla: Exit with EXIT_SUCCESS when help is invoked
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Kacur <[email protected]>
commit b5f319360371087d52070d8f3fc7789e80ce69a6 upstream.
Fix rtla so that the following commands exit with 0 when help is invoked
rtla osnoise top -h
rtla osnoise hist -h
rtla timerlat top -h
rtla timerlat hist -h
--- tools/tracing/rtla/src/osnoise_hist.c | 6 +++++- tools/tracing/rtla/src/osnoise_top.c | 6 +++++- tools/tracing/rtla/src/timerlat_hist.c | 6 +++++- tools/tracing/rtla/src/timerlat_top.c | 6 +++++- 4 files changed, 20 insertions(+), 4 deletions(-)
tools/tracing/rtla/src/osnoise_hist.c +5 -1
@@ -472,7 +472,11 @@ static void osnoise_hist_usage(char *usafor (i =0 ; msg[i]; i++)fprintf (stderr,"%s\n" , msg[i]); -exit (1 ); + +if (usage) +exit (EXIT_FAILURE ); + +exit (EXIT_SUCCESS ); }/*
tools/tracing/rtla/src/osnoise_top.c +5 -1
@@ -282,7 +282,11 @@ void osnoise_top_usage(char *usage)for (i =0 ; msg[i]; i++)fprintf (stderr,"%s\n" , msg[i]); -exit (1 ); + +if (usage) +exit (EXIT_FAILURE ); + +exit (EXIT_SUCCESS ); }/*
tools/tracing/rtla/src/timerlat_hist.c +5 -1
@@ -475,7 +475,11 @@ static void timerlat_hist_usage(char *usfor (i =0 ; msg[i]; i++)fprintf (stderr,"%s\n" , msg[i]); -exit (1 ); + +if (usage) +exit (EXIT_FAILURE ); + +exit (EXIT_SUCCESS ); }/*
tools/tracing/rtla/src/timerlat_top.c +5 -1
@@ -305,7 +305,11 @@ static void timerlat_top_usage(char *usafor (i =0 ; msg[i]; i++)fprintf (stderr,"%s\n" , msg[i]); -exit (1 ); + +if (usage) +exit (EXIT_FAILURE ); + +exit (EXIT_SUCCESS ); }/*
Greg Kroah-Hartman
maintainerPATCH 150/197 tools/rtla: Fix uninitialized bucket/data->bucket_size warning
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Bristot de Oliveira <[email protected]>
commit 64dc40f7523369912d7adb22c8cb655f71610505 upstream.
When compiling rtla with clang, I am getting the following warnings:
$ make HOSTCC=clang CC=clang LLVM_IAS=1
[..]
clang -O -g -DVERSION=\"6.8.0-rc3\" -flto=auto -fexceptions
-fstack-protector-strong -fasynchronous-unwind-tables
-fstack-clash-protection -Wall -Werror=format-security
-Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS
$(pkg-config --cflags libtracefs)
-c -o src/osnoise_hist.o src/osnoise_hist.csrc/osnoise_hist.c:138:6: warning: variable 'bucket' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
138 | if (data->bucket_size)
| ^~~~~~~~~~~~~~~~~
src/osnoise_hist.c:149:6: note: uninitialized use occurs here
149 | if (bucket < entries)
| ^~~~~~
src/osnoise_hist.c:138:2: note: remove the 'if' if its condition is always true
138 | if (data->bucket_size)
| ^~~~~~~~~~~~~~~~~~~~~~
139 | bucket = duration / data->bucket_size;
src/osnoise_hist.c:132:12: note: initialize the variable 'bucket' to silence this warning
132 | int bucket;
| ^
| = 01 warning generated.
[...]
clang -O -g -DVERSION=\"6.8.0-rc3\" -flto=auto -fexceptions
-fstack-protector-strong -fasynchronous-unwind-tables
-fstack-clash-protection -Wall -Werror=format-security
-Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS
$(pkg-config --cflags libtracefs)
-c -o src/timerlat_hist.o src/timerlat_hist.csrc/timerlat_hist.c:181:6: warning: variable 'bucket' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
181 | if (data->bucket_size)
| ^~~~~~~~~~~~~~~~~
src/timerlat_hist.c:204:6: note: uninitialized use occurs here
204 | if (bucket < entries)
| ^~~~~~
src/timerlat_hist.c:181:2: note: remove the 'if' if its condition is always true
181 | if (data->bucket_size)
| ^~~~~~~~~~~~~~~~~~~~~~
182 | bucket = latency / data->bucket_size;
src/timerlat_hist.c:175:12: note: initialize the variable 'bucket' to silence this warning
175 | int bucket;
| ^
| = 01 warning generated.
This is a legit warning, but data->bucket_size is always > 0 (see timerlat_hist_parse_args()), so the if is not necessary.
Remove the unneeded if (data->bucket_size) to avoid the warning.
--- tools/tracing/rtla/src/osnoise_hist.c | 3 +-- tools/tracing/rtla/src/timerlat_hist.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-)
tools/tracing/rtla/src/osnoise_hist.c +1 -2
@@ -129,8 +129,7 @@ static void osnoise_hist_update_multipleif (params->output_divisor) duration = duration / params->output_divisor; -if (data->bucket_size) - bucket = duration / data->bucket_size; + bucket = duration / data->bucket_size; total_duration = duration * count;
tools/tracing/rtla/src/timerlat_hist.c +1 -2
@@ -151,8 +151,7 @@ timerlat_hist_update(struct osnoise_toolif (params->output_divisor) latency = latency / params->output_divisor; -if (data->bucket_size) - bucket = latency / data->bucket_size; + bucket = latency / data->bucket_size;if (!thread) { hist = data->hist[cpu].irq;
Greg Kroah-Hartman
maintainerPATCH 151/197 tools/rtla: Fix Makefile compiler options for clang
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Bristot de Oliveira <[email protected]>
commit bc4cbc9d260ba8358ca63662919f4bb223cb603b upstream.
The following errors are showing up when compiling rtla with clang:
$ make HOSTCC=clang CC=clang LLVM_IAS=1 [...]
clang -O -g -DVERSION=\"6.8.0-rc1\" -flto=auto -ffat-lto-objects
-fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -Wno-maybe-uninitialized $(pkg-config --cflags libtracefs) -c -o src/utils.o src/utils.c
clang: warning: optimization flag '-ffat-lto-objects' is not supported [-Wignored-optimization-argument]
warning: unknown warning option '-Wno-maybe-uninitialized'; did you mean '-Wno-uninitialized'? [-Wunknown-warning-option] 1 warning generated.
clang -o rtla -ggdb src/osnoise.o src/osnoise_hist.o src/osnoise_top.o src/rtla.o src/timerlat_aa.o src/timerlat.o src/timerlat_hist.o src/timerlat_top.o src/timerlat_u.o src/trace.o src/utils.o $(pkg-config --libs libtracefs)
src/osnoise.o: file not recognized: file format not recognized
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:110: rtla] Error 1
Solve these issues by:
- removing -ffat-lto-objects and -Wno-maybe-uninitialized if using clang
- informing the linker about -flto=auto
--- tools/tracing/rtla/Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
tools/tracing/rtla/Makefile +6 -1
@@ -28,10 +28,15 @@ FOPTS := -flto=auto -ffat-lto-objects -f -fasynchronous-unwind-tables -fstack-clash-protection WOPTS := -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -Wno-maybe-uninitialized +ifeq ($(CC),clang) + FOPTS := $(filter-out -ffat-lto-objects, $(FOPTS)) + WOPTS := $(filter-out -Wno-maybe-uninitialized, $(WOPTS)) +endif + TRACEFS_HEADERS := $$($(PKG_CONFIG) --cflags libtracefs) CFLAGS := -O -g -DVERSION=\"$(VERSION)\" $(FOPTS) $(MOPTS) $(WOPTS) $(TRACEFS_HEADERS) $(EXTRA_CFLAGS) -LDFLAGS := -ggdb $(EXTRA_LDFLAGS) +LDFLAGS := -flto=auto -ggdb $(EXTRA_LDFLAGS) LIBS := $$($(PKG_CONFIG) --libs libtracefs) SRC := $(wildcard src/*.c)
Greg Kroah-Hartman
maintainerPATCH 152/197 fs: relax mount_setattr() permission checks
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Brauner <[email protected]>
commit 46f5ab762d048dad224436978315cbc2fa79c630 upstream.
When we added mount_setattr() I added additional checks compared to the legacy do_reconfigure_mnt() and do_change_type() helpers used by regular mount(2). If that mount had a parent then verify that the caller and the mount namespace the mount is attached to match and if not make sure that it's an anonymous mount.
The real rootfs falls into neither category. It is neither an anoymous mount because it is obviously attached to the initial mount namespace but it also obviously doesn't have a parent mount. So that means legacy mount(2) allows changing mount properties on the real rootfs but mount_setattr(2) blocks this. I never thought much about this but of course someone on this planet of earth changes properties on the real rootfs as can be seen in [1].
Since util-linux finally switched to the new mount api in 2.39 not so long ago it also relies on mount_setattr() and that surfaced this issue when Fedora 39 finally switched to it. Fix this.
--- fs/namespace.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
fs/namespace.c +8 -3
@@ -4172,10 +4172,15 @@ static int do_mount_setattr(struct path/* * If this is an attached mount make sure it's located in the callers * mount namespace. If it's not don't let the caller interact with it. -* If this is a detached mount make sure it has an anonymous mount -* namespace attached to it, i.e. we've created it via OPEN_TREE_CLONE. +* +* If this mount doesn't have a parent it's most often simply a +* detached mount with an anonymous mount namespace. IOW, something +* that's simply not attached yet. But there are apparently also users +* that do change mount properties on the rootfs itself. That obviously +* neither has a parent nor is it a detached mount so we cannot +* unconditionally check for detached mounts. */ -if (!(mnt_has_parent (mnt) ?check_mnt (mnt) :is_anon_ns (mnt->mnt_ns))) +if ((mnt_has_parent (mnt) || !is_anon_ns (mnt->mnt_ns)) && !check_mnt (mnt)) goto out;/*
Greg Kroah-Hartman
maintainerPATCH 153/197 net: ethernet: ti: cpsw: enable mac_managed_pm to fix mdio
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sinthu Raja <[email protected]>
commit bc4ce46b1e3d1da4309405cd4afc7c0fcddd0b90 upstream.
The below commit introduced a WARN when phy state is not in the states:PHY_HALTED, PHY_READY and PHY_UP.
commit 744d23c71af3 ("net: phy: Warn about incorrect mdio_bus_phy_resume() state")
When cpsw resumes, there have port in PHY_NOLINK state, so the below warning comes out. Set mac_managed_pm be true to tell mdio that the phy resume/suspend is managed by the mac, to fix the following warning:
WARNING: CPU: 0 PID: 965 at drivers/net/phy/phy_device.c:326 mdio_bus_phy_resume+0x140/0x144 CPU: 0 PID: 965 Comm: sh Tainted: G O 6.1.46-g247b2535b2 #1 Hardware name: Generic AM33XX (Flattened Device Tree) unwind_backtrace from show_stack+0x18/0x1c show_stack from dump_stack_lvl+0x24/0x2c dump_stack_lvl from __warn+0x84/0x15c __warn from warn_slowpath_fmt+0x1a8/0x1c8 warn_slowpath_fmt from mdio_bus_phy_resume+0x140/0x144 mdio_bus_phy_resume from dpm_run_callback+0x3c/0x140 dpm_run_callback from device_resume+0xb8/0x2b8 device_resume from dpm_resume+0x144/0x314 dpm_resume from dpm_resume_end+0x14/0x20 dpm_resume_end from suspend_devices_and_enter+0xd0/0x924 suspend_devices_and_enter from pm_suspend+0x2e0/0x33c pm_suspend from state_store+0x74/0xd0 state_store from kernfs_fop_write_iter+0x104/0x1ec kernfs_fop_write_iter from vfs_write+0x1b8/0x358 vfs_write from ksys_write+0x78/0xf8 ksys_write from ret_fast_syscall+0x0/0x54 Exception stack(0xe094dfa8 to 0xe094dff0)
dfa0: 00000004 005c3fb8 00000001 005c3fb8 00000004 00000001
dfc0: 00000004 005c3fb8 b6f6bba0 00000004 00000004 0059edb8 00000000 00000000
dfe0: 00000004 bed918f0 b6f09bd3 b6e89a66
--- drivers/net/ethernet/ti/cpsw.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/ti/cpsw.c +2 -0
@@ -631,6 +631,8 @@ static void cpsw_slave_open(struct cpsw_ } } + phy->mac_managed_pm = true; + slave->phy = phy;phy_attached_info (slave->phy);
Greg Kroah-Hartman
maintainerPATCH 154/197 s390/qeth: Fix potential loss of L3-IP@ in case of network issues
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandra Winter <[email protected]>
commit 2fe8a236436fe40d8d26a1af8d150fc80f04ee1a upstream.
Symptom:
In case of a bad cable connection (e.g. dirty optics) a fast sequence of network DOWN-UP-DOWN-UP could happen. UP triggers recovery of the qeth interface. In case of a second DOWN while recovery is still ongoing, it can happen that the IP@ of a Layer3 qeth interface is lost and will not be recovered by the second UP.
Problem:
When registration of IP addresses with Layer 3 qeth devices fails, (e.g. because of bad address format) the respective IP address is deleted from its hash-table in the driver. If registration fails because of a ENETDOWN condition, the address should stay in the hashtable, so a subsequent recovery can restore it.
3caa4af834df ("qeth: keep ip-address after LAN_OFFLINE failure") fixes this for registration failures during normal operation, but not during recovery.
Solution:
Keep L3-IP address in case of ENETDOWN in qeth_l3_recover_ip(). For consistency with qeth_l3_add_ip() we also keep it in case of EADDRINUSE, i.e. for some reason the card already/still has this address registered.
--- drivers/s390/net/qeth_l3_main.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/s390/net/qeth_l3_main.c +6 -3
@@ -254,9 +254,10 @@ static void qeth_l3_clear_ip_htable(struif (!recover) {hash_del (&addr->hnode);kfree (addr); -continue ; + }else { +/* prepare for recovery */ + addr->disp_flag =QETH_DISP_ADDR_ADD ; } - addr->disp_flag =QETH_DISP_ADDR_ADD ; }mutex_unlock (&card->ip_lock);
@@ -277,9 +278,11 @@ static void qeth_l3_recover_ip(struct qeif (addr->disp_flag ==QETH_DISP_ADDR_ADD ) { rc =qeth_l3_register_addr_entry (card, addr); -if (!rc) { +if (!rc || rc == -EADDRINUSE || rc == -ENETDOWN ) { +/* keep it in the records */ addr->disp_flag =QETH_DISP_ADDR_DO_NOTHING ; }else { +/* bad address */ hash_del (&addr->hnode);kfree (addr); }
Greg Kroah-Hartman
maintainerPATCH 155/197 net: ethernet: ti: cpsw_new: enable mac_managed_pm to fix mdio
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sinthu Raja <[email protected]>
commit 9def04e759caa5a3d741891037ae99f81e2fff01 upstream.
The below commit introduced a WARN when phy state is not in the states:PHY_HALTED, PHY_READY and PHY_UP.
commit 744d23c71af3 ("net: phy: Warn about incorrect mdio_bus_phy_resume() state")
When cpsw_new resumes, there have port in PHY_NOLINK state, so the below warning comes out. Set mac_managed_pm be true to tell mdio that the phy resume/suspend is managed by the mac, to fix the following warning:
WARNING: CPU: 0 PID: 965 at drivers/net/phy/phy_device.c:326 mdio_bus_phy_resume+0x140/0x144 CPU: 0 PID: 965 Comm: sh Tainted: G O 6.1.46-g247b2535b2 #1 Hardware name: Generic AM33XX (Flattened Device Tree) unwind_backtrace from show_stack+0x18/0x1c show_stack from dump_stack_lvl+0x24/0x2c dump_stack_lvl from __warn+0x84/0x15c __warn from warn_slowpath_fmt+0x1a8/0x1c8 warn_slowpath_fmt from mdio_bus_phy_resume+0x140/0x144 mdio_bus_phy_resume from dpm_run_callback+0x3c/0x140 dpm_run_callback from device_resume+0xb8/0x2b8 device_resume from dpm_resume+0x144/0x314 dpm_resume from dpm_resume_end+0x14/0x20 dpm_resume_end from suspend_devices_and_enter+0xd0/0x924 suspend_devices_and_enter from pm_suspend+0x2e0/0x33c pm_suspend from state_store+0x74/0xd0 state_store from kernfs_fop_write_iter+0x104/0x1ec kernfs_fop_write_iter from vfs_write+0x1b8/0x358 vfs_write from ksys_write+0x78/0xf8 ksys_write from ret_fast_syscall+0x0/0x54 Exception stack(0xe094dfa8 to 0xe094dff0)
dfa0: 00000004 005c3fb8 00000001 005c3fb8 00000004 00000001
dfc0: 00000004 005c3fb8 b6f6bba0 00000004 00000004 0059edb8 00000000 00000000
dfe0: 00000004 bed918f0 b6f09bd3 b6e89a66
--- drivers/net/ethernet/ti/cpsw_new.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/ti/cpsw_new.c +3 -0
@@ -772,6 +772,9 @@ static void cpsw_slave_open(struct cpsw_ slave->slave_num);return ; } + + phy->mac_managed_pm = true; + slave->phy = phy;phy_attached_info (slave->phy);
Greg Kroah-Hartman
maintainerPATCH 156/197 hv_netvsc: Register VF in netvsc_probe if NET_DEVICE_REGISTER missed
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shradha Gupta <[email protected]>
commit 9cae43da9867412f8bd09aee5c8a8dc5e8dc3dc2 upstream.
If hv_netvsc driver is unloaded and reloaded, the NET_DEVICE_REGISTER handler cannot perform VF register successfully as the register call is received before netvsc_probe is finished. This is because we register register_netdevice_notifier() very early( even before vmbus_driver_register()).
To fix this, we try to register each such matching VF( if it is visible as a netdevice) at the end of netvsc_probe.
--- drivers/net/hyperv/netvsc_drv.c | 82 ++++++++++++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 20 deletions(-)
drivers/net/hyperv/netvsc_drv.c +62 -20
@@ -42,6 +42,10 @@#define LINKCHANGE_INT (2 * HZ)#define VF_TAKEOVER_INT (HZ / 10) +/* Macros to define the context of vf registration */ +#define VF_REG_IN_PROBE 1 +#define VF_REG_IN_NOTIFIER 2 +static unsigned int ring_size__ro_after_init =128 ;module_param (ring_size, uint,0444 );MODULE_PARM_DESC (ring_size,"Ring buffer size (# of 4K pages)" );
@@ -2181,7 +2185,7 @@ static rx_handler_result_t netvsc_vf_han }static int netvsc_vf_join (struct net_device *vf_netdev, -struct net_device *ndev) +struct net_device *ndev,int context) {struct net_device_context *ndev_ctx =netdev_priv (ndev);int ret;
@@ -2204,7 +2208,11 @@ static int netvsc_vf_join(struct net_dev goto upper_link_failed; } -schedule_delayed_work (&ndev_ctx->vf_takeover,VF_TAKEOVER_INT ); +/* If this registration is called from probe context vf_takeover +* is taken care of later in probe itself. +*/ +if (context ==VF_REG_IN_NOTIFIER ) +schedule_delayed_work (&ndev_ctx->vf_takeover,VF_TAKEOVER_INT );call_netdevice_notifiers (NETDEV_JOIN , vf_netdev);
@@ -2342,7 +2350,7 @@ static int netvsc_prepare_bonding(structreturn NOTIFY_DONE ; } -static int netvsc_register_vf (struct net_device *vf_netdev) +static int netvsc_register_vf (struct net_device *vf_netdev,int context) {struct net_device_context *net_device_ctx;struct netvsc_device *netvsc_dev;
@@ -2382,7 +2390,7 @@ static int netvsc_register_vf(struct netnetdev_info (ndev,"VF registering: %s\n" , vf_netdev->name); -if (netvsc_vf_join (vf_netdev, ndev) !=0 ) +if (netvsc_vf_join (vf_netdev, ndev, context) !=0 )return NOTIFY_DONE ;dev_hold (vf_netdev);
@@ -2480,10 +2488,31 @@ static int netvsc_unregister_vf(struct nreturn NOTIFY_OK ; } +static int check_dev_is_matching_vf (struct net_device *event_ndev) +{ +/* Skip NetVSC interfaces */ +if (event_ndev->netdev_ops == &device_ops) +return -ENODEV ; + +/* Avoid non-Ethernet type devices */ +if (event_ndev->type !=ARPHRD_ETHER ) +return -ENODEV ; + +/* Avoid Vlan dev with same MAC registering as VF */ +if (is_vlan_dev (event_ndev)) +return -ENODEV ; + +/* Avoid Bonding master dev with same MAC registering as VF */ +if (netif_is_bond_master (event_ndev)) +return -ENODEV ; + +return 0 ; +} +static int netvsc_probe (struct hv_device *dev,const struct hv_vmbus_device_id *dev_id) { -struct net_device *net =NULL ; +struct net_device *net =NULL , *vf_netdev;struct net_device_context *net_device_ctx;struct netvsc_device_info *device_info =NULL ;struct netvsc_device *nvdev;
@@ -2592,6 +2621,30 @@ static int netvsc_probe(struct hv_device }list_add (&net_device_ctx->list, &netvsc_dev_list); + +/* When the hv_netvsc driver is unloaded and reloaded, the +* NET_DEVICE_REGISTER for the vf device is replayed before probe +* is complete. This is because register_netdevice_notifier() gets +* registered before vmbus_driver_register() so that callback func +* is set before probe and we don't miss events like NETDEV_POST_INIT +* So, in this section we try to register the matching vf device that +* is present as a netdevice, knowing that its register call is not +* processed in the netvsc_netdev_notifier(as probing is progress and +* get_netvsc_byslot fails). +*/ +for_each_netdev (dev_net (net), vf_netdev) { + ret =check_dev_is_matching_vf (vf_netdev); +if (ret !=0 ) +continue ; + +if (net !=get_netvsc_byslot (vf_netdev)) +continue ; + +netvsc_prepare_bonding (vf_netdev); +netvsc_register_vf (vf_netdev,VF_REG_IN_PROBE ); +__netvsc_vf_setup (net, vf_netdev); +break ; + }rtnl_unlock ();netvsc_devinfo_put (device_info);
@@ -2748,28 +2801,17 @@ static int netvsc_netdev_event(struct no unsigned long event, void *ptr) { struct net_device *event_dev = netdev_notifier_info_to_dev(ptr); +int ret =0 ; -/* Skip our own events */ -if (event_dev->netdev_ops == &device_ops) -return NOTIFY_DONE ; - -/* Avoid non-Ethernet type devices */ -if (event_dev->type !=ARPHRD_ETHER ) -return NOTIFY_DONE ; - -/* Avoid Vlan dev with same MAC registering as VF */ -if (is_vlan_dev (event_dev)) -return NOTIFY_DONE ; - -/* Avoid Bonding master dev with same MAC registering as VF */ -if (netif_is_bond_master (event_dev)) + ret =check_dev_is_matching_vf (event_dev); +if (ret !=0 )return NOTIFY_DONE ;switch (event) {case NETDEV_POST_INIT :return netvsc_prepare_bonding (event_dev);case NETDEV_REGISTER : -return netvsc_register_vf (event_dev); +return netvsc_register_vf (event_dev,VF_REG_IN_NOTIFIER );case NETDEV_UNREGISTER :return netvsc_unregister_vf (event_dev);case NETDEV_UP :
Greg Kroah-Hartman
maintainerPATCH 157/197 ceph: prevent use-after-free in encode_cap_msg()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rishabh Dave <[email protected]>
commit cda4672da1c26835dcbd7aec2bfed954eda9b5ef upstream.
In fs/ceph/caps.c, in encode_cap_msg(), "use after free" error was caught by KASAN at this line - 'ceph_buffer_get(arg->xattr_buf);'. This implies before the refcount could be increment here, it was freed.
In same file, in "handle_cap_grant()" refcount is decremented by this line - 'ceph_buffer_put(ci->i_xattrs.blob);'. It appears that a race occurred and resource was freed by the latter line before the former line could increment it.
encode_cap_msg() is called by __send_cap() and __send_cap() is called by ceph_check_caps() after calling __prep_cap(). __prep_cap() is where arg->xattr_buf is assigned to ci->i_xattrs.blob. This is the spot where the refcount must be increased to prevent "use after free" error.
--- fs/ceph/caps.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/ceph/caps.c +2 -1
@@ -1391,7 +1391,7 @@ static void __prep_cap(struct cap_msg_arif (flushing &CEPH_CAP_XATTR_EXCL ) { arg->old_xattr_buf =__ceph_build_xattrs_blob (ci); arg->xattr_version = ci->i_xattrs.version; - arg->xattr_buf = ci->i_xattrs.blob; + arg->xattr_buf =ceph_buffer_get (ci->i_xattrs.blob); }else { arg->xattr_buf =NULL ; arg->old_xattr_buf =NULL ;
@@ -1457,6 +1457,7 @@ static void __send_cap(struct cap_msg_arencode_cap_msg (msg, arg);ceph_con_send (&arg->session->s_con, msg);ceph_buffer_put (arg->old_xattr_buf); +ceph_buffer_put (arg->xattr_buf);if (arg->wake)wake_up_all (&ci->i_cap_wq); }
Greg Kroah-Hartman
maintainerPATCH 158/197 fs,hugetlb: fix NULL pointer dereference in hugetlbs_fill_super
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oscar Salvador <[email protected]>
commit 79d72c68c58784a3e1cd2378669d51bfd0cb7498 upstream.
When configuring a hugetlb filesystem via the fsconfig() syscall, there is a possible NULL dereference in hugetlbfs_fill_super() caused by assigning NULL to ctx->hstate in hugetlbfs_parse_param() when the requested pagesize is non valid.
E.g: Taking the following steps:
fd = fsopen("hugetlbfs", FSOPEN_CLOEXEC);
fsconfig(fd, FSCONFIG_SET_STRING, "pagesize", "1024", 0);
fsconfig(fd, FSCONFIG_CMD_CREATE, NULL, NULL, 0);Given that the requested "pagesize" is invalid, ctxt->hstate will be replaced with NULL, losing its previous value, and we will print an error:
...
...
case Opt_pagesize:
ps = memparse(param->string, &rest);
ctx->hstate = h;
if (!ctx->hstate) {
pr_err("Unsupported page size %lu MB\n", ps / SZ_1M);
return -EINVAL; }
return 0;
...
...
This is a problem because later on, we will dereference ctxt->hstate in hugetlbfs_fill_super()
...
...
sb->s_blocksize = huge_page_size(ctx->hstate);
...
...
Causing below Oops.
Fix this by replacing cxt->hstate value only when then pagesize is known to be valid.
kernel: hugetlbfs: Unsupported page size 0 MB
kernel: BUG: kernel NULL pointer dereference, address: 0000000000000028
kernel: #PF: supervisor read access in kernel mode
kernel: #PF: error_code(0x0000) - not-present page
kernel: PGD 800000010f66c067 P4D 800000010f66c067 PUD 1b22f8067 PMD 0
kernel: Oops: 0000 [#1] PREEMPT SMP PTI
kernel: CPU: 4 PID: 5659 Comm: syscall Tainted: G E 6.8.0-rc2-default+ #22 5a47c3fef76212addcc6eb71344aabc35190ae8f
kernel: Hardware name: Intel Corp. GROVEPORT/GROVEPORT, BIOS GVPRCRB1.86B.0016.D04.1705030402 05/03/2017
kernel: RIP: 0010:hugetlbfs_fill_super+0xb4/0x1a0
kernel: Code: 48 8b 3b e8 3e c6 ed ff 48 85 c0 48 89 45 20 0f 84 d6 00 00 00 48 b8 ff ff ff ff ff ff ff 7f 4c 89 e7 49 89 44 24 20 48 8b 03 <8b> 48 28 b8 00 10 00 00 48 d3 e0 49 89 44 24 18 48 8b 03 8b 40 28
kernel: RSP: 0018:ffffbe9960fcbd48 EFLAGS: 00010246
kernel: RAX: 0000000000000000 RBX: ffff9af5272ae780 RCX: 0000000000372004
kernel: RDX: ffffffffffffffff RSI: ffffffffffffffff RDI: ffff9af555e9b000
kernel: RBP: ffff9af52ee66b00 R08: 0000000000000040 R09: 0000000000370004
kernel: R10: ffffbe9960fcbd48 R11: 0000000000000040 R12: ffff9af555e9b000
kernel: R13: ffffffffa66b86c0 R14: ffff9af507d2f400 R15: ffff9af507d2f400
kernel: FS: 00007ffbc0ba4740(0000) GS:ffff9b0bd7000000(0000) knlGS:0000000000000000
kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
kernel: CR2: 0000000000000028 CR3: 00000001b1ee0000 CR4: 00000000001506f0
kernel: Call Trace:
kernel: <TASK> kernel: ? __die_body+0x1a/0x60 kernel: ? page_fault_oops+0x16f/0x4a0 kernel: ? search_bpf_extables+0x65/0x70 kernel: ? fixup_exception+0x22/0x310 kernel: ? exc_page_fault+0x69/0x150 kernel: ? asm_exc_page_fault+0x22/0x30 kernel: ? __pfx_hugetlbfs_fill_super+0x10/0x10 kernel: ? hugetlbfs_fill_super+0xb4/0x1a0 kernel: ? hugetlbfs_fill_super+0x28/0x1a0 kernel: ? __pfx_hugetlbfs_fill_super+0x10/0x10 kernel: vfs_get_super+0x40/0xa0 kernel: ? __pfx_bpf_lsm_capable+0x10/0x10 kernel: vfs_get_tree+0x25/0xd0 kernel: vfs_cmd_create+0x64/0xe0 kernel: __x64_sys_fsconfig+0x395/0x410 kernel: do_syscall_64+0x80/0x160 kernel: ? syscall_exit_to_user_mode+0x82/0x240 kernel: ? do_syscall_64+0x8d/0x160 kernel: ? syscall_exit_to_user_mode+0x82/0x240 kernel: ? do_syscall_64+0x8d/0x160 kernel: ? exc_page_fault+0x69/0x150 kernel: entry_SYSCALL_64_after_hwframe+0x6e/0x76
kernel: RIP: 0033:0x7ffbc0cb87c9
kernel: Code: 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 66 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 97 96 0d 00 f7 d8 64 89 01 48
kernel: RSP: 002b:00007ffc29d2f388 EFLAGS: 00000206 ORIG_RAX: 00000000000001af
kernel: RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007ffbc0cb87c9
kernel: RDX: 0000000000000000 RSI: 0000000000000006 RDI: 0000000000000003
kernel: RBP: 00007ffc29d2f3b0 R08: 0000000000000000 R09: 0000000000000000
kernel: R10: 0000000000000000 R11: 0000000000000206 R12: 0000000000000000
kernel: R13: 00007ffc29d2f4c0 R14: 0000000000000000 R15: 0000000000000000
kernel: </TASK>
kernel: Modules linked in: rpcsec_gss_krb5(E) auth_rpcgss(E) nfsv4(E) dns_resolver(E) nfs(E) lockd(E) grace(E) sunrpc(E) netfs(E) af_packet(E) bridge(E) stp(E) llc(E) iscsi_ibft(E) iscsi_boot_sysfs(E) intel_rapl_msr(E) intel_rapl_common(E) iTCO_wdt(E) intel_pmc_bxt(E) sb_edac(E) iTCO_vendor_support(E) x86_pkg_temp_thermal(E) intel_powerclamp(E) coretemp(E) kvm_intel(E) rfkill(E) ipmi_ssif(E) kvm(E) acpi_ipmi(E) irqbypass(E) pcspkr(E) igb(E) ipmi_si(E) mei_me(E) i2c_i801(E) joydev(E) intel_pch_thermal(E) i2c_smbus(E) dca(E) lpc_ich(E) mei(E) ipmi_devintf(E) ipmi_msghandler(E) acpi_pad(E) tiny_power_button(E) button(E) fuse(E) efi_pstore(E) configfs(E) ip_tables(E) x_tables(E) ext4(E) mbcache(E) jbd2(E) hid_generic(E) usbhid(E) sd_mod(E) t10_pi(E) crct10dif_pclmul(E) crc32_pclmul(E) crc32c_intel(E) polyval_clmulni(E) ahci(E) xhci_pci(E) polyval_generic(E) gf128mul(E) ghash_clmulni_intel(E) sha512_ssse3(E) sha256_ssse3(E) xhci_pci_renesas(E) libahci(E) ehci_pci(E) sha1_ssse3(E) xhci_hcd(E) ehci_hcd(E) libata(E)
kernel: mgag200(E) i2c_algo_bit(E) usbcore(E) wmi(E) sg(E) dm_multipath(E) dm_mod(E) scsi_dh_rdac(E) scsi_dh_emc(E) scsi_dh_alua(E) scsi_mod(E) scsi_common(E) aesni_intel(E) crypto_simd(E) cryptd(E)
kernel: Unloaded tainted modules: acpi_cpufreq(E):1 fjes(E):1
kernel: CR2: 0000000000000028
kernel: ---[ end trace 0000000000000000 ]---
kernel: RIP: 0010:hugetlbfs_fill_super+0xb4/0x1a0
kernel: Code: 48 8b 3b e8 3e c6 ed ff 48 85 c0 48 89 45 20 0f 84 d6 00 00 00 48 b8 ff ff ff ff ff ff ff 7f 4c 89 e7 49 89 44 24 20 48 8b 03 <8b> 48 28 b8 00 10 00 00 48 d3 e0 49 89 44 24 18 48 8b 03 8b 40 28
kernel: RSP: 0018:ffffbe9960fcbd48 EFLAGS: 00010246
kernel: RAX: 0000000000000000 RBX: ffff9af5272ae780 RCX: 0000000000372004
kernel: RDX: ffffffffffffffff RSI: ffffffffffffffff RDI: ffff9af555e9b000
kernel: RBP: ffff9af52ee66b00 R08: 0000000000000040 R09: 0000000000370004
kernel: R10: ffffbe9960fcbd48 R11: 0000000000000040 R12: ffff9af555e9b000
kernel: R13: ffffffffa66b86c0 R14: ffff9af507d2f400 R15: ffff9af507d2f400
kernel: FS: 00007ffbc0ba4740(0000) GS:ffff9b0bd7000000(0000) knlGS:0000000000000000
kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
kernel: CR2: 0000000000000028 CR3: 00000001b1ee0000 CR4: 00000000001506f0
--- fs/hugetlbfs/inode.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/hugetlbfs/inode.c +4 -2
@@ -1350,6 +1350,7 @@ static int hugetlbfs_parse_param(struct {struct hugetlbfs_fs_context *ctx = fc->fs_private;struct fs_parse_result result; +struct hstate *h;char *rest;unsigned long ps;int opt;
@@ -1394,11 +1395,12 @@ static int hugetlbfs_parse_param(structcase Opt_pagesize: ps =memparse (param->string, &rest); - ctx->hstate =size_to_hstate (ps); -if (!ctx->hstate) { + h =size_to_hstate (ps); +if (!h) {pr_err ("Unsupported page size %lu MB\n" , ps /SZ_1M );return -EINVAL ; } + ctx->hstate = h;return 0 ;case Opt_min_size:
Greg Kroah-Hartman
maintainerPATCH 159/197 mm: hugetlb pages should not be reserved by shmat() if SHM_NORESERVE
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Prakash Sangappa <[email protected]>
commit e656c7a9e59607d1672d85ffa9a89031876ffe67 upstream.
For shared memory of type SHM_HUGETLB, hugetlb pages are reserved in shmget() call. If SHM_NORESERVE flags is specified then the hugetlb pages are not reserved. However when the shared memory is attached with the shmat() call the hugetlb pages are getting reserved incorrectly for SHM_HUGETLB shared memory created with SHM_NORESERVE which is a bug.
-------------------------------
Following test shows the issue.
$cat shmhtb.c
int main()
{
int shmflags = 0660 | IPC_CREAT | SHM_HUGETLB | SHM_NORESERVE;
int shmid;
shmid = shmget(SKEY, SHMSZ, shmflags);
if (shmid < 0)
{
printf("shmat: shmget() failed, %d\n", errno);
return 1;
}
printf("After shmget()\n");
system("cat /proc/meminfo | grep -i hugepages_");
shmat(shmid, NULL, 0);
printf("\nAfter shmat()\n");
system("cat /proc/meminfo | grep -i hugepages_");
shmctl(shmid, IPC_RMID, NULL);
return 0;
} #sysctl -w vm.nr_hugepages=20
#./shmhtb
After shmget()
HugePages_Total: 20 HugePages_Free: 20 HugePages_Rsvd: 0 HugePages_Surp: 0
After shmat()
HugePages_Total: 20 HugePages_Free: 20 HugePages_Rsvd: 5 <-- HugePages_Surp: 0
--------------------------------
Fix is to ensure that hugetlb pages are not reserved for SHM_HUGETLB shared memory in the shmat() call.
--- fs/hugetlbfs/inode.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
fs/hugetlbfs/inode.c +12 -1
@@ -123,6 +123,7 @@ static int hugetlbfs_file_mmap(struct filoff_t len, vma_len;int ret;struct hstate *h =hstate_file (file); +vm_flags_t vm_flags;/* * vma address alignment (but not the pgoff alignment) has
@@ -164,10 +165,20 @@ static int hugetlbfs_file_mmap(struct fifile_accessed (file); ret = -ENOMEM ; + + vm_flags = vma->vm_flags; +/* +* for SHM_HUGETLB, the pages are reserved in the shmget() call so skip +* reserving here. Note: only for SHM hugetlbfs file, the inode +* flag S_PRIVATE is set. +*/ +if (inode->i_flags &S_PRIVATE ) + vm_flags |=VM_NORESERVE ; +if (!hugetlb_reserve_pages (inode, vma->vm_pgoff >>huge_page_order (h), len >>huge_page_shift (h), vma, - vma->vm_flags)) + vm_flags)) goto out; ret =0 ;
Greg Kroah-Hartman
maintainerPATCH 160/197 of: property: fix typo in io-channels
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nuno Sa <[email protected]>
commit 8f7e917907385e112a845d668ae2832f41e64bf5 upstream.
The property is io-channels and not io-channel. This was effectively preventing the devlink creation.
--- drivers/of/property.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/of/property.c +1 -1
@@ -1243,7 +1243,7 @@ DEFINE_SIMPLE_PROP(clocks, "clocks", "#c DEFINE_SIMPLE_PROP(interconnects, "interconnects", "#interconnect-cells") DEFINE_SIMPLE_PROP(iommus, "iommus", "#iommu-cells") DEFINE_SIMPLE_PROP(mboxes, "mboxes", "#mbox-cells") -DEFINE_SIMPLE_PROP(io_channels, "io-channel", "#io-channel-cells") +DEFINE_SIMPLE_PROP(io_channels, "io-channels", "#io-channel-cells") DEFINE_SIMPLE_PROP(interrupt_parent, "interrupt-parent", NULL) DEFINE_SIMPLE_PROP(dmas, "dmas", "#dma-cells")DEFINE_SIMPLE_PROP (power_domains,"power-domains" ,"#power-domain-cells" )
Greg Kroah-Hartman
maintainerPATCH 161/197 can: netlink: Fix TDCO calculation using the old data bittiming
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Jayat <[email protected]>
commit 2aa0a5e65eae27dbd96faca92c84ecbf6f492d42 upstream.
The TDCO calculation was done using the currently applied data bittiming, instead of the newly computed data bittiming, which means that the TDCO had an invalid value unless setting the same data bittiming twice.
--- drivers/net/can/dev/netlink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/can/dev/netlink.c +1 -1
@@ -311,7 +311,7 @@ static int can_changelink(struct net_dev/* Neither of TDC parameters nor TDC flags are * provided: do calculation */ -can_calc_tdco (&priv->tdc, priv->tdc_const, &priv->data_bittiming, +can_calc_tdco (&priv->tdc, priv->tdc_const, &dbt, &priv->ctrlmode, priv->ctrlmode_supported); }/* else: both CAN_CTRLMODE_TDC_{AUTO,MANUAL} are explicitly * turned off. TDC is disabled: do nothing
Greg Kroah-Hartman
maintainerPATCH 162/197 can: j1939: prevent deadlock by changing j1939_socks_lock to rwlock
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ziqi Zhao <[email protected]>
commit 6cdedc18ba7b9dacc36466e27e3267d201948c8d upstream.
The following 3 locks would race against each other, causing the deadlock situation in the Syzbot bug report:
- j1939_socks_lock
- active_session_list_lock
- sk_session_queue_lock
A reasonable fix is to change j1939_socks_lock to an rwlock, since in the rare situations where a write lock is required for the linked list that j1939_socks_lock is protecting, the code does not attempt to acquire any more locks. This would break the circular lock dependency, where, for example, the current thread already locks j1939_socks_lock and attempts to acquire sk_session_queue_lock, and at the same time, another thread attempts to acquire j1939_socks_lock while holding sk_session_queue_lock.
NOTE: This patch along does not fix the unregister_netdevice bug reported by Syzbot; instead, it solves a deadlock situation to prepare for one or more further patches to actually fix the Syzbot bug, which appears to be a reference counting problem within the j1939 codebase.
--- net/can/j1939/j1939-priv.h | 2 +- net/can/j1939/main.c | 2 +- net/can/j1939/socket.c | 24 ++++++++++++------------ 3 files changed, 14 insertions(+), 14 deletions(-)
net/can/j1939/j1939-priv.h +1 -1
@@ -86,7 +86,7 @@ struct j1939_priv {unsigned int tp_max_packet_size;/* lock for j1939_socks list */ -spinlock_t j1939_socks_lock; +rwlock_t j1939_socks_lock;struct list_head j1939_socks;struct kref rx_kref;
net/can/j1939/main.c +1 -1
@@ -274,7 +274,7 @@ struct j1939_priv *j1939_netdev_start(streturn ERR_PTR (-ENOMEM );j1939_tp_init (priv); -spin_lock_init (&priv->j1939_socks_lock); +rwlock_init (&priv->j1939_socks_lock);INIT_LIST_HEAD (&priv->j1939_socks);mutex_lock (&j1939_netdev_lock);
net/can/j1939/socket.c +12 -12
@@ -80,16 +80,16 @@ static void j1939_jsk_add(struct j1939_p jsk->state |=J1939_SOCK_BOUND ;j1939_priv_get (priv); -spin_lock_bh (&priv->j1939_socks_lock); +write_lock_bh (&priv->j1939_socks_lock);list_add_tail (&jsk->list, &priv->j1939_socks); -spin_unlock_bh (&priv->j1939_socks_lock); +write_unlock_bh (&priv->j1939_socks_lock); }static void j1939_jsk_del (struct j1939_priv *priv,struct j1939_sock *jsk) { -spin_lock_bh (&priv->j1939_socks_lock); +write_lock_bh (&priv->j1939_socks_lock);list_del_init (&jsk->list); -spin_unlock_bh (&priv->j1939_socks_lock); +write_unlock_bh (&priv->j1939_socks_lock);j1939_priv_put (priv); jsk->state &= ~J1939_SOCK_BOUND ;
@@ -329,13 +329,13 @@ bool j1939_sk_recv_match(struct j1939_prstruct j1939_sock *jsk;bool match = false; -spin_lock_bh (&priv->j1939_socks_lock); +read_lock_bh (&priv->j1939_socks_lock);list_for_each_entry (jsk, &priv->j1939_socks, list) { match =j1939_sk_recv_match_one (jsk, skcb);if (match)break ; } -spin_unlock_bh (&priv->j1939_socks_lock); +read_unlock_bh (&priv->j1939_socks_lock);return match; }
@@ -344,11 +344,11 @@ void j1939_sk_recv(struct j1939_priv *pr {struct j1939_sock *jsk; -spin_lock_bh (&priv->j1939_socks_lock); +read_lock_bh (&priv->j1939_socks_lock);list_for_each_entry (jsk, &priv->j1939_socks, list) {j1939_sk_recv_one (jsk, skb); } -spin_unlock_bh (&priv->j1939_socks_lock); +read_unlock_bh (&priv->j1939_socks_lock); }static void j1939_sk_sock_destruct (struct sock *sk)
@@ -1080,12 +1080,12 @@ void j1939_sk_errqueue(struct j1939_sess }/* spread RX notifications to all sockets subscribed to this session */ -spin_lock_bh (&priv->j1939_socks_lock); +read_lock_bh (&priv->j1939_socks_lock);list_for_each_entry (jsk, &priv->j1939_socks, list) {if (j1939_sk_recv_match_one (jsk, &session->skcb))__j1939_sk_errqueue (session, &jsk->sk, type); } -spin_unlock_bh (&priv->j1939_socks_lock); +read_unlock_bh (&priv->j1939_socks_lock); };void j1939_sk_send_loop_abort (struct sock *sk,int err)
@@ -1273,7 +1273,7 @@ void j1939_sk_netdev_event_netdown(strucstruct j1939_sock *jsk;int error_code =ENETDOWN ; -spin_lock_bh (&priv->j1939_socks_lock); +read_lock_bh (&priv->j1939_socks_lock);list_for_each_entry (jsk, &priv->j1939_socks, list) { jsk->sk.sk_err = error_code;if (!sock_flag (&jsk->sk,SOCK_DEAD ))
@@ -1281,7 +1281,7 @@ void j1939_sk_netdev_event_netdown(strucj1939_sk_queue_drop_all (priv, jsk, error_code); } -spin_unlock_bh (&priv->j1939_socks_lock); +read_unlock_bh (&priv->j1939_socks_lock); } static int j1939_sk_no_ioctlcmd(struct socket *sock, unsigned int cmd,
Greg Kroah-Hartman
maintainerPATCH 163/197 can: j1939: Fix UAF in j1939_sk_match_filter during setsockopt(SO_J1939_FILTER)
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksij Rempel <[email protected]>
commit efe7cf828039aedb297c1f9920b638fffee6aabc upstream.
Lock jsk->sk to prevent UAF when setsockopt(..., SO_J1939_FILTER, ...) modifies jsk->filters while receiving packets.
Following trace was seen on affected system:
==================================================================
BUG: KASAN: slab-use-after-free in j1939_sk_recv_match_one+0x1af/0x2d0 [can_j1939] Read of size 4 at addr ffff888012144014 by task j1939/350 CPU: 0 PID: 350 Comm: j1939 Tainted: G W OE 6.5.0-rc5 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014 Call Trace: print_report+0xd3/0x620 ? kasan_complete_mode_report_info+0x7d/0x200 ? j1939_sk_recv_match_one+0x1af/0x2d0 [can_j1939] kasan_report+0xc2/0x100 ? j1939_sk_recv_match_one+0x1af/0x2d0 [can_j1939] __asan_load4+0x84/0xb0 j1939_sk_recv_match_one+0x1af/0x2d0 [can_j1939] j1939_sk_recv+0x20b/0x320 [can_j1939] ? __kasan_check_write+0x18/0x20 ? __pfx_j1939_sk_recv+0x10/0x10 [can_j1939] ? j1939_simple_recv+0x69/0x280 [can_j1939] ? j1939_ac_recv+0x5e/0x310 [can_j1939] j1939_can_recv+0x43f/0x580 [can_j1939] ? __pfx_j1939_can_recv+0x10/0x10 [can_j1939] ? raw_rcv+0x42/0x3c0 [can_raw] ? __pfx_j1939_can_recv+0x10/0x10 [can_j1939] can_rcv_filter+0x11f/0x350 [can] can_receive+0x12f/0x190 [can] ? __pfx_can_rcv+0x10/0x10 [can] can_rcv+0xdd/0x130 [can] ? __pfx_can_rcv+0x10/0x10 [can] __netif_receive_skb_one_core+0x13d/0x150 ? __pfx___netif_receive_skb_one_core+0x10/0x10 ? __kasan_check_write+0x18/0x20 ? _raw_spin_lock_irq+0x8c/0xe0 __netif_receive_skb+0x23/0xb0 process_backlog+0x107/0x260 __napi_poll+0x69/0x310 net_rx_action+0x2a1/0x580 ? __pfx_net_rx_action+0x10/0x10 ? __pfx__raw_spin_lock+0x10/0x10 ? handle_irq_event+0x7d/0xa0 __do_softirq+0xf3/0x3f8 do_softirq+0x53/0x80 </IRQ> <TASK> __local_bh_enable_ip+0x6e/0x70 netif_rx+0x16b/0x180 can_send+0x32b/0x520 [can] ? __pfx_can_send+0x10/0x10 [can] ? __check_object_size+0x299/0x410 raw_sendmsg+0x572/0x6d0 [can_raw] ? __pfx_raw_sendmsg+0x10/0x10 [can_raw] ? apparmor_socket_sendmsg+0x2f/0x40 ? __pfx_raw_sendmsg+0x10/0x10 [can_raw] sock_sendmsg+0xef/0x100 sock_write_iter+0x162/0x220 ? __pfx_sock_write_iter+0x10/0x10 ? __rtnl_unlock+0x47/0x80 ? security_file_permission+0x54/0x320 vfs_write+0x6ba/0x750 ? __pfx_vfs_write+0x10/0x10 ? __fget_light+0x1ca/0x1f0 ? __rcu_read_unlock+0x5b/0x280 ksys_write+0x143/0x170 ? __pfx_ksys_write+0x10/0x10 ? __kasan_check_read+0x15/0x20 ? fpregs_assert_state_consistent+0x62/0x70 __x64_sys_write+0x47/0x60 do_syscall_64+0x60/0x90 ? do_syscall_64+0x6d/0x90 ? irqentry_exit+0x3f/0x50 ? exc_page_fault+0x79/0xf0 entry_SYSCALL_64_after_hwframe+0x6e/0xd8 Allocated by task 348: kasan_save_stack+0x2a/0x50 kasan_set_track+0x29/0x40 kasan_save_alloc_info+0x1f/0x30 __kasan_kmalloc+0xb5/0xc0 __kmalloc_node_track_caller+0x67/0x160 j1939_sk_setsockopt+0x284/0x450 [can_j1939] __sys_setsockopt+0x15c/0x2f0 __x64_sys_setsockopt+0x6b/0x80 do_syscall_64+0x60/0x90 entry_SYSCALL_64_after_hwframe+0x6e/0xd8 Freed by task 349: kasan_save_stack+0x2a/0x50 kasan_set_track+0x29/0x40 kasan_save_free_info+0x2f/0x50 __kasan_slab_free+0x12e/0x1c0 __kmem_cache_free+0x1b9/0x380 kfree+0x7a/0x120 j1939_sk_setsockopt+0x3b2/0x450 [can_j1939] __sys_setsockopt+0x15c/0x2f0 __x64_sys_setsockopt+0x6b/0x80 do_syscall_64+0x60/0x90 entry_SYSCALL_64_after_hwframe+0x6e/0xd8
--- net/can/j1939/j1939-priv.h | 1 + net/can/j1939/socket.c | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-)
net/can/j1939/j1939-priv.h +1 -0
@@ -301,6 +301,7 @@ struct j1939_sock {int ifindex;struct j1939_addr addr; +spinlock_t filters_lock;struct j1939_filter *filters;int nfilters;pgn_t pgn_rx_filter;
net/can/j1939/socket.c +18 -4
@@ -262,12 +262,17 @@ static bool j1939_sk_match_dst(struct j1static bool j1939_sk_match_filter (struct j1939_sock *jsk,const struct j1939_sk_buff_cb *skcb) { -const struct j1939_filter *f = jsk->filters; -int nfilter = jsk->nfilters; +const struct j1939_filter *f; +int nfilter; + +spin_lock_bh (&jsk->filters_lock); + + f = jsk->filters; + nfilter = jsk->nfilters;if (!nfilter)/* receive all when no filters are assigned */ -return true; + goto filter_match_found;for (; nfilter; ++f, --nfilter) {if ((skcb->addr.pgn & f->pgn_mask) != f->pgn)
@@ -276,9 +281,15 @@ static bool j1939_sk_match_filter(structcontinue ;if ((skcb->addr.src_name & f->name_mask) != f->name)continue ; -return true; + goto filter_match_found; } + +spin_unlock_bh (&jsk->filters_lock);return false; + +filter_match_found: +spin_unlock_bh (&jsk->filters_lock); +return true; } static bool j1939_sk_recv_match_one(struct j1939_sock *jsk,
@@ -401,6 +412,7 @@ static int j1939_sk_init(struct sock *skatomic_set (&jsk->skb_pending,0 );spin_lock_init (&jsk->sk_session_queue_lock);INIT_LIST_HEAD (&jsk->sk_session_queue); +spin_lock_init (&jsk->filters_lock);/* j1939_sk_sock_destruct() depends on SOCK_RCU_FREE flag */ sock_set_flag (sk,SOCK_RCU_FREE );
@@ -703,9 +715,11 @@ static int j1939_sk_setsockopt(struct so }lock_sock (&jsk->sk); +spin_lock_bh (&jsk->filters_lock); ofilters = jsk->filters; jsk->filters = filters; jsk->nfilters = count; +spin_unlock_bh (&jsk->filters_lock);release_sock (&jsk->sk);kfree (ofilters);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 164/197 pmdomain: core: Move the unused cleanup to a _sync initcall
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
commit 741ba0134fa7822fcf4e4a0a537a5c4cfd706b20 upstream.
The unused clock cleanup uses the _sync initcall to give all users at earlier initcalls time to probe. Do the same to avoid leaving some PDs dangling at "on" (which actually happened on qcom!).
--- drivers/base/power/domain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/base/power/domain.c +1 -1
@@ -1052,7 +1052,7 @@ static int __init genpd_power_off_unusedreturn 0 ; } -late_initcall (genpd_power_off_unused); +late_initcall_sync (genpd_power_off_unused);#ifdef CONFIG_PM_SLEEP
Greg Kroah-Hartman
maintainerPATCH 165/197 fs/proc: do_task_stat: move thread_group_cputime_adjusted() outside of lock_task_sighand()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleg Nesterov <[email protected]>
commit 60f92acb60a989b14e4b744501a0df0f82ef30a3 upstream.
Patch series "fs/proc: do_task_stat: use sig->stats_".
do_task_stat() has the same problem as getrusage() had before "getrusage:
use sig->stats_lock rather than lock_task_sighand()": a hard lockup. If NR_CPUS threads call lock_task_sighand() at the same time and the process has NR_THREADS, spin_lock_irq will spin with irqs disabled O(NR_CPUS * NR_THREADS) time.
This patch (of 3):
thread_group_cputime() does its own locking, we can safely shift thread_group_cputime_adjusted() which does another for_each_thread loop outside of ->siglock protected section.
Not only this removes for_each_thread() from the critical section with irqs disabled, this removes another case when stats_lock is taken with siglock held. We want to remove this dependency, then we can change the users of stats_lock to not disable irqs.
--- fs/proc/array.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
fs/proc/array.c +6 -4
@@ -501,7 +501,7 @@ static int do_task_stat(struct seq_filesigemptyset (&sigign);sigemptyset (&sigcatch); - cutime = cstime = utime = stime =0 ; + cutime = cstime =0 ; cgtime = gtime =0 ;if (lock_task_sighand (task, &flags)) {
@@ -535,7 +535,6 @@ static int do_task_stat(struct seq_file min_flt += sig->min_flt; maj_flt += sig->maj_flt; -thread_group_cputime_adjusted (task, &utime, &stime); gtime += sig->gtime;if (sig->flags & (SIGNAL_GROUP_EXIT |SIGNAL_STOP_STOPPED ))
@@ -551,10 +550,13 @@ static int do_task_stat(struct seq_fileif (permitted && (!whole || num_threads <2 )) wchan = !task_is_running (task); -if (!whole) { + +if (whole) { +thread_group_cputime_adjusted (task, &utime, &stime); + }else { +task_cputime_adjusted (task, &utime, &stime); min_flt = task->min_flt; maj_flt = task->maj_flt; -task_cputime_adjusted (task, &utime, &stime); gtime =task_gtime (task); }
Greg Kroah-Hartman
maintainerPATCH 166/197 tracing: Inform kmemleak of saved_cmdlines allocation
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt (Google) <[email protected]>
commit 2394ac4145ea91b92271e675a09af2a9ea6840b7 upstream.
The allocation of the struct saved_cmdlines_buffer structure changed from:
s = kmalloc(sizeof(*s), GFP_KERNEL); s->saved_cmdlines = kmalloc_array(TASK_COMM_LEN, val, GFP_KERNEL);
to:
orig_size = sizeof(*s) + val * TASK_COMM_LEN; order = get_order(orig_size); size = 1 << (order + PAGE_SHIFT); page = alloc_pages(GFP_KERNEL, order); if (!page) return NULL; s = page_address(page); memset(s, 0, sizeof(*s)); s->saved_cmdlines = kmalloc_array(TASK_COMM_LEN, val, GFP_KERNEL);
Where that s->saved_cmdlines allocation looks to be a dangling allocation to kmemleak. That's because kmemleak only keeps track of kmalloc() allocations. For allocations that use page_alloc() directly, the kmemleak needs to be explicitly informed about it.
Add kmemleak_alloc() and kmemleak_free() around the page allocation so that it doesn't give the following false positive:
unreferenced object 0xffff8881010c8000 (size 32760):
comm "swapper", pid 0, jiffies 4294667296
hex dump (first 32 bytes):
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
backtrace (crc ae6ec1b9):
[<ffffffff86722405>] kmemleak_alloc+0x45/0x80
[<ffffffff8414028d>] __kmalloc_large_node+0x10d/0x190
[<ffffffff84146ab1>] __kmalloc+0x3b1/0x4c0
[<ffffffff83ed7103>] allocate_cmdlines_buffer+0x113/0x230
[<ffffffff88649c34>] tracer_alloc_buffers.isra.0+0x124/0x460
[<ffffffff8864a174>] early_trace_init+0x14/0xa0
[<ffffffff885dd5ae>] start_kernel+0x12e/0x3c0
[<ffffffff885f5758>] x86_64_start_reservations+0x18/0x30
[<ffffffff885f582b>] x86_64_start_kernel+0x7b/0x80
[<ffffffff83a001c3>] secondary_startup_64_no_verify+0x15e/0x16b--- kernel/trace/trace.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/trace/trace.c +3 -0
@@ -40,6 +40,7 @@#include <linux/ctype.h> #include <linux/init.h> #include <linux/panic_notifier.h> +#include <linux/kmemleak.h> #include <linux/poll.h> #include <linux/nmi.h> #include <linux/fs.h>
@@ -2268,6 +2269,7 @@ static void free_saved_cmdlines_buffer(sint order =get_order (sizeof (*s) + s->cmdline_num *TASK_COMM_LEN );kfree (s->map_cmdline_to_pid); +kmemleak_free (s);free_pages ((unsigned long )s, order); }
@@ -2287,6 +2289,7 @@ static struct saved_cmdlines_buffer *allreturn NULL ; s =page_address (page); +kmemleak_alloc (s, size,1 ,GFP_KERNEL );memset (s,0 ,sizeof (*s));/* Round up to actual allocation */
Greg Kroah-Hartman
maintainerPATCH 167/197 xfrm: Use xfrm_state selector for BEET input
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
commit 842665a9008a53ff13ac22a4e4b8ae2f10e92aca upstream.
For BEET the inner address and therefore family is stored in the xfrm_state selector. Use that when decapsulating an input packet instead of incorrectly relying on a non-existent tunnel protocol.
--- net/xfrm/xfrm_input.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
net/xfrm/xfrm_input.c +3 -4
@@ -331,11 +331,10 @@ xfrm_inner_mode_encap_remove(struct xfrm {switch (x->props.mode) {case XFRM_MODE_BEET : -switch (XFRM_MODE_SKB_CB (skb)->protocol) { -case IPPROTO_IPIP : -case IPPROTO_BEETPH : +switch (x->sel.family) { +case AF_INET :return xfrm4_remove_beet_encap (x, skb); -case IPPROTO_IPV6 : +case AF_INET6 :return xfrm6_remove_beet_encap (x, skb); }break ;
Greg Kroah-Hartman
maintainerPATCH 168/197 xfrm: Silence warnings triggerable by bad packets
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
commit 57010b8ece2821a1fdfdba2197d14a022f3769db upstream.
After the elimination of inner modes, a couple of warnings that were previously unreachable can now be triggered by malformed inbound packets.
Fix this by:
1. Moving the setting of skb->protocol into the decap functions.
2. Returning -EINVAL when unexpected protocol is seen.
--- net/xfrm/xfrm_input.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-)
net/xfrm/xfrm_input.c +9 -13
@@ -180,6 +180,8 @@ static int xfrm4_remove_beet_encap(strucint optlen =0 ;int err = -EINVAL ; + skb->protocol =htons (ETH_P_IP ); +if (unlikely (XFRM_MODE_SKB_CB (skb)->protocol ==IPPROTO_BEETPH )) {struct ip_beet_phdr *ph;int phlen;
@@ -232,6 +234,8 @@ static int xfrm4_remove_tunnel_encap(str {int err = -EINVAL ; + skb->protocol =htons (ETH_P_IP ); +if (!pskb_may_pull (skb,sizeof (struct iphdr ))) goto out;
@@ -267,6 +271,8 @@ static int xfrm6_remove_tunnel_encap(str {int err = -EINVAL ; + skb->protocol =htons (ETH_P_IPV6 ); +if (!pskb_may_pull (skb,sizeof (struct ipv6hdr ))) goto out;
@@ -296,6 +302,8 @@ static int xfrm6_remove_beet_encap(strucint size =sizeof (struct ipv6hdr );int err; + skb->protocol =htons (ETH_P_IPV6 ); + err =skb_cow_head (skb, size + skb->mac_len);if (err) goto out;
@@ -346,6 +354,7 @@ xfrm_inner_mode_encap_remove(struct xfrmreturn xfrm6_remove_tunnel_encap (x, skb);break ; } +return -EINVAL ; }WARN_ON_ONCE (1 );
@@ -366,19 +375,6 @@ static int xfrm_prepare_input(struct xfrreturn -EAFNOSUPPORT ; } -switch (XFRM_MODE_SKB_CB (skb)->protocol) { -case IPPROTO_IPIP : -case IPPROTO_BEETPH : - skb->protocol =htons (ETH_P_IP ); -break ; -case IPPROTO_IPV6 : - skb->protocol =htons (ETH_P_IPV6 ); -break ; -default : -WARN_ON_ONCE (1 ); -break ; - } -return xfrm_inner_mode_encap_remove (x, skb); }
Greg Kroah-Hartman
maintainerPATCH 169/197 tls: fix NULL deref on tls_sw_splice_eof() with empty record
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jann Horn <[email protected]>
commit 53f2cb491b500897a619ff6abd72f565933760f0 upstream.
syzkaller discovered that if tls_sw_splice_eof() is executed as part of sendfile() when the plaintext/ciphertext sk_msg are empty, the send path gets confused because the empty ciphertext buffer does not have enough space for the encryption overhead. This causes tls_push_record() to go on the split = true path (which is only supposed to be used when interacting with an attached BPF program), and then get further confused and hit the tls_merge_open_record() path, which then assumes that there must be at least one populated buffer element, leading to a NULL deref.
It is possible to have empty plaintext/ciphertext buffers if we previously bailed from tls_sw_sendmsg_locked() via the tls_trim_both_msgs() path. tls_sw_push_pending_record() already handles this case correctly; let's do the same check in tls_sw_splice_eof().
--- net/tls/tls_sw.c | 3 +++ 1 file changed, 3 insertions(+)
net/tls/tls_sw.c +3 -0
@@ -1179,11 +1179,14 @@ void tls_sw_splice_eof(struct socket *solock_sock (sk); retry: +/* same checks as in tls_sw_push_pending_record() */ rec = ctx->open_rec;if (!rec) goto unlock; msg_pl = &rec->msg_plaintext; +if (msg_pl->sg.size ==0 ) + goto unlock;/* Check the BPF advisor and perform transmission. */ ret = bpf_exec_tx_verdict(msg_pl, sk, false, TLS_RECORD_TYPE_DATA,
Greg Kroah-Hartman
maintainerPATCH 170/197 selftests/mm: ksm_tests should only MADV_HUGEPAGE valid memory
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryan Roberts <[email protected]>
[ Upstream commit d021b442cf312664811783e92b3d5e4548e92a53 ]
ksm_tests was previously mmapping a region of memory, aligning the returned pointer to a PMD boundary, then setting MADV_HUGEPAGE, but was setting it past the end of the mmapped area due to not taking the pointer alignment into consideration. Fix this behaviour.
Up until commit efa7df3e3bb5 ("mm: align larger anonymous mappings on THP boundaries"), this buggy behavior was (usually) masked because the alignment difference was always less than PMD-size. But since the mentioned commit, ksm_tests -H -s 100 started failing.
--- tools/testing/selftests/vm/ksm_tests.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/vm/ksm_tests.c +1 -1
@@ -470,7 +470,7 @@ static int ksm_merge_hugepages_time(int mapping, int prot, int timeout, size_t mif (map_ptr_orig ==MAP_FAILED )err (2 ,"initial mmap" ); -if (madvise (map_ptr, len +HPAGE_SIZE ,MADV_HUGEPAGE )) +if (madvise (map_ptr, len,MADV_HUGEPAGE ))err (2 ,"MADV_HUGEPAGE" ); pagemap_fd =open ("/proc/self/pagemap" ,O_RDONLY );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 171/197 selftests/mm: Update va_high_addr_switch.sh to check CPU for la57 flag
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Audra Mitchell <[email protected]>
[ Upstream commit 52e63d67b5bb423b33d7a262ac7f8bd375a90145 ]
In order for the page table level 5 to be in use, the CPU must have the setting enabled in addition to the CONFIG option. Check for the flag to be set to avoid false test failures on systems that do not have this cpu flag set.
The test does a series of mmap calls including three using the MAP_FIXED flag and specifying an address that is 1<<47 or 1<<48. These addresses are only available if you are using level 5 page tables, which requires both the CPU to have the capabiltiy (la57 flag) and the kernel to be configured. Currently the test only checks for the kernel configuration option, so this test can still report a false positive. Here are the three failing lines:
$ ./va_high_addr_switch | grep FAILED mmap(ADDR_SWITCH_HINT, 2 * PAGE_SIZE, MAP_FIXED): 0xffffffffffffffff - FAILED mmap(HIGH_ADDR, MAP_FIXED): 0xffffffffffffffff - FAILED mmap(ADDR_SWITCH_HINT, 2 * PAGE_SIZE, MAP_FIXED): 0xffffffffffffffff - FAILED
I thought (for about a second) refactoring the test so that these three mmap calls will only be run on systems with the level 5 page tables available, but the whole point of the test is to check the level 5 feature...
--- tools/testing/selftests/vm/va_128TBswitch.sh | 6 ++++++ 1 file changed, 6 insertions(+)
tools/testing/selftests/vm/va_128TBswitch.sh +6 -0
@@ -29,9 +29,15 @@ check_supported_x86_64() # See man 1 gzip under '-f'. local pg_table_levels=$(gzip -dcfq "${config}" | grep PGTABLE_LEVELS | cut -d'=' -f 2) + local cpu_supports_pl5=$(awk '/^flags/ {if (/la57/) {print 0;} + else {print 1}; exit}' /proc/cpuinfo 2>/dev/null) + if [[ "${pg_table_levels}" -lt 5 ]]; then echo "$0: PGTABLE_LEVELS=${pg_table_levels}, must be >= 5 to run this test" exit $ksft_skip + elif [[ "${cpu_supports_pl5}" -ne 0 ]]; then + echo "$0: CPU does not have the necessary la57 flag to support page table level 5" + exit $ksft_skip fi }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 172/197 md: bypass block throttle for superblock update
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxiao Bi <[email protected]>
[ Upstream commit d6e035aad6c09991da1c667fb83419329a3baed8 ]
commit 5e2cf333b7bd ("md/raid5: Wait for MD_SB_CHANGE_PENDING in raid5d") introduced a hung bug and will be reverted in next patch, since the issue that commit is fixing is due to md superblock write is throttled by wbt, to fix it, we can have superblock write bypass block layer throttle.
--- drivers/md/md.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/md/md.c +4 -3
@@ -963,9 +963,10 @@ void md_super_write(struct mddev *mddev, struct md_rdev *rdev,return ; bio =bio_alloc_bioset (rdev->meta_bdev ? rdev->meta_bdev : rdev->bdev, -1 , -REQ_OP_WRITE |REQ_SYNC |REQ_PREFLUSH |REQ_FUA , -GFP_NOIO , &mddev->sync_set); +1 , +REQ_OP_WRITE |REQ_SYNC |REQ_IDLE |REQ_META + |REQ_PREFLUSH |REQ_FUA , +GFP_NOIO , &mddev->sync_set);atomic_inc (&rdev->nr_pending);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 173/197 ARM: dts: imx6q-apalis: add can power-up delay on ixora board
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrejs Cainikovs <[email protected]>
[ Upstream commit b76bbf835d8945080b22b52fc1e6f41cde06865d ]
Newer variants of Ixora boards require a power-up delay when powering up the CAN transceiver of up to 1ms.
--- arch/arm/boot/dts/imx6q-apalis-ixora-v1.2.dts | 2 ++ 1 file changed, 2 insertions(+)
arch/arm/boot/dts/imx6q-apalis-ixora-v1.2.dts +2 -0
@@ -76,6 +76,7 @@ reg_can1_supply: regulator-can1-supply { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_enable_can1_power>; regulator-name = "can1_supply"; + startup-delay-us = <1000>; }; reg_can2_supply: regulator-can2-supply {
@@ -85,6 +86,7 @@ reg_can2_supply: regulator-can2-supply { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_enable_can2_power>; regulator-name = "can2_supply"; + startup-delay-us = <1000>; }; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 174/197 wifi: mwifiex: Support SD8978 chipset
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Wunner <[email protected]>
[ Upstream commit bba047f15851c8b053221f1b276eb7682d59f755 ]
The Marvell SD8978 (aka NXP IW416) uses identical registers as SD8987, so reuse the existing mwifiex_reg_sd8987 definition.
Note that mwifiex_reg_sd8977 and mwifiex_reg_sd8997 are likewise identical, save for the fw_dump_ctrl register: They define it as 0xf0 whereas mwifiex_reg_sd8987 defines it as 0xf9. I've verified that 0xf9 is the correct value on SD8978. NXP's out-of-tree driver uses 0xf9 for all of them, so there's a chance that 0xf0 is not correct in the mwifiex_reg_sd8977 and mwifiex_reg_sd8997 definitions. I cannot test that for lack of hardware, hence am leaving it as is.
NXP has only released a firmware which runs Bluetooth over UART. Perhaps Bluetooth over SDIO is unsupported by this chipset. Consequently, only an "sdiouart" firmware image is referenced, not an alternative "sdsd" image.
Stable-dep-of: 1c5d463c0770 ("wifi: mwifiex: add extra delay for firmware ready")
--- .../bindings/net/wireless/marvell-8xxx.txt | 4 ++- drivers/net/wireless/marvell/mwifiex/Kconfig | 5 ++-- drivers/net/wireless/marvell/mwifiex/sdio.c | 25 +++++++++++++++++-- drivers/net/wireless/marvell/mwifiex/sdio.h | 1 + include/linux/mmc/sdio_ids.h | 1 + 5 files changed, 31 insertions(+), 5 deletions(-)
Documentation/devicetree/bindings/net/wireless/marvell-8xxx.txt +3 -1
@@ -1,4 +1,4 @@ -Marvell 8787/8897/8997 (sd8787/sd8897/sd8997/pcie8997) SDIO/PCIE devices +Marvell 8787/8897/8978/8997 (sd8787/sd8897/sd8978/sd8997/pcie8997) SDIO/PCIE devices ------ This node provides properties for controlling the Marvell SDIO/PCIE wireless device.
@@ -10,7 +10,9 @@ Required properties: - compatible : should be one of the following: * "marvell,sd8787" * "marvell,sd8897" + * "marvell,sd8978" * "marvell,sd8997" + * "nxp,iw416" * "pci11ab,2b42" * "pci1b4b,2b42"
drivers/net/wireless/marvell/mwifiex/Kconfig +3 -2
@@ -10,13 +10,14 @@ config MWIFIEX mwifiex. config MWIFIEX_SDIO - tristate "Marvell WiFi-Ex Driver for SD8786/SD8787/SD8797/SD8887/SD8897/SD8977/SD8987/SD8997" + tristate "Marvell WiFi-Ex Driver for SD8786/SD8787/SD8797/SD8887/SD8897/SD8977/SD8978/SD8987/SD8997" depends on MWIFIEX && MMC select FW_LOADER select WANT_DEV_COREDUMP help This adds support for wireless adapters based on Marvell - 8786/8787/8797/8887/8897/8977/8987/8997 chipsets with SDIO interface. + 8786/8787/8797/8887/8897/8977/8978/8987/8997 chipsets with + SDIO interface. SD8978 is also known as NXP IW416. If you choose to build it as a module, it will be called mwifiex_sdio.
drivers/net/wireless/marvell/mwifiex/sdio.c +23 -2
@@ -263,7 +263,7 @@ static const struct mwifiex_sdio_card_reg mwifiex_reg_sd8887 = { 0x68, 0x69, 0x6a}, }; -static const struct mwifiex_sdio_card_reg mwifiex_reg_sd8987 = { +static const struct mwifiex_sdio_card_reg mwifiex_reg_sd89xx = { .start_rd_port =0 , .start_wr_port =0 , .base_0_reg =0xF8 ,
@@ -394,6 +394,22 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8977 = { .can_ext_scan = true, }; +static const struct mwifiex_sdio_device mwifiex_sdio_sd8978 = { + .firmware_sdiouart =SD8978_SDIOUART_FW_NAME , + .reg = &mwifiex_reg_sd89xx, + .max_ports =32 , + .mp_agg_pkt_limit =16 , + .tx_buf_size =MWIFIEX_TX_DATA_BUF_SIZE_4K , + .mp_tx_agg_buf_size =MWIFIEX_MP_AGGR_BUF_SIZE_MAX , + .mp_rx_agg_buf_size =MWIFIEX_MP_AGGR_BUF_SIZE_MAX , + .supports_sdio_new_mode = true, + .has_control_mask = false, + .can_dump_fw = true, + .fw_dump_enh = true, + .can_auto_tdls = false, + .can_ext_scan = true, +}; +static const struct mwifiex_sdio_device mwifiex_sdio_sd8997 = { .firmware =SD8997_DEFAULT_FW_NAME , .firmware_sdiouart =SD8997_SDIOUART_FW_NAME ,
@@ -428,7 +444,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8887 = {static const struct mwifiex_sdio_device mwifiex_sdio_sd8987 = { .firmware =SD8987_DEFAULT_FW_NAME , - .reg = &mwifiex_reg_sd8987, + .reg = &mwifiex_reg_sd89xx, .max_ports =32 , .mp_agg_pkt_limit =16 , .tx_buf_size =MWIFIEX_TX_DATA_BUF_SIZE_2K ,
@@ -482,7 +498,9 @@ static struct memory_type_mapping mem_type_mapping_tbl[] = {static const struct of_device_id mwifiex_sdio_of_match_table[]__maybe_unused = { { .compatible ="marvell,sd8787" }, { .compatible ="marvell,sd8897" }, + { .compatible ="marvell,sd8978" }, { .compatible ="marvell,sd8997" }, + { .compatible ="nxp,iw416" }, { } };
@@ -920,6 +938,8 @@ static const struct sdio_device_id mwifiex_ids[] = { .driver_data = (unsigned long)&mwifiex_sdio_sd8801}, {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8977_WLAN), .driver_data = (unsigned long)&mwifiex_sdio_sd8977}, + {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8978_WLAN), + .driver_data = (unsigned long)&mwifiex_sdio_sd8978}, {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8987_WLAN), .driver_data = (unsigned long)&mwifiex_sdio_sd8987}, {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8997_WLAN),
@@ -3164,6 +3184,7 @@ MODULE_FIRMWARE(SD8797_DEFAULT_FW_NAME);MODULE_FIRMWARE (SD8897_DEFAULT_FW_NAME );MODULE_FIRMWARE (SD8887_DEFAULT_FW_NAME );MODULE_FIRMWARE (SD8977_DEFAULT_FW_NAME ); +MODULE_FIRMWARE (SD8978_SDIOUART_FW_NAME );MODULE_FIRMWARE (SD8987_DEFAULT_FW_NAME );MODULE_FIRMWARE (SD8997_DEFAULT_FW_NAME );MODULE_FIRMWARE (SD8997_SDIOUART_FW_NAME );
drivers/net/wireless/marvell/mwifiex/sdio.h +1 -0
@@ -25,6 +25,7 @@#define SD8887_DEFAULT_FW_NAME "mrvl/sd8887_uapsta.bin"#define SD8801_DEFAULT_FW_NAME "mrvl/sd8801_uapsta.bin"#define SD8977_DEFAULT_FW_NAME "mrvl/sdsd8977_combo_v2.bin" +#define SD8978_SDIOUART_FW_NAME "mrvl/sdiouartiw416_combo_v0.bin"#define SD8987_DEFAULT_FW_NAME "mrvl/sd8987_uapsta.bin"#define SD8997_DEFAULT_FW_NAME "mrvl/sdsd8997_combo_v4.bin"#define SD8997_SDIOUART_FW_NAME "mrvl/sdiouart8997_combo_v4.bin"
include/linux/mmc/sdio_ids.h +1 -0
@@ -102,6 +102,7 @@#define SDIO_DEVICE_ID_MARVELL_8977_BT 0x9146#define SDIO_DEVICE_ID_MARVELL_8987_WLAN 0x9149#define SDIO_DEVICE_ID_MARVELL_8987_BT 0x914a +#define SDIO_DEVICE_ID_MARVELL_8978_WLAN 0x9159#define SDIO_VENDOR_ID_MEDIATEK 0x037a#define SDIO_DEVICE_ID_MEDIATEK_MT7663 0x7663
Signature · 1 line
2.43.0
Re: [PATCH 6.1 174/197] wifi: mwifiex: Support SD8978 chipset
Quoted 24 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Wunner <[email protected]>
[ Upstream commit
bba047f15851c8b053221f1b276eb7682d59f755]The Marvell SD8978 (aka NXP IW416) uses identical registers as SD8987, so reuse the existing
mwifiex_reg_sd8987definition.Note that
mwifiex_reg_sd8977andmwifiex_reg_sd8997are likewise identical, save for thefw_dump_ctrlregister: They define it as0xf0whereasmwifiex_reg_sd8987defines it as0xf9. I've verified that0xf9is the correct value on SD8978. NXP's out-of-tree driver uses0xf9for all of them, so there's a chance that0xf0is not correct in themwifiex_reg_sd8977andmwifiex_reg_sd8997definitions. I cannot test that for lack of hardware, hence am leaving it as is.NXP has only released a firmware which runs Bluetooth over UART. Perhaps Bluetooth over SDIO is unsupported by this chipset. Consequently, only an "sdiouart" firmware image is referenced, not an alternative "sdsd" image.
Quoted 4 lines
Signed-off-by Lukas Wunner <[email protected]>Signed-off-by Kalle Valo <[email protected]>Stable-dep-of:
1c5d463c0770("wifi: mwifiex: add extra delay for firmware ready")
I would drop this and 1c5d463c0770.
Thanks,
Francesco
Greg Kroah-Hartman
maintainerRe: [PATCH 6.1 174/197] wifi: mwifiex: Support SD8978 chipset
Quoted 25 lines · Francesco Dolcini
Quoted 24 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Wunner <[email protected]>
[ Upstream commit
bba047f15851c8b053221f1b276eb7682d59f755]The Marvell SD8978 (aka NXP IW416) uses identical registers as SD8987, so reuse the existing
mwifiex_reg_sd8987definition.Note that
mwifiex_reg_sd8977andmwifiex_reg_sd8997are likewise identical, save for thefw_dump_ctrlregister: They define it as0xf0whereasmwifiex_reg_sd8987defines it as0xf9. I've verified that0xf9is the correct value on SD8978. NXP's out-of-tree driver uses0xf9for all of them, so there's a chance that0xf0is not correct in themwifiex_reg_sd8977andmwifiex_reg_sd8997definitions. I cannot test that for lack of hardware, hence am leaving it as is.NXP has only released a firmware which runs Bluetooth over UART. Perhaps Bluetooth over SDIO is unsupported by this chipset. Consequently, only an "sdiouart" firmware image is referenced, not an alternative "sdsd" image.
Quoted 6 lines
Quoted 4 lines
Signed-off-by Lukas Wunner <[email protected]>Signed-off-by Kalle Valo <[email protected]>Stable-dep-of:
1c5d463c0770("wifi: mwifiex: add extra delay for firmware ready")I would drop this and
1c5d463c0770.
Why? Commit 1c5d463c0770 was explicitly tagged for stable inclusion, what changed?
thanks,
greg k-h
Re: [PATCH 6.1 174/197] wifi: mwifiex: Support SD8978 chipset
Quoted 31 lines · Greg Kroah-Hartman
Quoted 30 lines · Francesco Dolcini
Quoted 28 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Wunner <[email protected]>
[ Upstream commit
bba047f15851c8b053221f1b276eb7682d59f755]The Marvell SD8978 (aka NXP IW416) uses identical registers as SD8987, so reuse the existing
mwifiex_reg_sd8987definition.Note that
mwifiex_reg_sd8977andmwifiex_reg_sd8997are likewise identical, save for thefw_dump_ctrlregister: They define it as0xf0whereasmwifiex_reg_sd8987defines it as0xf9. I've verified that0xf9is the correct value on SD8978. NXP's out-of-tree driver uses0xf9for all of them, so there's a chance that0xf0is not correct in themwifiex_reg_sd8977andmwifiex_reg_sd8997definitions. I cannot test that for lack of hardware, hence am leaving it as is.NXP has only released a firmware which runs Bluetooth over UART. Perhaps Bluetooth over SDIO is unsupported by this chipset. Consequently, only an "sdiouart" firmware image is referenced, not an alternative "sdsd" image.
Signed-off-by Lukas Wunner <[email protected]>Signed-off-by Kalle Valo <[email protected]>Stable-dep-of:
1c5d463c0770("wifi: mwifiex: add extra delay for firmware ready")
Quoted 4 lines
Quoted 1 line
I would drop this and
1c5d463c0770.Why? Commit
1c5d463c0770was explicitly tagged for stable inclusion, what changed?
1c5d463c0770 is a fix for bba047f15851c8b053221f1b276eb7682d59f755.
So there is no bug, unless bba047f15851c8b053221f1b276eb7682d59f755 is there.
The mistake that we did at that time is that it should have been
Sorry about that.
Francesco
Greg Kroah-Hartman
maintainerRe: [PATCH 6.1 174/197] wifi: mwifiex: Support SD8978 chipset
Quoted 34 lines · Francesco Dolcini
Quoted 33 lines · Greg Kroah-Hartman
Quoted 31 lines · Francesco Dolcini
Quoted 24 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Wunner <[email protected]>
[ Upstream commit
bba047f15851c8b053221f1b276eb7682d59f755]The Marvell SD8978 (aka NXP IW416) uses identical registers as SD8987, so reuse the existing
mwifiex_reg_sd8987definition.Note that
mwifiex_reg_sd8977andmwifiex_reg_sd8997are likewise identical, save for thefw_dump_ctrlregister: They define it as0xf0whereasmwifiex_reg_sd8987defines it as0xf9. I've verified that0xf9is the correct value on SD8978. NXP's out-of-tree driver uses0xf9for all of them, so there's a chance that0xf0is not correct in themwifiex_reg_sd8977andmwifiex_reg_sd8997definitions. I cannot test that for lack of hardware, hence am leaving it as is.NXP has only released a firmware which runs Bluetooth over UART. Perhaps Bluetooth over SDIO is unsupported by this chipset. Consequently, only an "sdiouart" firmware image is referenced, not an alternative "sdsd" image.
Quoted 4 lines
Signed-off-by Lukas Wunner <[email protected]>Signed-off-by Kalle Valo <[email protected]>Stable-dep-of:
1c5d463c0770("wifi: mwifiex: add extra delay for firmware ready")I would drop this and
1c5d463c0770.
Quoted 7 lines
Quoted 2 lines
Why? Commit
1c5d463c0770was explicitly tagged for stable inclusion, what changed?
1c5d463c0770is a fix forbba047f15851c8b053221f1b276eb7682d59f755.So there is no bug, unless
bba047f15851c8b053221f1b276eb7682d59f755is there.
It is.
Quoted 4 lines
The mistake that we did at that time is that it should have been
Fixes bba047f15851 ("wifi: mwifiex: Support SD8978 chipset")
Great, that commit is currently in:
6.3 queue-5.10 queue-5.15 queue-6.1
so all is good.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 175/197 wifi: mwifiex: add extra delay for firmware ready
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Lin <[email protected]>
[ Upstream commit 1c5d463c0770c6fa2037511a24fb17966fd07d97 ]
For SDIO IW416, due to a bug, FW may return ready before complete full initialization. Command timeout may occur at driver load after reboot. Workaround by adding 100ms delay at checking FW status.
--- drivers/net/wireless/marvell/mwifiex/sdio.c | 19 +++++++++++++++++++ drivers/net/wireless/marvell/mwifiex/sdio.h | 2 ++ 2 files changed, 21 insertions(+)
drivers/net/wireless/marvell/mwifiex/sdio.c +19 -0
@@ -331,6 +331,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8786 = { .can_dump_fw = false, .can_auto_tdls = false, .can_ext_scan = false, + .fw_ready_extra_delay = false, };static const struct mwifiex_sdio_device mwifiex_sdio_sd8787 = {
@@ -346,6 +347,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8787 = { .can_dump_fw = false, .can_auto_tdls = false, .can_ext_scan = true, + .fw_ready_extra_delay = false, };static const struct mwifiex_sdio_device mwifiex_sdio_sd8797 = {
@@ -361,6 +363,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8797 = { .can_dump_fw = false, .can_auto_tdls = false, .can_ext_scan = true, + .fw_ready_extra_delay = false, };static const struct mwifiex_sdio_device mwifiex_sdio_sd8897 = {
@@ -376,6 +379,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8897 = { .can_dump_fw = true, .can_auto_tdls = false, .can_ext_scan = true, + .fw_ready_extra_delay = false, };static const struct mwifiex_sdio_device mwifiex_sdio_sd8977 = {
@@ -392,6 +396,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8977 = { .fw_dump_enh = true, .can_auto_tdls = false, .can_ext_scan = true, + .fw_ready_extra_delay = false, };static const struct mwifiex_sdio_device mwifiex_sdio_sd8978 = {
@@ -408,6 +413,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8978 = { .fw_dump_enh = true, .can_auto_tdls = false, .can_ext_scan = true, + .fw_ready_extra_delay = true, };static const struct mwifiex_sdio_device mwifiex_sdio_sd8997 = {
@@ -425,6 +431,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8997 = { .fw_dump_enh = true, .can_auto_tdls = false, .can_ext_scan = true, + .fw_ready_extra_delay = false, };static const struct mwifiex_sdio_device mwifiex_sdio_sd8887 = {
@@ -440,6 +447,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8887 = { .can_dump_fw = false, .can_auto_tdls = true, .can_ext_scan = true, + .fw_ready_extra_delay = false, };static const struct mwifiex_sdio_device mwifiex_sdio_sd8987 = {
@@ -456,6 +464,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8987 = { .fw_dump_enh = true, .can_auto_tdls = true, .can_ext_scan = true, + .fw_ready_extra_delay = false, };static const struct mwifiex_sdio_device mwifiex_sdio_sd8801 = {
@@ -471,6 +480,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8801 = { .can_dump_fw = false, .can_auto_tdls = false, .can_ext_scan = true, + .fw_ready_extra_delay = false, };static struct memory_type_mapping generic_mem_type_map[] = {
@@ -563,6 +573,7 @@ mwifiex_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id) card->fw_dump_enh = data->fw_dump_enh; card->can_auto_tdls = data->can_auto_tdls; card->can_ext_scan = data->can_ext_scan; + card->fw_ready_extra_delay = data->fw_ready_extra_delay;INIT_WORK (&card->work, mwifiex_sdio_work); }
@@ -766,6 +777,7 @@ mwifiex_sdio_read_fw_status(struct mwifiex_adapter *adapter, u16 *dat)static int mwifiex_check_fw_status (struct mwifiex_adapter *adapter,u32 poll_num) { +struct sdio_mmc_card *card = adapter->card;int ret =0 ;u16 firmware_stat;u32 tries;
@@ -783,6 +795,13 @@ static int mwifiex_check_fw_status(struct mwifiex_adapter *adapter, ret =-1 ; } +if (card->fw_ready_extra_delay && + firmware_stat ==FIRMWARE_READY_SDIO ) +/* firmware might pretend to be ready, when it's not. +* Wait a little bit more as a workaround. +*/ +msleep (100 ); +return ret; }
drivers/net/wireless/marvell/mwifiex/sdio.h +2 -0
@@ -258,6 +258,7 @@ struct sdio_mmc_card {bool fw_dump_enh;bool can_auto_tdls;bool can_ext_scan; +bool fw_ready_extra_delay;struct mwifiex_sdio_mpa_tx mpa_tx;struct mwifiex_sdio_mpa_rx mpa_rx;
@@ -281,6 +282,7 @@ struct mwifiex_sdio_device {bool fw_dump_enh;bool can_auto_tdls;bool can_ext_scan; +bool fw_ready_extra_delay; };/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 176/197 bus: moxtet: Add spi device table
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sjoerd Simons <[email protected]>
[ Upstream commit aaafe88d5500ba18b33be72458439367ef878788 ]
The moxtet module fails to auto-load on. Add a SPI id table to allow it to do so.
--- drivers/bus/moxtet.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/bus/moxtet.c +7 -0
@@ -830,6 +830,12 @@ static void moxtet_remove(struct spi_device *spi)mutex_destroy (&moxtet->lock); } +static const struct spi_device_id moxtet_spi_ids[] = { + {"moxtet" }, + { }, +}; +MODULE_DEVICE_TABLE (spi, moxtet_spi_ids); +static const struct of_device_id moxtet_dt_ids[] = { { .compatible ="cznic,moxtet" }, {},
@@ -841,6 +847,7 @@ static struct spi_driver moxtet_spi_driver = { .name = "moxtet", .of_match_table = moxtet_dt_ids, }, + .id_table = moxtet_spi_ids, .probe = moxtet_probe, .remove = moxtet_remove, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 177/197 arm64: dts: qcom: msm8916: Enable blsp_dma by default
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephan Gerhold <[email protected]>
[ Upstream commit 0154d3594af3c198532ac7b4ab70f50fb5207a15 ]
Adding the "dmas" to the I2C controllers prevents probing them if blsp_dma is disabled (infinite probe deferral). Avoid this by enabling blsp_dma by default - it's an integral part of the SoC that is almost always used (even if just for UART).
Stable-dep-of: 7c45b6ddbcff ("arm64: dts: qcom: msm8916: Make blsp_dma controlled-remotely")
--- arch/arm64/boot/dts/qcom/apq8016-sbc.dts | 4 ---- arch/arm64/boot/dts/qcom/msm8916.dtsi | 1 - 2 files changed, 5 deletions(-)
arch/arm64/boot/dts/qcom/apq8016-sbc.dts +0 -4
@@ -169,10 +169,6 @@ led@6 { }; }; -&blsp_dma { - status = "okay"; -}; - &blsp_i2c2 { /* On Low speed expansion */ status = "okay";
arch/arm64/boot/dts/qcom/msm8916.dtsi +0 -1
@@ -1522,7 +1522,6 @@ blsp_dma: dma-controller@7884000 { clock-names = "bam_clk"; #dma-cells = <1>; qcom,ee = <0>; - status = "disabled"; }; blsp1_uart1: serial@78af000 {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 178/197 arm64: dts: qcom: msm8916: Make blsp_dma controlled-remotely
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephan Gerhold <[email protected]>
[ Upstream commit 7c45b6ddbcff01f9934d11802010cfeb0879e693 ]
The blsp_dma controller is shared between the different subsystems, which is why it is already initialized by the firmware. We should not reinitialize it from Linux to avoid potential other users of the DMA engine to misbehave.
In mainline this can be described using the "qcom,controlled-remotely" property. In the downstream/vendor kernel from Qualcomm there is an opposite "qcom,managed-locally" property. This property is *not* set for the qcom,sps-dma@7884000 [1] so adding "qcom,controlled-remotely" upstream matches the behavior of the downstream/vendor kernel.
Adding this seems to fix some weird issues with UART where both input/output becomes garbled with certain obscure firmware versions on some devices.
--- arch/arm64/boot/dts/qcom/msm8916.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm64/boot/dts/qcom/msm8916.dtsi +1 -0
@@ -1522,6 +1522,7 @@ blsp_dma: dma-controller@7884000 { clock-names = "bam_clk"; #dma-cells = <1>; qcom,ee = <0>; + qcom,controlled-remotely; }; blsp1_uart1: serial@78af000 {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 179/197 arm64: dts: qcom: sdm845: fix USB SS wakeup
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
[ Upstream commit 971f5d8b0618d09db75184ddd8cca0767514db5d ]
The USB SS PHY interrupts need to be provided by the PDC interrupt controller in order to be able to wake the system up from low-power states.
--- arch/arm64/boot/dts/qcom/sdm845.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/qcom/sdm845.dtsi +2 -2
@@ -4049,7 +4049,7 @@ usb_1: usb@a6f8800 { assigned-clock-rates = <19200000>, <150000000>; interrupts-extended = <&intc GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>, - <&intc GIC_SPI 486 IRQ_TYPE_LEVEL_HIGH>, + <&pdc_intc 6 IRQ_TYPE_LEVEL_HIGH>, <&pdc_intc 8 IRQ_TYPE_EDGE_BOTH>, <&pdc_intc 9 IRQ_TYPE_EDGE_BOTH>; interrupt-names = "hs_phy_irq", "ss_phy_irq",
@@ -4100,7 +4100,7 @@ usb_2: usb@a8f8800 { assigned-clock-rates = <19200000>, <150000000>; interrupts-extended = <&intc GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>, - <&intc GIC_SPI 487 IRQ_TYPE_LEVEL_HIGH>, + <&pdc_intc 7 IRQ_TYPE_LEVEL_HIGH>, <&pdc_intc 10 IRQ_TYPE_EDGE_BOTH>, <&pdc_intc 11 IRQ_TYPE_EDGE_BOTH>; interrupt-names = "hs_phy_irq", "ss_phy_irq",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 180/197 arm64: dts: qcom: sm8150: fix USB SS wakeup
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
[ Upstream commit cc4e1da491b84ca05339a19893884cda78f74aef ]
The USB SS PHY interrupts need to be provided by the PDC interrupt controller in order to be able to wake the system up from low-power states.
--- arch/arm64/boot/dts/qcom/sm8150.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/qcom/sm8150.dtsi +2 -2
@@ -3629,7 +3629,7 @@ usb_1: usb@a6f8800 { assigned-clock-rates = <19200000>, <200000000>; interrupts-extended = <&intc GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>, - <&intc GIC_SPI 486 IRQ_TYPE_LEVEL_HIGH>, + <&pdc 6 IRQ_TYPE_LEVEL_HIGH>, <&pdc 8 IRQ_TYPE_EDGE_BOTH>, <&pdc 9 IRQ_TYPE_EDGE_BOTH>; interrupt-names = "hs_phy_irq", "ss_phy_irq",
@@ -3678,7 +3678,7 @@ usb_2: usb@a8f8800 { assigned-clock-rates = <19200000>, <200000000>; interrupts-extended = <&intc GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>, - <&intc GIC_SPI 487 IRQ_TYPE_LEVEL_HIGH>, + <&pdc 7 IRQ_TYPE_LEVEL_HIGH>, <&pdc 10 IRQ_TYPE_EDGE_BOTH>, <&pdc 11 IRQ_TYPE_EDGE_BOTH>; interrupt-names = "hs_phy_irq", "ss_phy_irq",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 181/197 wifi: mwifiex: fix uninitialized firmware_stat
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Lin <[email protected]>
[ Upstream commit 3df95e265924ac898c1a38a0c01846dd0bd3b354 ]
Variable firmware_stat is possible to be used without initialization.
--- drivers/net/wireless/marvell/mwifiex/sdio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/marvell/mwifiex/sdio.c +1 -1
@@ -779,7 +779,7 @@ static int mwifiex_check_fw_status(struct mwifiex_adapter *adapter, {struct sdio_mmc_card *card = adapter->card;int ret =0 ; -u16 firmware_stat; +u16 firmware_stat =0 ;u32 tries;for (tries =0 ; tries < poll_num; tries++) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 182/197 crypto: lib/mpi - Fix unexpected pointer access in mpi_ec_init
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tianjia Zhang <[email protected]>
[ Upstream commit ba3c5574203034781ac4231acf117da917efcd2a ]
When the mpi_ec_ctx structure is initialized, some fields are not cleared, causing a crash when referencing the field when the structure was released. Initially, this issue was ignored because memory for mpi_ec_ctx is allocated with the __GFP_ZERO flag. For example, this error will be triggered when calculating the Za value for SM2 separately.
--- lib/mpi/ec.c | 3 +++ 1 file changed, 3 insertions(+)
lib/mpi/ec.c +3 -0
@@ -584,6 +584,9 @@ void mpi_ec_init(struct mpi_ec_ctx *ctx, enum gcry_mpi_ec_models model, ctx->a =mpi_copy (a); ctx->b =mpi_copy (b); + ctx->d =NULL ; + ctx->t.two_inv_p =NULL ; + ctx->t.p_barrett = use_barrett >0 ?mpi_barrett_init (ctx->p,0 ) :NULL ;mpi_ec_get_reset (ctx);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 183/197 block: fix partial zone append completion handling in req_bio_endio()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Damien Le Moal <[email protected]>
[ Upstream commit 748dc0b65ec2b4b7b3dbd7befcc4a54fdcac7988 ]
Partial completions of zone append request is not allowed but if a zone append completion indicates a number of completed bytes different from the original BIO size, only the BIO status is set to error. This leads to bio_advance() not setting the BIO size to 0 and thus to not call bio_endio() at the end of req_bio_endio().
Make sure a partially completed zone append is failed and completed immediately by forcing the completed number of bytes (nbytes) to be equal to the BIO size, thus ensuring that bio_endio() is called.
--- block/blk-mq.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
block/blk-mq.c +7 -2
@@ -747,11 +747,16 @@ static void req_bio_endio(struct request *rq, struct bio *bio,/* * Partial zone append completions cannot be supported as the * BIO fragments may end up not being written sequentially. +* For such case, force the completed nbytes to be equal to +* the BIO size so that bio_advance() sets the BIO remaining +* size to 0 and we end up calling bio_endio() before returning. */ -if (bio->bi_iter.bi_size != nbytes) +if (bio->bi_iter.bi_size != nbytes) { bio->bi_status =BLK_STS_IOERR ; -else + nbytes = bio->bi_iter.bi_size; + }else { bio->bi_iter.bi_sector = rq->__sector; + } }bio_advance (bio, nbytes);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 184/197 netfilter: ipset: fix performance regression in swap operation
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jozsef Kadlecsik <[email protected]>
commit 97f7cf1cd80eeed3b7c808b7c12463295c751001 upstream.
The patch "netfilter: ipset: fix race condition between swap/destroy and kernel side add/del/test", commit 28628fa9 fixes a race condition. But the synchronize_rcu() added to the swap function unnecessarily slows it down: it can safely be moved to destroy and use call_rcu() instead.
Eric Dumazet pointed out that simply calling the destroy functions as rcu callback does not work: sets with timeout use garbage collectors which need cancelling at destroy which can wait. Therefore the destroy functions are split into two: cancelling garbage collectors safely at executing the command received by netlink and moving the remaining part only into the rcu callback.
--- include/linux/netfilter/ipset/ip_set.h | 4 +++ net/netfilter/ipset/ip_set_bitmap_gen.h | 14 +++++++++--- net/netfilter/ipset/ip_set_core.c | 37 ++++++++++++++++++++++++-------- net/netfilter/ipset/ip_set_hash_gen.h | 15 ++++++++++-- net/netfilter/ipset/ip_set_list_set.c | 13 ++++++++--- 5 files changed, 65 insertions(+), 18 deletions(-)
include/linux/netfilter/ipset/ip_set.h +4 -0
@@ -186,6 +186,8 @@ struct ip_set_type_variant {/* Return true if "b" set is the same as "a" * according to the create set parameters */ bool (*same_set)(const struct ip_set *a,const struct ip_set *b); +/* Cancel ongoing garbage collectors before destroying the set*/ +void (*cancel_gc)(struct ip_set *set);/* Region-locking is used */ bool region_lock; };
@@ -242,6 +244,8 @@ extern void ip_set_type_unregister(struc/* A generic IP set */ struct ip_set { +/* For call_cru in destroy */ +struct rcu_head rcu;/* The name of the set */ char name[IPSET_MAXNAMELEN ];/* Lock protecting the set data */
net/netfilter/ipset/ip_set_bitmap_gen.h +11 -3
@@ -28,6 +28,7 @@#define mtype_del IPSET_TOKEN(MTYPE, _del)#define mtype_list IPSET_TOKEN(MTYPE, _list)#define mtype_gc IPSET_TOKEN(MTYPE, _gc) +#define mtype_cancel_gc IPSET_TOKEN(MTYPE, _cancel_gc)#define mtype MTYPE#define get_ext (set, map, id) ((map)->extensions + ((set)->dsize * (id)))
@@ -57,9 +58,6 @@ mtype_destroy(struct ip_set *set) {struct mtype *map = set->data; -if (SET_WITH_TIMEOUT (set)) -del_timer_sync (&map->gc); -if (set->dsize && set->extensions &IPSET_EXT_DESTROY )mtype_ext_cleanup (set);ip_set_free (map->members);
@@ -288,6 +286,15 @@ mtype_gc(struct timer_list *t)add_timer (&map->gc); } +static void +mtype_cancel_gc (struct ip_set *set) +{ +struct mtype *map = set->data; + +if (SET_WITH_TIMEOUT (set)) +del_timer_sync (&map->gc); +} +static const struct ip_set_type_variant mtype = { .kadt = mtype_kadt, .uadt = mtype_uadt,
@@ -301,6 +308,7 @@ static const struct ip_set_type_variant .head = mtype_head, .list = mtype_list, .same_set = mtype_same_set, + .cancel_gc = mtype_cancel_gc, };#endif /* __IP_SET_BITMAP_IP_GEN_H */
net/netfilter/ipset/ip_set_core.c +28 -9
@@ -1184,6 +1184,14 @@ ip_set_destroy_set(struct ip_set *set)kfree (set); } +static void +ip_set_destroy_set_rcu (struct rcu_head *head) +{ + struct ip_set *set = container_of(head, struct ip_set, rcu); + +ip_set_destroy_set (set); +} +static int ip_set_destroy (struct sk_buff *skb,const struct nfnl_info *info,const struct nlattr *const attr[]) {
@@ -1195,8 +1203,6 @@ static int ip_set_destroy(struct sk_buffif (unlikely (protocol_min_failed (attr)))return -IPSET_ERR_PROTOCOL ; -/* Must wait for flush to be really finished in list:set */ -rcu_barrier ();/* Commands are serialized and references are * protected by the ip_set_ref_lock.
@@ -1208,8 +1214,10 @@ static int ip_set_destroy(struct sk_buff* counter, so if it's already zero, we can proceed * without holding the lock. */ -read_lock_bh (&ip_set_ref_lock);if (!attr[IPSET_ATTR_SETNAME ]) { +/* Must wait for flush to be really finished in list:set */ +rcu_barrier (); +read_lock_bh (&ip_set_ref_lock);for (i =0 ; i < inst->ip_set_max; i++) { s =ip_set (inst, i);if (s && (s->ref || s->ref_netlink)) {
@@ -1223,6 +1231,8 @@ static int ip_set_destroy(struct sk_buff s =ip_set (inst, i);if (s) {ip_set (inst, i) =NULL ; +/* Must cancel garbage collectors */ + s->variant->cancel_gc (s);ip_set_destroy_set (s); } }
@@ -1230,6 +1240,9 @@ static int ip_set_destroy(struct sk_buff inst->is_destroyed = false; }else {u32 flags =flag_exist (info->nlh); +u16 features =0 ; + +read_lock_bh (&ip_set_ref_lock); s =find_set_and_id (inst,nla_data (attr[IPSET_ATTR_SETNAME ]), &i);if (!s) {
@@ -1240,10 +1253,16 @@ static int ip_set_destroy(struct sk_buff ret = -IPSET_ERR_BUSY ; goto out; } + features = s->type->features;ip_set (inst, i) =NULL ;read_unlock_bh (&ip_set_ref_lock); - -ip_set_destroy_set (s); +if (features &IPSET_TYPE_NAME ) { +/* Must wait for flush to be really finished */ +rcu_barrier (); + } +/* Must cancel garbage collectors */ + s->variant->cancel_gc (s); +call_rcu (&s->rcu, ip_set_destroy_set_rcu); }return 0 ; out:
@@ -1396,9 +1415,6 @@ static int ip_set_swap(struct sk_buff *sip_set (inst, to_id) = from;write_unlock_bh (&ip_set_ref_lock); -/* Make sure all readers of the old set pointers are completed. */ -synchronize_rcu (); -return 0 ; }
@@ -2411,8 +2427,11 @@ ip_set_fini(void) {nf_unregister_sockopt (&so_set);nfnetlink_subsys_unregister (&ip_set_netlink_subsys); -unregister_pernet_subsys (&ip_set_net_ops); + +/* Wait for call_rcu() in destroy */ +rcu_barrier (); +pr_debug ("these are the famous last words\n" ); }
net/netfilter/ipset/ip_set_hash_gen.h +12 -3
@@ -210,6 +210,7 @@ htable_size(u8 hbits)#undef mtype_gc_do#undef mtype_gc#undef mtype_gc_init +#undef mtype_cancel_gc#undef mtype_variant#undef mtype_data_match
@@ -254,6 +255,7 @@ htable_size(u8 hbits)#define mtype_gc_do IPSET_TOKEN(MTYPE, _gc_do)#define mtype_gc IPSET_TOKEN(MTYPE, _gc)#define mtype_gc_init IPSET_TOKEN(MTYPE, _gc_init) +#define mtype_cancel_gc IPSET_TOKEN(MTYPE, _cancel_gc)#define mtype_variant IPSET_TOKEN(MTYPE, _variant)#define mtype_data_match IPSET_TOKEN(MTYPE, _data_match)
@@ -437,9 +439,6 @@ mtype_destroy(struct ip_set *set)struct htype *h = set->data;struct list_head *l, *lt; -if (SET_WITH_TIMEOUT (set)) -cancel_delayed_work_sync (&h->gc.dwork); -mtype_ahash_destroy (set,ipset_dereference_nfnl (h->table), true);list_for_each_safe (l, lt, &h->ad) {list_del (l);
@@ -586,6 +585,15 @@ mtype_gc_init(struct htable_gc *gc)queue_delayed_work (system_power_efficient_wq, &gc->dwork,HZ ); } +static void +mtype_cancel_gc (struct ip_set *set) +{ +struct htype *h = set->data; + +if (SET_WITH_TIMEOUT (set)) +cancel_delayed_work_sync (&h->gc.dwork); +} +static int mtype_add (struct ip_set *set,void *value,const struct ip_set_ext *ext,struct ip_set_ext *mext,u32 flags);
@@ -1416,6 +1424,7 @@ static const struct ip_set_type_variant .uref = mtype_uref, .resize = mtype_resize, .same_set = mtype_same_set, + .cancel_gc = mtype_cancel_gc, .region_lock = true, };
net/netfilter/ipset/ip_set_list_set.c +10 -3
@@ -426,9 +426,6 @@ list_set_destroy(struct ip_set *set)struct list_set *map = set->data;struct set_elem *e, *n; -if (SET_WITH_TIMEOUT (set)) -del_timer_sync (&map->gc); -list_for_each_entry_safe (e, n, &map->members, list) {list_del (&e->list);ip_set_put_byindex (map->net, e->id);
@@ -545,6 +542,15 @@ list_set_same_set(const struct ip_set *a a->extensions == b->extensions; } +static void +list_set_cancel_gc (struct ip_set *set) +{ +struct list_set *map = set->data; + +if (SET_WITH_TIMEOUT (set)) +del_timer_sync (&map->gc); +} +static const struct ip_set_type_variant set_variant = { .kadt = list_set_kadt, .uadt = list_set_uadt,
@@ -558,6 +564,7 @@ static const struct ip_set_type_variant .head = list_set_head, .list = list_set_list, .same_set = list_set_same_set, + .cancel_gc = list_set_cancel_gc, }; static void
Greg Kroah-Hartman
maintainerPATCH 185/197 netfilter: ipset: Missing gc cancellations fixed
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jozsef Kadlecsik <[email protected]>
commit 27c5a095e2518975e20a10102908ae8231699879 upstream.
The patch fdb8e12cc2cc ("netfilter: ipset: fix performance regression in swap operation") missed to add the calls to gc cancellations at the error path of create operations and at module unload. Also, because the half of the destroy operations now executed by a function registered by call_rcu(), neither NFNL_SUBSYS_IPSET mutex or rcu read lock is held and therefore the checking of them results false warnings.
--- net/netfilter/ipset/ip_set_core.c | 2 ++ net/netfilter/ipset/ip_set_hash_gen.h | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-)
net/netfilter/ipset/ip_set_core.c +2 -0
@@ -1156,6 +1156,7 @@ static int ip_set_create(struct sk_buffreturn ret; cleanup: + set->variant->cancel_gc (set); set->variant->destroy (set); put_out:module_put (set->type->me);
@@ -2380,6 +2381,7 @@ ip_set_net_exit(struct net *net) set =ip_set (inst, i);if (set) {ip_set (inst, i) =NULL ; + set->variant->cancel_gc (set);ip_set_destroy_set (set); } }
net/netfilter/ipset/ip_set_hash_gen.h +2 -2
@@ -419,7 +419,7 @@ mtype_ahash_destroy(struct ip_set *set,u32 i;for (i =0 ; i <jhash_size (t->htable_bits); i++) { - n =__ipset_dereference (hbucket (t, i)); + n = (__force struct hbucket *)hbucket (t, i);if (!n)continue ;if (set->extensions &IPSET_EXT_DESTROY && ext_destroy)
@@ -439,7 +439,7 @@ mtype_destroy(struct ip_set *set)struct htype *h = set->data;struct list_head *l, *lt; -mtype_ahash_destroy (set,ipset_dereference_nfnl (h->table), true); +mtype_ahash_destroy (set, (__force struct htable *)h->table, true);list_for_each_safe (l, lt, &h->ad) {list_del (l);kfree (l);
Greg Kroah-Hartman
maintainerPATCH 186/197 parisc: Fix random data corruption from exception handler
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Helge Deller <[email protected]>
commit 8b1d72395635af45410b66cc4c4ab37a12c4a831 upstream.
The current exception handler implementation, which assists when accessing user space memory, may exhibit random data corruption if the compiler decides to use a different register than the specified register %r29 (defined in ASM_EXCEPTIONTABLE_REG) for the error code. If the compiler choose another register, the fault handler will nevertheless store -EFAULT into %r29 and thus trash whatever this register is used for.
Looking at the assembly I found that this happens sometimes in emulate_ldd().
To solve the issue, the easiest solution would be if it somehow is possible to tell the fault handler which register is used to hold the error code. Using %0 or %1 in the inline assembly is not posssible as it will show up as e.g. %r29 (with the "%r" prefix), which the GNU assembler can not convert to an integer.
This patch takes another, better and more flexible approach:
We extend the __ex_table (which is out of the execution path) by one 32-word. In this word we tell the compiler to insert the assembler instruction "or %r0,%r0,%reg", where %reg references the register which the compiler choosed for the error return code.
In case of an access failure, the fault handler finds the __ex_table entry and can examine the opcode. The used register is encoded in the lowest 5 bits, and the fault handler can then store -EFAULT into this register.
Since we extend the __ex_table to 3 words we can't use the BUILDTIME_TABLE_SORT config option any longer.
---
--- arch/parisc/Kconfig | 1 arch/parisc/include/asm/assembly.h | 1 arch/parisc/include/asm/extable.h | 64 ++++++++++++++++++++++++++++++++ arch/parisc/include/asm/special_insns.h | 6 ++- arch/parisc/include/asm/uaccess.h | 48 +++--------------------- arch/parisc/kernel/unaligned.c | 44 +++++++++++----------- arch/parisc/mm/fault.c | 11 ++++- 7 files changed, 106 insertions(+), 69 deletions(-)
arch/parisc/Kconfig +0 -1
@@ -24,7 +24,6 @@ config PARISC select RTC_DRV_GENERIC select INIT_ALL_POSSIBLE select BUG - select BUILDTIME_TABLE_SORT select HAVE_PCI select HAVE_PERF_EVENTS select HAVE_KERNEL_BZIP2
arch/parisc/include/asm/assembly.h +1 -0
@@ -576,6 +576,7 @@ .section __ex_table,"aw" ! \ .align 4 ! \ .word (fault_addr - .), (except_addr - .) ! \ + or %r0,%r0,%r0 ! \ .previous
arch/parisc/include/asm/extable.h new file +64 -0
64 lines not on this page · raw message
arch/parisc/include/asm/special_insns.h +4 -2
@@ -8,7 +8,8 @@"copy %%r0,%0\n" \"8:\tlpa %%r0(%1),%0\n" \"9:\n" \ -ASM_EXCEPTIONTABLE_ENTRY (8b ,9b ) \ +ASM_EXCEPTIONTABLE_ENTRY (8b ,9b , \ +"or %%r0,%%r0,%%r0" ) \ : "=&r" (pa) \: " r" (va) \ : " memory" \
@@ -22,7 +23,8 @@"copy %%r0,%0\n" \"8:\tlpa %%r0(%%sr3,%1),%0\n" \"9:\n" \ -ASM_EXCEPTIONTABLE_ENTRY (8b ,9b ) \ +ASM_EXCEPTIONTABLE_ENTRY (8b ,9b , \ +"or %%r0,%%r0,%%r0" ) \ : "=&r" (pa) \: " r" (va) \ : " memory" \
arch/parisc/include/asm/uaccess.h +7 -41
94 lines not on this page · raw message
arch/parisc/kernel/unaligned.c +22 -22
92 lines not on this page · raw message
arch/parisc/mm/fault.c +8 -3
@@ -150,11 +150,16 @@ int fixup_exception(struct pt_regs *regs* Fix up get_user() and put_user(). * ASM_EXCEPTIONTABLE_ENTRY_EFAULT() sets the least-significant * bit in the relative address of the fixup routine to indicate -* that gr[ASM_EXCEPTIONTABLE_REG] should be loaded with -* -EFAULT to report a userspace access error. +* that the register encoded in the "or %r0,%r0,register" +* opcode should be loaded with -EFAULT to report a userspace +* access error. */ if (fix->fixup &1 ) { - regs->gr[ASM_EXCEPTIONTABLE_REG ] = -EFAULT ; +int fault_error_reg = fix->err_opcode &0x1f ; +if (!WARN_ON (!fault_error_reg)) + regs->gr[fault_error_reg] = -EFAULT ; +pr_debug ("Unalignment fixup of register %d at %pS\n" , + fault_error_reg, (void *)regs->iaoq[0 ]);/* zero target register for get_user() */ if (parisc_acctyp (0 , regs->iir) ==VM_READ ) {
Greg Kroah-Hartman
maintainerPATCH 187/197 nfsd: fix RELEASE_LOCKOWNER
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
[ Upstream commit edcf9725150e42beeca42d085149f4c88fa97afd ]
The test on so_count in nfsd4_release_lockowner() is nonsense and harmful. Revert to using check_for_locks(), changing that to not sleep.
First: harmful.
As is documented in the kdoc comment for nfsd4_release_lockowner(), the test on so_count can transiently return a false positive resulting in a return of NFS4ERR_LOCKS_HELD when in fact no locks are held. This is clearly a protocol violation and with the Linux NFS client it can cause incorrect behaviour.
If RELEASE_LOCKOWNER is sent while some other thread is still processing a LOCK request which failed because, at the time that request was received, the given owner held a conflicting lock, then the nfsd thread processing that LOCK request can hold a reference (conflock) to the lock owner that causes nfsd4_release_lockowner() to return an incorrect error.
The Linux NFS client ignores that NFS4ERR_LOCKS_HELD error because it never sends NFS4_RELEASE_LOCKOWNER without first releasing any locks, so it knows that the error is impossible. It assumes the lock owner was in fact released so it feels free to use the same lock owner identifier in some later locking request.
When it does reuse a lock owner identifier for which a previous RELEASE failed, it will naturally use a lock_seqid of zero. However the server, which didn't release the lock owner, will expect a larger lock_seqid and so will respond with NFS4ERR_BAD_SEQID.
So clearly it is harmful to allow a false positive, which testing so_count allows.
The test is nonsense because ... well... it doesn't mean anything.
so_count is the sum of three different counts.
1/ the set of states listed on so_stateids
2/ the set of active vfs locks owned by any of those states 3/ various transient counts such as for conflicting locks.
When it is tested against '2' it is clear that one of these is the transient reference obtained by find_lockowner_str_locked(). It is not clear what the other one is expected to be.
In practice, the count is often 2 because there is precisely one state on so_stateids. If there were more, this would fail.
In my testing I see two circumstances when RELEASE_LOCKOWNER is called. In one case, CLOSE is called before RELEASE_LOCKOWNER. That results in all the lock states being removed, and so the lockowner being discarded (it is removed when there are no more references which usually happens when the lock state is discarded). When nfsd4_release_lockowner() finds that the lock owner doesn't exist, it returns success.
The other case shows an so_count of '2' and precisely one state listed in so_stateid. It appears that the Linux client uses a separate lock owner for each file resulting in one lock state per lock owner, so this test on '2' is safe. For another client it might not be safe.
So this patch changes check_for_locks() to use the (newish) find_any_file_locked() so that it doesn't take a reference on the nfs4_file and so never calls nfsd_file_put(), and so never sleeps. With this check is it safe to restore the use of check_for_locks() rather than testing so_count against the mysterious '2'.
--- fs/nfsd/nfs4state.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-)
fs/nfsd/nfs4state.c +15 -11
@@ -7736,14 +7736,16 @@ check_for_locks(struct nfs4_file *fp, st {struct file_lock *fl;int status = false; -struct nfsd_file *nf =find_any_file (fp); +struct nfsd_file *nf;struct inode *inode;struct file_lock_context *flctx; +spin_lock (&fp->fi_lock); + nf =find_any_file_locked (fp);if (!nf) {/* Any valid lock stateid should have some sort of access */ WARN_ON_ONCE (1 ); -return status; + goto out; } inode =locks_inode (nf->nf_file);
@@ -7759,7 +7761,8 @@ check_for_locks(struct nfs4_file *fp, st }spin_unlock (&flctx->flc_lock); } -nfsd_file_put (nf); +out: +spin_unlock (&fp->fi_lock);return status; }
@@ -7769,10 +7772,8 @@ check_for_locks(struct nfs4_file *fp, st* @cstate: NFSv4 COMPOUND state * @u: RELEASE_LOCKOWNER arguments * -* The lockowner's so_count is bumped when a lock record is added -* or when copying a conflicting lock. The latter case is brief, -* but can lead to fleeting false positives when looking for -* locks-in-use. +* Check if theree are any locks still held and if not - free the lockowner +* and any lock state that is owned. * * Return values: * %nfs_ok: lockowner released or not found
@@ -7808,10 +7809,13 @@ nfsd4_release_lockowner(struct svc_rqstspin_unlock (&clp->cl_lock);return nfs_ok; } -if (atomic_read (&lo->lo_owner.so_count) !=2 ) { -spin_unlock (&clp->cl_lock); -nfs4_put_stateowner (&lo->lo_owner); -return nfserr_locks_held; + +list_for_each_entry (stp, &lo->lo_owner.so_stateids, st_perstateowner) { +if (check_for_locks (stp->st_stid.sc_file, lo)) { +spin_unlock (&clp->cl_lock); +nfs4_put_stateowner (&lo->lo_owner); +return nfserr_locks_held; + } }unhash_lockowner_locked (lo);while (!list_empty (&lo->lo_owner.so_stateids)) {
Greg Kroah-Hartman
maintainerPATCH 188/197 nfsd: dont take fi_lock in nfsd_break_deleg_cb()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
[ Upstream commit 5ea9a7c5fe4149f165f0e3b624fe08df02b6c301 ]
A recent change to check_for_locks() changed it to take ->flc_lock while holding ->fi_lock. This creates a lock inversion (reported by lockdep) because there is a case where ->fi_lock is taken while holding ->flc_lock.
->flc_lock is held across ->fl_lmops callbacks, and nfsd_break_deleg_cb() is one of those and does take ->fi_lock. However it doesn't need to.
Prior to v4.17-rc1~110^2~22 ("nfsd: create a separate lease for each delegation") nfsd_break_deleg_cb() would walk the ->fi_delegations list and so needed the lock. Since then it doesn't walk the list and doesn't need the lock.
Two actions are performed under the lock. One is to call nfsd_break_one_deleg which calls nfsd4_run_cb(). These doesn't act on the nfs4_file at all, so don't need the lock.
The other is to set ->fi_had_conflict which is in the nfs4_file. This field is only ever set here (except when initialised to false) so there is no possible problem will multiple threads racing when setting it.
The field is tested twice in nfs4_set_delegation(). The first test does not hold a lock and is documented as an opportunistic optimisation, so it doesn't impose any need to hold ->fi_lock while setting ->fi_had_conflict.
The second test in nfs4_set_delegation() *is* make under ->fi_lock, so removing the locking when ->fi_had_conflict is set could make a change. The change could only be interesting if ->fi_had_conflict tested as false even though nfsd_break_one_deleg() ran before ->fi_lock was unlocked. i.e. while hash_delegation_locked() was running. As hash_delegation_lock() doesn't interact in any way with nfs4_run_cb() there can be no importance to this interaction.
So this patch removes the locking from nfsd_break_one_deleg() and moves the final test on ->fi_had_conflict out of the locked region to make it clear that locking isn't important to the test. It is still tested *after* vfs_setlease() has succeeded. This might be significant and as vfs_setlease() takes ->flc_lock, and nfsd_break_one_deleg() is called under ->flc_lock this "after" is a true ordering provided by a spinlock.
--- fs/nfsd/nfs4state.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
fs/nfsd/nfs4state.c +5 -6
@@ -4908,10 +4908,8 @@ nfsd_break_deleg_cb(struct file_lock *fl*/ fl->fl_break_time =0 ; -spin_lock (&fp->fi_lock); fp->fi_had_conflict = true;nfsd_break_one_deleg (dp); -spin_unlock (&fp->fi_lock);return false; }
@@ -5499,12 +5497,13 @@ nfs4_set_delegation(struct nfsd4_open *oif (status) goto out_unlock; + status = -EAGAIN ; +if (fp->fi_had_conflict) + goto out_unlock; +spin_lock (&state_lock);spin_lock (&fp->fi_lock); -if (fp->fi_had_conflict) - status = -EAGAIN ; -else - status =hash_delegation_locked (dp, fp); + status =hash_delegation_locked (dp, fp);spin_unlock (&fp->fi_lock);spin_unlock (&state_lock);
Greg Kroah-Hartman
maintainerPATCH 189/197 hrtimer: Ignore slack time for RT tasks in schedule_hrtimeout_range()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Davidlohr Bueso <[email protected]>
commit 0c52310f260014d95c1310364379772cb74cf82d upstream.
While in theory the timer can be triggered before expires + delta, for the cases of RT tasks they really have no business giving any lenience for extra slack time, so override any passed value by the user and always use zero for schedule_hrtimeout_range() calls. Furthermore, this is similar to what the nanosleep(2) family already does with current->timer_slack_ns.
--- kernel/time/hrtimer.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
kernel/time/hrtimer.c +11 -3
@@ -2266,7 +2266,7 @@ void __init hrtimers_init(void)/** * schedule_hrtimeout_range_clock - sleep until timeout * @expires: timeout value (ktime_t) -* @delta: slack in expires timeout (ktime_t) +* @delta: slack in expires timeout (ktime_t) for SCHED_OTHER tasks * @mode: timer mode * @clock_id: timer clock to be used */
@@ -2293,6 +2293,13 @@ schedule_hrtimeout_range_clock(ktime_t *return -EINTR ; } +/* +* Override any slack passed by the user if under +* rt contraints. +*/ +if (rt_task (current)) + delta =0 ; +hrtimer_init_sleeper_on_stack (&t, clock_id, mode);hrtimer_set_expires_range_ns (&t.timer, *expires, delta);hrtimer_sleeper_start_expires (&t, mode);
@@ -2312,7 +2319,7 @@ EXPORT_SYMBOL_GPL(schedule_hrtimeout_ran/** * schedule_hrtimeout_range - sleep until timeout * @expires: timeout value (ktime_t) -* @delta: slack in expires timeout (ktime_t) +* @delta: slack in expires timeout (ktime_t) for SCHED_OTHER tasks * @mode: timer mode * * Make the current task sleep until the given expiry time has
@@ -2320,7 +2327,8 @@ EXPORT_SYMBOL_GPL(schedule_hrtimeout_ran* the current task state has been set (see set_current_state()). * * The @delta argument gives the kernel the freedom to schedule the -* actual wakeup to a time that is both power and performance friendly. +* actual wakeup to a time that is both power and performance friendly +* for regular (non RT/DL) tasks. * The kernel give the normal best effort behavior for "@expires+@delta", * but may decide to fire the timer earlier, but no earlier than @expires. *
Greg Kroah-Hartman
maintainerPATCH 190/197 RDMA/irdma: Ensure iWarp QP queue memory is OS paged aligned
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Marciniszyn <[email protected]>
commit 0a5ec366de7e94192669ba08de6ed336607fd282 upstream.
The SQ is shared for between kernel and used by storing the kernel page pointer and passing that to a kmap_atomic().
This then requires that the alignment is PAGE_SIZE aligned.
Fix by adding an iWarp specific alignment check.
--- drivers/infiniband/hw/irdma/verbs.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/infiniband/hw/irdma/verbs.c +7 -0
@@ -2845,6 +2845,13 @@ static struct ib_mr *irdma_reg_user_mr(sswitch (req.reg_type) {case IRDMA_MEMREG_TYPE_QP : +/* iWarp: Catch page not starting on OS page boundary */ +if (!rdma_protocol_roce (&iwdev->ibdev,1 ) && +ib_umem_offset (iwmr->region)) { + err = -EINVAL ; + goto error; + } + total = req.sq_pages + req.rq_pages + shadow_pgcnt;if (total > iwmr->page_cnt) { err = -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 191/197 smb: client: fix potential OOBs in smb2_parse_contexts()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paulo Alcantara <[email protected]>
commit af1689a9b7701d9907dfc84d2a4b57c4bc907144 upstream.
Validate offsets and lengths before dereferencing create contexts in smb2_parse_contexts().
This fixes following oops when accessing invalid create contexts from server:
BUG: unable to handle page fault for address: ffff8881178d8cc3 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 4a01067 P4D 4a01067 PUD 0 Oops: 0000 [#1] PREEMPT SMP NOPTI CPU: 3 PID: 1736 Comm: mount.cifs Not tainted 6.7.0-rc4 #1 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.2-3-gd478f380-rebuilt.opensuse.org 04/01/2014 RIP: 0010:smb2_parse_contexts+0xa0/0x3a0 [cifs] Code: f8 10 75 13 48 b8 93 ad 25 50 9c b4 11 e7 49 39 06 0f 84 d2 00 00 00 8b 45 00 85 c0 74 61 41 29 c5 48 01 c5 41 83 fd 0f 76 55 <0f> b7 7d 04 0f b7 45 06 4c 8d 74 3d 00 66 83 f8 04 75 bc ba 04 00 RSP: 0018:ffffc900007939e0 EFLAGS: 00010216 RAX: ffffc90000793c78 RBX: ffff8880180cc000 RCX: ffffc90000793c90 RDX: ffffc90000793cc0 RSI: ffff8880178d8cc0 RDI: ffff8880180cc000 RBP: ffff8881178d8cbf R08: ffffc90000793c22 R09: 0000000000000000 R10: ffff8880180cc000 R11: 0000000000000024 R12: 0000000000000000 R13: 0000000000000020 R14: 0000000000000000 R15: ffffc90000793c22 FS: 00007f873753cbc0(0000) GS:ffff88806bc00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffff8881178d8cc3 CR3: 00000000181ca000 CR4: 0000000000750ef0 PKRU: 55555554 Call Trace: <TASK> ? __die+0x23/0x70 ? page_fault_oops+0x181/0x480 ? search_module_extables+0x19/0x60 ? srso_alias_return_thunk+0x5/0xfbef5 ? exc_page_fault+0x1b6/0x1c0 ? asm_exc_page_fault+0x26/0x30 ? smb2_parse_contexts+0xa0/0x3a0 [cifs] SMB2_open+0x38d/0x5f0 [cifs] ? smb2_is_path_accessible+0x138/0x260 [cifs] smb2_is_path_accessible+0x138/0x260 [cifs] cifs_is_path_remote+0x8d/0x230 [cifs] cifs_mount+0x7e/0x350 [cifs] cifs_smb3_do_mount+0x128/0x780 [cifs] smb3_get_tree+0xd9/0x290 [cifs] vfs_get_tree+0x2c/0x100 ? capable+0x37/0x70 path_mount+0x2d7/0xb80 ? srso_alias_return_thunk+0x5/0xfbef5 ? _raw_spin_unlock_irqrestore+0x44/0x60 __x64_sys_mount+0x11a/0x150 do_syscall_64+0x47/0xf0 entry_SYSCALL_64_after_hwframe+0x6f/0x77 RIP: 0033:0x7f8737657b1e
--- fs/smb/client/cached_dir.c | 8 ++- fs/smb/client/smb2pdu.c | 91 +++++++++++++++++++++++++++------------------ fs/smb/client/smb2proto.h | 12 +++-- 3 files changed, 67 insertions(+), 44 deletions(-)
fs/smb/client/cached_dir.c +5 -3
@@ -268,10 +268,12 @@ int open_cached_dir(unsigned int xid, stif (o_rsp->OplockLevel !=SMB2_OPLOCK_LEVEL_LEASE ) goto oshr_free; -smb2_parse_contexts (server, o_rsp, + rc =smb2_parse_contexts (server, rsp_iov, &oparms.fid->epoch, - oparms.fid->lease_key, &oplock, -NULL ,NULL ); + oparms.fid->lease_key, + &oplock,NULL ,NULL ); +if (rc) + goto oshr_free;if (!(oplock &SMB2_LEASE_READ_CACHING_HE )) goto oshr_free; qi_rsp = (struct smb2_query_info_rsp *)rsp_iov[1 ].iov_base;
fs/smb/client/smb2pdu.c +55 -36
125 lines not on this page · raw message
fs/smb/client/smb2proto.h +7 -5
@@ -249,11 +249,13 @@ extern int smb3_validate_negotiate(constextern enum securityEnum smb2_select_sectype (struct TCP_Server_Info *,enum securityEnum ); -extern void smb2_parse_contexts (struct TCP_Server_Info *server, -struct smb2_create_rsp *rsp, -unsigned int *epoch,char *lease_key, -__u8 *oplock,struct smb2_file_all_info *buf, -struct create_posix_rsp *posix); +int smb2_parse_contexts (struct TCP_Server_Info *server, +struct kvec *rsp_iov, +unsigned int *epoch, +char *lease_key,__u8 *oplock, +struct smb2_file_all_info *buf, +struct create_posix_rsp *posix); +extern int smb3_encryption_required (const struct cifs_tcon *tcon);extern int smb2_validate_iov (unsigned int offset,unsigned int buffer_length,struct kvec *iov,unsigned int min_buf_size);
Greg Kroah-Hartman
maintainerPATCH 192/197 smb: client: fix parsing of SMB3.1.1 POSIX create context
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paulo Alcantara <[email protected]>
commit 76025cc2285d9ede3d717fe4305d66f8be2d9346 upstream.
The data offset for the SMB3.1.1 POSIX create context will always be 8-byte aligned so having the check 'noff + nlen >= doff' in smb2_parse_contexts() is wrong as it will lead to -EINVAL because noff
+ nlen == doff.
Fix the sanity check to correctly handle aligned create context data.
--- fs/smb/client/smb2pdu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/smb/client/smb2pdu.c +1 -1
@@ -2184,7 +2184,7 @@ int smb2_parse_contexts(struct TCP_Serve noff =le16_to_cpu (cc->NameOffset); nlen =le16_to_cpu (cc->NameLength); -if (noff + nlen >= doff) +if (noff + nlen > doff)return -EINVAL ; name = (char *)cc + noff;
Greg Kroah-Hartman
maintainerPATCH 193/197 net: prevent mss overflow in skb_segment()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
commit 23d05d563b7e7b0314e65c8e882bc27eac2da8e7 upstream.
Once again syzbot is able to crash the kernel in skb_segment() [1]
GSO_BY_FRAGS is a forbidden value, but unfortunately the following computation in skb_segment() can reach it quite easily :
mss = mss * partial_segs;
65535 = 3 * 5 * 17 * 257, so many initial values of mss can lead to a bad final result.
Make sure to limit segmentation so that the new mss value is smaller than GSO_BY_FRAGS.
[1]
general protection fault, probably for non-canonical address 0xdffffc000000000e: 0000 [#1] PREEMPT SMP KASAN KASAN: null-ptr-deref in range [0x0000000000000070-0x0000000000000077] CPU: 1 PID: 5079 Comm: syz-executor993 Not tainted 6.7.0-rc4-syzkaller-00141-g1ae4cd3cbdd0 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 11/10/2023 RIP: 0010:skb_segment+0x181d/0x3f30 net/core/skbuff.c:4551 Code: 83 e3 02 e9 fb ed ff ff e8 90 68 1c f9 48 8b 84 24 f8 00 00 00 48 8d 78 70 48 b8 00 00 00 00 00 fc ff df 48 89 fa 48 c1 ea 03 <0f> b6 04 02 84 c0 74 08 3c 03 0f 8e 8a 21 00 00 48 8b 84 24 f8 00 RSP: 0018:ffffc900043473d0 EFLAGS: 00010202 RAX: dffffc0000000000 RBX: 0000000000010046 RCX: ffffffff886b1597 RDX: 000000000000000e RSI: ffffffff886b2520 RDI: 0000000000000070 RBP: ffffc90004347578 R08: 0000000000000005 R09: 000000000000ffff R10: 000000000000ffff R11: 0000000000000002 R12: ffff888063202ac0 R13: 0000000000010000 R14: 000000000000ffff R15: 0000000000000046 FS: 0000555556e7e380(0000) GS:ffff8880b9900000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000020010000 CR3: 0000000027ee2000 CR4: 00000000003506f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> udp6_ufo_fragment+0xa0e/0xd00 net/ipv6/udp_offload.c:109 ipv6_gso_segment+0x534/0x17e0 net/ipv6/ip6_offload.c:120 skb_mac_gso_segment+0x290/0x610 net/core/gso.c:53 __skb_gso_segment+0x339/0x710 net/core/gso.c:124 skb_gso_segment include/net/gso.h:83 [inline] validate_xmit_skb+0x36c/0xeb0 net/core/dev.c:3626 __dev_queue_xmit+0x6f3/0x3d60 net/core/dev.c:4338 dev_queue_xmit include/linux/netdevice.h:3134 [inline] packet_xmit+0x257/0x380 net/packet/af_packet.c:276 packet_snd net/packet/af_packet.c:3087 [inline] packet_sendmsg+0x24c6/0x5220 net/packet/af_packet.c:3119 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg+0xd5/0x180 net/socket.c:745 __sys_sendto+0x255/0x340 net/socket.c:2190 __do_sys_sendto net/socket.c:2202 [inline] __se_sys_sendto net/socket.c:2198 [inline] __x64_sys_sendto+0xe0/0x1b0 net/socket.c:2198 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0x40/0x110 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b RIP: 0033:0x7f8692032aa9 Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 d1 19 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007fff8d685418 EFLAGS: 00000246 ORIG_RAX: 000000000000002c RAX: ffffffffffffffda RBX: 0000000000000003 RCX: 00007f8692032aa9 RDX: 0000000000010048 RSI: 00000000200000c0 RDI: 0000000000000003 RBP: 00000000000f4240 R08: 0000000020000540 R09: 0000000000000014 R10: 0000000000000000 R11: 0000000000000246 R12: 00007fff8d685480 R13: 0000000000000001 R14: 00007fff8d685480 R15: 0000000000000003 </TASK> Modules linked in: ---[ end trace 0000000000000000 ]--- RIP: 0010:skb_segment+0x181d/0x3f30 net/core/skbuff.c:4551 Code: 83 e3 02 e9 fb ed ff ff e8 90 68 1c f9 48 8b 84 24 f8 00 00 00 48 8d 78 70 48 b8 00 00 00 00 00 fc ff df 48 89 fa 48 c1 ea 03 <0f> b6 04 02 84 c0 74 08 3c 03 0f 8e 8a 21 00 00 48 8b 84 24 f8 00 RSP: 0018:ffffc900043473d0 EFLAGS: 00010202 RAX: dffffc0000000000 RBX: 0000000000010046 RCX: ffffffff886b1597 RDX: 000000000000000e RSI: ffffffff886b2520 RDI: 0000000000000070 RBP: ffffc90004347578 R08: 0000000000000005 R09: 000000000000ffff R10: 000000000000ffff R11: 0000000000000002 R12: ffff888063202ac0 R13: 0000000000010000 R14: 000000000000ffff R15: 0000000000000046 FS: 0000555556e7e380(0000) GS:ffff8880b9900000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000020010000 CR3: 0000000027ee2000 CR4: 00000000003506f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
--- net/core/skbuff.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/core/skbuff.c +2 -1
@@ -4213,8 +4213,9 @@ struct sk_buff *skb_segment(struct sk_bu/* GSO partial only requires that we trim off any excess that * doesn't fit into an MSS sized block, so take care of that * now. +* Cap len to not accidentally hit GSO_BY_FRAGS. */ - partial_segs = len / mss; + partial_segs =min (len,GSO_BY_FRAGS -1U ) / mss;if (partial_segs >1 ) mss *= partial_segs;else
Greg Kroah-Hartman
maintainerPATCH 194/197 bpf: Add struct for bin_args arg in bpf_bprintf_prepare
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Olsa <[email protected]>
commit 78aa1cc9404399a15d2a1205329c6a06236f5378 upstream.
Adding struct bpf_bprintf_data to hold bin_args argument for bpf_bprintf_prepare function.
We will add another return argument to bpf_bprintf_prepare and pass the struct to bpf_bprintf_cleanup for proper cleanup in following changes.
--- include/linux/bpf.h | 7 ++++++- kernel/bpf/helpers.c | 24 +++++++++++++----------- kernel/bpf/verifier.c | 3 ++- kernel/trace/bpf_trace.c | 34 ++++++++++++++++++++-------------- 4 files changed, 41 insertions(+), 27 deletions(-)
include/linux/bpf.h +6 -1
@@ -2740,8 +2740,13 @@ bool btf_id_set_contains(const struct bt#define MAX_BPRINTF_VARARGS 12 +struct bpf_bprintf_data { +u32 *bin_args; +bool get_bin_args; +}; +int bpf_bprintf_prepare (char *fmt,u32 fmt_size,const u64 *raw_args, -u32 **bin_buf,u32 num_args); +u32 num_args,struct bpf_bprintf_data *data);void bpf_bprintf_cleanup (void );/* the implementation of the opaque uapi struct bpf_dynptr */
kernel/bpf/helpers.c +13 -11
@@ -795,16 +795,16 @@ void bpf_bprintf_cleanup(void)* Returns a negative value if fmt is an invalid format string or 0 otherwise. * * This can be used in two ways: -* - Format string verification only: when bin_args is NULL +* - Format string verification only: when data->get_bin_args is false * - Arguments preparation: in addition to the above verification, it writes in -* bin_args a binary representation of arguments usable by bstr_printf where -* pointers from BPF have been sanitized. +* data->bin_args a binary representation of arguments usable by bstr_printf +* where pointers from BPF have been sanitized. * * In argument preparation mode, if 0 is returned, safe temporary buffers are * allocated and bpf_bprintf_cleanup should be called to free them after use. */ int bpf_bprintf_prepare (char *fmt,u32 fmt_size,const u64 *raw_args, -u32 **bin_args,u32 num_args) +u32 num_args,struct bpf_bprintf_data *data) {char *unsafe_ptr =NULL , *tmp_buf =NULL , *tmp_buf_end, *fmt_end;size_t sizeof_cur_arg, sizeof_cur_ip;
@@ -817,12 +817,12 @@ int bpf_bprintf_prepare(char *fmt, u32 freturn -EINVAL ; fmt_size = fmt_end - fmt; -if (bin_args) { +if (data->get_bin_args) {if (num_args &&try_get_fmt_tmp_buf (&tmp_buf))return -EBUSY ; tmp_buf_end = tmp_buf +MAX_BPRINTF_BUF_LEN ; - *bin_args = (u32 *)tmp_buf; + data->bin_args = (u32 *)tmp_buf; }for (i =0 ; i < fmt_size; i++) {
@@ -1023,24 +1023,26 @@ out: } BPF_CALL_5(bpf_snprintf, char *, str, u32, str_size, char *, fmt, - const void *, data, u32, data_len) + const void *, args, u32, data_len) { +struct bpf_bprintf_data data = { + .get_bin_args = true, + };int err, num_args; -u32 *bin_args;if (data_len %8 || data_len >MAX_BPRINTF_VARARGS *8 || - (data_len && !data)) + (data_len && !args))return -EINVAL ; num_args = data_len /8 ;/* ARG_PTR_TO_CONST_STR guarantees that fmt is zero-terminated so we * can safely give an unbounded size. */ - err =bpf_bprintf_prepare (fmt,UINT_MAX , data, &bin_args, num_args); + err =bpf_bprintf_prepare (fmt,UINT_MAX , args, num_args, &data);if (err <0 )return err; - err =bstr_printf (str, str_size, fmt, bin_args); + err =bstr_printf (str, str_size, fmt, data.bin_args);bpf_bprintf_cleanup ();
kernel/bpf/verifier.c +2 -1
@@ -7448,6 +7448,7 @@ static int check_bpf_snprintf_call(strucstruct bpf_reg_state *fmt_reg = ®s[BPF_REG_3 ];struct bpf_reg_state *data_len_reg = ®s[BPF_REG_5 ];struct bpf_map *fmt_map = fmt_reg->map_ptr; +struct bpf_bprintf_data data = {};int err, fmt_map_off, num_args;u64 fmt_addr;char *fmt;
@@ -7472,7 +7473,7 @@ static int check_bpf_snprintf_call(struc/* We are also guaranteed that fmt+fmt_map_off is NULL terminated, we * can focus on validating the format specifiers. */ - err =bpf_bprintf_prepare (fmt,UINT_MAX ,NULL ,NULL , num_args); + err =bpf_bprintf_prepare (fmt,UINT_MAX ,NULL , num_args, &data);if (err <0 )verbose (env,"Invalid format string\n" );
kernel/trace/bpf_trace.c +20 -14
@@ -377,18 +377,20 @@ BPF_CALL_5(bpf_trace_printk, char *, fmt u64, arg2, u64, arg3) {u64 args[MAX_TRACE_PRINTK_VARARGS ] = { arg1, arg2, arg3 }; -u32 *bin_args; +struct bpf_bprintf_data data = { + .get_bin_args = true, + };static char buf[BPF_TRACE_PRINTK_SIZE ];unsigned long flags;int ret; - ret =bpf_bprintf_prepare (fmt, fmt_size, args, &bin_args, -MAX_TRACE_PRINTK_VARARGS ); + ret =bpf_bprintf_prepare (fmt, fmt_size, args, +MAX_TRACE_PRINTK_VARARGS , &data);if (ret <0 )return ret;raw_spin_lock_irqsave (&trace_printk_lock, flags); - ret =bstr_printf (buf,sizeof (buf), fmt, bin_args); + ret =bstr_printf (buf,sizeof (buf), fmt, data.bin_args);trace_bpf_trace_printk (buf);raw_spin_unlock_irqrestore (&trace_printk_lock, flags);
@@ -426,25 +428,27 @@ const struct bpf_func_proto *bpf_get_trareturn &bpf_trace_printk_proto; } -BPF_CALL_4(bpf_trace_vprintk, char *, fmt, u32, fmt_size, const void *, data, +BPF_CALL_4(bpf_trace_vprintk, char *, fmt, u32, fmt_size, const void *, args, u32, data_len) { +struct bpf_bprintf_data data = { + .get_bin_args = true, + };static char buf[BPF_TRACE_PRINTK_SIZE ];unsigned long flags;int ret, num_args; -u32 *bin_args;if (data_len &7 || data_len >MAX_BPRINTF_VARARGS *8 || - (data_len && !data)) + (data_len && !args))return -EINVAL ; num_args = data_len /8 ; - ret =bpf_bprintf_prepare (fmt, fmt_size, data, &bin_args, num_args); + ret =bpf_bprintf_prepare (fmt, fmt_size, args, num_args, &data);if (ret <0 )return ret;raw_spin_lock_irqsave (&trace_printk_lock, flags); - ret =bstr_printf (buf,sizeof (buf), fmt, bin_args); + ret =bstr_printf (buf,sizeof (buf), fmt, data.bin_args);trace_bpf_trace_printk (buf);raw_spin_unlock_irqrestore (&trace_printk_lock, flags);
@@ -471,21 +475,23 @@ const struct bpf_func_proto *bpf_get_tra } BPF_CALL_5(bpf_seq_printf, struct seq_file *, m, char *, fmt, u32, fmt_size, - const void *, data, u32, data_len) + const void *, args, u32, data_len) { +struct bpf_bprintf_data data = { + .get_bin_args = true, + };int err, num_args; -u32 *bin_args;if (data_len &7 || data_len >MAX_BPRINTF_VARARGS *8 || - (data_len && !data)) + (data_len && !args))return -EINVAL ; num_args = data_len /8 ; - err =bpf_bprintf_prepare (fmt, fmt_size, data, &bin_args, num_args); + err =bpf_bprintf_prepare (fmt, fmt_size, args, num_args, &data);if (err <0 )return err; -seq_bprintf (m, fmt, bin_args); +seq_bprintf (m, fmt, data.bin_args);bpf_bprintf_cleanup ();
Greg Kroah-Hartman
maintainerPATCH 195/197 bpf: Do cleanup in bpf_bprintf_cleanup only when needed
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Olsa <[email protected]>
commit f19a4050455aad847fb93f18dc1fe502eb60f989 upstream.
Currently we always cleanup/decrement bpf_bprintf_nest_level variable in bpf_bprintf_cleanup if it's > 0.
There's possible scenario where this could cause a problem, when bpf_bprintf_prepare does not get bin_args buffer (because num_args is 0) and following bpf_bprintf_cleanup call decrements bpf_bprintf_nest_level variable, like:
in task context:
bpf_bprintf_prepare(num_args != 0) increments 'bpf_bprintf_nest_level = 1'
-> first irq :
bpf_bprintf_prepare(num_args == 0)
bpf_bprintf_cleanup decrements 'bpf_bprintf_nest_level = 0'
-> second irq:
bpf_bprintf_prepare(num_args != 0) bpf_bprintf_nest_level = 1
gets same buffer as task context aboveAdding check to bpf_bprintf_cleanup and doing the real cleanup only if we got bin_args data in the first place.
--- include/linux/bpf.h | 2 +- kernel/bpf/helpers.c | 16 +++++++++------- kernel/trace/bpf_trace.c | 6 +++--- 3 files changed, 13 insertions(+), 11 deletions(-)
include/linux/bpf.h +1 -1
@@ -2747,7 +2747,7 @@ struct bpf_bprintf_data {int bpf_bprintf_prepare (char *fmt,u32 fmt_size,const u64 *raw_args,u32 num_args,struct bpf_bprintf_data *data); -void bpf_bprintf_cleanup (void ); +void bpf_bprintf_cleanup (struct bpf_bprintf_data *data);/* the implementation of the opaque uapi struct bpf_dynptr */ struct bpf_dynptr_kern {
kernel/bpf/helpers.c +9 -7
@@ -781,12 +781,14 @@ static int try_get_fmt_tmp_buf(char **tmreturn 0 ; } -void bpf_bprintf_cleanup (void ) +void bpf_bprintf_cleanup (struct bpf_bprintf_data *data) { -if (this_cpu_read (bpf_bprintf_nest_level)) { -this_cpu_dec (bpf_bprintf_nest_level); -preempt_enable (); - } +if (!data->bin_args) +return ; +if (WARN_ON_ONCE (this_cpu_read (bpf_bprintf_nest_level) ==0 )) +return ; +this_cpu_dec (bpf_bprintf_nest_level); +preempt_enable (); }/*
@@ -1018,7 +1020,7 @@ nocopy_fmt: err =0 ; out:if (err) -bpf_bprintf_cleanup (); +bpf_bprintf_cleanup (data);return err; }
@@ -1044,7 +1046,7 @@ BPF_CALL_5(bpf_snprintf, char *, str, u3 err =bstr_printf (str, str_size, fmt, data.bin_args); -bpf_bprintf_cleanup (); +bpf_bprintf_cleanup (&data);return err +1 ; }
kernel/trace/bpf_trace.c +3 -3
@@ -395,7 +395,7 @@ BPF_CALL_5(bpf_trace_printk, char *, fmttrace_bpf_trace_printk (buf);raw_spin_unlock_irqrestore (&trace_printk_lock, flags); -bpf_bprintf_cleanup (); +bpf_bprintf_cleanup (&data);return ret; }
@@ -453,7 +453,7 @@ BPF_CALL_4(bpf_trace_vprintk, char *, fmtrace_bpf_trace_printk (buf);raw_spin_unlock_irqrestore (&trace_printk_lock, flags); -bpf_bprintf_cleanup (); +bpf_bprintf_cleanup (&data);return ret; }
@@ -493,7 +493,7 @@ BPF_CALL_5(bpf_seq_printf, struct seq_fiseq_bprintf (m, fmt, data.bin_args); -bpf_bprintf_cleanup (); +bpf_bprintf_cleanup (&data);return seq_has_overflowed (m) ? -EOVERFLOW :0 ; }
Greg Kroah-Hartman
maintainerPATCH 196/197 bpf: Remove trace_printk_lock
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Olsa <[email protected]>
commit e2bb9e01d589f7fa82573aedd2765ff9b277816a upstream.
Both bpf_trace_printk and bpf_trace_vprintk helpers use static buffer guarded with trace_printk_lock spin lock.
The spin lock contention causes issues with bpf programs attached to contention_begin tracepoint [1][2].
Andrii suggested we could get rid of the contention by using trylock, but we could actually get rid of the spinlock completely by using percpu buffers the same way as for bin_args in bpf_bprintf_prepare function.
Adding new return 'buf' argument to struct bpf_bprintf_data and making bpf_bprintf_prepare to return also the buffer for printk helpers.
[1] https://lore.kernel.org/bpf/CACkBjsakT_yWxnSWr4r-0TpPvbKm9-OBmVUhJb7hV3hY8fdCkw@mail.gmail.com/
[2] https://lore.kernel.org/bpf/CACkBjsaCsTovQHFfkqJKto6S4Z8d02ud1D7MPESrHa1cVNNTrw@mail.gmail.com/
--- include/linux/bpf.h | 3 +++ kernel/bpf/helpers.c | 31 +++++++++++++++++++------------ kernel/trace/bpf_trace.c | 20 ++++++-------------- 3 files changed, 28 insertions(+), 26 deletions(-)
include/linux/bpf.h +3 -0
@@ -2739,10 +2739,13 @@ struct btf_id_set;bool btf_id_set_contains (const struct btf_id_set *set,u32 id);#define MAX_BPRINTF_VARARGS 12 +#define MAX_BPRINTF_BUF 1024struct bpf_bprintf_data {u32 *bin_args; +char *buf;bool get_bin_args; +bool get_buf; }; int bpf_bprintf_prepare(char *fmt, u32 fmt_size, const u64 *raw_args,
kernel/bpf/helpers.c +19 -12
@@ -753,19 +753,20 @@ static int bpf_trace_copy_string(char *b/* Per-cpu temp buffers used by printf-like helpers to store the bprintf binary * arguments representation. */ -#define MAX_BPRINTF_BUF_LEN 512 +#define MAX_BPRINTF_BIN_ARGS 512/* Support executing three nested bprintf helper calls on a given CPU */ #define MAX_BPRINTF_NEST_LEVEL 3struct bpf_bprintf_buffers { -char tmp_bufs[MAX_BPRINTF_NEST_LEVEL ][MAX_BPRINTF_BUF_LEN ]; +char bin_args[MAX_BPRINTF_BIN_ARGS ]; +char buf[MAX_BPRINTF_BUF ]; }; -static DEFINE_PER_CPU(struct bpf_bprintf_buffers, bpf_bprintf_bufs); + +static DEFINE_PER_CPU(struct bpf_bprintf_buffers[MAX_BPRINTF_NEST_LEVEL], bpf_bprintf_bufs); static DEFINE_PER_CPU(int, bpf_bprintf_nest_level); -static int try_get_fmt_tmp_buf (char **tmp_buf) +static int try_get_buffers (struct bpf_bprintf_buffers **bufs) { -struct bpf_bprintf_buffers *bufs;int nest_level;preempt_disable ();
@@ -775,15 +776,14 @@ static int try_get_fmt_tmp_buf(char **tmpreempt_enable ();return -EBUSY ; } - bufs =this_cpu_ptr (&bpf_bprintf_bufs); - *tmp_buf = bufs->tmp_bufs[nest_level -1 ]; + *bufs =this_cpu_ptr (&bpf_bprintf_bufs[nest_level -1 ]);return 0 ; }void bpf_bprintf_cleanup (struct bpf_bprintf_data *data) { -if (!data->bin_args) +if (!data->bin_args && !data->buf)return ;if (WARN_ON_ONCE (this_cpu_read (bpf_bprintf_nest_level) ==0 ))return ;
@@ -808,7 +808,9 @@ void bpf_bprintf_cleanup(struct bpf_bpriint bpf_bprintf_prepare (char *fmt,u32 fmt_size,const u64 *raw_args,u32 num_args,struct bpf_bprintf_data *data) { +bool get_buffers = (data->get_bin_args && num_args) || data->get_buf;char *unsafe_ptr =NULL , *tmp_buf =NULL , *tmp_buf_end, *fmt_end; +struct bpf_bprintf_buffers *buffers =NULL ;size_t sizeof_cur_arg, sizeof_cur_ip;int err, i, num_spec =0 ;u64 cur_arg;
@@ -819,14 +821,19 @@ int bpf_bprintf_prepare(char *fmt, u32 freturn -EINVAL ; fmt_size = fmt_end - fmt; -if (data->get_bin_args) { -if (num_args &&try_get_fmt_tmp_buf (&tmp_buf)) -return -EBUSY ; +if (get_buffers &&try_get_buffers (&buffers)) +return -EBUSY ; - tmp_buf_end = tmp_buf +MAX_BPRINTF_BUF_LEN ; +if (data->get_bin_args) { +if (num_args) + tmp_buf = buffers->bin_args; + tmp_buf_end = tmp_buf +MAX_BPRINTF_BIN_ARGS ; data->bin_args = (u32 *)tmp_buf; } +if (data->get_buf) + data->buf = buffers->buf; +for (i =0 ; i < fmt_size; i++) {if ((!isprint (fmt[i]) && !isspace (fmt[i])) || !isascii (fmt[i])) { err = -EINVAL ;
kernel/trace/bpf_trace.c +6 -14
@@ -368,8 +368,6 @@ static const struct bpf_func_proto *bpf_return &bpf_probe_write_user_proto; } -static DEFINE_RAW_SPINLOCK (trace_printk_lock); -#define MAX_TRACE_PRINTK_VARARGS 3#define BPF_TRACE_PRINTK_SIZE 1024
@@ -379,9 +377,8 @@ BPF_CALL_5(bpf_trace_printk, char *, fmtu64 args[MAX_TRACE_PRINTK_VARARGS ] = { arg1, arg2, arg3 };struct bpf_bprintf_data data = { .get_bin_args = true, + .get_buf = true, }; -static char buf[BPF_TRACE_PRINTK_SIZE ]; -unsigned long flags;int ret; ret = bpf_bprintf_prepare(fmt, fmt_size, args,
@@ -389,11 +386,9 @@ BPF_CALL_5(bpf_trace_printk, char *, fmtif (ret <0 )return ret; -raw_spin_lock_irqsave (&trace_printk_lock, flags); - ret =bstr_printf (buf,sizeof (buf), fmt, data.bin_args); + ret =bstr_printf (data.buf,MAX_BPRINTF_BUF , fmt, data.bin_args); -trace_bpf_trace_printk (buf); -raw_spin_unlock_irqrestore (&trace_printk_lock, flags); +trace_bpf_trace_printk (data.buf);bpf_bprintf_cleanup (&data);
@@ -433,9 +428,8 @@ BPF_CALL_4(bpf_trace_vprintk, char *, fm {struct bpf_bprintf_data data = { .get_bin_args = true, + .get_buf = true, }; -static char buf[BPF_TRACE_PRINTK_SIZE ]; -unsigned long flags;int ret, num_args; if (data_len & 7 || data_len > MAX_BPRINTF_VARARGS * 8 ||
@@ -447,11 +441,9 @@ BPF_CALL_4(bpf_trace_vprintk, char *, fmif (ret <0 )return ret; -raw_spin_lock_irqsave (&trace_printk_lock, flags); - ret =bstr_printf (buf,sizeof (buf), fmt, data.bin_args); + ret =bstr_printf (data.buf,MAX_BPRINTF_BUF , fmt, data.bin_args); -trace_bpf_trace_printk (buf); -raw_spin_unlock_irqrestore (&trace_printk_lock, flags); +trace_bpf_trace_printk (data.buf);bpf_bprintf_cleanup (&data);
Greg Kroah-Hartman
maintainerPATCH 197/197 userfaultfd: fix mmap_changing checking in mfill_atomic_hugetlb
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lokesh Gidra <[email protected]>
commit 67695f18d55924b2013534ef3bdc363bc9e14605 upstream.
In mfill_atomic_hugetlb(), mmap_changing isn't being checked again if we drop mmap_lock and reacquire it. When the lock is not held, mmap_changing could have been incremented. This is also inconsistent with the behavior in mfill_atomic().
--- mm/userfaultfd.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
mm/userfaultfd.c +13 -2
@@ -327,6 +327,7 @@ static __always_inline ssize_t __mcopy_aunsigned long dst_start, unsigned long src_start, unsigned long len, + atomic_t *mmap_changing, enum mcopy_atomic_mode mode, bool wp_copy) {
@@ -445,6 +446,15 @@ retry: goto out; }mmap_read_lock (dst_mm); +/* +* If memory mappings are changing because of non-cooperative +* operation (e.g. mremap) running in parallel, bail out and +* request the user to retry later +*/ +if (mmap_changing &&atomic_read (mmap_changing)) { + err = -EAGAIN ; +break ; + } dst_vma =NULL ; goto retry;
@@ -480,6 +490,7 @@ extern ssize_t __mcopy_atomic_hugetlb(stunsigned long dst_start, unsigned long src_start, unsigned long len, + atomic_t *mmap_changing, enum mcopy_atomic_mode mode, bool wp_copy);#endif /* CONFIG_HUGETLB_PAGE */
@@ -601,8 +612,8 @@ retry:*/ if (is_vm_hugetlb_page (dst_vma))return __mcopy_atomic_hugetlb (dst_mm, dst_vma, dst_start, - src_start, len, mcopy_mode, - wp_copy); + src_start, len, mmap_changing, + mcopy_mode, wp_copy);if (!vma_is_anonymous (dst_vma) && !vma_is_shmem (dst_vma)) goto out_unlock;
Hello,
Quoted 5 lines · On Tue, 20 Feb 2024 21:49:19 +0100 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 6.1.79 release. There are 197 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 8 lines
Responses should be made by Thu, 22 Feb 2024 20:48:08 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.79-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.
This rc kernel passes DAMON functionality test[1] on my test machine. Attaching the test results summary below. Please note that I retrieved the kernel from linux-stable-rc tree[2].
[1] https://github.com/awslabs/damon-tests/tree/next/corr
[2] cc64836e147d ("Linux 6.1.79-rc1")
Thanks,
SJ
[...]
---
ok 1 selftests: damon: debugfs_attrs.sh
ok 2 selftests: damon: debugfs_schemes.sh
ok 3 selftests: damon: debugfs_target_ids.sh
ok 4 selftests: damon: debugfs_empty_targets.sh
ok 5 selftests: damon: debugfs_huge_count_read_write.sh
ok 6 selftests: damon: debugfs_duplicate_context_creation.sh
ok 7 selftests: damon: sysfs.sh
ok 1 selftests: damon-tests: kunit.sh
ok 2 selftests: damon-tests: huge_count_read_write.sh
ok 3 selftests: damon-tests: buffer_overflow.sh
ok 4 selftests: damon-tests: rm_contexts.sh
ok 5 selftests: damon-tests: record_null_deref.sh
ok 6 selftests: damon-tests: dbgfs_target_ids_read_before_terminate_race.sh ok 7 selftests: damon-tests: dbgfs_target_ids_pid_leak.sh
ok 8 selftests: damon-tests: damo_tests.sh
ok 9 selftests: damon-tests: masim-record.sh
ok 10 selftests: damon-tests: build_i386.sh
ok 11 selftests: damon-tests: build_arm64.sh
ok 12 selftests: damon-tests: build_m68k.sh
ok 13 selftests: damon-tests: build_i386_idle_flag.sh
ok 14 selftests: damon-tests: build_i386_highpte.sh
ok 15 selftests: damon-tests: build_nomemcg.sh
[33m
[92mPASS [39m
Hello!
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.79 release. There are 197 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 22 Feb 2024 20:48:08 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.79-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
We see a regression with PowerPC:
-----8<-----
/builds/linux/arch/powerpc/kernel/cpu_setup_6xx.S: Assembler messages:
/builds/linux/arch/powerpc/kernel/cpu_setup_6xx.S:124: Error: unrecognized opcode: sym_func_start_local(setup_g2_le_hid2)' /builds/linux/arch/powerpc/kernel/cpu_setup_6xx.S:131: Error: unrecognized opcode: sym_func_end(setup_g2_le_hid2)' make[4]: *** [/builds/linux/scripts/Makefile.build:382: arch/powerpc/kernel/cpu_setup_6xx.o] Error 1
----->8-----
This is seen only on PowerPC with GCC 8, GCC 13, Clang 17, Clang nightly, on:
* allnoconfig
* tinyconfig
* mpc83xx_defconfig
* ppc6xx_defconfig
(at least)
Reproducer:
tuxmake \
--runtime podman \
--target-arch powerpc \
--toolchain gcc-8 \
--kconfig tinyconfigGreetings!
Daniel Díaz
[email protected]
Hello!
Quoted 35 lines · Daniel Díaz
Quoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.79 release. There are 197 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 22 Feb 2024 20:48:08 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.79-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-6.1.y and the diffstat can be found below.Quoted 3 lines
thanks,
greg k-h
We see a regression with PowerPC:
-----8<-----
/builds/linux/arch/powerpc/kernel/cpu_setup_6xx.S: Assembler messages:
/builds/linux/arch/powerpc/kernel/cpu_setup_6xx.S:124: Error: unrecognized opcode:sym_func_start_local(setup_g2_le_hid2)' /builds/linux/arch/powerpc/kernel/cpu_setup_6xx.S:131: Error: unrecognized opcode:sym_func_end(setup_g2_le_hid2)' make[4]: *** [/builds/linux/scripts/Makefile.build:382:arch/powerpc/kernel/cpu_setup_6xx.o] Error 1
----->8-----This is seen only on PowerPC with GCC 8, GCC 13, Clang 17, Clang nightly, on:
* allnoconfig
* tinyconfig
*mpc83xx_defconfig
*ppc6xx_defconfig
(at least)
Quoted 8 lines
Reproducer:
tuxmake \
--runtime podman \
--target-arch powerpc \
--toolchain gcc-8 \
--kconfig tinyconfig
Bisection points to:
commit a65d7a833f486d0c162fdc854d2d5dd2e66ddd95
Author: Matthias Schiffer <[email protected]>
Date: Wed Jan 24 11:38:38 2024 +0100
powerpc/6xx: set High BAT Enable flag on G2_LE cores
[ Upstream commit a038a3ff8c6582404834852c043dadc73a5b68b4 ]
Reverting that commit makes the build pass again.
Greetings!
Daniel Díaz
[email protected]
Quoted 63 lines · Daniel Díaz
********************
Achtung externe E-Mail: Öffnen Sie Anhänge und Links nur, wenn Sie wissen, dass diese aus einer sicheren Quelle stammen und sicher sind. Leiten Sie die E-Mail im Zweifelsfall zur Prüfung an den IT-Helpdesk weiter. Attention external email: Open attachments and links only if you know that they are from a secure source and are safe. In doubt forward the email to the IT-Helpdesk to check it.
********************Hello!
Quoted 35 lines · Daniel Díaz
Quoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.79 release. There are 197 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 22 Feb 2024 20:48:08 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.79-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-6.1.y and the diffstat can be found below.Quoted 3 lines
thanks,
greg k-h
We see a regression with PowerPC:
-----8<-----
/builds/linux/arch/powerpc/kernel/cpu_setup_6xx.S: Assembler messages:
/builds/linux/arch/powerpc/kernel/cpu_setup_6xx.S:124: Error: unrecognized opcode:sym_func_start_local(setup_g2_le_hid2)' /builds/linux/arch/powerpc/kernel/cpu_setup_6xx.S:131: Error: unrecognized opcode:sym_func_end(setup_g2_le_hid2)' make[4]: *** [/builds/linux/scripts/Makefile.build:382:arch/powerpc/kernel/cpu_setup_6xx.o] Error 1
----->8-----This is seen only on PowerPC with GCC 8, GCC 13, Clang 17, Clang nightly, on:
* allnoconfig
* tinyconfig
*mpc83xx_defconfig
*ppc6xx_defconfig
(at least)Quoted 8 lines
Reproducer:
tuxmake \
--runtime podman \
--target-arch powerpc \
--toolchain gcc-8 \
--kconfig tinyconfigBisection points to:
commit a65d7a833f486d0c162fdc854d2d5dd2e66ddd95 Author: Matthias Schiffer <[email protected]> Date: Wed Jan 24 11:38:38 2024 +0100 powerpc/6xx: set High BAT Enable flag on G2_LE cores [ Upstream commit a038a3ff8c6582404834852c043dadc73a5b68b4 ]
Quoted 1 line
Reverting that commit makes the build pass again.
It seems that backporting the mentioned commit verbatim would also require 2da37761671b5bdedbe04e6469cfa57cd6b6ae45 ("powerpc/32: Fix objtool unannotated intra-function call warnings") to make SYM_FUNC_START_LOCAL/SYM_FUNC_END available. Please drop this patch from 6.1 and older for now.
Adding Christophe and Michael to cc. Is backporting the additional patch an option (and if so, for which kernel versions?), or should I send a new patch that does not use SYM_FUNC_START_LOCAL/SYM_FUNC_END for stable?
Thanks,
Matthias
Quoted 6 lines
Greetings!
Daniel Díaz
[email protected]
Greg Kroah-Hartman
maintainerQuoted 64 lines · Matthias Schiffer
Quoted 63 lines · Daniel Díaz
********************
Achtung externe E-Mail: Öffnen Sie Anhänge und Links nur, wenn Sie wissen, dass diese aus einer sicheren Quelle stammen und sicher sind. Leiten Sie die E-Mail im Zweifelsfall zur Prüfung an den IT-Helpdesk weiter. Attention external email: Open attachments and links only if you know that they are from a secure source and are safe. In doubt forward the email to the IT-Helpdesk to check it.
********************Hello!
Quoted 35 lines · Daniel Díaz
Quoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.79 release. There are 197 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 22 Feb 2024 20:48:08 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.79-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-6.1.y and the diffstat can be found below.Quoted 3 lines
thanks,
greg k-h
We see a regression with PowerPC:
-----8<-----
/builds/linux/arch/powerpc/kernel/cpu_setup_6xx.S: Assembler messages:
/builds/linux/arch/powerpc/kernel/cpu_setup_6xx.S:124: Error: unrecognized opcode:sym_func_start_local(setup_g2_le_hid2)' /builds/linux/arch/powerpc/kernel/cpu_setup_6xx.S:131: Error: unrecognized opcode:sym_func_end(setup_g2_le_hid2)' make[4]: *** [/builds/linux/scripts/Makefile.build:382:arch/powerpc/kernel/cpu_setup_6xx.o] Error 1
----->8-----This is seen only on PowerPC with GCC 8, GCC 13, Clang 17, Clang nightly, on:
* allnoconfig
* tinyconfig
*mpc83xx_defconfig
*ppc6xx_defconfig
(at least)Quoted 8 lines
Reproducer:
tuxmake \
--runtime podman \
--target-arch powerpc \
--toolchain gcc-8 \
--kconfig tinyconfigBisection points to:
commit a65d7a833f486d0c162fdc854d2d5dd2e66ddd95 Author: Matthias Schiffer <[email protected]> Date: Wed Jan 24 11:38:38 2024 +0100 powerpc/6xx: set High BAT Enable flag on G2_LE cores [ Upstream commit a038a3ff8c6582404834852c043dadc73a5b68b4 ]
Quoted 6 lines
Quoted 1 line
Reverting that commit makes the build pass again.
It seems that backporting the mentioned commit verbatim would also require
2da37761671b5bdedbe04e6469cfa57cd6b6ae45("powerpc/32: Fix objtool unannotated intra-function call warnings") to make SYM_FUNC_START_LOCAL/SYM_FUNC_END available. Please drop this patch from 6.1 and older for now.
Now dropped, thanks!
greg k-h
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.79 release. There are 197 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 22 Feb 2024 20:48:08 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.79-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.1:
10 builds: 10 pass, 0 fail
26 boots: 26 pass, 0 fail
116 tests: 116 pass, 0 failLinux version: 6.1.79-rc1-gcc64836e147d
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Jon
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.79 release. There are 197 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 22 Feb 2024 20:48:08 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.79-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah