6.11.2-rc1 review
Subsystems (5)
Re: [PATCH 6.11 397/695] nfsd: fix refcount leak when file is unhashed after being found
In reply to Chuck Lever IIII applied 2/4, 3/4 and 4/4 on top of kernel 6.6.41 and tested it under our work load, unfortunately leaks occurred. Here is what I got:
crash> p nfsd_file_allocations:a | awk '{print $NF}' | perl -e 'while(<>){ $sum += $_; } print $sum, "\n";' 114664232
crash> p nfsd_file_releases:a | awk '{print $NF}' | perl -e 'while(<>){ $sum += $_; } print $sum, "\n";' 114664221
So yes, 1/4 is needed for fixing the issue.
Quoted 34 lines · Chuck Lever III
Quoted 17 lines · Greg Kroah-Hartman
Quoted 11 lines · Youzhong Yang
My understanding is that the following 4 commits together fix the leaking issue:
nfsd: add
list_headnf_gcto structnfsd_file
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8e6e2ffa6569a205f1805cbaeca143b556581da6nfsd: fix refcount leak when file is unhashed after being found
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8a7926176378460e0d91e02b03f0ff20a8709a60nfsd: remove unneeded EEXIST error check in
nfsd_do_file_acquire
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=81a95c2b1d605743220f28db04b8da13a65c4059Quoted 8 lines
Quoted 4 lines
nfsd: count
nfsd_fileallocations
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=700bb4ff912f954345286e065ff145753a1d5bbeThe first two are essential but it's better to have the last two commits too.
So right now only the 2nd and 3rd are in the tree, do we really need the others as well? And if so, why were none of these marked for a stable inclusion?
IMO 1/4 and 4/4 are not needed in stable, and that's why we marked them that way.
--
Chuck Lever
Greg Kroah-Hartman
maintainerRe: [PATCH 6.11 397/695] nfsd: fix refcount leak when file is unhashed after being found
Quoted 11 lines · Youzhong Yang
I applied 2/4, 3/4 and 4/4 on top of kernel 6.6.41 and tested it under our work load, unfortunately leaks occurred. Here is what I got:
crash> p nfsd_file_allocations:a | awk '{print $NF}' | perl -e 'while(<>){ $sum += $_; } print $sum, "\n";' 114664232
crash> p nfsd_file_releases:a | awk '{print $NF}' | perl -e 'while(<>){ $sum += $_; } print $sum, "\n";' 114664221So yes, 1/4 is needed for fixing the issue.
What exactly is 1/4? For where?
Sorry, top posting loses all context :(
greg k-h
Re: [PATCH 6.11 397/695] nfsd: fix refcount leak when file is unhashed after being found
Here is 1/4 in the context of Chuck's e-mail reply:
nfsd: add list_head nf_gc to struct nfsd_file
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8e6e2ffa6569a205f1805cbaeca143b556581da6
Quoted 19 lines · Greg Kroah-Hartman
Quoted 11 lines · Youzhong Yang
I applied 2/4, 3/4 and 4/4 on top of kernel 6.6.41 and tested it under our work load, unfortunately leaks occurred. Here is what I got:
crash> p nfsd_file_allocations:a | awk '{print $NF}' | perl -e 'while(<>){ $sum += $_; } print $sum, "\n";' 114664232
crash> p nfsd_file_releases:a | awk '{print $NF}' | perl -e 'while(<>){ $sum += $_; } print $sum, "\n";' 114664221So yes, 1/4 is needed for fixing the issue.
What exactly is 1/4? For where?
Sorry, top posting loses all context :(
greg k-h
Greg Kroah-Hartman
maintainerRe: [PATCH 6.11 397/695] nfsd: fix refcount leak when file is unhashed after being found
Quoted 4 lines · Youzhong Yang
Here is 1/4 in the context of Chuck's e-mail reply:
nfsd: add
list_headnf_gcto structnfsd_file
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8e6e2ffa6569a205f1805cbaeca143b556581da6
Sorry, again, I don't know what to do here :(
Greg Kroah-Hartman
maintainerRe: [PATCH 6.11 397/695] nfsd: fix refcount leak when file is unhashed after being found
Quoted 9 lines · Greg Kroah-Hartman
Quoted 4 lines · Youzhong Yang
Here is 1/4 in the context of Chuck's e-mail reply:
nfsd: add
list_headnf_gcto structnfsd_file
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8e6e2ffa6569a205f1805cbaeca143b556581da6Sorry, again, I don't know what to do here :(
Ok, in digging through the thread, do you feel this one should also be backported to the 6.11.y tree? If so, how far back?
thanks,
greg k-h
Re: [PATCH 6.11 397/695] nfsd: fix refcount leak when file is unhashed after being found
Thanks Greg. Yes, if a complete fix is concerned, it should be backported. I had no problem applying those commits on the top of 6.6, but I am not sure about the earlier kernel versions.
Quoted 18 lines · Greg Kroah-Hartman
Quoted 9 lines · Greg Kroah-Hartman
Quoted 4 lines · Youzhong Yang
Here is 1/4 in the context of Chuck's e-mail reply:
nfsd: add
list_headnf_gcto structnfsd_file
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8e6e2ffa6569a205f1805cbaeca143b556581da6Sorry, again, I don't know what to do here :(
Ok, in digging through the thread, do you feel this one should also be backported to the 6.11.y tree? If so, how far back?
thanks,
greg k-h
Re: [PATCH 6.11 397/695] nfsd: fix refcount leak when file is unhashed after being found
In reply to Greg Kroah-HartmanQuoted 12 lines · Greg Kroah-Hartman
Quoted 7 lines · Greg Kroah-Hartman
Quoted 4 lines · Youzhong Yang
Here is 1/4 in the context of Chuck's e-mail reply:
nfsd: add
list_headnf_gcto structnfsd_file
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8e6e2ffa6569a205f1805cbaeca143b556581da6Sorry, again, I don't know what to do here :(
When we tested 1/4 on upstream, it was neither sufficient nor necessary to address the leak, IIRC. And I don't recall ever seeing a clear explanation about why that change is necessary. That's why we consider it a defensive change, not a bug fix.
But it shouldn't be harmful to backport it to LTS kernels. I don't object to a backport. To me, though, it seems to be lacking a complete rationale.
Quoted 2 lines
Ok, in digging through the thread, do you feel this one should also be backported to the 6.11.y tree?
It's not clear that it is needed in v6.11 without testing. Neither Jeff nor I have a reproducer for that leak, though.
4/4 seems like an ABI change, and again, testing is needed to see whether its backport is truly needed. So far we know only that when all 4 are backported, the leak goes away. That is not proof that 4/4 by itself is required.
Quoted 1 line
If so, how far back?
LTS kernels all the way back to v5.10.y are likely to have this leak, since they have all the NFSD filecache backports already. 5.4.y is generally too old to be reparable.
I would prefer more testing of this backport on the stable kernels, but I understand if that isn't practical.
--
Chuck Lever
Re: [PATCH 6.11 397/695] nfsd: fix refcount leak when file is unhashed after being found
The explanation of how it can happen is in the commit message. Using list_head 'nf_lru' for two purposes (the LRU list and dispose list) is problematic. I also mentioned my reproducer in one of the e-mail threads, here it is if it still matters:
https://github.com/youzhongyang/nfsd-file-leaks
Thank you.
Quoted 51 lines · Chuck Lever III
Quoted 13 lines · Greg Kroah-Hartman
Quoted 7 lines · Greg Kroah-Hartman
Quoted 4 lines · Youzhong Yang
Here is 1/4 in the context of Chuck's e-mail reply:
nfsd: add
list_headnf_gcto structnfsd_file
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8e6e2ffa6569a205f1805cbaeca143b556581da6Sorry, again, I don't know what to do here :(
When we tested 1/4 on upstream, it was neither sufficient nor necessary to address the leak, IIRC. And I don't recall ever seeing a clear explanation about why that change is necessary. That's why we consider it a defensive change, not a bug fix.
But it shouldn't be harmful to backport it to LTS kernels. I don't object to a backport. To me, though, it seems to be lacking a complete rationale.
Quoted 2 lines
Ok, in digging through the thread, do you feel this one should also be backported to the 6.11.y tree?
It's not clear that it is needed in v6.11 without testing. Neither Jeff nor I have a reproducer for that leak, though.
4/4 seems like an ABI change, and again, testing is needed to see whether its backport is truly needed. So far we know only that when all 4 are backported, the leak goes away. That is not proof that 4/4 by itself is required.
Quoted 1 line
If so, how far back?
LTS kernels all the way back to v5.10.y are likely to have this leak, since they have all the NFSD filecache backports already. 5.4.y is generally too old to be reparable.
I would prefer more testing of this backport on the stable kernels, but I understand if that isn't practical.
--
Chuck Lever
Re: [PATCH 6.11 397/695] nfsd: fix refcount leak when file is unhashed after being found
Quoted 7 lines · Youzhong Yang
The explanation of how it can happen is in the commit message. Using
list_head'nf_lru' for two purposes (the LRU list and dispose list) is problematic.
"is problematic" is not an adequate or precise explanation of how the code is failing. But as I said, I'm not objecting, just noting that we don't understand why this change addresses the problem.
In other words, we have test experience that shows the patch is safe to apply, but no deep explanation of why it is effective.
Quoted 4 lines
I also mentioned my reproducer in one of the e-mail threads, here it is if it still matters:
I'm asking that you please apply and test these patches on v6.11 and v6.1, at the very least, before requesting that Greg apply these patches to the LTS kernels. Greg needs very clear instructions about how he should proceed, as well as some evidence that we are not asking him to apply patches that will break the target kernels.
And, please confirm that 4/4 is needed. I can't see any obvious reason why it is necessary to prevent a leak.
--
Chuck Lever
Re: [PATCH 6.11 397/695] nfsd: fix refcount leak when file is unhashed after being found
The precise explanation is in the commit message.
Quoted 6 lines
I'm asking that you please apply and test these patches on v6.11 and v6.1, at the very least, before requesting that Greg apply these patches to the LTS kernels. Greg needs very clear instructions about how he should proceed, as well as some evidence that we are not asking him to apply patches that will break the target kernels.
It's very reasonable to have more tests. I 100% agree.
Per your request, I performed the testing under kernel 6.1 and 6.11. We've already tested under kernel 6.6 using our test farm.
Conclusion: it works as expected - the issue reproduces without the fix, it's no longer reproducible with the fix applied.
To Greg: please cherry-pick the commits 1, 2, 3, and 4 (see below for what these commits are) and apply to kernel 6.1 all the way up to 6.11 if that's appropriate.
Here is how it's done:
- cherry-pick nfsd commit(s)
- build and install kernel
- run my reproducer
- check nfsd_file_allocations and nfsd_file_releases, see if it reproduces or not
Commits to cherry-pick:
1. nfsd: add list_head nf_gc to struct nfsd_file
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8e6e2ffa6569a205f1805cbaeca143b556581da6
2. nfsd: fix refcount leak when file is unhashed after being found
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8a7926176378460e0d91e02b03f0ff20a8709a60
3. nfsd: remove unneeded EEXIST error check in nfsd_do_file_acquire
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=81a95c2b1d605743220f28db04b8da13a65c4059
4. nfsd: count nfsd_file allocations
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=700bb4ff912f954345286e065ff145753a1d5bbe
Note: commit #4 is very useful for detecting if a leak happens or not, otherwise it would be very time-consuming to find out. It's not needed but better to have.
Kernel 6.1.110 + commit 4
1st run:nfsd_file_allocations: 811nfsd_file_releases: 791
leaks? Yes
2nd run:nfsd_file_allocations: 554nfsd_file_releases: 548
leaks? Yes
Kernel 6.1.110 + commits 1,2,3,4
1st run:nfsd_file_allocations: 816nfsd_file_releases: 816
leaks? No
2nd run:nfsd_file_allocations: 9755nfsd_file_releases: 9755
leaks? No
Kernel 6.11.0 + commit 4
1st run:nfsd_file_allocations: 3662nfsd_file_releases: 3659
leaks? Yes
2nd run:nfsd_file_allocations: 2177nfsd_file_releases: 2175
leaks? Yes
Kernel 6.11.0 + commits 1,2,3,4
1st run:nfsd_file_allocations: 2136nfsd_file_releases: 2136
leaks? No
2nd run:nfsd_file_allocations: 9094nfsd_file_releases: 9094
leaks? No
Quoted 39 lines · Chuck Lever III
Quoted 8 lines · Youzhong Yang
The explanation of how it can happen is in the commit message. Using
list_head'nf_lru' for two purposes (the LRU list and dispose list) is problematic."is problematic" is not an adequate or precise explanation of how the code is failing. But as I said, I'm not objecting, just noting that we don't understand why this change addresses the problem.
In other words, we have test experience that shows the patch is safe to apply, but no deep explanation of why it is effective.
Quoted 4 lines
I also mentioned my reproducer in one of the e-mail threads, here it is if it still matters:
I'm asking that you please apply and test these patches on v6.11 and v6.1, at the very least, before requesting that Greg apply these patches to the LTS kernels. Greg needs very clear instructions about how he should proceed, as well as some evidence that we are not asking him to apply patches that will break the target kernels.
And, please confirm that 4/4 is needed. I can't see any obvious reason why it is necessary to prevent a leak.
--
Chuck Lever
Greg Kroah-Hartman
maintainerPATCH 398/695 pinctrl: mvebu: Fix devinit_dove_pinctrl_probe function
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wang Jianzheng <[email protected]>
[ Upstream commit c25478419f6fd3f74c324a21ec007cf14f2688d7 ]
When an error occurs during the execution of the function __devinit_dove_pinctrl_probe, the clk is not properly disabled.
Fix this by calling clk_disable_unprepare before return.
--- drivers/pinctrl/mvebu/pinctrl-dove.c | 42 +++++++++++++++++++--------- 1 file changed, 29 insertions(+), 13 deletions(-)
drivers/pinctrl/mvebu/pinctrl-dove.c +29 -13
@@ -767,7 +767,7 @@ static int dove_pinctrl_probe(struct platform_device *pdev)struct resource fb_res;struct mvebu_mpp_ctrl_data *mpp_data;void __iomem *base; -int i; +int i, ret; pdev->dev.platform_data = (void *)device_get_match_data (&pdev->dev);
@@ -783,13 +783,17 @@ static int dove_pinctrl_probe(struct platform_device *pdev)clk_prepare_enable (clk); base =devm_platform_get_and_ioremap_resource (pdev,0 , &mpp_res); -if (IS_ERR (base)) -return PTR_ERR (base); +if (IS_ERR (base)) { + ret =PTR_ERR (base); + goto err_probe; + } mpp_data =devm_kcalloc (&pdev->dev, dove_pinctrl_info.ncontrols,sizeof (*mpp_data),GFP_KERNEL ); -if (!mpp_data) -return -ENOMEM ; +if (!mpp_data) { + ret = -ENOMEM ; + goto err_probe; + } dove_pinctrl_info.control_data = mpp_data;for (i =0 ; i <ARRAY_SIZE (dove_mpp_controls); i++)
@@ -808,8 +812,10 @@ static int dove_pinctrl_probe(struct platform_device *pdev) } mpp4_base =devm_ioremap_resource (&pdev->dev, res); -if (IS_ERR (mpp4_base)) -return PTR_ERR (mpp4_base); +if (IS_ERR (mpp4_base)) { + ret =PTR_ERR (mpp4_base); + goto err_probe; + } res =platform_get_resource (pdev,IORESOURCE_MEM ,2 );if (!res) {
@@ -820,8 +826,10 @@ static int dove_pinctrl_probe(struct platform_device *pdev) } pmu_base =devm_ioremap_resource (&pdev->dev, res); -if (IS_ERR (pmu_base)) -return PTR_ERR (pmu_base); +if (IS_ERR (pmu_base)) { + ret =PTR_ERR (pmu_base); + goto err_probe; + } gconfmap =syscon_regmap_lookup_by_compatible ("marvell,dove-global-config" );if (IS_ERR (gconfmap)) {
@@ -831,12 +839,17 @@ static int dove_pinctrl_probe(struct platform_device *pdev)adjust_resource (&fb_res, (mpp_res->start &INT_REGS_MASK ) +GC_REGS_OFFS ,0x14 ); gc_base =devm_ioremap_resource (&pdev->dev, &fb_res); -if (IS_ERR (gc_base)) -return PTR_ERR (gc_base); +if (IS_ERR (gc_base)) { + ret =PTR_ERR (gc_base); + goto err_probe; + } + gconfmap =devm_regmap_init_mmio (&pdev->dev, gc_base, &gc_regmap_config); -if (IS_ERR (gconfmap)) -return PTR_ERR (gconfmap); +if (IS_ERR (gconfmap)) { + ret =PTR_ERR (gconfmap); + goto err_probe; + } }/* Warn on any missing DT resource */
@@ -844,6 +857,9 @@ static int dove_pinctrl_probe(struct platform_device *pdev)dev_warn (&pdev->dev,FW_BUG "Missing pinctrl regs in DTB. Please update your firmware.\n" );return mvebu_pinctrl_probe (pdev); +err_probe: +clk_disable_unprepare (clk); +return ret; }static struct platform_driver dove_pinctrl_driver = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 399/695 IB/mlx5: Fix UMR pd cleanup on error flow of driver init
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mi <[email protected]>
[ Upstream commit 112e6e83a894260cc7efe79a1fc47d4d51461742 ]
The cited commit moves the pd allocation from function mlx5r_umr_resource_cleanup() to a new function mlx5r_umr_cleanup(). So the fix in commit [1] is broken. In error flow, will hit panic [2].
Fix it by checking pd pointer to avoid panic if it is NULL;
[1] RDMA/mlx5: Fix UMR cleanup on error flow of driver init
[2]
[ 347.567063] infiniband mlx5_0: Couldn't register device with driver model [ 347.591382] BUG: kernel NULL pointer dereference, address: 0000000000000020 [ 347.593438] #PF: supervisor read access in kernel mode [ 347.595176] #PF: error_code(0x0000) - not-present page [ 347.596962] PGD 0 P4D 0 [ 347.601361] RIP: 0010:ib_dealloc_pd_user+0x12/0xc0 [ib_core] [ 347.604171] RSP: 0018:ffff888106293b10 EFLAGS: 00010282 [ 347.604834] RAX: 0000000000000000 RBX: 000000000000000e RCX: 0000000000000000 [ 347.605672] RDX: ffff888106293ad0 RSI: 0000000000000000 RDI: 0000000000000000 [ 347.606529] RBP: 0000000000000000 R08: ffff888106293ae0 R09: ffff888106293ae0 [ 347.607379] R10: 0000000000000a06 R11: 0000000000000000 R12: 0000000000000000 [ 347.608224] R13: ffffffffa0704dc0 R14: 0000000000000001 R15: 0000000000000001 [ 347.609067] FS: 00007fdc720cd9c0(0000) GS:ffff88852c880000(0000) knlGS:0000000000000000 [ 347.610094] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 347.610727] CR2: 0000000000000020 CR3: 0000000103012003 CR4: 0000000000370eb0 [ 347.611421] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 347.612113] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 347.612804] Call Trace: [ 347.613130] <TASK> [ 347.613417] ? __die+0x20/0x60 [ 347.613793] ? page_fault_oops+0x150/0x3e0 [ 347.614243] ? free_msg+0x68/0x80 [mlx5_core] [ 347.614840] ? cmd_exec+0x48f/0x11d0 [mlx5_core] [ 347.615359] ? exc_page_fault+0x74/0x130 [ 347.615808] ? asm_exc_page_fault+0x22/0x30 [ 347.616273] ? ib_dealloc_pd_user+0x12/0xc0 [ib_core] [ 347.616801] mlx5r_umr_cleanup+0x23/0x90 [mlx5_ib] [ 347.617365] mlx5_ib_stage_pre_ib_reg_umr_cleanup+0x36/0x40 [mlx5_ib] [ 347.618025] __mlx5_ib_add+0x96/0xd0 [mlx5_ib] [ 347.618539] mlx5r_probe+0xe9/0x310 [mlx5_ib] [ 347.619032] ? kernfs_add_one+0x107/0x150 [ 347.619478] ? __mlx5_ib_add+0xd0/0xd0 [mlx5_ib] [ 347.619984] auxiliary_bus_probe+0x3e/0x90 [ 347.620448] really_probe+0xc5/0x3a0 [ 347.620857] __driver_probe_device+0x80/0x160 [ 347.621325] driver_probe_device+0x1e/0x90 [ 347.621770] __driver_attach+0xec/0x1c0 [ 347.622213] ? __device_attach_driver+0x100/0x100 [ 347.622724] bus_for_each_dev+0x71/0xc0 [ 347.623151] bus_add_driver+0xed/0x240 [ 347.623570] driver_register+0x58/0x100 [ 347.623998] __auxiliary_driver_register+0x6a/0xc0 [ 347.624499] ? driver_register+0xae/0x100 [ 347.624940] ? 0xffffffffa0893000 [ 347.625329] mlx5_ib_init+0x16a/0x1e0 [mlx5_ib] [ 347.625845] do_one_initcall+0x4a/0x2a0 [ 347.626273] ? gcov_event+0x2e2/0x3a0 [ 347.626706] do_init_module+0x8a/0x260 [ 347.627126] init_module_from_file+0x8b/0xd0 [ 347.627596] __x64_sys_finit_module+0x1ca/0x2f0 [ 347.628089] do_syscall_64+0x4c/0x100
--- drivers/infiniband/hw/mlx5/umr.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/infiniband/hw/mlx5/umr.c +3 -0
@@ -224,6 +224,9 @@ int mlx5r_umr_init(struct mlx5_ib_dev *dev)void mlx5r_umr_cleanup (struct mlx5_ib_dev *dev) { +if (!dev->umrc.pd) +return ; +mutex_destroy (&dev->umrc.init_lock);ib_dealloc_pd (dev->umrc.pd); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 400/695 IB/core: Fix ib_cache_setup_one error flow cleanup
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Patrisious Haddad <[email protected]>
[ Upstream commit 1403c8b14765eab805377dd3b75e96ace8747aed ]
When ib_cache_update return an error, we exit ib_cache_setup_one instantly with no proper cleanup, even though before this we had already successfully done gid_table_setup_one, that results in the kernel WARN below.
Do proper cleanup using gid_table_cleanup_one before returning the err in order to fix the issue.
WARNING: CPU: 4 PID: 922 at drivers/infiniband/core/cache.c:806 gid_table_release_one+0x181/0x1a0 Modules linked in: CPU: 4 UID: 0 PID: 922 Comm: c_repro Not tainted 6.11.0-rc1+ #3 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 RIP: 0010:gid_table_release_one+0x181/0x1a0 Code: 44 8b 38 75 0c e8 2f cb 34 ff 4d 8b b5 28 05 00 00 e8 23 cb 34 ff 44 89 f9 89 da 4c 89 f6 48 c7 c7 d0 58 14 83 e8 4f de 21 ff <0f> 0b 4c 8b 75 30 e9 54 ff ff ff 48 8 3 c4 10 5b 5d 41 5c 41 5d 41 RSP: 0018:ffffc90002b835b0 EFLAGS: 00010286 RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffffffff811c8527 RDX: 0000000000000000 RSI: ffffffff811c8534 RDI: 0000000000000001 RBP: ffff8881011b3d00 R08: ffff88810b3abe00 R09: 205d303839303631 R10: 666572207972746e R11: 72746e6520444947 R12: 0000000000000001 R13: ffff888106390000 R14: ffff8881011f2110 R15: 0000000000000001 FS: 00007fecc3b70800(0000) GS:ffff88813bd00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000020000340 CR3: 000000010435a001 CR4: 00000000003706b0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> ? show_regs+0x94/0xa0 ? __warn+0x9e/0x1c0 ? gid_table_release_one+0x181/0x1a0 ? report_bug+0x1f9/0x340 ? gid_table_release_one+0x181/0x1a0 ? handle_bug+0xa2/0x110 ? exc_invalid_op+0x31/0xa0 ? asm_exc_invalid_op+0x16/0x20 ? __warn_printk+0xc7/0x180 ? __warn_printk+0xd4/0x180 ? gid_table_release_one+0x181/0x1a0 ib_device_release+0x71/0xe0 ? __pfx_ib_device_release+0x10/0x10 device_release+0x44/0xd0 kobject_put+0x135/0x3d0 put_device+0x20/0x30 rxe_net_add+0x7d/0xa0 rxe_newlink+0xd7/0x190 nldev_newlink+0x1b0/0x2a0 ? __pfx_nldev_newlink+0x10/0x10 rdma_nl_rcv_msg+0x1ad/0x2e0 rdma_nl_rcv_skb.constprop.0+0x176/0x210 netlink_unicast+0x2de/0x400 netlink_sendmsg+0x306/0x660 __sock_sendmsg+0x110/0x120 ____sys_sendmsg+0x30e/0x390 ___sys_sendmsg+0x9b/0xf0 ? kstrtouint+0x6e/0xa0 ? kstrtouint_from_user+0x7c/0xb0 ? get_pid_task+0xb0/0xd0 ? proc_fail_nth_write+0x5b/0x140 ? __fget_light+0x9a/0x200 ? preempt_count_add+0x47/0xa0 __sys_sendmsg+0x61/0xd0 do_syscall_64+0x50/0x110 entry_SYSCALL_64_after_hwframe+0x76/0x7e
--- drivers/infiniband/core/cache.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/infiniband/core/cache.c +3 -1
@@ -1640,8 +1640,10 @@ int ib_cache_setup_one(struct ib_device *device) rdma_for_each_port (device, p) { err =ib_cache_update (device, p, true, true, true); -if (err) +if (err) { +gid_table_cleanup_one (device);return err; + } }return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 401/695 dt-bindings: PCI: layerscape-pci: Replace fsl,lx2160a-pcie with fsl,lx2160ar2-pcie
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Li <[email protected]>
[ Upstream commit 1a1bf58897d20fc38b454dfecd2771e142d36966 ]
The fsl,lx2160a-pcie compatible is used for mobivel according to the Documentation/devicetree/bindings/pci/layerscape-pcie-gen4.txt file.
Whereas the fsl,layerscape-pcie is used for DesignWare PCIe controller binding.
So change it to fsl,lx2160ar2-pcie and allow a fall back to fsl,ls2088a-pcie.
While at it, sort compatible string.
--- .../bindings/pci/fsl,layerscape-pcie.yaml | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-)
Documentation/devicetree/bindings/pci/fsl,layerscape-pcie.yaml +14 -12
@@ -22,18 +22,20 @@ description: properties: compatible: - enum: - - fsl,ls1021a-pcie - - fsl,ls2080a-pcie - - fsl,ls2085a-pcie - - fsl,ls2088a-pcie - - fsl,ls1088a-pcie - - fsl,ls1046a-pcie - - fsl,ls1043a-pcie - - fsl,ls1012a-pcie - - fsl,ls1028a-pcie - - fsl,lx2160a-pcie - + oneOf: + - enum: + - fsl,ls1012a-pcie + - fsl,ls1021a-pcie + - fsl,ls1028a-pcie + - fsl,ls1043a-pcie + - fsl,ls1046a-pcie + - fsl,ls1088a-pcie + - fsl,ls2080a-pcie + - fsl,ls2085a-pcie + - fsl,ls2088a-pcie + - items: + - const: fsl,lx2160ar2-pcie + - const: fsl,ls2088a-pcie reg: maxItems: 2
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 402/695 iommufd: Check the domain owner of the parent before creating a nesting domain
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
[ Upstream commit 73183ad6ea51029d04b098286dcee98d715015f1 ]
This check was missed, before we can pass a struct iommu_domain to a driver callback we need to validate that the domain was created by that driver.
--- drivers/iommu/iommufd/hw_pagetable.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/iommu/iommufd/hw_pagetable.c +2 -1
@@ -225,7 +225,8 @@ iommufd_hwpt_nested_alloc(struct iommufd_ctx *ictx,if ((flags & ~IOMMU_HWPT_FAULT_ID_VALID ) || !user_data->len || !ops->domain_alloc_user)return ERR_PTR (-EOPNOTSUPP ); -if (parent->auto_domain || !parent->nest_parent) +if (parent->auto_domain || !parent->nest_parent || + parent->common.domain->owner != ops)return ERR_PTR (-EINVAL ); hwpt_nested = __iommufd_object_alloc(
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 403/695 PCI: kirin: Fix buffer overflow in kirin_pcie_parse_port()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandra Diupina <[email protected]>
[ Upstream commit c500a86693a126c9393e602741e348f80f1b0fc5 ]
Within kirin_pcie_parse_port(), the pcie->num_slots is compared to pcie->gpio_id_reset size (MAX_PCI_SLOTS) which is correct and would lead to an overflow.
Thus, fix condition to pcie->num_slots + 1 >= MAX_PCI_SLOTS and move pcie->num_slots increment below the if-statement to avoid out-of-bounds array access.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/pci/controller/dwc/pcie-kirin.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/pci/controller/dwc/pcie-kirin.c +2 -2
@@ -420,11 +420,11 @@ static int kirin_pcie_parse_port(struct kirin_pcie *pcie, "unable to get a valid reset gpio\n"); } - pcie->num_slots++; -if (pcie->num_slots >MAX_PCI_SLOTS ) { +if (pcie->num_slots +1 >=MAX_PCI_SLOTS ) {dev_err (dev,"Too many PCI slots!\n" );return -EINVAL ; } + pcie->num_slots++; ret =of_pci_get_devfn (child);if (ret <0 ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 404/695 RDMA/erdma: Return QP state in erdma_query_qp
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cheng Xu <[email protected]>
[ Upstream commit e77127ff6416b17e0b3e630ac46ee5c9a6570f57 ]
Fix qp_state and cur_qp_state to return correct values in struct ib_qp_attr.
--- drivers/infiniband/hw/erdma/erdma_verbs.c | 25 ++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-)
drivers/infiniband/hw/erdma/erdma_verbs.c +24 -1
@@ -1544,11 +1544,31 @@ int erdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask,return ret; } +static enum ib_qp_state query_qp_state (struct erdma_qp *qp) +{ +switch (qp->attrs.state) { +case ERDMA_QP_STATE_IDLE : +return IB_QPS_INIT ; +case ERDMA_QP_STATE_RTR : +return IB_QPS_RTR ; +case ERDMA_QP_STATE_RTS : +return IB_QPS_RTS ; +case ERDMA_QP_STATE_CLOSING : +return IB_QPS_ERR ; +case ERDMA_QP_STATE_TERMINATE : +return IB_QPS_ERR ; +case ERDMA_QP_STATE_ERROR : +return IB_QPS_ERR ; +default : +return IB_QPS_ERR ; + } +} +int erdma_query_qp (struct ib_qp *ibqp,struct ib_qp_attr *qp_attr,int qp_attr_mask,struct ib_qp_init_attr *qp_init_attr) { -struct erdma_qp *qp;struct erdma_dev *dev; +struct erdma_qp *qp;if (ibqp && qp_attr && qp_init_attr) { qp =to_eqp (ibqp);
@@ -1575,6 +1595,9 @@ int erdma_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, qp_init_attr->cap = qp_attr->cap; + qp_attr->qp_state =query_qp_state (qp); + qp_attr->cur_qp_state =query_qp_state (qp); +return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 405/695 RDMA/mlx5: Fix counter update on MR cache mkey creation
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Guralnik <[email protected]>
[ Upstream commit 6f5cd6ac9a4201e4ba6f10b76a9da8044d6e38b0 ]
After an mkey is created, update the counter for pending mkeys before reshceduling the work that is filling the cache.
Rescheduling the work with a full MR cache entry and a wrong 'pending' counter will cause us to miss disabling the fill_to_high_water flag. Thus leaving the cache full but with an indication that it's still needs to be filled up to it's full size (2 * limit).
Next time an mkey will be taken from the cache, we'll unnecessarily continue the process of filling the cache to it's full size.
--- drivers/infiniband/hw/mlx5/mr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/mlx5/mr.c +1 -1
@@ -211,9 +211,9 @@ static void create_mkey_callback(int status, struct mlx5_async_work *context)spin_lock_irqsave (&ent->mkeys_queue.lock, flags);push_mkey_locked (ent, mkey_out->mkey); + ent->pending--;/* If we are doing fill_to_high_water then keep going. */ queue_adjust_cache_locked (ent); - ent->pending--;spin_unlock_irqrestore (&ent->mkeys_queue.lock, flags);kfree (mkey_out); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 406/695 RDMA/mlx5: Limit usage of over-sized mkeys from the MR cache
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Guralnik <[email protected]>
[ Upstream commit ee6d57a2e13d11ce9050cfc3e3b69ef707a44a63 ]
When searching the MR cache for suitable cache entries, don't use mkeys larger than twice the size required for the MR.
This should ensure the usage of mkeys closer to the minimal required size and reduce memory waste.
On driver init we create entries for mkeys with clear attributes and powers of 2 sizes from 4 to the max supported size.
This solves the issue for anyone using mkeys that fit these requirements.
In the use case where an MR is registered with different attributes, like an access flag we can't UMR, we'll create a new cache entry to store it upon dereg.
Without this fix, any later registration with same attributes and smaller size will use the newly created cache entry and it's mkeys, disregarding the memory waste of using mkeys larger than required.
For example, one worst-case scenario can be when registering and deregistering a 1GB mkey with ATS enabled which will cause the creation of a new cache entry to hold those type of mkeys. A user registering a 4k MR with ATS will end up using the new cache entry and an mkey that can support a 1GB MR, thus wasting x250k memory than actually needed in the HW.
Additionally, allow all small registration to use the smallest size cache entry that is initialized on driver load even if size is larger than twice the required size.
--- drivers/infiniband/hw/mlx5/mr.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/infiniband/hw/mlx5/mr.c +12 -2
@@ -48,6 +48,7 @@ enum { MAX_PENDING_REG_MR = 8, }; +#define MLX5_MR_CACHE_PERSISTENT_ENTRY_MIN_DESCS 4#define MLX5_UMR_ALIGN 2048 static void
@@ -659,6 +660,7 @@ mkey_cache_ent_from_rb_key(struct mlx5_ib_dev *dev, {struct rb_node *node = dev->cache.rb_root.rb_node;struct mlx5_cache_ent *cur, *smallest =NULL ; +u64 ndescs_limit;int cmp;/*
@@ -677,10 +679,18 @@ mkey_cache_ent_from_rb_key(struct mlx5_ib_dev *dev,return cur; } +/* +* Limit the usage of mkeys larger than twice the required size while +* also allowing the usage of smallest cache entry for small MRs. +*/ + ndescs_limit =max_t (u64, rb_key.ndescs *2 , +MLX5_MR_CACHE_PERSISTENT_ENTRY_MIN_DESCS ); +return (smallest && smallest->rb_key.access_mode == rb_key.access_mode && smallest->rb_key.access_flags == rb_key.access_flags && - smallest->rb_key.ats == rb_key.ats) ? + smallest->rb_key.ats == rb_key.ats && + smallest->rb_key.ndescs <= ndescs_limit) ? smallest :NULL ; }
@@ -962,7 +972,7 @@ int mlx5_mkey_cache_init(struct mlx5_ib_dev *dev)mlx5_mkey_cache_debugfs_init (dev);mutex_lock (&cache->rb_lock);for (i =0 ; i <=mkey_cache_max_order (dev); i++) { - rb_key.ndescs =1 << (i +2 ); + rb_key.ndescs =MLX5_MR_CACHE_PERSISTENT_ENTRY_MIN_DESCS << i; ent =mlx5r_cache_create_ent_locked (dev, rb_key, true);if (IS_ERR (ent)) { ret =PTR_ERR (ent);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 407/695 RDMA/mlx5: Drop redundant work canceling from clean_keys()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Guralnik <[email protected]>
[ Upstream commit 30e6bd8d3b5639f8f4261e5e6c0917ce264b8dc2 ]
The canceling of dealyed work in clean_keys() is a leftover from years back and was added to prevent races in the cleanup process of MR cache. The cleanup process was rewritten a few years ago and the canceling of delayed work and flushing of workqueue was added before the call to clean_keys().
Stable-dep-of: 7ebb00cea49d ("RDMA/mlx5: Fix MR cache temp entries cleanup")
--- drivers/infiniband/hw/mlx5/mr.c | 1 - 1 file changed, 1 deletion(-)
drivers/infiniband/hw/mlx5/mr.c +0 -1
@@ -779,7 +779,6 @@ static void clean_keys(struct mlx5_ib_dev *dev, struct mlx5_cache_ent *ent) {u32 mkey; -cancel_delayed_work (&ent->dwork);spin_lock_irq (&ent->mkeys_queue.lock);while (ent->mkeys_queue.ci) { mkey =pop_mkey_locked (ent);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 408/695 RDMA/mlx5: Fix MR cache temp entries cleanup
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Guralnik <[email protected]>
[ Upstream commit 7ebb00cea49db641b458edef0ede389f7004821d ]
Fix the cleanup of the temp cache entries that are dynamically created in the MR cache.
The cleanup of the temp cache entries is currently scheduled only when a new entry is created. Since in the cleanup of the entries only the mkeys are destroyed and the cache entry stays in the cache, subsequent registrations might reuse the entry and it will eventually be filled with new mkeys without cleanup ever getting scheduled again.
On workloads that register and deregister MRs with a wide range of properties we see the cache ends up holding many cache entries, each holding the max number of mkeys that were ever used through it.
Additionally, as the cleanup work is scheduled to run over the whole cache, any mkey that is returned to the cache after the cleanup was scheduled will be held for less than the intended 30 seconds timeout.
Solve both issues by dropping the existing remove_ent_work and reusing the existing per-entry work to also handle the temp entries cleanup.
Schedule the work to run with a 30 seconds delay every time we push an mkey to a clean temp entry.
This ensures the cleanup runs on each entry only 30 seconds after the first mkey was pushed to an empty entry.
As we have already been distinguishing between persistent and temp entries when scheduling the cache_work_func, it is not being scheduled in any other flows for the temp entries.
Another benefit from moving to a per-entry cleanup is we now not required to hold the rb_tree mutex, thus enabling other flow to run concurrently.
--- drivers/infiniband/hw/mlx5/mlx5_ib.h | 2 +- drivers/infiniband/hw/mlx5/mr.c | 82 +++++++++++----------------- 2 files changed, 32 insertions(+), 52 deletions(-)
drivers/infiniband/hw/mlx5/mlx5_ib.h +1 -1
@@ -796,6 +796,7 @@ struct mlx5_cache_ent { u8 is_tmp:1; u8 disabled:1; u8 fill_to_high_water:1; + u8 tmp_cleanup_scheduled:1;/* * - limit is the low water mark for stored mkeys, 2* limit is the
@@ -827,7 +828,6 @@ struct mlx5_mkey_cache {struct mutex rb_lock;struct dentry *fs_root;unsigned long last_add; -struct delayed_work remove_ent_dwork; };struct mlx5_ib_port_resources {
drivers/infiniband/hw/mlx5/mr.c +31 -51
131 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 409/695 watchdog: imx_sc_wdt: Dont disable WDT in suspend
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Blixt <[email protected]>
[ Upstream commit 2d9d6d300fb0a4ae4431bb308027ac9385746d42 ]
Parts of the suspend and resume chain is left unprotected if we disable the WDT here.
Quoted 1 line
From experiments we can see that the SCU disables and re-enables the WDT
when we enter and leave suspend to ram. By not touching the WDT here we are protected by the WDT all the way to the SCU.
--- drivers/watchdog/imx_sc_wdt.c | 24 ------------------------ 1 file changed, 24 deletions(-)
drivers/watchdog/imx_sc_wdt.c +0 -24
@@ -216,29 +216,6 @@ static int imx_sc_wdt_probe(struct platform_device *pdev)return devm_watchdog_register_device (dev, wdog); } -static int __maybe_unused imx_sc_wdt_suspend (struct device *dev) -{ -struct imx_sc_wdt_device *imx_sc_wdd =dev_get_drvdata (dev); - -if (watchdog_active (&imx_sc_wdd->wdd)) -imx_sc_wdt_stop (&imx_sc_wdd->wdd); - -return 0 ; -} - -static int __maybe_unused imx_sc_wdt_resume (struct device *dev) -{ -struct imx_sc_wdt_device *imx_sc_wdd =dev_get_drvdata (dev); - -if (watchdog_active (&imx_sc_wdd->wdd)) -imx_sc_wdt_start (&imx_sc_wdd->wdd); - -return 0 ; -} - -static SIMPLE_DEV_PM_OPS(imx_sc_wdt_pm_ops, - imx_sc_wdt_suspend, imx_sc_wdt_resume); -static const struct of_device_id imx_sc_wdt_dt_ids[] = { { .compatible ="fsl,imx-sc-wdt" , }, {/* sentinel */ }
@@ -250,7 +227,6 @@ static struct platform_driver imx_sc_wdt_driver = { .driver = { .name = "imx-sc-wdt", .of_match_table = imx_sc_wdt_dt_ids, - .pm = &imx_sc_wdt_pm_ops, }, };module_platform_driver (imx_sc_wdt_driver);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 410/695 RDMA/hns: Dont modify rq next block addr in HIP09 QPC
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxian Huang <[email protected]>
[ Upstream commit 6928d264e328e0cb5ee7663003a6e46e4cba0a7e ]
The field 'rq next block addr' in QPC can be updated by driver only on HIP08. On HIP09 HW updates this field while driver is not allowed.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +8 -6
@@ -4423,12 +4423,14 @@ static int config_qp_rq_buf(struct hns_roce_dev *hr_dev, upper_32_bits(to_hr_hw_page_addr(mtts[0])));hr_reg_clear (qpc_mask,QPC_RQ_CUR_BLK_ADDR_H ); - context->rq_nxt_blk_addr =cpu_to_le32 (to_hr_hw_page_addr (mtts[1 ])); - qpc_mask->rq_nxt_blk_addr =0 ; - -hr_reg_write (context,QPC_RQ_NXT_BLK_ADDR_H , -upper_32_bits (to_hr_hw_page_addr (mtts[1 ]))); -hr_reg_clear (qpc_mask,QPC_RQ_NXT_BLK_ADDR_H ); +if (hr_dev->pci_dev->revision ==PCI_REVISION_ID_HIP08 ) { + context->rq_nxt_blk_addr = +cpu_to_le32 (to_hr_hw_page_addr (mtts[1 ])); + qpc_mask->rq_nxt_blk_addr =0 ; +hr_reg_write (context,QPC_RQ_NXT_BLK_ADDR_H , +upper_32_bits (to_hr_hw_page_addr (mtts[1 ]))); +hr_reg_clear (qpc_mask,QPC_RQ_NXT_BLK_ADDR_H ); + }return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 411/695 RDMA/hns: Fix Use-After-Free of rsv_qp on HIP08
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: wenglianfa <[email protected]>
[ Upstream commit fd8489294dd2beefb70f12ec4f6132aeec61a4d0 ]
Currently rsv_qp is freed before ib_unregister_device() is called on HIP08. During the time interval, users can still dereg MR and rsv_qp will be used in this process, leading to a UAF. Move the release of rsv_qp after calling ib_unregister_device() to fix it.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +3 -3
@@ -2972,6 +2972,9 @@ static int hns_roce_v2_init(struct hns_roce_dev *hr_dev)static void hns_roce_v2_exit (struct hns_roce_dev *hr_dev) { +if (hr_dev->pci_dev->revision ==PCI_REVISION_ID_HIP08 ) +free_mr_exit (hr_dev); +hns_roce_function_clear (hr_dev);if (!hr_dev->is_vf)
@@ -6951,9 +6954,6 @@ static void __hns_roce_hw_v2_uninit_instance(struct hnae3_handle *handle, hr_dev->state =HNS_ROCE_DEVICE_STATE_UNINIT ;hns_roce_handle_device_err (hr_dev); -if (hr_dev->pci_dev->revision ==PCI_REVISION_ID_HIP08 ) -free_mr_exit (hr_dev); -hns_roce_exit (hr_dev);kfree (hr_dev->priv);ib_dealloc_device (&hr_dev->ib_dev);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 412/695 RDMA/hns: Fix the overflow risk of hem_list_calc_ba_range()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: wenglianfa <[email protected]>
[ Upstream commit d586628b169d14bbf36be64d2b3ec9d9d2fe0432 ]
The max value of 'unit' and 'hop_num' is 2^24 and 2, so the value of 'step' may exceed the range of u32. Change the type of 'step' to u64.
--- drivers/infiniband/hw/hns/hns_roce_hem.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hem.c +6 -6
@@ -1041,9 +1041,9 @@ static bool hem_list_is_bottom_bt(int hopnum, int bt_level)* @bt_level: base address table level * @unit: ba entries per bt page */ -static u32 hem_list_calc_ba_range (int hopnum,int bt_level,int unit) +static u64 hem_list_calc_ba_range (int hopnum,int bt_level,int unit) { -u32 step; +u64 step;int max;int i;
@@ -1079,7 +1079,7 @@ int hns_roce_hem_list_calc_root_ba(const struct hns_roce_buf_region *regions, {struct hns_roce_buf_region *r;int total =0 ; -int step; +u64 step;int i;for (i =0 ; i < region_cnt; i++) {
@@ -1110,7 +1110,7 @@ static int hem_list_alloc_mid_bt(struct hns_roce_dev *hr_dev,int ret =0 ;int max_ofs;int level; -u32 step; +u64 step;int end;if (hopnum <=1 )
@@ -1147,7 +1147,7 @@ static int hem_list_alloc_mid_bt(struct hns_roce_dev *hr_dev, } start_aligned = (distance / step) * step + r->offset; - end =min_t (int, start_aligned + step -1 , max_ofs); + end =min_t (u64, start_aligned + step -1 , max_ofs); cur =hem_list_alloc_item (hr_dev, start_aligned, end, unit, true);if (!cur) {
@@ -1235,7 +1235,7 @@ static int setup_middle_bt(struct hns_roce_dev *hr_dev, void *cpu_base,struct hns_roce_hem_item *hem, *temp_hem;int total =0 ;int offset; -int step; +u64 step; step =hem_list_calc_ba_range (r->hopnum,1 , unit);if (step <1 )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 413/695 RDMA/hns: Fix spin_unlock_irqrestore() called with IRQs enabled
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengchang Tang <[email protected]>
[ Upstream commit 74d315b5af180220d561684d15897730135733a6 ]
Fix missuse of spin_lock_irq()/spin_unlock_irq() when spin_lock_irqsave()/spin_lock_irqrestore() was hold.
This was discovered through the lock debugging, and the corresponding log is as follows:
raw_local_irq_restore() called with IRQs enabled
WARNING: CPU: 96 PID: 2074 at kernel/locking/irqflag-debug.c:10 warn_bogus_irq_restore+0x30/0x40 ... Call trace: warn_bogus_irq_restore+0x30/0x40 _raw_spin_unlock_irqrestore+0x84/0xc8 add_qp_to_list+0x11c/0x148 [hns_roce_hw_v2] hns_roce_create_qp_common.constprop.0+0x240/0x780 [hns_roce_hw_v2] hns_roce_create_qp+0x98/0x160 [hns_roce_hw_v2] create_qp+0x138/0x258 ib_create_qp_kernel+0x50/0xe8 create_mad_qp+0xa8/0x128 ib_mad_port_open+0x218/0x448 ib_mad_init_device+0x70/0x1f8 add_client_context+0xfc/0x220 enable_device_and_get+0xd0/0x140 ib_register_device.part.0+0xf4/0x1c8 ib_register_device+0x34/0x50 hns_roce_register_device+0x174/0x3d0 [hns_roce_hw_v2] hns_roce_init+0xfc/0x2c0 [hns_roce_hw_v2] __hns_roce_hw_v2_init_instance+0x7c/0x1d0 [hns_roce_hw_v2] hns_roce_hw_v2_init_instance+0x9c/0x180 [hns_roce_hw_v2]
--- drivers/infiniband/hw/hns/hns_roce_qp.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/infiniband/hw/hns/hns_roce_qp.c +8 -8
@@ -1460,19 +1460,19 @@ void hns_roce_lock_cqs(struct hns_roce_cq *send_cq, struct hns_roce_cq *recv_cq)__acquire (&send_cq->lock);__acquire (&recv_cq->lock); }else if (unlikely (send_cq !=NULL && recv_cq ==NULL )) { -spin_lock_irq (&send_cq->lock); +spin_lock (&send_cq->lock);__acquire (&recv_cq->lock); }else if (unlikely (send_cq ==NULL && recv_cq !=NULL )) { -spin_lock_irq (&recv_cq->lock); +spin_lock (&recv_cq->lock);__acquire (&send_cq->lock); }else if (send_cq == recv_cq) { -spin_lock_irq (&send_cq->lock); +spin_lock (&send_cq->lock);__acquire (&recv_cq->lock); }else if (send_cq->cqn < recv_cq->cqn) { -spin_lock_irq (&send_cq->lock); +spin_lock (&send_cq->lock);spin_lock_nested (&recv_cq->lock,SINGLE_DEPTH_NESTING ); }else { -spin_lock_irq (&recv_cq->lock); +spin_lock (&recv_cq->lock);spin_lock_nested (&send_cq->lock,SINGLE_DEPTH_NESTING ); } }
@@ -1492,13 +1492,13 @@ void hns_roce_unlock_cqs(struct hns_roce_cq *send_cq,spin_unlock (&recv_cq->lock); }else if (send_cq == recv_cq) {__release (&recv_cq->lock); -spin_unlock_irq (&send_cq->lock); +spin_unlock (&send_cq->lock); }else if (send_cq->cqn < recv_cq->cqn) {spin_unlock (&recv_cq->lock); -spin_unlock_irq (&send_cq->lock); +spin_unlock (&send_cq->lock); }else {spin_unlock (&send_cq->lock); -spin_unlock_irq (&recv_cq->lock); +spin_unlock (&recv_cq->lock); } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 414/695 RDMA/hns: Fix VF triggering PF reset in abnormal interrupt handler
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxian Huang <[email protected]>
[ Upstream commit 4321feefa5501a746ebf6a7d8b59e6b955ae1860 ]
In abnormal interrupt handler, a PF reset will be triggered even if the device is a VF. It should be a VF reset.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +5 -2
@@ -6198,6 +6198,7 @@ static irqreturn_t abnormal_interrupt_basic(struct hns_roce_dev *hr_dev,struct pci_dev *pdev = hr_dev->pci_dev;struct hnae3_ae_dev *ae_dev =pci_get_drvdata (pdev);const struct hnae3_ae_ops *ops = ae_dev->ops; +enum hnae3_reset_type reset_type;irqreturn_t int_work =IRQ_NONE ;u32 int_en;
@@ -6209,10 +6210,12 @@ static irqreturn_t abnormal_interrupt_basic(struct hns_roce_dev *hr_dev,roce_write (hr_dev,ROCEE_VF_ABN_INT_ST_REG ,1 <<HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S ); + reset_type = hr_dev->is_vf ? +HNAE3_VF_FUNC_RESET :HNAE3_FUNC_RESET ; +/* Set reset level for reset_event() */ if (ops->set_default_reset_request) - ops->set_default_reset_request (ae_dev, -HNAE3_FUNC_RESET ); + ops->set_default_reset_request (ae_dev, reset_type);if (ops->reset_event) ops->reset_event (pdev,NULL );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 415/695 RDMA/hns: Fix 1bit-ECC recovery address in non-4K OS
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengchang Tang <[email protected]>
[ Upstream commit ce196f6297c7f3ab7780795e40efd6c521f60c8b ]
The 1bit-ECC recovery address read from HW only contain bits 64:12, so it should be fixed left-shifted 12 bits when used.
Currently, the driver will shift the address left by PAGE_SHIFT when used, which is wrong in non-4K OS.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +1 -1
@@ -6285,7 +6285,7 @@ static u64 fmea_get_ram_res_addr(u32 res_type, __le64 *data) res_type == ECC_RESOURCE_SCCC)return le64_to_cpu (*data); -return le64_to_cpu (*data) <<PAGE_SHIFT ; +return le64_to_cpu (*data) <<HNS_HW_PAGE_SHIFT ; } static int fmea_recover_others(struct hns_roce_dev *hr_dev, u32 res_type,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 416/695 RDMA/hns: Optimize hem allocation performance
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxian Huang <[email protected]>
[ Upstream commit fe51f6254d81f5a69c31df16353d6539b2b51630 ]
When allocating MTT hem, for each hop level of each hem that is being allocated, the driver iterates the hem list to find out whether the bt page has been allocated in this hop level. If not, allocate a new one and splice it to the list. The time complexity is O(n^2) in worst cases.
Currently the allocation for-loop uses 'unit' as the step size. This actually has taken into account the reuse of last-hop-level MTT bt pages by multiple buffer pages. Thus pages of last hop level will never have been allocated, so there is no need to iterate the hem list in last hop level.
Removing this unnecessary iteration can reduce the time complexity to O(n).
--- drivers/infiniband/hw/hns/hns_roce_hem.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hem.c +6 -4
@@ -1134,10 +1134,12 @@ static int hem_list_alloc_mid_bt(struct hns_roce_dev *hr_dev,/* config L1 bt to last bt and link them to corresponding parent */ for (level =1 ; level < hopnum; level++) { - cur =hem_list_search_item (&mid_bt[level], offset); -if (cur) { - hem_ptrs[level] = cur; -continue ; +if (!hem_list_is_bottom_bt (hopnum, level)) { + cur =hem_list_search_item (&mid_bt[level], offset); +if (cur) { + hem_ptrs[level] = cur; +continue ; + } } step =hem_list_calc_ba_range (hopnum, level, unit);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 417/695 RDMA/hns: Fix restricted __le16 degrades to integer issue
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxian Huang <[email protected]>
[ Upstream commit f4ccc0a2a0c5977540f519588636b5bc81aae2db ]
Fix sparse warnings: restricted __le16 degrades to integer.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +2 -2
@@ -1681,8 +1681,8 @@ static int hns_roce_hw_v2_query_counter(struct hns_roce_dev *hr_dev,for (i =0 ; i <HNS_ROCE_HW_CNT_TOTAL && i < *num_counters; i++) { bd_idx = i /CNT_PER_DESC ; -if (!(desc[bd_idx].flag &HNS_ROCE_CMD_FLAG_NEXT ) && - bd_idx !=HNS_ROCE_HW_CNT_TOTAL /CNT_PER_DESC ) +if (bd_idx !=HNS_ROCE_HW_CNT_TOTAL /CNT_PER_DESC && + !(desc[bd_idx].flag &cpu_to_le16 (HNS_ROCE_CMD_FLAG_NEXT )))break ; cnt_data = (__le64 *)&desc[bd_idx].data[0 ];
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 418/695 Input: ims-pcu - fix calling interruptible mutex
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Lechner <[email protected]>
[ Upstream commit 82abef590eb31d373e632743262ee7c42f49c289 ]
Fix calling scoped_cond_guard() with mutex instead of mutex_intr.
scoped_cond_guard(mutex, ...) will call mutex_lock() instead of mutex_lock_interruptible().
--- drivers/input/misc/ims-pcu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/input/misc/ims-pcu.c +1 -1
@@ -1067,7 +1067,7 @@ static ssize_t ims_pcu_attribute_store(struct device *dev,if (data_len > attr->field_length)return -EINVAL ; - scoped_cond_guard(mutex, return -EINTR, &pcu->cmd_mutex) { + scoped_cond_guard(mutex_intr, return -EINTR, &pcu->cmd_mutex) {memset (field,0 , attr->field_length);memcpy (field, buf, data_len);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 419/695 RDMA/mlx5: Obtain upper net device only when needed
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Bloch <[email protected]>
[ Upstream commit 3ed7f9e239938a0cfaf3689e2f545229ecabec06 ]
Report the upper device's state as the RDMA port state only in RoCE LAG or switchdev LAG.
--- drivers/infiniband/hw/mlx5/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/mlx5/main.c +1 -1
@@ -550,7 +550,7 @@ static int mlx5_query_port_roce(struct ib_device *device, u32 port_num,if (!ndev) goto out; -if (dev->lag_active) { +if (mlx5_lag_is_roce (mdev) ||mlx5_lag_is_sriov (mdev)) {rcu_read_lock (); upper =netdev_master_upper_dev_get_rcu (ndev);if (upper) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 420/695 PCI: qcom-ep: Enable controller resources like PHY only after refclk is available
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manivannan Sadhasivam <[email protected]>
[ Upstream commit d3745e3ae6c0eec517d431be926742b6e8b9b64a ]
qcom_pcie_enable_resources() is called by qcom_pcie_ep_probe() and it enables the controller resources like clocks, regulator, PHY. On one of the new unreleased Qcom SoC, PHY enablement depends on the active refclk. And on all of the supported Qcom endpoint SoCs, refclk comes from the host (RC). So calling qcom_pcie_enable_resources() without refclk causes the NoC (Network On Chip) error in the endpoint SoC and in turn results in a whole SoC crash and rebooting into EDL (Emergency Download) mode which is an unrecoverable state.
But qcom_pcie_enable_resources() is already called by qcom_pcie_perst_deassert() when PERST# is deasserted, and refclk is available at that time.
Hence, remove the unnecessary call to qcom_pcie_enable_resources() from qcom_pcie_ep_probe() to prevent the above mentioned crash.
It should be noted that this commit prevents the crash only under normal working condition (booting endpoint before host), but the crash may also occur if PERST# assert happens at the wrong time. For avoiding the crash completely, it is recommended to use SRIS mode which allows the endpoint SoC to generate its own refclk. The driver is not supporting SRIS mode currently, but will be added in the future.
--- drivers/pci/controller/dwc/pcie-qcom-ep.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-)
drivers/pci/controller/dwc/pcie-qcom-ep.c +4 -10
@@ -858,21 +858,15 @@ static int qcom_pcie_ep_probe(struct platform_device *pdev)if (ret)return ret; - ret =qcom_pcie_enable_resources (pcie_ep); -if (ret) { -dev_err (dev,"Failed to enable resources: %d\n" , ret); -return ret; - } - ret =dw_pcie_ep_init (&pcie_ep->pci.ep);if (ret) {dev_err (dev,"Failed to initialize endpoint: %d\n" , ret); - goto err_disable_resources; +return ret; } ret =qcom_pcie_ep_enable_irq_resources (pdev, pcie_ep);if (ret) - goto err_disable_resources; + goto err_ep_deinit; name =devm_kasprintf (dev,GFP_KERNEL ,"%pOFP" , dev->of_node);if (!name) {
@@ -889,8 +883,8 @@ static int qcom_pcie_ep_probe(struct platform_device *pdev)disable_irq (pcie_ep->global_irq);disable_irq (pcie_ep->perst_irq); -err_disable_resources: -qcom_pcie_disable_resources (pcie_ep); +err_ep_deinit: +dw_pcie_ep_deinit (&pcie_ep->pci.ep);return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 421/695 riscv: Fix fp alignment bug in perf_callchain_user()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 22ab08955ea13be04a8efd20cc30890e0afaa49c ]
The standard RISC-V calling convention said:
"The stack grows downward and the stack pointer is always kept 16-byte aligned".
So perf_callchain_user() should check whether 16-byte aligned for fp.
--- arch/riscv/kernel/perf_callchain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/kernel/perf_callchain.c +1 -1
@@ -62,7 +62,7 @@ void perf_callchain_user(struct perf_callchain_entry_ctx *entry,perf_callchain_store (entry, regs->epc); fp =user_backtrace (entry, fp, regs->ra); -while (fp && !(fp &0x3 ) && entry->nr < entry->max_stack) +while (fp && !(fp &0x7 ) && entry->nr < entry->max_stack) fp =user_backtrace (entry, fp,0 ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 422/695 RDMA/hns: Fix ah error counter in sw stat not increasing
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxian Huang <[email protected]>
[ Upstream commit 39c047d4047a1242aeefa87513174b56a91080ab ]
There are several error cases where hns_roce_create_ah() returns directly without jumping to sw stat path, thus leading to a problem that the ah error counter does not increase.
--- drivers/infiniband/hw/hns/hns_roce_ah.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/infiniband/hw/hns/hns_roce_ah.c +9 -5
@@ -64,8 +64,10 @@ int hns_roce_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr,u8 tc_mode =0 ;int ret; -if (hr_dev->pci_dev->revision ==PCI_REVISION_ID_HIP08 && udata) -return -EOPNOTSUPP ; +if (hr_dev->pci_dev->revision ==PCI_REVISION_ID_HIP08 && udata) { + ret = -EOPNOTSUPP ; + goto err_out; + } ah->av.port =rdma_ah_get_port_num (ah_attr); ah->av.gid_index = grh->sgid_index;
@@ -83,7 +85,7 @@ int hns_roce_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr, ret =0 ;if (ret && grh->sgid_attr->gid_type ==IB_GID_TYPE_ROCE_UDP_ENCAP ) -return ret; + goto err_out;if (tc_mode ==HNAE3_TC_MAP_MODE_DSCP && grh->sgid_attr->gid_type ==IB_GID_TYPE_ROCE_UDP_ENCAP )
@@ -91,8 +93,10 @@ int hns_roce_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr,else ah->av.sl =rdma_ah_get_sl (ah_attr); -if (!check_sl_valid (hr_dev, ah->av.sl)) -return -EINVAL ; +if (!check_sl_valid (hr_dev, ah->av.sl)) { + ret = -EINVAL ; + goto err_out; + }memcpy (ah->av.dgid, grh->dgid.raw,HNS_ROCE_GID_SIZE );memcpy (ah->av.mac, ah_attr->roce.dmac,ETH_ALEN );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 423/695 RDMA/cxgb4: Added NULL check for lookup_atid
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikhail Lobanov <[email protected]>
[ Upstream commit e766e6a92410ca269161de059fff0843b8ddd65f ]
The lookup_atid() function can return NULL if the ATID is invalid or does not exist in the identifier table, which could lead to dereferencing a null pointer without a check in the act_establish() and act_open_rpl() functions. Add a NULL check to prevent null pointer dereferencing.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/infiniband/hw/cxgb4/cm.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/infiniband/hw/cxgb4/cm.c +5 -0
@@ -1222,6 +1222,8 @@ static int act_establish(struct c4iw_dev *dev, struct sk_buff *skb)int ret; ep =lookup_atid (t, atid); +if (!ep) +return -EINVAL ;pr_debug ("ep %p tid %u snd_isn %u rcv_isn %u\n" , ep, tid,be32_to_cpu (req->snd_isn),be32_to_cpu (req->rcv_isn));
@@ -2279,6 +2281,9 @@ static int act_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb)int ret =0 ; ep =lookup_atid (t, atid); +if (!ep) +return -EINVAL ; + la = (struct sockaddr_in *)&ep->com.local_addr; ra = (struct sockaddr_in *)&ep->com.remote_addr; la6 = (struct sockaddr_in6 *)&ep->com.local_addr;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 424/695 RDMA/irdma: fix error message in irdma_modify_qp_roce()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vitaliy Shevtsov <[email protected]>
[ Upstream commit 9f0eafe86ea0a589676209d0cff1a1ed49a037d3 ]
Use a correct field max_dest_rd_atomic instead of max_rd_atomic for the error output.
Found by Linux Verification Center (linuxtesting.org) with Svace.
--- drivers/infiniband/hw/irdma/verbs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/irdma/verbs.c +1 -1
@@ -1347,7 +1347,7 @@ int irdma_modify_qp_roce(struct ib_qp *ibqp, struct ib_qp_attr *attr,if (attr->max_dest_rd_atomic > dev->hw_attrs.max_hw_ird) {ibdev_err (&iwdev->ibdev,"rd_atomic = %d, above max_hw_ird=%d\n" , - attr->max_rd_atomic, + attr->max_dest_rd_atomic, dev->hw_attrs.max_hw_ird);return -EINVAL ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 425/695 ntb: intel: Fix the NULL vs IS_ERR() bug for debugfs_create_dir()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit e229897d373a87ee09ec5cc4ecd4bb2f895fc16b ]
The debugfs_create_dir() function returns error pointers. It never returns NULL. So use IS_ERR() to check it.
--- drivers/ntb/hw/intel/ntb_hw_gen1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/ntb/hw/intel/ntb_hw_gen1.c +1 -1
@@ -778,7 +778,7 @@ static void ndev_init_debugfs(struct intel_ntb_dev *ndev) ndev->debugfs_dir =debugfs_create_dir (pci_name (ndev->ntb.pdev), debugfs_dir); -if (!ndev->debugfs_dir) +if (IS_ERR (ndev->debugfs_dir)) ndev->debugfs_info =NULL ;else ndev->debugfs_info =
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 426/695 ntb_perf: Fix printk format
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Max Hawking <[email protected]>
[ Upstream commit 1501ae7479c8d0f66efdbfdc9ae8d6136cefbd37 ]
The correct printk format is %pa or %pap, but not %pa[p].
--- drivers/ntb/test/ntb_perf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/ntb/test/ntb_perf.c +1 -1
@@ -1227,7 +1227,7 @@ static ssize_t perf_dbgfs_read_info(struct file *filep, char __user *ubuf, "\tOut buffer addr 0x%pK\n", peer->outbuf); pos +=scnprintf (buf + pos, buf_size - pos, -"\tOut buff phys addr %pa[p]\n" , &peer->out_phys_addr); +"\tOut buff phys addr %pap\n" , &peer->out_phys_addr); pos +=scnprintf (buf + pos, buf_size - pos,"\tOut buffer size %pa\n" , &peer->outbuf_size);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 427/695 ntb: Force physically contiguous allocation of rx ring buffers
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Jiang <[email protected]>
[ Upstream commit 061a785a114f159e990ea8ed8d1b7dca4b41120f ]
Physical addresses under IOVA on x86 platform are mapped contiguously as a side effect before the patch that removed CONFIG_DMA_REMAP. The NTB rx buffer ring is a single chunk DMA buffer that is allocated against the NTB PCI device. If the receive side is using a DMA device, then the buffers are remapped against the DMA device before being submitted via the dmaengine API. This scheme becomes a problem when the physical memory is discontiguous. When dma_map_page() is called on the kernel virtual address from the dma_alloc_coherent() call, the new IOVA mapping no longer points to all the physical memory allocated due to being discontiguous. Change dma_alloc_coherent() to dma_alloc_attrs() in order to force DMA_ATTR_FORCE_CONTIGUOUS attribute. This is the best fix for the circumstance. A potential future solution may be having the DMA mapping API providing a way to alias an existing IOVA mapping to a new device perhaps.
This fix is not to fix the patch pointed to by the fixes tag, but to fix the issue arised in the ntb_transport driver on x86 platforms after the said patch is applied.
--- drivers/ntb/ntb_transport.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-)
drivers/ntb/ntb_transport.c +18 -5
@@ -807,16 +807,29 @@ static void ntb_free_mw(struct ntb_transport_ctx *nt, int num_mw) }static int ntb_alloc_mw_buffer (struct ntb_transport_mw *mw, -struct device *dma_dev,size_t align) +struct device *ntb_dev,size_t align) {dma_addr_t dma_addr;void *alloc_addr, *virt_addr;int rc; - alloc_addr =dma_alloc_coherent (dma_dev, mw->alloc_size, - &dma_addr,GFP_KERNEL ); +/* +* The buffer here is allocated against the NTB device. The reason to +* use dma_alloc_*() call is to allocate a large IOVA contiguous buffer +* backing the NTB BAR for the remote host to write to. During receive +* processing, the data is being copied out of the receive buffer to +* the kernel skbuff. When a DMA device is being used, dma_map_page() +* is called on the kvaddr of the receive buffer (from dma_alloc_*()) +* and remapped against the DMA device. It appears to be a double +* DMA mapping of buffers, but first is mapped to the NTB device and +* second is to the DMA device. DMA_ATTR_FORCE_CONTIGUOUS is necessary +* in order for the later dma_map_page() to not fail. +*/ + alloc_addr =dma_alloc_attrs (ntb_dev, mw->alloc_size, + &dma_addr,GFP_KERNEL , +DMA_ATTR_FORCE_CONTIGUOUS );if (!alloc_addr) { -dev_err (dma_dev,"Unable to alloc MW buff of size %zu\n" , +dev_err (ntb_dev,"Unable to alloc MW buff of size %zu\n" , mw->alloc_size);return -ENOMEM ; }
@@ -845,7 +858,7 @@ static int ntb_alloc_mw_buffer(struct ntb_transport_mw *mw,return 0 ; err: -dma_free_coherent (dma_dev, mw->alloc_size, alloc_addr, dma_addr); +dma_free_coherent (ntb_dev, mw->alloc_size, alloc_addr, dma_addr);return rc; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 428/695 nfsd: call cache_put if xdr_reserve_space returns NULL
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guoqing Jiang <[email protected]>
[ Upstream commit d078cbf5c38de83bc31f83c47dcd2184c04a50c7 ]
If not enough buffer space available, but idmap_lookup has triggered lookup_fn which calls cache_get and returns successfully. Then we missed to call cache_put here which pairs with cache_get.
--- fs/nfsd/nfs4idmap.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
fs/nfsd/nfs4idmap.c +9 -4
@@ -581,6 +581,7 @@ static __be32 idmap_id_to_name(struct xdr_stream *xdr, .id = id, .type = type, }; +__be32 status = nfs_ok;__be32 *p;int ret;struct nfsd_net *nn =net_generic (SVC_NET (rqstp), nfsd_net_id);
@@ -593,12 +594,16 @@ static __be32 idmap_id_to_name(struct xdr_stream *xdr,return nfserrno (ret); ret =strlen (item->name);WARN_ON_ONCE (ret >IDMAP_NAMESZ ); + p =xdr_reserve_space (xdr, ret +4 ); -if (!p) -return nfserr_resource; - p =xdr_encode_opaque (p, item->name, ret); +if (unlikely (!p)) { + status = nfserr_resource; + goto out_put; + } +xdr_encode_opaque (p, item->name, ret); +out_put:cache_put (&item->h, nn->idtoname_cache); -return 0 ; +return status; } static bool
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 429/695 nfsd: return -EINVAL when namelen is 0
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Lingfeng <[email protected]>
[ Upstream commit 22451a16b7ab7debefce660672566be887db1637 ]
When we have a corrupted main.sqlite in /var/lib/nfs/nfsdcld/, it may result in namelen being 0, which will cause memdup_user() to return ZERO_SIZE_PTR.
When we access the name.data that has been assigned the value of ZERO_SIZE_PTR in nfs4_client_to_reclaim(), null pointer dereference is triggered.
[ T1205] ==================================================================
[ T1205] BUG: KASAN: null-ptr-deref in nfs4_client_to_reclaim+0xe9/0x260
[ T1205] Read of size 1 at addr 0000000000000010 by task nfsdcld/1205
[ T1205]
[ T1205] CPU: 11 PID: 1205 Comm: nfsdcld Not tainted 5.10.0-00003-g2c1423731b8d #406
[ T1205] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ?-20190727_073836-buildvm-ppc64le-16.ppc.fedoraproject.org-3.fc31 04/01/2014 [ T1205] Call Trace:
[ T1205] dump_stack+0x9a/0xd0 [ T1205] ? nfs4_client_to_reclaim+0xe9/0x260 [ T1205] __kasan_report.cold+0x34/0x84 [ T1205] ? nfs4_client_to_reclaim+0xe9/0x260 [ T1205] kasan_report+0x3a/0x50 [ T1205] nfs4_client_to_reclaim+0xe9/0x260 [ T1205] ? nfsd4_release_lockowner+0x410/0x410 [ T1205] cld_pipe_downcall+0x5ca/0x760 [ T1205] ? nfsd4_cld_tracking_exit+0x1d0/0x1d0 [ T1205] ? down_write_killable_nested+0x170/0x170 [ T1205] ? avc_policy_seqno+0x28/0x40 [ T1205] ? selinux_file_permission+0x1b4/0x1e0 [ T1205] rpc_pipe_write+0x84/0xb0 [ T1205] vfs_write+0x143/0x520 [ T1205] ksys_write+0xc9/0x170 [ T1205] ? __ia32_sys_read+0x50/0x50 [ T1205] ? ktime_get_coarse_real_ts64+0xfe/0x110 [ T1205] ? ktime_get_coarse_real_ts64+0xa2/0x110 [ T1205] do_syscall_64+0x33/0x40 [ T1205] entry_SYSCALL_64_after_hwframe+0x67/0xd1
[ T1205] RIP: 0033:0x7fdbdb761bc7
[ T1205] Code: 0f 00 f7 d8 64 89 02 48 c7 c0 ff ff ff ff eb b7 0f 1f 00 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 514 [ T1205] RSP: 002b:00007fff8c4b7248 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
[ T1205] RAX: ffffffffffffffda RBX: 000000000000042b RCX: 00007fdbdb761bc7
[ T1205] RDX: 000000000000042b RSI: 00007fff8c4b75f0 RDI: 0000000000000008
[ T1205] RBP: 00007fdbdb761bb0 R08: 0000000000000000 R09: 0000000000000001
[ T1205] R10: 0000000000000000 R11: 0000000000000246 R12: 000000000000042b
[ T1205] R13: 0000000000000008 R14: 00007fff8c4b75f0 R15: 0000000000000000
[ T1205] ==================================================================
Fix it by checking namelen.
--- fs/nfsd/nfs4recover.c | 8 ++++++++ 1 file changed, 8 insertions(+)
fs/nfsd/nfs4recover.c +8 -0
@@ -809,6 +809,10 @@ __cld_pipe_inprogress_downcall(const struct cld_msg_v2 __user *cmsg, ci = &cmsg->cm_u.cm_clntinfo;if (get_user (namelen, &ci->cc_name.cn_len))return -EFAULT ; +if (!namelen) { +dprintk ("%s: namelen should not be zero" , __func__); +return -EINVAL ; + } name.data =memdup_user (&ci->cc_name.cn_id, namelen);if (IS_ERR (name.data))return PTR_ERR (name.data);
@@ -831,6 +835,10 @@ __cld_pipe_inprogress_downcall(const struct cld_msg_v2 __user *cmsg, cnm = &cmsg->cm_u.cm_name;if (get_user (namelen, &cnm->cn_len))return -EFAULT ; +if (!namelen) { +dprintk ("%s: namelen should not be zero" , __func__); +return -EINVAL ; + } name.data =memdup_user (&cnm->cn_id, namelen);if (IS_ERR (name.data))return PTR_ERR (name.data);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 430/695 nfsd: untangle code in nfsd4_deleg_getattr_conflict()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
[ Upstream commit a078a7dc0eaa9db288ae45319f7f7503968af546 ]
The code in nfsd4_deleg_getattr_conflict() is convoluted and buggy.
With this patch we:
- properly handle non-nfsd leases. We must not assume flc_owner is a
delegation unless fl_lmops == &nfsd_lease_mng_ops
- move the main code out of the for loop
- have a single exit which calls nfs4_put_stid() (and other exits which don't need to call that)
[ jlayton: refactored on top of Neil's other patch: nfsd: fix
nfsd4_deleg_getattr_conflict in presence of third party lease ]
--- fs/nfsd/nfs4state.c | 131 +++++++++++++++++++++----------------------- 1 file changed, 62 insertions(+), 69 deletions(-)
fs/nfsd/nfs4state.c +62 -69
@@ -8836,6 +8836,7 @@ nfsd4_deleg_getattr_conflict(struct svc_rqst *rqstp, struct dentry *dentry,__be32 status;struct nfsd_net *nn =net_generic (SVC_NET (rqstp), nfsd_net_id);struct file_lock_context *ctx; +struct nfs4_delegation *dp =NULL ;struct file_lease *fl;struct iattr attrs;struct nfs4_cb_fattr *ncf;
@@ -8845,84 +8846,76 @@ nfsd4_deleg_getattr_conflict(struct svc_rqst *rqstp, struct dentry *dentry, ctx =locks_inode_context (inode);if (!ctx)return 0 ; + +#define NON_NFSD_LEASE ((void *)1) +spin_lock (&ctx->flc_lock);for_each_file_lock (fl, &ctx->flc_lease) { -unsigned char type = fl->c.flc_type; -if (fl->c.flc_flags ==FL_LAYOUT )continue ; -if (fl->fl_lmops != &nfsd_lease_mng_ops) { -/* -* non-nfs lease, if it's a lease with F_RDLCK then -* we are done; there isn't any write delegation -* on this inode -*/ -if (type ==F_RDLCK ) -break ; - -nfsd_stats_wdeleg_getattr_inc (nn); -spin_unlock (&ctx->flc_lock); - - status =nfserrno (nfsd_open_break_lease (inode,NFSD_MAY_READ )); +if (fl->c.flc_type ==F_WRLCK ) { +if (fl->fl_lmops == &nfsd_lease_mng_ops) + dp = fl->c.flc_owner; +else + dp =NON_NFSD_LEASE ; + } +break ; + } +if (dp ==NULL || dp ==NON_NFSD_LEASE || + dp->dl_recall.cb_clp == *(rqstp->rq_lease_breaker)) { +spin_unlock (&ctx->flc_lock); +if (dp ==NON_NFSD_LEASE ) { + status =nfserrno (nfsd_open_break_lease (inode, +NFSD_MAY_READ ));if (status != nfserr_jukebox || !nfsd_wait_for_delegreturn (rqstp, inode))return status; -return 0 ; } -if (type ==F_WRLCK ) { -struct nfs4_delegation *dp = fl->c.flc_owner; +return 0 ; + } -if (dp->dl_recall.cb_clp == *(rqstp->rq_lease_breaker)) { -spin_unlock (&ctx->flc_lock); -return 0 ; - } -nfsd_stats_wdeleg_getattr_inc (nn); - dp = fl->c.flc_owner; -refcount_inc (&dp->dl_stid.sc_count); - ncf = &dp->dl_cb_fattr; -nfs4_cb_getattr (&dp->dl_cb_fattr); -spin_unlock (&ctx->flc_lock); -wait_on_bit_timeout (&ncf->ncf_cb_flags,CB_GETATTR_BUSY , -TASK_INTERRUPTIBLE ,NFSD_CB_GETATTR_TIMEOUT ); -if (ncf->ncf_cb_status) { -/* Recall delegation only if client didn't respond */ - status =nfserrno (nfsd_open_break_lease (inode,NFSD_MAY_READ )); -if (status != nfserr_jukebox || - !nfsd_wait_for_delegreturn (rqstp, inode)) { -nfs4_put_stid (&dp->dl_stid); -return status; - } - } -if (!ncf->ncf_file_modified && - (ncf->ncf_initial_cinfo != ncf->ncf_cb_change || - ncf->ncf_cur_fsize != ncf->ncf_cb_fsize)) - ncf->ncf_file_modified = true; -if (ncf->ncf_file_modified) { -int err; - -/* -* Per section 10.4.3 of RFC 8881, the server would -* not update the file's metadata with the client's -* modified size -*/ - attrs.ia_mtime = attrs.ia_ctime =current_time (inode); - attrs.ia_valid =ATTR_MTIME |ATTR_CTIME |ATTR_DELEG ; -inode_lock (inode); - err =notify_change (&nop_mnt_idmap, dentry, &attrs,NULL ); -inode_unlock (inode); -if (err) { -nfs4_put_stid (&dp->dl_stid); -return nfserrno (err); - } - ncf->ncf_cur_fsize = ncf->ncf_cb_fsize; - *size = ncf->ncf_cur_fsize; - *modified = true; - } -nfs4_put_stid (&dp->dl_stid); -return 0 ; +nfsd_stats_wdeleg_getattr_inc (nn); +refcount_inc (&dp->dl_stid.sc_count); + ncf = &dp->dl_cb_fattr; +nfs4_cb_getattr (&dp->dl_cb_fattr); +spin_unlock (&ctx->flc_lock); + +wait_on_bit_timeout (&ncf->ncf_cb_flags,CB_GETATTR_BUSY , +TASK_INTERRUPTIBLE ,NFSD_CB_GETATTR_TIMEOUT ); +if (ncf->ncf_cb_status) { +/* Recall delegation only if client didn't respond */ + status =nfserrno (nfsd_open_break_lease (inode,NFSD_MAY_READ )); +if (status != nfserr_jukebox || + !nfsd_wait_for_delegreturn (rqstp, inode)) + goto out_status; + } +if (!ncf->ncf_file_modified && + (ncf->ncf_initial_cinfo != ncf->ncf_cb_change || + ncf->ncf_cur_fsize != ncf->ncf_cb_fsize)) + ncf->ncf_file_modified = true; +if (ncf->ncf_file_modified) { +int err; + +/* +* Per section 10.4.3 of RFC 8881, the server would +* not update the file's metadata with the client's +* modified size +*/ + attrs.ia_mtime = attrs.ia_ctime =current_time (inode); + attrs.ia_valid =ATTR_MTIME |ATTR_CTIME |ATTR_DELEG ; +inode_lock (inode); + err =notify_change (&nop_mnt_idmap, dentry, &attrs,NULL ); +inode_unlock (inode); +if (err) { + status =nfserrno (err); + goto out_status; } -break ; + ncf->ncf_cur_fsize = ncf->ncf_cb_fsize; + *size = ncf->ncf_cur_fsize; + *modified = true; } -spin_unlock (&ctx->flc_lock); -return 0 ; + status =0 ; +out_status: +nfs4_put_stid (&dp->dl_stid); +return status; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 431/695 nfsd: fix initial getattr on write delegation
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
[ Upstream commit bf92e5008b17f935a6de8b708551e02c2294121c ]
At this point in compound processing, currentfh refers to the parent of the file, not the file itself. Get the correct dentry from the delegation stateid instead.
--- fs/nfsd/nfs4state.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-)
fs/nfsd/nfs4state.c +25 -8
@@ -5912,6 +5912,28 @@ static void nfsd4_open_deleg_none_ext(struct nfsd4_open *open, int status) } } +static bool +nfs4_delegation_stat (struct nfs4_delegation *dp,struct svc_fh *currentfh, +struct kstat *stat) +{ +struct nfsd_file *nf =find_rw_file (dp->dl_stid.sc_file); +struct path path; +int rc; + +if (!nf) +return false; + + path.mnt = currentfh->fh_export->ex_path.mnt; + path.dentry =file_dentry (nf->nf_file); + + rc =vfs_getattr (&path, stat, + (STATX_SIZE |STATX_CTIME |STATX_CHANGE_COOKIE ), +AT_STATX_SYNC_AS_STAT ); + +nfsd_file_put (nf); +return rc ==0 ; +} +/* * The Linux NFS server does not offer write delegations to NFSv4.0 * clients in order to avoid conflicts between write delegations and
@@ -5947,7 +5969,6 @@ nfs4_open_delegation(struct nfsd4_open *open, struct nfs4_ol_stateid *stp,int cb_up;int status =0 ;struct kstat stat; -struct path path; cb_up =nfsd4_cb_channel_good (oo->oo_owner.so_client); open->op_recall = false;
@@ -5983,20 +6004,16 @@ nfs4_open_delegation(struct nfsd4_open *open, struct nfs4_ol_stateid *stp,memcpy (&open->op_delegate_stateid, &dp->dl_stid.sc_stateid,sizeof (dp->dl_stid.sc_stateid));if (open->op_share_access &NFS4_SHARE_ACCESS_WRITE ) { - open->op_delegate_type =NFS4_OPEN_DELEGATE_WRITE ; -trace_nfsd_deleg_write (&dp->dl_stid.sc_stateid); - path.mnt = currentfh->fh_export->ex_path.mnt; - path.dentry = currentfh->fh_dentry; -if (vfs_getattr (&path, &stat, - (STATX_SIZE |STATX_CTIME |STATX_CHANGE_COOKIE ), -AT_STATX_SYNC_AS_STAT )) { +if (!nfs4_delegation_stat (dp, currentfh, &stat)) {nfs4_put_stid (&dp->dl_stid);destroy_delegation (dp); goto out_no_deleg; } + open->op_delegate_type =NFS4_OPEN_DELEGATE_WRITE ; dp->dl_cb_fattr.ncf_cur_fsize = stat.size; dp->dl_cb_fattr.ncf_initial_cinfo =nfsd4_change_attribute (&stat,d_inode (currentfh->fh_dentry)); +trace_nfsd_deleg_write (&dp->dl_stid.sc_stateid); }else { open->op_delegate_type =NFS4_OPEN_DELEGATE_READ ;trace_nfsd_deleg_read (&dp->dl_stid.sc_stateid);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 432/695 crypto: caam - Pad SG length when allocating hash edesc
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
[ Upstream commit 5124bc96162667766f6120b19f57a640c2eccb2a ]
Because hardware will read in multiples of 4 SG entries, ensure the allocated length is always padded. This was already done by some callers of ahash_edesc_alloc, but ahash_digest was conspicuously missing.
In any case, doing it in the allocation function ensures that the memory is always there.
--- drivers/crypto/caam/caamhash.c | 1 + 1 file changed, 1 insertion(+)
drivers/crypto/caam/caamhash.c +1 -0
@@ -708,6 +708,7 @@ static struct ahash_edesc *ahash_edesc_alloc(struct ahash_request *req, GFP_KERNEL :GFP_ATOMIC ;struct ahash_edesc *edesc; + sg_num =pad_sg_nents (sg_num); edesc =kzalloc (struct_size (edesc, sec4_sg, sg_num), flags);if (!edesc)return NULL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 433/695 crypto: powerpc/p10-aes-gcm - Disable CRYPTO_AES_GCM_P10
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Danny Tsen <[email protected]>
[ Upstream commit 44ac4625ea002deecd0c227336c95b724206c698 ]
Data mismatch found when testing ipsec tunnel with AES/GCM crypto. Disabling CRYPTO_AES_GCM_P10 in Kconfig for this feature.
--- arch/powerpc/crypto/Kconfig | 1 + 1 file changed, 1 insertion(+)
arch/powerpc/crypto/Kconfig +1 -0
@@ -107,6 +107,7 @@ config CRYPTO_AES_PPC_SPE config CRYPTO_AES_GCM_P10 tristate "Stitched AES/GCM acceleration support on P10 or later CPU (PPC)" + depends on BROKEN depends on PPC64 && CPU_LITTLE_ENDIAN && VSX select CRYPTO_LIB_AES select CRYPTO_ALGAPI
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 434/695 f2fs: atomic: fix to avoid racing w/ GC
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 1a0bd289a5db1df8df8fab949633a0b8d3f235ee ]
Case #1:
SQLite App GC Thread Kworker Shrinker
- f2fs_ioc_start_atomic_write
- f2fs_ioc_commit_atomic_write
- f2fs_commit_atomic_write
- filemap_write_and_wait_range
: write atomic_file's data to cow_inode
echo 3 > drop_caches to drop atomic_file's cache.
- f2fs_gc
- gc_data_segment
- move_data_page
- set_page_dirty
- writepages
- f2fs_do_write_data_page : overwrite atomic_file's data to cow_inode
- f2fs_down_write(&fi->i_gc_rwsem[WRITE])
- __f2fs_commit_atomic_write
- f2fs_up_write(&fi->i_gc_rwsem[WRITE])
Case #2:
SQLite App GC Thread Kworker
- f2fs_ioc_start_atomic_write
- __writeback_single_inode
- do_writepages
- f2fs_write_cache_pages
- f2fs_write_single_data_page
- f2fs_do_write_data_page : write atomic_file's data to cow_inode
- f2fs_gc
- gc_data_segment
- move_data_page
- set_page_dirty
- writepages
- f2fs_do_write_data_page
: overwrite atomic_file's data to cow_inode
- f2fs_ioc_commit_atomic_write
In above cases racing in between atomic_write and GC, previous data in atomic_file may be overwrited to cow_file, result in data corruption.
This patch introduces PAGE_PRIVATE_ATOMIC_WRITE bit flag in page.private, and use it to indicate that there is last dirty data in atomic file, and the data should be writebacked into cow_file, if the flag is not tagged in page, we should never write data across files.
--- fs/f2fs/data.c | 10 +++++++++- fs/f2fs/f2fs.h | 8 +++++++- 2 files changed, 16 insertions(+), 2 deletions(-)
fs/f2fs/data.c +9 -1
@@ -2650,10 +2650,13 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio)struct dnode_of_data dn;struct node_info ni;bool ipu_force = false; +bool atomic_commit;int err =0 ;/* Use COW inode to make dnode_of_data for atomic write */ -if (f2fs_is_atomic_file (inode)) + atomic_commit =f2fs_is_atomic_file (inode) && +page_private_atomic (fio->page); +if (atomic_commit)set_new_dnode (&dn,F2FS_I (inode)->cow_inode,NULL ,NULL ,0 );else set_new_dnode (&dn, inode,NULL ,NULL ,0 );
@@ -2752,6 +2755,8 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio)f2fs_outplace_write_data (&dn, fio);trace_f2fs_do_write_data_page (page_folio (page),OPU );set_inode_flag (inode,FI_APPEND_WRITE ); +if (atomic_commit) +clear_page_private_atomic (page); out_writepage:f2fs_put_dnode (&dn); out:
@@ -3721,6 +3726,9 @@ static int f2fs_write_end(struct file *file,set_page_dirty (page); +if (f2fs_is_atomic_file (inode)) +set_page_private_atomic (page); +if (pos + copied >i_size_read (inode) && !f2fs_verity_in_progress (inode)) {f2fs_i_size_write (inode, pos + copied);
fs/f2fs/f2fs.h +7 -1
@@ -1418,7 +1418,8 @@ static inline void f2fs_clear_bit(unsigned int nr, char *addr);* bit 1 PAGE_PRIVATE_ONGOING_MIGRATION * bit 2 PAGE_PRIVATE_INLINE_INODE * bit 3 PAGE_PRIVATE_REF_RESOURCE -* bit 4- f2fs private data +* bit 4 PAGE_PRIVATE_ATOMIC_WRITE +* bit 5- f2fs private data * * Layout B: lowest bit should be 0 * page.private is a wrapped pointer.
@@ -1428,6 +1429,7 @@ enum {PAGE_PRIVATE_ONGOING_MIGRATION ,/* data page which is on-going migrating */ PAGE_PRIVATE_INLINE_INODE ,/* inode page contains inline data */ PAGE_PRIVATE_REF_RESOURCE ,/* dirty page has referenced resources */ +PAGE_PRIVATE_ATOMIC_WRITE ,/* data page from atomic write path */ PAGE_PRIVATE_MAX };
@@ -2396,14 +2398,17 @@ static inline void clear_page_private_##name(struct page *page) \PAGE_PRIVATE_GET_FUNC (nonpointer,NOT_POINTER );PAGE_PRIVATE_GET_FUNC (inline,INLINE_INODE );PAGE_PRIVATE_GET_FUNC (gcing,ONGOING_MIGRATION ); +PAGE_PRIVATE_GET_FUNC (atomic,ATOMIC_WRITE );PAGE_PRIVATE_SET_FUNC (reference,REF_RESOURCE );PAGE_PRIVATE_SET_FUNC (inline,INLINE_INODE );PAGE_PRIVATE_SET_FUNC (gcing,ONGOING_MIGRATION ); +PAGE_PRIVATE_SET_FUNC (atomic,ATOMIC_WRITE );PAGE_PRIVATE_CLEAR_FUNC (reference,REF_RESOURCE );PAGE_PRIVATE_CLEAR_FUNC (inline,INLINE_INODE );PAGE_PRIVATE_CLEAR_FUNC (gcing,ONGOING_MIGRATION ); +PAGE_PRIVATE_CLEAR_FUNC (atomic,ATOMIC_WRITE );static inline unsigned long get_page_private_data (struct page *page) {
@@ -2435,6 +2440,7 @@ static inline void clear_page_private_all(struct page *page)clear_page_private_reference (page);clear_page_private_gcing (page);clear_page_private_inline (page); +clear_page_private_atomic (page);f2fs_bug_on (F2FS_P_SB (page),page_private (page)); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 435/695 f2fs: reduce expensive checkpoint trigger frequency
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit aaf8c0b9ae042494cb4585883b15c1332de77840 ]
We may trigger high frequent checkpoint for below case:
1. mkdir /mnt/dir1; set dir1 encrypted
2. touch /mnt/file1; fsync /mnt/file1
3. mkdir /mnt/dir2; set dir2 encrypted
4. touch /mnt/file2; fsync /mnt/file2
...
Although, newly created dir and file are not related, due to commit bbf156f7afa7 ("f2fs: fix lost xattrs of directories"), we will trigger checkpoint whenever fsync() comes after a new encrypted dir created.
In order to avoid such performance regression issue, let's record an entry including directory's ino in global cache whenever we update directory's xattr data, and then triggerring checkpoint() only if xattr metadata of target file's parent was updated.
This patch updates to cover below no encryption case as well:
1) parent is checkpointed
2) set_xattr(dir) w/ new xnid
3) create(file)
4) fsync(file)
--- fs/f2fs/f2fs.h | 2 ++ fs/f2fs/file.c | 3 +++ fs/f2fs/xattr.c | 14 ++++++++++++-- include/trace/events/f2fs.h | 3 ++- 4 files changed, 19 insertions(+), 3 deletions(-)
fs/f2fs/f2fs.h +2 -0
@@ -285,6 +285,7 @@ enum {APPEND_INO ,/* for append ino list */ UPDATE_INO ,/* for update ino list */ TRANS_DIR_INO ,/* for transactions dir ino list */ +XATTR_DIR_INO ,/* for xattr updated dir ino list */ FLUSH_INO ,/* for multiple device flushing */ MAX_INO_ENTRY, /* max. list */ };
@@ -1155,6 +1156,7 @@ enum cp_reason_type {CP_FASTBOOT_MODE ,CP_SPEC_LOG_NUM ,CP_RECOVER_DIR , + CP_XATTR_DIR, }; enum iostat_type {
fs/f2fs/file.c +3 -0
@@ -218,6 +218,9 @@ static inline enum cp_reason_type need_do_checkpoint(struct inode *inode) f2fs_exist_written_data(sbi, F2FS_I(inode)->i_pino, TRANS_DIR_INO)) cp_reason =CP_RECOVER_DIR ; + else if (f2fs_exist_written_data(sbi, F2FS_I(inode)->i_pino, +XATTR_DIR_INO )) + cp_reason =CP_XATTR_DIR ;return cp_reason; }
fs/f2fs/xattr.c +12 -2
@@ -629,6 +629,7 @@ static int __f2fs_setxattr(struct inode *inode, int index, const char *name, const void *value, size_t size, struct page *ipage, int flags) { + struct f2fs_sb_info *sbi = F2FS_I_SB(inode);struct f2fs_xattr_entry *here, *last;void *base_addr, *last_base_addr;int found, newsize;
@@ -772,9 +773,18 @@ static int __f2fs_setxattr(struct inode *inode, int index,if (index ==F2FS_XATTR_INDEX_ENCRYPTION && !strcmp (name,F2FS_XATTR_NAME_ENCRYPTION_CONTEXT ))f2fs_set_encrypted_inode (inode); -if (S_ISDIR (inode->i_mode)) -set_sbi_flag (F2FS_I_SB (inode),SBI_NEED_CP ); +if (!S_ISDIR (inode->i_mode)) + goto same; +/* +* In restrict mode, fsync() always try to trigger checkpoint for all +* metadata consistency, in other mode, it triggers checkpoint when +* parent's xattr metadata was updated. +*/ +if (F2FS_OPTION (sbi).fsync_mode ==FSYNC_MODE_STRICT ) +set_sbi_flag (sbi,SBI_NEED_CP ); +else +f2fs_add_ino_entry (sbi, inode->i_ino,XATTR_DIR_INO ); same:if (is_inode_flag_set (inode,FI_ACL_MODE )) { inode->i_mode =F2FS_I (inode)->i_acl_mode;
include/trace/events/f2fs.h +2 -1
@@ -139,7 +139,8 @@ TRACE_DEFINE_ENUM(EX_BLOCK_AGE); { CP_NODE_NEED_CP, "node needs cp" }, \ { CP_FASTBOOT_MODE, "fastboot mode" }, \ { CP_SPEC_LOG_NUM, "log type is 2" }, \ - { CP_RECOVER_DIR, "dir needs recovery" }) + { CP_RECOVER_DIR, "dir needs recovery" }, \ + { CP_XATTR_DIR, "dir's xattr updated" }) #define show_shutdown_mode(type) \ __print_symbolic(type, \
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 436/695 f2fs: fix to avoid racing in between read and OPU dio write
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 0cac51185e65dc2a20686184e02f3cafc99eb202 ]
If lfs mode is on, buffered read may race w/ OPU dio write as below, it may cause buffered read hits unwritten data unexpectly, and for dio read, the race condition exists as well.
Thread A Thread B
- f2fs_file_write_iter
- f2fs_dio_write_iter
- __iomap_dio_rw
- f2fs_iomap_begin
- f2fs_map_blocks
- __allocate_data_block
- allocated blkaddr #x
- iomap_dio_submit_bio
- f2fs_file_read_iter
- filemap_read
- f2fs_read_data_folio
- f2fs_mpage_readpages
- f2fs_map_blocks
: get blkaddr #x
- f2fs_submit_read_bio
IRQ
- f2fs_read_end_io
: read IO on blkaddr #x complete
IRQ
- iomap_dio_bio_end_io
: direct write IO on blkaddr #x complete
In LFS mode, if there is inflight dio, let's wait for its completion, this policy won't cover all race cases, however it is a tradeoff which avoids abusing lock around IO paths.
--- fs/f2fs/file.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/f2fs/file.c +4 -0
@@ -4600,6 +4600,10 @@ static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)f2fs_trace_rw_file_path (iocb->ki_filp, iocb->ki_pos,iov_iter_count (to),READ ); +/* In LFS mode, if there is inflight dio, wait for its completion */ +if (f2fs_lfs_mode (F2FS_I_SB (inode))) +inode_dio_wait (inode); +if (f2fs_should_use_dio (inode, iocb, to)) { ret =f2fs_dio_read_iter (iocb, to); }else {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 437/695 f2fs: Create COW inode from parent dentry for atomic write
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yeongjin Gil <[email protected]>
[ Upstream commit 8c1b787938fd86bab27a1492fa887408c75fec2b ]
The i_pino in f2fs_inode_info has the previous parent's i_ino when inode was renamed, which may cause f2fs_ioc_start_atomic_write to fail. If file_wrong_pino is true and i_nlink is 1, then to find a valid pino, we should refer to the dentry from inode.
To resolve this issue, let's get parent inode using parent dentry directly.
--- fs/f2fs/file.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-)
fs/f2fs/file.c +3 -9
@@ -2119,7 +2119,6 @@ static int f2fs_ioc_start_atomic_write(struct file *filp, bool truncate)struct mnt_idmap *idmap =file_mnt_idmap (filp);struct f2fs_inode_info *fi =F2FS_I (inode);struct f2fs_sb_info *sbi =F2FS_I_SB (inode); -struct inode *pinode;loff_t isize;int ret;
@@ -2169,15 +2168,10 @@ static int f2fs_ioc_start_atomic_write(struct file *filp, bool truncate)/* Check if the inode already has a COW inode */ if (fi->cow_inode ==NULL ) {/* Create a COW inode for atomic write */ - pinode =f2fs_iget (inode->i_sb, fi->i_pino); -if (IS_ERR (pinode)) { -f2fs_up_write (&fi->i_gc_rwsem[WRITE ]); - ret =PTR_ERR (pinode); - goto out; - } +struct dentry *dentry =file_dentry (filp); +struct inode *dir =d_inode (dentry->d_parent); - ret =f2fs_get_tmpfile (idmap, pinode, &fi->cow_inode); -iput (pinode); + ret =f2fs_get_tmpfile (idmap, dir, &fi->cow_inode);if (ret) {f2fs_up_write (&fi->i_gc_rwsem[WRITE ]); goto out;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 438/695 f2fs: fix to wait page writeback before setting gcing flag
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit a4d7f2b3238fd5f76b9e6434a0bd5d2e29049cff ]
Soft IRQ Thread
- f2fs_write_end_io
- f2fs_defragment_range
- set_page_private_gcing
- type = WB_DATA_TYPE(page, false);
: assign type w/ F2FS_WB_CP_DATA
due to page_private_gcing() is true
- dec_page_count() w/ wrong type
- end_page_writeback()
Value of F2FS_WB_CP_DATA reference count may become negative under above race condition, the root cause is we missed to wait page writeback before setting gcing page private flag, let's fix it.
--- fs/f2fs/file.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/f2fs/file.c +4 -0
@@ -2790,6 +2790,8 @@ static int f2fs_defragment_range(struct f2fs_sb_info *sbi, goto clear_out; } +f2fs_wait_on_page_writeback (page,DATA , true, true); +set_page_dirty (page);set_page_private_gcing (page);f2fs_put_page (page,1 );
@@ -4190,6 +4192,8 @@ static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int len)/* It will never fail, when page has pinned above */ f2fs_bug_on (F2FS_I_SB (inode), !page); +f2fs_wait_on_page_writeback (page,DATA , true, true); +set_page_dirty (page);set_page_private_gcing (page);f2fs_put_page (page,1 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 439/695 f2fs: atomic: fix to truncate pagecache before on-disk metadata truncation
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit ebd3309aec6271c4616573b0cb83ea25e623070a ]
We should always truncate pagecache while truncating on-disk data.
--- fs/f2fs/file.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/f2fs/file.c +4 -0
@@ -2184,6 +2184,10 @@ static int f2fs_ioc_start_atomic_write(struct file *filp, bool truncate)F2FS_I (fi->cow_inode)->atomic_inode = inode; }else {/* Reuse the already created COW inode */ +f2fs_bug_on (sbi,get_dirty_pages (fi->cow_inode)); + +invalidate_mapping_pages (fi->cow_inode->i_mapping,0 ,-1 ); + ret =f2fs_do_truncate_blocks (fi->cow_inode,0 , true);if (ret) {f2fs_up_write (&fi->i_gc_rwsem[WRITE ]);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 440/695 f2fs: fix to avoid use-after-free in f2fs_stop_gc_thread()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit c7f114d864ac91515bb07ac271e9824a20f5ed95 ]
syzbot reports a f2fs bug as below:
__dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x241/0x360 lib/dump_stack.c:114 print_report+0xe8/0x550 mm/kasan/report.c:491 kasan_report+0x143/0x180 mm/kasan/report.c:601 kasan_check_range+0x282/0x290 mm/kasan/generic.c:189 instrument_atomic_read_write include/linux/instrumented.h:96 [inline] atomic_fetch_add_relaxed include/linux/atomic/atomic-instrumented.h:252 [inline] __refcount_add include/linux/refcount.h:184 [inline] __refcount_inc include/linux/refcount.h:241 [inline] refcount_inc include/linux/refcount.h:258 [inline] get_task_struct include/linux/sched/task.h:118 [inline] kthread_stop+0xca/0x630 kernel/kthread.c:704 f2fs_stop_gc_thread+0x65/0xb0 fs/f2fs/gc.c:210 f2fs_do_shutdown+0x192/0x540 fs/f2fs/file.c:2283 f2fs_ioc_shutdown fs/f2fs/file.c:2325 [inline] __f2fs_ioctl+0x443a/0xbe60 fs/f2fs/file.c:4325 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:907 [inline] __se_sys_ioctl+0xfc/0x170 fs/ioctl.c:893 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f
The root cause is below race condition, it may cause use-after-free issue in sbi->gc_th pointer.
- remount
- f2fs_remount
- f2fs_stop_gc_thread
- kfree(gc_th)
- f2fs_ioc_shutdown
- f2fs_do_shutdown
- f2fs_stop_gc_thread
- kthread_stop(gc_th->f2fs_gc_task)
: sbi->gc_thread = NULL;
We will call f2fs_do_shutdown() in two paths:
- for f2fs_ioc_shutdown() path, we should grab sb->s_umount semaphore for fixing.
- for f2fs_shutdown() path, it's safe since caller has already grabbed sb->s_umount semaphore.
--- fs/f2fs/f2fs.h | 2 +- fs/f2fs/file.c | 11 +++++++++-- fs/f2fs/super.c | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-)
fs/f2fs/f2fs.h +1 -1
@@ -3503,7 +3503,7 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,int f2fs_truncate_hole (struct inode *inode,pgoff_t pg_start,pgoff_t pg_end);void f2fs_truncate_data_blocks_range (struct dnode_of_data *dn,int count);int f2fs_do_shutdown (struct f2fs_sb_info *sbi,unsigned int flag, -bool readonly); +bool readonly,bool need_lock);int f2fs_precache_extents (struct inode *inode);int f2fs_fileattr_get (struct dentry *dentry,struct fileattr *fa); int f2fs_fileattr_set(struct mnt_idmap *idmap,
fs/f2fs/file.c +9 -2
@@ -2280,7 +2280,7 @@ static int f2fs_ioc_abort_atomic_write(struct file *filp) }int f2fs_do_shutdown (struct f2fs_sb_info *sbi,unsigned int flag, -bool readonly) +bool readonly,bool need_lock) {struct super_block *sb = sbi->sb;int ret =0 ;
@@ -2327,12 +2327,19 @@ int f2fs_do_shutdown(struct f2fs_sb_info *sbi, unsigned int flag,if (readonly) goto out; +/* grab sb->s_umount to avoid racing w/ remount() */ +if (need_lock) +down_read (&sbi->sb->s_umount); +f2fs_stop_gc_thread (sbi);f2fs_stop_discard_thread (sbi);f2fs_drop_discard_cmd (sbi);clear_opt (sbi,DISCARD ); +if (need_lock) +up_read (&sbi->sb->s_umount); +f2fs_update_time (sbi,REQ_TIME ); out:
@@ -2369,7 +2376,7 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg) } } - ret =f2fs_do_shutdown (sbi, in, readonly); + ret =f2fs_do_shutdown (sbi, in, readonly, true);if (need_drop)mnt_drop_write_file (filp);
fs/f2fs/super.c +1 -1
@@ -2561,7 +2561,7 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data)static void f2fs_shutdown (struct super_block *sb) { -f2fs_do_shutdown (F2FS_SB (sb),F2FS_GOING_DOWN_NOSYNC , false); +f2fs_do_shutdown (F2FS_SB (sb),F2FS_GOING_DOWN_NOSYNC , false, false); }#ifdef CONFIG_QUOTA
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 441/695 f2fs: compress: dont redirty sparse cluster during {,de}compress
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yeongjin Gil <[email protected]>
[ Upstream commit f785cec298c95d00058560c0715233294a04b8f3 ]
In f2fs_do_write_data_page, when the data block is NULL_ADDR, it skips writepage considering that it has been already truncated. This results in an infinite loop as the PAGECACHE_TAG_TOWRITE tag is not cleared during the writeback process for a compressed file including NULL_ADDR in compress_mode=user.
This is the reproduction process:
1. dd if=/dev/zero bs=4096 count=1024 seek=1024 of=testfile
2. f2fs_io compress testfile
3. dd if=/dev/zero bs=4096 count=1 conv=notrunc of=testfile
4. f2fs_io decompress testfile
To prevent the problem, let's check whether the cluster is fully allocated before redirty its pages.
--- fs/f2fs/compress.c | 36 ++++++++++++++++++++++++++++-------- fs/f2fs/f2fs.h | 12 ++++++++++++ fs/f2fs/file.c | 39 +++++++++++++++++++++------------------ 3 files changed, 61 insertions(+), 26 deletions(-)
fs/f2fs/compress.c +28 -8
@@ -945,7 +945,7 @@ static int __f2fs_get_cluster_blocks(struct inode *inode,unsigned int cluster_size =F2FS_I (inode)->i_cluster_size;int count, i; -for (i =1 , count =1 ; i < cluster_size; i++) { +for (i =0 , count =0 ; i < cluster_size; i++) {block_t blkaddr =data_blkaddr (dn->inode, dn->node_page, dn->ofs_in_node + i);
@@ -956,8 +956,8 @@ static int __f2fs_get_cluster_blocks(struct inode *inode,return count; } -static int __f2fs_cluster_blocks (struct inode *inode, -unsigned int cluster_idx,bool compr_blks) +static int __f2fs_cluster_blocks (struct inode *inode,unsigned int cluster_idx, +enum cluster_check_type type) {struct dnode_of_data dn; unsigned int start_idx = cluster_idx <<
@@ -978,10 +978,12 @@ static int __f2fs_cluster_blocks(struct inode *inode, }if (dn.data_blkaddr ==COMPRESS_ADDR ) { -if (compr_blks) - ret =__f2fs_get_cluster_blocks (inode, &dn); -else +if (type ==CLUSTER_COMPR_BLKS ) + ret =1 +__f2fs_get_cluster_blocks (inode, &dn); +else if (type ==CLUSTER_IS_COMPR ) ret =1 ; + }else if (type ==CLUSTER_RAW_BLKS ) { + ret =__f2fs_get_cluster_blocks (inode, &dn); } fail:f2fs_put_dnode (&dn);
@@ -991,7 +993,16 @@ static int __f2fs_cluster_blocks(struct inode *inode,/* return # of compressed blocks in compressed cluster */ static int f2fs_compressed_blocks (struct compress_ctx *cc) { -return __f2fs_cluster_blocks (cc->inode, cc->cluster_idx, true); +return __f2fs_cluster_blocks (cc->inode, cc->cluster_idx, +CLUSTER_COMPR_BLKS ); +} + +/* return # of raw blocks in non-compressed cluster */ +static int f2fs_decompressed_blocks (struct inode *inode, +unsigned int cluster_idx) +{ +return __f2fs_cluster_blocks (inode, cluster_idx, +CLUSTER_RAW_BLKS ); }/* return whether cluster is compressed one or not */
@@ -999,7 +1010,16 @@ int f2fs_is_compressed_cluster(struct inode *inode, pgoff_t index) {return __f2fs_cluster_blocks (inode, index >>F2FS_I (inode)->i_log_cluster_size, - false); +CLUSTER_IS_COMPR ); +} + +/* return whether cluster contains non raw blocks or not */ +bool f2fs_is_sparse_cluster (struct inode *inode,pgoff_t index) +{ +unsigned int cluster_idx = index >>F2FS_I (inode)->i_log_cluster_size; + +return f2fs_decompressed_blocks (inode, cluster_idx) != +F2FS_I (inode)->i_cluster_size; }static bool cluster_may_compress (struct compress_ctx *cc)
fs/f2fs/f2fs.h +12 -0
@@ -4297,6 +4297,11 @@ static inline bool f2fs_meta_inode_gc_required(struct inode *inode)* compress.c */ #ifdef CONFIG_F2FS_FS_COMPRESSION +enum cluster_check_type { +CLUSTER_IS_COMPR ,/* check only if compressed cluster */ +CLUSTER_COMPR_BLKS ,/* return # of compressed blocks in a cluster */ +CLUSTER_RAW_BLKS /* return # of raw blocks in a cluster */ +};bool f2fs_is_compressed_page (struct page *page);struct page *f2fs_compress_control_page (struct page *page); int f2fs_prepare_compress_overwrite(struct inode *inode,
@@ -4323,6 +4328,7 @@ int f2fs_write_multi_pages(struct compress_ctx *cc,struct writeback_control *wbc, enum iostat_type io_type);int f2fs_is_compressed_cluster (struct inode *inode,pgoff_t index); +bool f2fs_is_sparse_cluster (struct inode *inode,pgoff_t index);void f2fs_update_read_extent_tree_range_compressed (struct inode *inode,pgoff_t fofs,block_t blkaddr,unsigned int llen,unsigned int c_len);
@@ -4409,6 +4415,12 @@ static inline bool f2fs_load_compressed_page(struct f2fs_sb_info *sbi,static inline void f2fs_invalidate_compress_pages (struct f2fs_sb_info *sbi,nid_t ino) { }#define inc_compr_inode_stat (inode) do { } while (0) +static inline int f2fs_is_compressed_cluster ( +struct inode *inode, +pgoff_t index) {return 0 ; } +static inline bool f2fs_is_sparse_cluster ( +struct inode *inode, +pgoff_t index) {return true; } static inline void f2fs_update_read_extent_tree_range_compressed( struct inode *inode, pgoff_t fofs, block_t blkaddr,
fs/f2fs/file.c +21 -18
@@ -4219,9 +4219,8 @@ static int f2fs_ioc_decompress_file(struct file *filp)struct inode *inode =file_inode (filp);struct f2fs_sb_info *sbi =F2FS_I_SB (inode);struct f2fs_inode_info *fi =F2FS_I (inode); -pgoff_t page_idx =0 , last_idx; -int cluster_size = fi->i_cluster_size; -int count, ret; +pgoff_t page_idx =0 , last_idx, cluster_idx; +int ret;if (!f2fs_sb_has_compression (sbi) ||F2FS_OPTION (sbi).compress_mode !=COMPR_MODE_USER )
@@ -4256,10 +4255,15 @@ static int f2fs_ioc_decompress_file(struct file *filp) goto out; last_idx =DIV_ROUND_UP (i_size_read (inode),PAGE_SIZE ); + last_idx >>= fi->i_log_cluster_size; + +for (cluster_idx =0 ; cluster_idx < last_idx; cluster_idx++) { + page_idx = cluster_idx << fi->i_log_cluster_size; + +if (!f2fs_is_compressed_cluster (inode, page_idx)) +continue ; - count = last_idx - page_idx; -while (count && count >= cluster_size) { - ret =redirty_blocks (inode, page_idx, cluster_size); + ret =redirty_blocks (inode, page_idx, fi->i_cluster_size);if (ret <0 )break ;
@@ -4269,9 +4273,6 @@ static int f2fs_ioc_decompress_file(struct file *filp)break ; } - count -= cluster_size; - page_idx += cluster_size; -cond_resched ();if (fatal_signal_pending (current)) { ret = -EINTR ;
@@ -4298,9 +4299,9 @@ static int f2fs_ioc_compress_file(struct file *filp) {struct inode *inode =file_inode (filp);struct f2fs_sb_info *sbi =F2FS_I_SB (inode); -pgoff_t page_idx =0 , last_idx; -int cluster_size =F2FS_I (inode)->i_cluster_size; -int count, ret; +struct f2fs_inode_info *fi =F2FS_I (inode); +pgoff_t page_idx =0 , last_idx, cluster_idx; +int ret;if (!f2fs_sb_has_compression (sbi) ||F2FS_OPTION (sbi).compress_mode !=COMPR_MODE_USER )
@@ -4334,10 +4335,15 @@ static int f2fs_ioc_compress_file(struct file *filp)set_inode_flag (inode,FI_ENABLE_COMPRESS ); last_idx =DIV_ROUND_UP (i_size_read (inode),PAGE_SIZE ); + last_idx >>= fi->i_log_cluster_size; - count = last_idx - page_idx; -while (count && count >= cluster_size) { - ret =redirty_blocks (inode, page_idx, cluster_size); +for (cluster_idx =0 ; cluster_idx < last_idx; cluster_idx++) { + page_idx = cluster_idx << fi->i_log_cluster_size; + +if (f2fs_is_sparse_cluster (inode, page_idx)) +continue ; + + ret =redirty_blocks (inode, page_idx, fi->i_cluster_size);if (ret <0 )break ;
@@ -4347,9 +4353,6 @@ static int f2fs_ioc_compress_file(struct file *filp)break ; } - count -= cluster_size; - page_idx += cluster_size; -cond_resched ();if (fatal_signal_pending (current)) { ret = -EINTR ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 442/695 f2fs: prevent atomic file from being dirtied before commit
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daeho Jeong <[email protected]>
[ Upstream commit fccaa81de87e80b1809906f7e438e5766fbdc172 ]
Keep atomic file clean while updating and make it dirtied during commit in order to avoid unnecessary and excessive inode updates in the previous fix.
--- fs/f2fs/f2fs.h | 2 +- fs/f2fs/inode.c | 5 +++++ fs/f2fs/segment.c | 8 ++++++++ 3 files changed, 14 insertions(+), 1 deletion(-)
fs/f2fs/f2fs.h +1 -1
@@ -803,6 +803,7 @@ enum {FI_ALIGNED_WRITE ,/* enable aligned write */ FI_COW_FILE ,/* indicate COW file */ FI_ATOMIC_COMMITTED ,/* indicate atomic commit completed except disk sync */ +FI_ATOMIC_DIRTIED ,/* indicate atomic file is dirtied */ FI_ATOMIC_REPLACE ,/* indicate atomic replace */ FI_OPENED_FILE ,/* indicate file has been opened */ FI_MAX, /* max flag, never be used */
@@ -3049,7 +3050,6 @@ static inline void __mark_inode_dirty_flag(struct inode *inode,case FI_INLINE_DOTS :case FI_PIN_FILE :case FI_COMPRESS_RELEASED : -case FI_ATOMIC_COMMITTED :f2fs_mark_inode_dirty_sync (inode, true); } }
fs/f2fs/inode.c +5 -0
@@ -35,6 +35,11 @@ void f2fs_mark_inode_dirty_sync(struct inode *inode, bool sync)if (f2fs_inode_dirtied (inode, sync))return ; +if (f2fs_is_atomic_file (inode)) { +set_inode_flag (inode,FI_ATOMIC_DIRTIED ); +return ; + } +mark_inode_dirty_sync (inode); }
fs/f2fs/segment.c +8 -0
@@ -199,6 +199,10 @@ void f2fs_abort_atomic_write(struct inode *inode, bool clean)clear_inode_flag (inode,FI_ATOMIC_COMMITTED );clear_inode_flag (inode,FI_ATOMIC_REPLACE );clear_inode_flag (inode,FI_ATOMIC_FILE ); +if (is_inode_flag_set (inode,FI_ATOMIC_DIRTIED )) { +clear_inode_flag (inode,FI_ATOMIC_DIRTIED ); +f2fs_mark_inode_dirty_sync (inode, true); + }stat_dec_atomic_inode (inode);F2FS_I (inode)->atomic_write_task =NULL ;
@@ -366,6 +370,10 @@ static int __f2fs_commit_atomic_write(struct inode *inode) }else { sbi->committed_atomic_block += fi->atomic_write_cnt;set_inode_flag (inode,FI_ATOMIC_COMMITTED ); +if (is_inode_flag_set (inode,FI_ATOMIC_DIRTIED )) { +clear_inode_flag (inode,FI_ATOMIC_DIRTIED ); +f2fs_mark_inode_dirty_sync (inode, true); + } }__complete_revoke_list (inode, &revoke_list, ret ? true : false);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 443/695 f2fs: get rid of online repaire on corrupted directory
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 884ee6dc85b959bc152f15bca80c30f06069e6c4 ]
syzbot reports a f2fs bug as below:
kernel BUG at fs/f2fs/inode.c:896!
RIP: 0010:f2fs_evict_inode+0x1598/0x15c0 fs/f2fs/inode.c:896 Call Trace: evict+0x532/0x950 fs/inode.c:704 dispose_list fs/inode.c:747 [inline] evict_inodes+0x5f9/0x690 fs/inode.c:797 generic_shutdown_super+0x9d/0x2d0 fs/super.c:627 kill_block_super+0x44/0x90 fs/super.c:1696 kill_f2fs_super+0x344/0x690 fs/f2fs/super.c:4898 deactivate_locked_super+0xc4/0x130 fs/super.c:473 cleanup_mnt+0x41f/0x4b0 fs/namespace.c:1373 task_work_run+0x24f/0x310 kernel/task_work.c:228 ptrace_notify+0x2d2/0x380 kernel/signal.c:2402 ptrace_report_syscall include/linux/ptrace.h:415 [inline] ptrace_report_syscall_exit include/linux/ptrace.h:477 [inline] syscall_exit_work+0xc6/0x190 kernel/entry/common.c:173 syscall_exit_to_user_mode_prepare kernel/entry/common.c:200 [inline] __syscall_exit_to_user_mode_work kernel/entry/common.c:205 [inline] syscall_exit_to_user_mode+0x279/0x370 kernel/entry/common.c:218 do_syscall_64+0x100/0x230 arch/x86/entry/common.c:89 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0010:f2fs_evict_inode+0x1598/0x15c0 fs/f2fs/inode.c:896
Online repaire on corrupted directory in f2fs_lookup() can generate dirty data/meta while racing w/ readonly remount, it may leave dirty inode after filesystem becomes readonly, however, checkpoint() will skips flushing dirty inode in a state of readonly mode, result in above panic.
Let's get rid of online repaire in f2fs_lookup(), and leave the work to fsck.f2fs.
--- fs/f2fs/f2fs.h | 11 ------- fs/f2fs/namei.c | 68 ----------------------------------------- include/linux/f2fs_fs.h | 2 +- 3 files changed, 1 insertion(+), 80 deletions(-)
fs/f2fs/f2fs.h +0 -11
@@ -785,7 +785,6 @@ enum {FI_NEED_IPU ,/* used for ipu per file */ FI_ATOMIC_FILE ,/* indicate atomic file */ FI_DATA_EXIST ,/* indicate data exists */ -FI_INLINE_DOTS ,/* indicate inline dot dentries */ FI_SKIP_WRITES ,/* should skip data page writeback */ FI_OPU_WRITE ,/* used for opu per file */ FI_DIRTY_FILE, /* indicate regular/symlink has dirty pages */
@@ -3047,7 +3046,6 @@ static inline void __mark_inode_dirty_flag(struct inode *inode,return ; fallthrough;case FI_DATA_EXIST : -case FI_INLINE_DOTS :case FI_PIN_FILE :case FI_COMPRESS_RELEASED :f2fs_mark_inode_dirty_sync (inode, true);
@@ -3171,8 +3169,6 @@ static inline void get_inline_info(struct inode *inode, struct f2fs_inode *ri)set_bit (FI_INLINE_DENTRY , fi->flags);if (ri->i_inline &F2FS_DATA_EXIST )set_bit (FI_DATA_EXIST , fi->flags); -if (ri->i_inline &F2FS_INLINE_DOTS ) -set_bit (FI_INLINE_DOTS , fi->flags);if (ri->i_inline &F2FS_EXTRA_ATTR )set_bit (FI_EXTRA_ATTR , fi->flags);if (ri->i_inline &F2FS_PIN_FILE )
@@ -3193,8 +3189,6 @@ static inline void set_raw_inline(struct inode *inode, struct f2fs_inode *ri) ri->i_inline |=F2FS_INLINE_DENTRY ;if (is_inode_flag_set (inode,FI_DATA_EXIST )) ri->i_inline |=F2FS_DATA_EXIST ; -if (is_inode_flag_set (inode,FI_INLINE_DOTS )) - ri->i_inline |=F2FS_INLINE_DOTS ;if (is_inode_flag_set (inode,FI_EXTRA_ATTR )) ri->i_inline |=F2FS_EXTRA_ATTR ;if (is_inode_flag_set (inode,FI_PIN_FILE ))
@@ -3275,11 +3269,6 @@ static inline int f2fs_exist_data(struct inode *inode)return is_inode_flag_set (inode,FI_DATA_EXIST ); } -static inline int f2fs_has_inline_dots (struct inode *inode) -{ -return is_inode_flag_set (inode,FI_INLINE_DOTS ); -} -static inline int f2fs_is_mmap_file (struct inode *inode) {return is_inode_flag_set (inode,FI_MMAP_FILE );
fs/f2fs/namei.c +0 -68
86 lines not on this page · raw message
include/linux/f2fs_fs.h +1 -1
@@ -278,7 +278,7 @@ struct node_footer {#define F2FS_INLINE_DATA 0x02/* file inline data flag */ #define F2FS_INLINE_DENTRY 0x04/* file inline dentry flag */ #define F2FS_DATA_EXIST 0x08/* file inline data exist flag */ -#define F2FS_INLINE_DOTS 0x10/* file having implicit dot dentries */ +#define F2FS_INLINE_DOTS 0x10/* file having implicit dot dentries (obsolete) */ #define F2FS_EXTRA_ATTR 0x20/* file having extra attribute */ #define F2FS_PIN_FILE 0x40/* file should not be gced */ #define F2FS_COMPRESS_RELEASED 0x80/* file released compressed blocks */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 444/695 f2fs: fix to dont set SB_RDONLY in f2fs_handle_critical_error()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 930c6ab93492c4b15436524e704950b364b2930c ]
syzbot reports a f2fs bug as below:
------------[ cut here ]------------ WARNING: CPU: 1 PID: 58 at kernel/rcu/sync.c:177 rcu_sync_dtor+0xcd/0x180 kernel/rcu/sync.c:177 CPU: 1 UID: 0 PID: 58 Comm: kworker/1:2 Not tainted 6.10.0-syzkaller-12562-g1722389b0d86 #0 Workqueue: events destroy_super_work RIP: 0010:rcu_sync_dtor+0xcd/0x180 kernel/rcu/sync.c:177 Call Trace: percpu_free_rwsem+0x41/0x80 kernel/locking/percpu-rwsem.c:42 destroy_super_work+0xec/0x130 fs/super.c:282 process_one_work kernel/workqueue.c:3231 [inline] process_scheduled_works+0xa2c/0x1830 kernel/workqueue.c:3312 worker_thread+0x86d/0xd40 kernel/workqueue.c:3390 kthread+0x2f0/0x390 kernel/kthread.c:389 ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244
As Christian Brauner pointed out [1]: the root cause is f2fs sets SB_RDONLY flag in internal function, rather than setting the flag covered w/ sb->s_umount semaphore via remount procedure, then below race condition causes this bug:
- freeze_super()
- sb_wait_write(sb, SB_FREEZE_WRITE)
- sb_wait_write(sb, SB_FREEZE_PAGEFAULT)
- sb_wait_write(sb, SB_FREEZE_FS)
- f2fs_handle_critical_error
- sb->s_flags |= SB_RDONLY
- thaw_super
- thaw_super_locked
- sb_rdonly() is true, so it skips
sb_freeze_unlock(sb, SB_FREEZE_FS)
- deactivate_locked_super
Since f2fs has almost the same logic as ext4 [2] when handling critical error in filesystem if it mounts w/ errors=remount-ro option:
- set CP_ERROR_FLAG flag which indicates filesystem is stopped
- record errors to superblock
- set SB_RDONLY falg
Once we set CP_ERROR_FLAG flag, all writable interfaces can detect the flag and stop any further updates on filesystem. So, it is safe to not set SB_RDONLY flag, let's remove the logic and keep in line w/ ext4 [3].
[1] https://lore.kernel.org/all/20240729-himbeeren-funknetz-96e62f9c7aee@brauner
[2] https://lore.kernel.org/all/20240729132721.hxih6ehigadqf7wx@quack3
[3] https://lore.kernel.org/linux-ext4/[email protected]
--- fs/f2fs/super.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
fs/f2fs/super.c +6 -4
@@ -4173,12 +4173,14 @@ void f2fs_handle_critical_error(struct f2fs_sb_info *sbi, unsigned char reason, }f2fs_warn (sbi,"Remounting filesystem read-only" ); +/* -* Make sure updated value of ->s_mount_flags will be visible before -* ->s_flags update +* We have already set CP_ERROR_FLAG flag to stop all updates +* to filesystem, so it doesn't need to set SB_RDONLY flag here +* because the flag should be set covered w/ sb->s_umount semaphore +* via remount procedure, otherwise, it will confuse code like +* freeze_super() which will lead to deadlocks and other problems. */ -smp_wmb (); - sb->s_flags |=SB_RDONLY ; }static void f2fs_record_error_work (struct work_struct *work)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 445/695 spi: airoha: fix dirmap_{read,write} operations
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Bianconi <[email protected]>
[ Upstream commit 2e6bbfe7b0c0607001b784082c2685b134174fac ]
SPI_NFI_READ_FROM_CACHE_DONE bit must be written at the end of dirmap_read operation even if it is already set.
In the same way, SPI_NFI_LOAD_TO_CACHE_DONE bit must be written at the end of dirmap_write operation even if it is already set. For this reason use regmap_write_bits() instead of regmap_set_bits(). This patch fixes mtd_pagetest kernel module test.
--- drivers/spi/spi-airoha-snfi.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
drivers/spi/spi-airoha-snfi.c +14 -4
@@ -739,8 +739,13 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,if (err)return err; - err =regmap_set_bits (as_ctrl->regmap_nfi,REG_SPI_NFI_SNF_STA_CTL1 , -SPI_NFI_READ_FROM_CACHE_DONE ); +/* +* SPI_NFI_READ_FROM_CACHE_DONE bit must be written at the end +* of dirmap_read operation even if it is already set. +*/ + err =regmap_write_bits (as_ctrl->regmap_nfi,REG_SPI_NFI_SNF_STA_CTL1 , +SPI_NFI_READ_FROM_CACHE_DONE , +SPI_NFI_READ_FROM_CACHE_DONE );if (err)return err;
@@ -870,8 +875,13 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,if (err)return err; - err =regmap_set_bits (as_ctrl->regmap_nfi,REG_SPI_NFI_SNF_STA_CTL1 , -SPI_NFI_LOAD_TO_CACHE_DONE ); +/* +* SPI_NFI_LOAD_TO_CACHE_DONE bit must be written at the end +* of dirmap_write operation even if it is already set. +*/ + err =regmap_write_bits (as_ctrl->regmap_nfi,REG_SPI_NFI_SNF_STA_CTL1 , +SPI_NFI_LOAD_TO_CACHE_DONE , +SPI_NFI_LOAD_TO_CACHE_DONE );if (err)return err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 446/695 spi: airoha: fix airoha_snand_{write,read}_data data_len estimation
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Bianconi <[email protected]>
[ Upstream commit 0e58637eb968c636725dcd6c7055249b4e5326fb ]
Fix data length written and read in airoha_snand_write_data and airoha_snand_read_data routines respectively if it is bigger than SPI_MAX_TRANSFER_SIZE.
--- drivers/spi/spi-airoha-snfi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/spi/spi-airoha-snfi.c +2 -2
@@ -405,7 +405,7 @@ static int airoha_snand_write_data(struct airoha_snand_ctrl *as_ctrl, u8 cmd,for (i =0 ; i < len; i += data_len) {int err; - data_len =min (len,SPI_MAX_TRANSFER_SIZE ); + data_len =min (len - i,SPI_MAX_TRANSFER_SIZE ); err =airoha_snand_set_fifo_op (as_ctrl, cmd, data_len);if (err)return err;
@@ -427,7 +427,7 @@ static int airoha_snand_read_data(struct airoha_snand_ctrl *as_ctrl, u8 *data,for (i =0 ; i < len; i += data_len) {int err; - data_len =min (len,SPI_MAX_TRANSFER_SIZE ); + data_len =min (len - i,SPI_MAX_TRANSFER_SIZE ); err =airoha_snand_set_fifo_op (as_ctrl,0xc , data_len);if (err)return err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 447/695 spi: atmel-quadspi: Undo runtime PM changes at driver exit time
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 438efb23f9581659495b85f1f6c7d5946200660c ]
It's important to undo pm_runtime_use_autosuspend() with pm_runtime_dont_use_autosuspend() at driver exit time unless driver initially enabled pm_runtime with devm_pm_runtime_enable() (which handles it for you).
Hence, call pm_runtime_dont_use_autosuspend() at driver exit time to fix it.
--- drivers/spi/atmel-quadspi.c | 1 + 1 file changed, 1 insertion(+)
drivers/spi/atmel-quadspi.c +1 -0
@@ -726,6 +726,7 @@ static void atmel_qspi_remove(struct platform_device *pdev)clk_unprepare (aq->pclk);pm_runtime_disable (&pdev->dev); +pm_runtime_dont_use_autosuspend (&pdev->dev);pm_runtime_put_noidle (&pdev->dev); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 448/695 spi: spi-fsl-lpspi: Undo runtime PM changes at driver exit time
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 3b577de206d52dbde9428664b6d823d35a803d75 ]
It's important to undo pm_runtime_use_autosuspend() with pm_runtime_dont_use_autosuspend() at driver exit time unless driver initially enabled pm_runtime with devm_pm_runtime_enable() (which handles it for you).
Hence, call pm_runtime_dont_use_autosuspend() at driver exit time to fix it.
--- drivers/spi/spi-fsl-lpspi.c | 1 + 1 file changed, 1 insertion(+)
drivers/spi/spi-fsl-lpspi.c +1 -0
@@ -986,6 +986,7 @@ static void fsl_lpspi_remove(struct platform_device *pdev)fsl_lpspi_dma_exit (controller); +pm_runtime_dont_use_autosuspend (fsl_lpspi->dev);pm_runtime_disable (fsl_lpspi->dev); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 449/695 lib/sbitmap: define swap_lock as raw_spinlock_t
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
[ Upstream commit 65f666c6203600053478ce8e34a1db269a8701c9 ]
When called from sbitmap_queue_get(), sbitmap_deferred_clear() may be run with preempt disabled. In RT kernel, spin_lock() can sleep, then warning of "BUG: sleeping function called from invalid context" can be triggered.
Fix it by replacing it with raw_spin_lock.
--- include/linux/sbitmap.h | 2 +- lib/sbitmap.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
include/linux/sbitmap.h +1 -1
@@ -40,7 +40,7 @@ struct sbitmap_word {/** * @swap_lock: serializes simultaneous updates of ->word and ->cleared */ -spinlock_t swap_lock; +raw_spinlock_t swap_lock; }____cacheline_aligned_in_smp ;/**
lib/sbitmap.c +2 -2
@@ -65,7 +65,7 @@ static inline bool sbitmap_deferred_clear(struct sbitmap_word *map, {unsigned long mask, word_mask; -guard (spinlock_irqsave)(&map->swap_lock); +guard (raw_spinlock_irqsave)(&map->swap_lock);if (!map->cleared) {if (depth ==0 )
@@ -136,7 +136,7 @@ int sbitmap_init_node(struct sbitmap *sb, unsigned int depth, int shift, }for (i =0 ; i < sb->map_nr; i++) -spin_lock_init (&sb->map[i].swap_lock); +raw_spin_lock_init (&sb->map[i].swap_lock);return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 450/695 spi: airoha: remove read cache in airoha_snand_dirmap_read()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Bianconi <[email protected]>
[ Upstream commit fffca269e4f31c3633c6d810833ba1b184407915 ]
Current upstream driver reports errors running mtd_oobtest kernel module test:
root@OpenWrt:/# insmod mtd_test.ko root@OpenWrt:/# insmod mtd_oobtest.ko dev=5 [ 7023.730584] ================================================= [ 7023.736399] mtd_oobtest: MTD device: 5 [ 7023.740160] mtd_oobtest: MTD device size 3670016, eraseblock size 131072, page size 2048, count of eraseblocks 28, pages per eraseblock 64, OOB size 128 [ 7023.753837] mtd_test: scanning for bad eraseblocks [ 7023.758636] mtd_test: scanned 28 eraseblocks, 0 are bad [ 7023.763861] mtd_oobtest: test 1 of 5 [ 7024.042076] mtd_oobtest: writing OOBs of whole device [ 7024.682069] mtd_oobtest: written up to eraseblock 0 [ 7041.962077] mtd_oobtest: written 28 eraseblocks [ 7041.966626] mtd_oobtest: verifying all eraseblocks [ 7041.972276] mtd_oobtest: error @addr[0x0:0x0] 0xff -> 0xe diff 0xf1 [ 7041.978550] mtd_oobtest: error @addr[0x0:0x1] 0xff -> 0x10 diff 0xef [ 7041.984932] mtd_oobtest: error @addr[0x0:0x2] 0xff -> 0x82 diff 0x7d [ 7041.991293] mtd_oobtest: error @addr[0x0:0x3] 0xff -> 0x10 diff 0xef [ 7041.997659] mtd_oobtest: error @addr[0x0:0x4] 0xff -> 0x0 diff 0xff [ 7042.003942] mtd_oobtest: error @addr[0x0:0x5] 0xff -> 0x8a diff 0x75 [ 7042.010294] mtd_oobtest: error @addr[0x0:0x6] 0xff -> 0x20 diff 0xdf [ 7042.016659] mtd_oobtest: error @addr[0x0:0x7] 0xff -> 0x1 diff 0xfe [ 7042.022935] mtd_oobtest: error @addr[0x0:0x8] 0xff -> 0x2e diff 0xd1 [ 7042.029295] mtd_oobtest: error @addr[0x0:0x9] 0xff -> 0x40 diff 0xbf [ 7042.035661] mtd_oobtest: error @addr[0x0:0xa] 0xff -> 0x0 diff 0xff [ 7042.041935] mtd_oobtest: error @addr[0x0:0xb] 0xff -> 0x89 diff 0x76 [ 7042.048300] mtd_oobtest: error @addr[0x0:0xc] 0xff -> 0x82 diff 0x7d [ 7042.054662] mtd_oobtest: error @addr[0x0:0xd] 0xff -> 0x15 diff 0xea [ 7042.061014] mtd_oobtest: error @addr[0x0:0xe] 0xff -> 0x90 diff 0x6f [ 7042.067380] mtd_oobtest: error @addr[0x0:0xf] 0xff -> 0x0 diff 0xff .... [ 7432.421369] mtd_oobtest: error @addr[0x237800:0x36] 0xff -> 0x5f diff 0xa0 [ 7432.428242] mtd_oobtest: error @addr[0x237800:0x37] 0xff -> 0x21 diff 0xde [ 7432.435118] mtd_oobtest: error: verify failed at 0x237800 [ 7432.440510] mtd_oobtest: error: too many errors [ 7432.445053] mtd_oobtest: error -1 occurred
The above errors are due to the buggy logic in the 'read cache' available in airoha_snand_dirmap_read() routine since there are some corner cases where we are missing data updates. Since we do not get any read/write speed improvement using the cache (according to the mtd_speedtest kernel module test), in order to fix the mtd_oobtest test, remove the 'read cache' in airoha_snand_dirmap_read routine. Now the driver is passing all the tests available in mtd_test suite.
--- drivers/spi/spi-airoha-snfi.c | 21 --------------------- 1 file changed, 21 deletions(-)
drivers/spi/spi-airoha-snfi.c +0 -21
@@ -211,9 +211,6 @@ struct airoha_snand_dev {u8 *txrx_buf;dma_addr_t dma_addr; - -u64 cur_page_num; -bool data_need_update; };struct airoha_snand_ctrl {
@@ -644,11 +641,6 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,u32 val, rd_mode;int err; -if (!as_dev->data_need_update) -return len; - - as_dev->data_need_update = false; -switch (op->cmd.opcode) {case SPI_NAND_OP_READ_FROM_CACHE_DUAL : rd_mode =1 ;
@@ -895,23 +887,11 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,static int airoha_snand_exec_op (struct spi_mem *mem,const struct spi_mem_op *op) { -struct airoha_snand_dev *as_dev =spi_get_ctldata (mem->spi);u8 data[8 ], cmd, opcode = op->cmd.opcode;struct airoha_snand_ctrl *as_ctrl;int i, err; as_ctrl =spi_controller_get_devdata (mem->spi->controller); -if (opcode ==SPI_NAND_OP_PROGRAM_EXECUTE && - op->addr.val == as_dev->cur_page_num) { - as_dev->data_need_update = true; - }else if (opcode ==SPI_NAND_OP_PAGE_READ ) { -if (!as_dev->data_need_update && - op->addr.val == as_dev->cur_page_num) -return 0 ; - - as_dev->data_need_update = true; - as_dev->cur_page_num = op->addr.val; - }/* switch to manual mode */ err =airoha_snand_set_mode (as_ctrl,SPI_MODE_MANUAL );
@@ -996,7 +976,6 @@ static int airoha_snand_setup(struct spi_device *spi)if (dma_mapping_error (as_ctrl->dev, as_dev->dma_addr))return -ENOMEM ; - as_dev->data_need_update = true;spi_set_ctldata (spi, as_dev);return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 451/695 spi: atmel-quadspi: Avoid overwriting delay register settings
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Dahl <[email protected]>
[ Upstream commit 329ca3eed4a9a161515a8714be6ba182321385c7 ]
Previously the MR and SCR registers were just set with the supposedly required values, from cached register values (cached reg content initialized to zero).
All parts fixed here did not consider the current register (cache) content, which would make future support of cs_setup, cs_hold, and cs_inactive impossible.
Setting SCBR in atmel_qspi_setup() erases a possible DLYBS setting from atmel_qspi_set_cs_timing(). The DLYBS setting is applied by ORing over the current setting, without resetting the bits first. All writes to MR did not consider possible settings of DLYCS and DLYBCT.
--- drivers/spi/atmel-quadspi.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/spi/atmel-quadspi.c +8 -6
@@ -375,9 +375,9 @@ static int atmel_qspi_set_cfg(struct atmel_qspi *aq,* If the QSPI controller is set in regular SPI mode, set it in * Serial Memory Mode (SMM). */ -if (aq->mr !=QSPI_MR_SMM ) { -atmel_qspi_write (QSPI_MR_SMM , aq,QSPI_MR ); - aq->mr =QSPI_MR_SMM ; +if (!(aq->mr &QSPI_MR_SMM )) { + aq->mr |=QSPI_MR_SMM ; +atmel_qspi_write (aq->scr, aq,QSPI_MR ); }/* Clear pending interrupts */
@@ -501,7 +501,8 @@ static int atmel_qspi_setup(struct spi_device *spi)if (ret <0 )return ret; - aq->scr =QSPI_SCR_SCBR (scbr); + aq->scr &= ~QSPI_SCR_SCBR_MASK ; + aq->scr |=QSPI_SCR_SCBR (scbr);atmel_qspi_write (aq->scr, aq,QSPI_SCR );pm_runtime_mark_last_busy (ctrl->dev.parent);
@@ -534,6 +535,7 @@ static int atmel_qspi_set_cs_timing(struct spi_device *spi)if (ret <0 )return ret; + aq->scr &= ~QSPI_SCR_DLYBS_MASK ; aq->scr |=QSPI_SCR_DLYBS (cs_setup);atmel_qspi_write (aq->scr, aq,QSPI_SCR );
@@ -549,8 +551,8 @@ static void atmel_qspi_init(struct atmel_qspi *aq)atmel_qspi_write (QSPI_CR_SWRST , aq,QSPI_CR );/* Set the QSPI controller by default in Serial Memory Mode */ -atmel_qspi_write (QSPI_MR_SMM , aq,QSPI_MR ); - aq->mr =QSPI_MR_SMM ; + aq->mr |=QSPI_MR_SMM ; +atmel_qspi_write (aq->mr, aq,QSPI_MR );/* Enable the QSPI controller */ atmel_qspi_write (QSPI_CR_QSPIEN , aq,QSPI_CR );
Signature · 1 line
2.43.0
Re: [PATCH 6.11 451/695] spi: atmel-quadspi: Avoid overwriting delay register settings
Hello Greg,
Am Wed, Oct 02, 2024 at 02:57:29PM +0200 schrieb Greg Kroah-Hartman:
Quoted 35 lines
6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Dahl <[email protected]>
[ Upstream commit
329ca3eed4a9a161515a8714be6ba182321385c7]Previously the MR and SCR registers were just set with the supposedly required values, from cached register values (cached reg content initialized to zero).
All parts fixed here did not consider the current register (cache) content, which would make future support of
cs_setup,cs_hold, andcs_inactiveimpossible.Setting SCBR in
atmel_qspi_setup()erases a possible DLYBS setting fromatmel_qspi_set_cs_timing(). The DLYBS setting is applied by ORing over the current setting, without resetting the bits first. All writes to MR did not consider possible settings of DLYCS and DLYBCT.Signed-off-by Alexander Dahl <[email protected]>Fixes f732646d0ccd ("spi: atmel-quadspi: Add support for configuring CS timing")Signed-off-by Mark Brown <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/spi/atmel-quadspi.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)drivers/spi/atmel-quadspi.c +0
-0
drivers/spi/atmel-quadspi.c static int atmel_qspi_set_cfg(struct atmel_qspi *aq, · line 380
Quoted 9 lines
drivers/spi/atmel-quadspi.c +3
-3@@ -375,9 +375,9 @@ static int atmel_qspi_set_cfg(struct atmel_qspi *aq,* If the QSPI controller is set in regular SPI mode, set it in * Serial Memory Mode (SMM). */ -if (aq->mr !=QSPI_MR_SMM ) { -atmel_qspi_write (QSPI_MR_SMM , aq,QSPI_MR ); - aq->mr =QSPI_MR_SMM ; +if (!(aq->mr &QSPI_MR_SMM )) { + aq->mr |=QSPI_MR_SMM ; +atmel_qspi_write (aq->scr, aq,QSPI_MR );
This is a write to a wrong register, it was already fixed with <[email protected]> [1] which was taken by Mark into the spi for-next tree. If you take this patch, please also take the fixup! Sorry for messing this up, that was my fault.
(Note: I'm AFK from tomorrow until October 13th.)
Thanks
Alex
[1] https://lore.kernel.org/linux-spi/[email protected]/T/#u
Quoted 38 lines
drivers/spi/atmel-quadspi.c +5
-3}/* Clear pending interrupts */ @@ -501,7 +501,8 @@ static int atmel_qspi_setup(struct spi_device *spi)if (ret <0 )return ret; - aq->scr =QSPI_SCR_SCBR (scbr); + aq->scr &= ~QSPI_SCR_SCBR_MASK ; + aq->scr |=QSPI_SCR_SCBR (scbr);atmel_qspi_write (aq->scr, aq,QSPI_SCR );pm_runtime_mark_last_busy (ctrl->dev.parent);@@ -534,6 +535,7 @@ static int atmel_qspi_set_cs_timing(struct spi_device *spi)if (ret <0 )return ret; + aq->scr &= ~QSPI_SCR_DLYBS_MASK ; aq->scr |=QSPI_SCR_DLYBS (cs_setup);atmel_qspi_write (aq->scr, aq,QSPI_SCR );@@ -549,8 +551,8 @@ static void atmel_qspi_init(struct atmel_qspi *aq)atmel_qspi_write (QSPI_CR_SWRST , aq,QSPI_CR );/* Set the QSPI controller by default in Serial Memory Mode */ -atmel_qspi_write (QSPI_MR_SMM , aq,QSPI_MR ); - aq->mr =QSPI_MR_SMM ; + aq->mr |=QSPI_MR_SMM ; +atmel_qspi_write (aq->mr, aq,QSPI_MR );/* Enable the QSPI controller */ atmel_qspi_write (QSPI_CR_QSPIEN , aq,QSPI_CR );Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerRe: [PATCH 6.11 451/695] spi: atmel-quadspi: Avoid overwriting delay register settings
Quoted 53 lines · Alexander Dahl
Hello Greg,
Am Wed, Oct 02, 2024 at 02:57:29PM +0200 schrieb Greg Kroah-Hartman:
Quoted 35 lines
6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Dahl <[email protected]>
[ Upstream commit
329ca3eed4a9a161515a8714be6ba182321385c7]Previously the MR and SCR registers were just set with the supposedly required values, from cached register values (cached reg content initialized to zero).
All parts fixed here did not consider the current register (cache) content, which would make future support of
cs_setup,cs_hold, andcs_inactiveimpossible.Setting SCBR in
atmel_qspi_setup()erases a possible DLYBS setting fromatmel_qspi_set_cs_timing(). The DLYBS setting is applied by ORing over the current setting, without resetting the bits first. All writes to MR did not consider possible settings of DLYCS and DLYBCT.Signed-off-by Alexander Dahl <[email protected]>Fixes f732646d0ccd ("spi: atmel-quadspi: Add support for configuring CS timing")Signed-off-by Mark Brown <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/spi/atmel-quadspi.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)drivers/spi/atmel-quadspi.c +0
-0drivers/spi/atmel-quadspi.c static int atmel_qspi_set_cfg(struct atmel_qspi *aq, · line 380
Quoted 9 lines
drivers/spi/atmel-quadspi.c +3
-3@@ -375,9 +375,9 @@ static int atmel_qspi_set_cfg(struct atmel_qspi *aq,* If the QSPI controller is set in regular SPI mode, set it in * Serial Memory Mode (SMM). */ -if (aq->mr !=QSPI_MR_SMM ) { -atmel_qspi_write (QSPI_MR_SMM , aq,QSPI_MR ); - aq->mr =QSPI_MR_SMM ; +if (!(aq->mr &QSPI_MR_SMM )) { + aq->mr |=QSPI_MR_SMM ; +atmel_qspi_write (aq->scr, aq,QSPI_MR );This is a write to a wrong register, it was already fixed with <[email protected]> [1] which was taken by Mark into the spi for-next tree. If you take this patch, please also take the fixup! Sorry for messing this up, that was my fault.
Quoted 6 lines
(Note: I'm AFK from tomorrow until October 13th.)
Thanks
Alex[1] https://lore.kernel.org/linux-spi/[email protected]/T/#u
Now queued up, thanks!
greg k-h
Greg Kroah-Hartman
maintainerPATCH 452/695 NFSv4.2: Fix detection of "Proxying of Times" server support
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roi Azarzar <[email protected]>
[ Upstream commit 615e693b14ba22e1332c3bd5a4e038284bbc3e07 ]
According to draft-ietf-nfsv4-delstid-07:
If a server informs the client via the fattr4_open_arguments attribute that it supports OPEN_ARGS_SHARE_ACCESS_WANT_DELEG_TIMESTAMPS and it returns a valid delegation stateid for an OPEN operation which sets the OPEN4_SHARE_ACCESS_WANT_DELEG_TIMESTAMPS flag, then it MUST query the client via a CB_GETATTR for the fattr4_time_deleg_access (see Section 5.2) attribute and fattr4_time_deleg_modify attribute (see Section 5.2).
Thus, we should look that the server supports proxying of times via OPEN4_SHARE_ACCESS_WANT_DELEG_TIMESTAMPS.
We want to be extra pedantic and continue to check that FATTR4_TIME_DELEG_ACCESS and FATTR4_TIME_DELEG_MODIFY are set. The server needs to expose both for the client to correctly detect "Proxying of Times" support.
--- fs/nfs/nfs4proc.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
fs/nfs/nfs4proc.c +14 -2
@@ -3904,6 +3904,18 @@ static void nfs4_close_context(struct nfs_open_context *ctx, int is_sync)#define FATTR4_WORD2_NFS41_MASK (2*FATTR4_WORD2_SUPPATTR_EXCLCREAT - 1UL)#define FATTR4_WORD2_NFS42_MASK (2*FATTR4_WORD2_OPEN_ARGUMENTS - 1UL) +#define FATTR4_WORD2_NFS42_TIME_DELEG_MASK \ + (FATTR4_WORD2_TIME_DELEG_MODIFY|FATTR4_WORD2_TIME_DELEG_ACCESS) +static bool nfs4_server_delegtime_capable (struct nfs4_server_caps_res *res) +{ +u32 share_access_want = res->open_caps.oa_share_access_want[0 ]; +u32 attr_bitmask = res->attr_bitmask[2 ]; + +return (share_access_want &NFS4_SHARE_WANT_DELEG_TIMESTAMPS ) && + ((attr_bitmask &FATTR4_WORD2_NFS42_TIME_DELEG_MASK ) == +FATTR4_WORD2_NFS42_TIME_DELEG_MASK ); +} +static int _nfs4_server_capabilities (struct nfs_server *server,struct nfs_fh *fhandle) {u32 minorversion = server->nfs_client->cl_minorversion;
@@ -3982,8 +3994,6 @@ static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *f#endif if (res.attr_bitmask[0 ] &FATTR4_WORD0_FS_LOCATIONS ) server->caps |=NFS_CAP_FS_LOCATIONS ; -if (res.attr_bitmask[2 ] &FATTR4_WORD2_TIME_DELEG_MODIFY ) - server->caps |=NFS_CAP_DELEGTIME ;if (!(res.attr_bitmask[0 ] &FATTR4_WORD0_FILEID )) server->fattr_valid &= ~NFS_ATTR_FATTR_FILEID ;if (!(res.attr_bitmask[1 ] &FATTR4_WORD1_MODE ))
@@ -4011,6 +4021,8 @@ static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fif (res.open_caps.oa_share_access_want[0 ] &NFS4_SHARE_WANT_OPEN_XOR_DELEGATION ) server->caps |=NFS_CAP_OPEN_XOR ; +if (nfs4_server_delegtime_capable (&res)) + server->caps |=NFS_CAP_DELEGTIME ;memcpy (server->cache_consistency_bitmask, res.attr_bitmask,sizeof (server->cache_consistency_bitmask)); server->cache_consistency_bitmask[0 ] &=FATTR4_WORD0_CHANGE |FATTR4_WORD0_SIZE ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 453/695 nvme-multipath: system fails to create generic nvme device
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hannes Reinecke <[email protected]>
[ Upstream commit 63bcf9014e95a7d279d10d8e2caa5d88db2b1855 ]
NVME_NSHEAD_DISK_LIVE is a flag for struct nvme_ns_head, not nvme_ns. The current code has a typo causing NVME_NSHEAD_DISK_LIVE never to be cleared once device_add_disk_fails, causing the system never to create the 'generic' character device. Even several rescan attempts will change the situation and the system has to be rebooted to fix the issue.
--- drivers/nvme/host/multipath.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvme/host/multipath.c +1 -1
@@ -648,7 +648,7 @@ static void nvme_mpath_set_live(struct nvme_ns *ns) rc =device_add_disk (&head->subsys->dev, head->disk, nvme_ns_attr_groups);if (rc) { -clear_bit (NVME_NSHEAD_DISK_LIVE , &ns->flags); +clear_bit (NVME_NSHEAD_DISK_LIVE , &head->flags);return ; }nvme_add_ns_head_cdev (head);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 454/695 iio: adc: ad7606: fix oversampling gpio array
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guillaume Stols <[email protected]>
[ Upstream commit 8dc4594b54dbaaba40dc8884ad3d42083de39434 ]
gpiod_set_array_value was misused here: the implementation relied on the assumption that an unsigned long was required for each gpio, while the function expects a bit array stored in "as much unsigned long as needed for storing one bit per GPIO", i.e it is using a bit field.
This leaded to incorrect parameter passed to gpiod_set_array_value, that would set 1 value instead of 3.
It also prevents to select the software mode correctly for the AD7606B.
--- drivers/iio/adc/ad7606.c | 4 ++-- drivers/iio/adc/ad7606_spi.c | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-)
drivers/iio/adc/ad7606.c +2 -2
@@ -212,9 +212,9 @@ static int ad7606_write_os_hw(struct iio_dev *indio_dev, int val)struct ad7606_state *st =iio_priv (indio_dev);DECLARE_BITMAP (values,3 ); - values[0 ] = val; + values[0 ] = val &GENMASK (2 ,0 ); -gpiod_set_array_value (ARRAY_SIZE (values), st->gpio_os->desc, +gpiod_set_array_value (st->gpio_os->ndescs, st->gpio_os->desc, st->gpio_os->info, values);/* AD7616 requires a reset to update value */
drivers/iio/adc/ad7606_spi.c +3 -2
@@ -249,8 +249,9 @@ static int ad7616_sw_mode_config(struct iio_dev *indio_dev)static int ad7606B_sw_mode_config (struct iio_dev *indio_dev) {struct ad7606_state *st =iio_priv (indio_dev); -unsigned long os[3 ] = {1 }; +DECLARE_BITMAP (os,3 ); +bitmap_fill (os,3 );/* * Software mode is enabled when all three oversampling * pins are set to high. If oversampling gpios are defined
@@ -258,7 +259,7 @@ static int ad7606B_sw_mode_config(struct iio_dev *indio_dev)* otherwise, they must be hardwired to VDD */ if (st->gpio_os) { -gpiod_set_array_value (ARRAY_SIZE (os), +gpiod_set_array_value (st->gpio_os->ndescs, st->gpio_os->desc, st->gpio_os->info, os); }/* OS of 128 and 256 are available only in software mode */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 455/695 iio: adc: ad7606: fix standby gpio state to match the documentation
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guillaume Stols <[email protected]>
[ Upstream commit 059fe4f8bbdf5cad212e1aeeb3e8968c80b9ff3b ]
The binding's documentation specifies that "As the line is active low, it should be marked GPIO_ACTIVE_LOW". However, in the driver, it was handled the opposite way. This commit sets the driver's behaviour in sync with the documentation
--- drivers/iio/adc/ad7606.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/iio/adc/ad7606.c +2 -2
@@ -419,7 +419,7 @@ static int ad7606_request_gpios(struct ad7606_state *st)return PTR_ERR (st->gpio_range); st->gpio_standby =devm_gpiod_get_optional (dev,"standby" , -GPIOD_OUT_HIGH ); +GPIOD_OUT_LOW );if (IS_ERR (st->gpio_standby))return PTR_ERR (st->gpio_standby);
@@ -662,7 +662,7 @@ static int ad7606_suspend(struct device *dev)if (st->gpio_standby) {gpiod_set_value (st->gpio_range,1 ); -gpiod_set_value (st->gpio_standby,0 ); +gpiod_set_value (st->gpio_standby,1 ); }return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 456/695 driver core: Fix error handling in driver API device_rename()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijun Hu <[email protected]>
[ Upstream commit 6d8249ac29bc23260dfa9747eb398ce76012d73c ]
For class-device, device_rename() failure maybe cause unexpected link name within its class folder as explained below:
/sys/class/.../old_name -> /sys/devices/.../old_name device_rename(..., new_name) and failed /sys/class/.../new_name -> /sys/devices/.../old_name
Fixed by undoing renaming link if renaming kobject failed.
--- drivers/base/core.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/base/core.c +10 -5
@@ -4515,9 +4515,11 @@ EXPORT_SYMBOL_GPL(device_destroy);*/ int device_rename (struct device *dev,const char *new_name) { +struct subsys_private *sp =NULL ;struct kobject *kobj = &dev->kobj;char *old_device_name =NULL ;int error; +bool is_link_renamed = false; dev =get_device (dev);if (!dev)
@@ -4532,7 +4534,7 @@ int device_rename(struct device *dev, const char *new_name) }if (dev->class) { -struct subsys_private *sp =class_to_subsys (dev->class); + sp =class_to_subsys (dev->class);if (!sp) { error = -EINVAL ;
@@ -4541,16 +4543,19 @@ int device_rename(struct device *dev, const char *new_name) error =sysfs_rename_link_ns (&sp->subsys.kobj, kobj, old_device_name, new_name,kobject_namespace (kobj)); -subsys_put (sp);if (error) goto out; + + is_link_renamed = true; } error =kobject_rename (kobj, new_name); -if (error) - goto out; - out: +if (error && is_link_renamed) +sysfs_rename_link_ns (&sp->subsys.kobj, kobj, new_name, + old_device_name,kobject_namespace (kobj)); +subsys_put (sp); +put_device (dev);kfree (old_device_name);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 457/695 ABI: testing: fix admv8818 attr description
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antoniu Miclaus <[email protected]>
[ Upstream commit 7d34b4ad8cd2867b130b5b8d7d76d0d6092bd019 ]
Fix description of the filter_mode_available attribute by pointing to the correct name of the attribute that can be written with valid values.
--- Documentation/ABI/testing/sysfs-bus-iio-filter-admv8818 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/ABI/testing/sysfs-bus-iio-filter-admv8818 +1 -1
@@ -3,7 +3,7 @@ KernelVersion: Contact: [email protected] Description: Reading this returns the valid values that can be written to the - on_altvoltage0_mode attribute: + filter_mode attribute: - auto -> Adjust bandpass filter to track changes in input clock rate. - manual -> disable/unregister the clock rate notifier / input clock tracking.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 458/695 iio: chemical: bme680: Fix read/write ops to device by adding mutexes
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vasileios Amoiridis <[email protected]>
[ Upstream commit 77641e5a477d428335cd094b88ac54e09ccb70f4 ]
Add mutexes in the {read/write}_raw() functions of the device to guard the read/write of data from/to the device. This is necessary because for any operation other than temperature, multiple reads need to take place from the device. Even though regmap has a locking by itself, it won't protect us from multiple applications trying to read at the same time temperature and pressure since the pressure reading includes an internal temperature reading and there is nothing to ensure that this temperature+pressure reading will happen sequentially without any other operation interfering in the meantime.
--- drivers/iio/chemical/bme680_core.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/iio/chemical/bme680_core.c +7 -0
@@ -10,6 +10,7 @@*/ #include <linux/acpi.h> #include <linux/bitfield.h> +#include <linux/cleanup.h> #include <linux/delay.h> #include <linux/device.h> #include <linux/module.h>
@@ -52,6 +53,7 @@ struct bme680_calib {struct bme680_data {struct regmap *regmap;struct bme680_calib bme680; +struct mutex lock;/* Protect multiple serial R/W ops to device. */ u8 oversampling_temp;u8 oversampling_press;u8 oversampling_humid;
@@ -827,6 +829,8 @@ static int bme680_read_raw(struct iio_dev *indio_dev, {struct bme680_data *data =iio_priv (indio_dev); +guard (mutex)(&data->lock); +switch (mask) {case IIO_CHAN_INFO_PROCESSED :switch (chan->type) {
@@ -871,6 +875,8 @@ static int bme680_write_raw(struct iio_dev *indio_dev, {struct bme680_data *data =iio_priv (indio_dev); +guard (mutex)(&data->lock); +if (val2 !=0 )return -EINVAL ;
@@ -967,6 +973,7 @@ int bme680_core_probe(struct device *dev, struct regmap *regmap, name =bme680_match_acpi_device (dev); data =iio_priv (indio_dev); +mutex_init (&data->lock);dev_set_drvdata (dev, indio_dev); data->regmap = regmap; indio_dev->name = name;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 459/695 iio: magnetometer: ak8975: drop incorrect AK09116 compatible
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit da6e3160df230692bbd48a6d52318035f19595e2 ]
All compatibles in this binding without prefixes were deprecated, so adding a new deprecated one after some time is not allowed, because it defies the core logic of deprecating things.
Drop the AK09916 vendorless compatible.
--- drivers/iio/magnetometer/ak8975.c | 1 - 1 file changed, 1 deletion(-)
drivers/iio/magnetometer/ak8975.c +0 -1
@@ -1081,7 +1081,6 @@ static const struct of_device_id ak8975_of_match[] = { { .compatible = "asahi-kasei,ak09912", .data = &ak_def_array[AK09912] }, { .compatible = "ak09912", .data = &ak_def_array[AK09912] }, { .compatible = "asahi-kasei,ak09916", .data = &ak_def_array[AK09916] }, - { .compatible = "ak09916", .data = &ak_def_array[AK09916] }, {} };MODULE_DEVICE_TABLE (of, ak8975_of_match);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 460/695 dt-bindings: iio: asahi-kasei,ak8975: drop incorrect AK09116 compatible
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit c7668ac67bc21aebdd8e2d7f839bfffba31b7713 ]
All compatibles in this binding without prefixes were deprecated, so adding a new deprecated one after some time is not allowed, because it defies the core logic of deprecating things.
Drop the AK09916 vendorless compatible.
--- .../devicetree/bindings/iio/magnetometer/asahi-kasei,ak8975.yaml | 1 - 1 file changed, 1 deletion(-)
Documentation/devicetree/bindings/iio/magnetometer/asahi-kasei,ak8975.yaml +0 -1
@@ -23,7 +23,6 @@ properties: - ak8963 - ak09911 - ak09912 - - ak09916 deprecated: true reg:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 461/695 driver core: Fix a potential null-ptr-deref in module_add_driver()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 18ec12c97b39ff6aa15beb8d2b25d15cd44b87d8 ]
Inject fault while probing of-fpga-region, if kasprintf() fails in module_add_driver(), the second sysfs_remove_link() in exit path will cause null-ptr-deref as below because kernfs_name_hash() will call strlen() with NULL driver_name.
Fix it by releasing resources based on the exit path sequence.
KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] Mem abort info: ESR = 0x0000000096000005 EC = 0x25: DABT (current EL), IL = 32 bits SET = 0, FnV = 0 EA = 0, S1PTW = 0 FSC = 0x05: level 1 translation fault Data abort info: ISV = 0, ISS = 0x00000005, ISS2 = 0x00000000 CM = 0, WnR = 0, TnD = 0, TagAccess = 0 GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 [dfffffc000000000] address between user and kernel address ranges Internal error: Oops: 0000000096000005 [#1] PREEMPT SMP Dumping ftrace buffer: (ftrace buffer empty) Modules linked in: of_fpga_region(+) fpga_region fpga_bridge cfg80211 rfkill 8021q garp mrp stp llc ipv6 [last unloaded: of_fpga_region] CPU: 2 UID: 0 PID: 2036 Comm: modprobe Not tainted 6.11.0-rc2-g6a0e38264012 #295 Hardware name: linux,dummy-virt (DT) pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : strlen+0x24/0xb0 lr : kernfs_name_hash+0x1c/0xc4 sp : ffffffc081f97380 x29: ffffffc081f97380 x28: ffffffc081f97b90 x27: ffffff80c821c2a0 x26: ffffffedac0be418 x25: 0000000000000000 x24: ffffff80c09d2000 x23: 0000000000000000 x22: 0000000000000000 x21: 0000000000000000 x20: 0000000000000000 x19: 0000000000000000 x18: 0000000000001840 x17: 0000000000000000 x16: 0000000000000000 x15: 1ffffff8103f2e42 x14: 00000000f1f1f1f1 x13: 0000000000000004 x12: ffffffb01812d61d x11: 1ffffff01812d61c x10: ffffffb01812d61c x9 : dfffffc000000000 x8 : 0000004fe7ed29e4 x7 : ffffff80c096b0e7 x6 : 0000000000000001 x5 : ffffff80c096b0e0 x4 : 1ffffffdb990efa2 x3 : 0000000000000000 x2 : 0000000000000000 x1 : dfffffc000000000 x0 : 0000000000000000 Call trace: strlen+0x24/0xb0 kernfs_name_hash+0x1c/0xc4 kernfs_find_ns+0x118/0x2e8 kernfs_remove_by_name_ns+0x80/0x100 sysfs_remove_link+0x74/0xa8 module_add_driver+0x278/0x394 bus_add_driver+0x1f0/0x43c driver_register+0xf4/0x3c0 __platform_driver_register+0x60/0x88 of_fpga_region_init+0x20/0x1000 [of_fpga_region] do_one_initcall+0x110/0x788 do_init_module+0x1dc/0x5c8 load_module+0x3c38/0x4cac init_module_from_file+0xd4/0x128 idempotent_init_module+0x2cc/0x528 __arm64_sys_finit_module+0xac/0x100 invoke_syscall+0x6c/0x258 el0_svc_common.constprop.0+0x160/0x22c do_el0_svc+0x44/0x5c el0_svc+0x48/0xb8 el0t_64_sync_handler+0x13c/0x158 el0t_64_sync+0x190/0x194 Code: f2fbffe1 a90157f4 12000802 aa0003f5 (38e16861) ---[ end trace 0000000000000000 ]--- Kernel panic - not syncing: Oops: Fatal exception
--- drivers/base/module.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/base/module.c +9 -5
@@ -66,27 +66,31 @@ int module_add_driver(struct module *mod, const struct device_driver *drv) driver_name =make_driver_name (drv);if (!driver_name) { ret = -ENOMEM ; - goto out; + goto out_remove_kobj; }module_create_drivers_dir (mk);if (!mk->drivers_dir) { ret = -EINVAL ; - goto out; + goto out_free_driver_name; } ret =sysfs_create_link (mk->drivers_dir, &drv->p->kobj, driver_name);if (ret) - goto out; + goto out_remove_drivers_dir;kfree (driver_name);return 0 ; -out: -sysfs_remove_link (&drv->p->kobj,"module" ); + +out_remove_drivers_dir:sysfs_remove_link (mk->drivers_dir, driver_name); + +out_free_driver_name:kfree (driver_name); +out_remove_kobj: +sysfs_remove_link (&drv->p->kobj,"module" );return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 462/695 serial: 8250: omap: Cleanup on error in request_irq
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markus Schneider-Pargmann <[email protected]>
[ Upstream commit 35e648a16018b747897be2ccc3ce95ff23237bb5 ]
If devm_request_irq fails, the code does not cleanup many things that were setup before. Instead of directly returning ret we should jump to err.
--- drivers/tty/serial/8250/8250_omap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/8250/8250_omap.c +1 -1
@@ -1581,7 +1581,7 @@ static int omap8250_probe(struct platform_device *pdev) ret =devm_request_irq (&pdev->dev, up.port.irq, omap8250_irq,0 ,dev_name (&pdev->dev), priv);if (ret <0 ) -return ret; + goto err; priv->wakeirq =irq_of_parse_and_map (np,1 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 463/695 Coresight: Set correct cs_mode for TPDM to fix disable issue
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jie Gan <[email protected]>
[ Upstream commit 14f5fa9b5fcbe2b3d5098893aba6ad62254d2ef6 ]
The coresight_disable_source_sysfs function should verify the mode of the coresight device before disabling the source.
However, the mode for the TPDM device is always set to CS_MODE_DISABLED, resulting in the check consistently failing. As a result, TPDM cannot be properly disabled.
Configure CS_MODE_SYSFS/CS_MODE_PERF during the enablement. Configure CS_MODE_DISABLED during the disablement.
--- drivers/hwtracing/coresight/coresight-tpdm.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/hwtracing/coresight/coresight-tpdm.c +6 -0
@@ -449,6 +449,11 @@ static int tpdm_enable(struct coresight_device *csdev, struct perf_event *event,return -EBUSY ; } +if (!coresight_take_mode (csdev, mode)) { +spin_unlock (&drvdata->spinlock); +return -EBUSY ; + } +__tpdm_enable (drvdata); drvdata->enable = true;spin_unlock (&drvdata->spinlock);
@@ -506,6 +511,7 @@ static void tpdm_disable(struct coresight_device *csdev, }__tpdm_disable (drvdata); +coresight_set_mode (csdev,CS_MODE_DISABLED ); drvdata->enable = false;spin_unlock (&drvdata->spinlock);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 464/695 Coresight: Set correct cs_mode for dummy source to fix disable issue
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jie Gan <[email protected]>
[ Upstream commit e6b64cda393efd84709ab3df2e42d36d36d7553e ]
The coresight_disable_source_sysfs function should verify the mode of the coresight device before disabling the source. However, the mode for the dummy source device is always set to CS_MODE_DISABLED, resulting in the check consistently failing. As a result, dummy source cannot be properly disabled.
Configure CS_MODE_SYSFS/CS_MODE_PERF during the enablement. Configure CS_MODE_DISABLED during the disablement.
--- drivers/hwtracing/coresight/coresight-dummy.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/hwtracing/coresight/coresight-dummy.c +4 -0
@@ -23,6 +23,9 @@ DEFINE_CORESIGHT_DEVLIST(sink_devs, "dummy_sink");static int dummy_source_enable (struct coresight_device *csdev,struct perf_event *event,enum cs_mode mode) { +if (!coresight_take_mode (csdev, mode)) +return -EBUSY ; +dev_dbg (csdev->dev.parent,"Dummy source enabled\n" );return 0 ;
@@ -31,6 +34,7 @@ static int dummy_source_enable(struct coresight_device *csdev,static void dummy_source_disable (struct coresight_device *csdev,struct perf_event *event) { +coresight_set_mode (csdev,CS_MODE_DISABLED );dev_dbg (csdev->dev.parent,"Dummy source disabled\n" ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 465/695 coresight: tmc: sg: Do not leak sg_table
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suzuki K Poulose <[email protected]>
[ Upstream commit c58dc5a1f886f2fcc1133746d0cbaa1fe7fd44ff ]
Running perf with cs_etm on Juno triggers the following kmemleak warning !
:~# cat /sys/kernel/debug/kmemleak unreferenced object 0xffffff8806b6d720 (size 96): comm "perf", pid 562, jiffies 4297810960 hex dump (first 32 bytes): 38 d8 13 07 88 ff ff ff 00 d0 9e 85 c0 ff ff ff 8............... 00 10 00 88 c0 ff ff ff 00 f0 ff f7 ff 00 00 00 ................ backtrace (crc 1dbf6e00): [<ffffffc08107381c>] kmemleak_alloc+0xbc/0xd8 [<ffffffc0802f9798>] kmalloc_trace_noprof+0x220/0x2e8 [<ffffffc07bb71948>] tmc_alloc_sg_table+0x48/0x208 [coresight_tmc] [<ffffffc07bb71cbc>] tmc_etr_alloc_sg_buf+0xac/0x240 [coresight_tmc] [<ffffffc07bb72538>] tmc_alloc_etr_buf.constprop.0+0x1f0/0x260 [coresight_tmc] [<ffffffc07bb7280c>] alloc_etr_buf.constprop.0.isra.0+0x74/0xa8 [coresight_tmc] [<ffffffc07bb72950>] tmc_alloc_etr_buffer+0x110/0x260 [coresight_tmc] [<ffffffc07bb38afc>] etm_setup_aux+0x204/0x3b0 [coresight] [<ffffffc08025837c>] rb_alloc_aux+0x20c/0x318 [<ffffffc08024dd84>] perf_mmap+0x2e4/0x7a0 [<ffffffc0802cceb0>] mmap_region+0x3b0/0xa08 [<ffffffc0802cd8a8>] do_mmap+0x3a0/0x500 [<ffffffc080295328>] vm_mmap_pgoff+0x100/0x1d0 [<ffffffc0802cadf8>] ksys_mmap_pgoff+0xb8/0x110 [<ffffffc080020688>] __arm64_sys_mmap+0x38/0x58 [<ffffffc080028fc0>] invoke_syscall.constprop.0+0x58/0x100
This due to the fact that we do not free the "sg_table" itself while freeing up the SG table and data pages. Fix this by freeing the sg_table in tmc_free_sg_table().
--- drivers/hwtracing/coresight/coresight-tmc-etr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwtracing/coresight/coresight-tmc-etr.c +1 -1
@@ -261,6 +261,7 @@ void tmc_free_sg_table(struct tmc_sg_table *sg_table) {tmc_free_table_pages (sg_table);tmc_free_data_pages (sg_table); +kfree (sg_table); }EXPORT_SYMBOL_GPL (tmc_free_sg_table);
@@ -342,7 +343,6 @@ struct tmc_sg_table *tmc_alloc_sg_table(struct device *dev, rc =tmc_alloc_table_pages (sg_table);if (rc) {tmc_free_sg_table (sg_table); -kfree (sg_table);return ERR_PTR (rc); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 466/695 interconnect: icc-clk: Add missed num_nodes initialization
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
[ Upstream commit c801ed86840ec38b2a9bcafeee3d7c9e14c743f3 ]
With the new __counted_by annotation, the "num_nodes" struct member must be set before accessing the "nodes" array. This initialization was done in other places where a new struct icc_onecell_data is allocated, but this case in icc_clk_register() was missed. Set "num_nodes" after allocation.
--- drivers/interconnect/icc-clk.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/interconnect/icc-clk.c +1 -2
@@ -87,6 +87,7 @@ struct icc_provider *icc_clk_register(struct device *dev, onecell =devm_kzalloc (dev,struct_size (onecell, nodes,2 * num_clocks),GFP_KERNEL );if (!onecell)return ERR_PTR (-ENOMEM ); + onecell->num_nodes =2 * num_clocks; qp =devm_kzalloc (dev,struct_size (qp, clocks, num_clocks),GFP_KERNEL );if (!qp)
@@ -133,8 +134,6 @@ struct icc_provider *icc_clk_register(struct device *dev, onecell->nodes[j++] = node; } - onecell->num_nodes = j; - ret =icc_provider_register (provider);if (ret) goto err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 467/695 interconnect: qcom: sm8250: Enable sync_state
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit d3681b30214eb5885092ce4586f07237dc3c522f ]
Enable the generic icc sync_state callback to ensure interconnect votes are actually taken into account, instead of being forced to the maximum value.
--- drivers/interconnect/qcom/sm8350.c | 1 + 1 file changed, 1 insertion(+)
drivers/interconnect/qcom/sm8350.c +1 -0
@@ -1965,6 +1965,7 @@ static struct platform_driver qnoc_driver = { .driver = { .name = "qnoc-sm8350", .of_match_table = qnoc_of_match, + .sync_state = icc_sync_state, }, };module_platform_driver (qnoc_driver);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 468/695 dm integrity: fix gcc 5 warning
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
[ Upstream commit a8fa6483b40943a6c8feea803a2dc8e9982cc766 ]
This commit fixes gcc 5 warning "logical not is only applied to the left hand side of comparison"
--- drivers/md/dm-integrity.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/md/dm-integrity.c +10 -5
@@ -4717,13 +4717,18 @@ static int dm_integrity_ctr(struct dm_target *ti, unsigned int argc, char **argv ti->error ="Block size doesn't match the information in superblock" ; goto bad; } -if (!le32_to_cpu (ic->sb->journal_sections) != (ic->mode =='I' )) { - r = -EINVAL ; -if (ic->mode !='I' ) +if (ic->mode !='I' ) { +if (!le32_to_cpu (ic->sb->journal_sections)) { + r = -EINVAL ; ti->error ="Corrupted superblock, journal_sections is 0" ; -else + goto bad; + } + }else { +if (le32_to_cpu (ic->sb->journal_sections)) { + r = -EINVAL ; ti->error ="Corrupted superblock, journal_sections is not 0" ; - goto bad; + goto bad; + } }/* make sure that ti->max_io_len doesn't overflow */ if (!ic->meta_dev) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 469/695 cxl/pci: Fix to record only non-zero ranges
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yanfei Xu <[email protected]>
[ Upstream commit 55e268694e8b07026c88191f9b6949b6887d9ce3 ]
The function cxl_dvsec_rr_decode() retrieves and records DVSEC ranges into info->dvsec_range[], regardless of whether it is non-zero range, and the variable info->ranges indicates the number of non-zero ranges. However, in cxl_hdm_decode_init(), the validation for info->dvsec_range[] occurs in a for loop that iterates based on info->ranges. It may result in zero range to be validated but non-zero range not be validated, in turn, the number of allowed ranges is to be
0. Address it by only record non-zero ranges.
This fix is not urgent as it requires a configuration that zeroes out the first dvsec range while populating the second. This has not been observed, but it is theoretically possible. If this gets picked up for -stable, no harm done, but there is no urgency to backport.
--- drivers/cxl/core/pci.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
drivers/cxl/core/pci.c +1 -7
@@ -390,10 +390,6 @@ int cxl_dvsec_rr_decode(struct device *dev, int d, size |= temp &CXL_DVSEC_MEM_SIZE_LOW_MASK ;if (!size) { - info->dvsec_range[i] = (struct range ) { - .start =0 , - .end =CXL_RESOURCE_NONE , - };continue ; }
@@ -411,12 +407,10 @@ int cxl_dvsec_rr_decode(struct device *dev, int d, base |= temp &CXL_DVSEC_MEM_BASE_LOW_MASK ; - info->dvsec_range[i] = (struct range ) { + info->dvsec_range[ranges++] = (struct range ) { .start = base, .end = base + size -1 }; - - ranges++; } info->ranges = ranges;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 470/695 vdpa/mlx5: Fix invalid mr resource destroy
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dragos Tatulea <[email protected]>
[ Upstream commit dc12502905b7a3de9097ea6b98870470c2921e09 ]
Certain error paths from mlx5_vdpa_dev_add() can end up releasing mr resources which never got initialized in the first place.
This patch adds the missing check in mlx5_vdpa_destroy_mr_resources() to block releasing non-initialized mr resources.
Reference trace:
mlx5_core 0000:08:00.2: mlx5_vdpa_dev_add:3274:(pid 2700) warning: No mac address provisioned?
BUG: kernel NULL pointer dereference, address: 0000000000000000 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 140216067 P4D 0 Oops: 0000 [#1] PREEMPT SMP NOPTI CPU: 8 PID: 2700 Comm: vdpa Kdump: loaded Not tainted 5.14.0-496.el9.x86_64 #1 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 RIP: 0010:vhost_iotlb_del_range+0xf/0xe0 [vhost_iotlb] Code: [...] RSP: 0018:ff1c823ac23077f0 EFLAGS: 00010246 RAX: ffffffffc1a21a60 RBX: ffffffff899567a0 RCX: 0000000000000000 RDX: ffffffffffffffff RSI: 0000000000000000 RDI: 0000000000000000 RBP: ff1bda1f7c21e800 R08: 0000000000000000 R09: ff1c823ac2307670 R10: ff1c823ac2307668 R11: ffffffff8a9e7b68 R12: 0000000000000000 R13: 0000000000000000 R14: ff1bda1f43e341a0 R15: 00000000ffffffea FS: 00007f56eba7c740(0000) GS:ff1bda269f800000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000000 CR3: 0000000104d90001 CR4: 0000000000771ef0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 PKRU: 55555554 Call Trace: ? show_trace_log_lvl+0x1c4/0x2df ? show_trace_log_lvl+0x1c4/0x2df ? mlx5_vdpa_free+0x3d/0x150 [mlx5_vdpa] ? __die_body.cold+0x8/0xd ? page_fault_oops+0x134/0x170 ? __irq_work_queue_local+0x2b/0xc0 ? irq_work_queue+0x2c/0x50 ? exc_page_fault+0x62/0x150 ? asm_exc_page_fault+0x22/0x30 ? __pfx_mlx5_vdpa_free+0x10/0x10 [mlx5_vdpa] ? vhost_iotlb_del_range+0xf/0xe0 [vhost_iotlb] mlx5_vdpa_free+0x3d/0x150 [mlx5_vdpa] vdpa_release_dev+0x1e/0x50 [vdpa] device_release+0x31/0x90 kobject_cleanup+0x37/0x130 mlx5_vdpa_dev_add+0x2d2/0x7a0 [mlx5_vdpa] vdpa_nl_cmd_dev_add_set_doit+0x277/0x4c0 [vdpa] genl_family_rcv_msg_doit+0xd9/0x130 genl_family_rcv_msg+0x14d/0x220 ? __pfx_vdpa_nl_cmd_dev_add_set_doit+0x10/0x10 [vdpa] ? _copy_to_user+0x1a/0x30 ? move_addr_to_user+0x4b/0xe0 genl_rcv_msg+0x47/0xa0 ? __import_iovec+0x46/0x150 ? __pfx_genl_rcv_msg+0x10/0x10 netlink_rcv_skb+0x54/0x100 genl_rcv+0x24/0x40 netlink_unicast+0x245/0x370 netlink_sendmsg+0x206/0x440 __sys_sendto+0x1dc/0x1f0 ? do_read_fault+0x10c/0x1d0 ? do_pte_missing+0x10d/0x190 __x64_sys_sendto+0x20/0x30 do_syscall_64+0x5c/0xf0 ? __count_memcg_events+0x4f/0xb0 ? mm_account_fault+0x6c/0x100 ? handle_mm_fault+0x116/0x270 ? do_user_addr_fault+0x1d6/0x6a0 ? do_syscall_64+0x6b/0xf0 ? clear_bhb_loop+0x25/0x80 ? clear_bhb_loop+0x25/0x80 ? clear_bhb_loop+0x25/0x80 ? clear_bhb_loop+0x25/0x80 ? clear_bhb_loop+0x25/0x80 entry_SYSCALL_64_after_hwframe+0x78/0x80
Message-Id: <[email protected]>
--- drivers/vdpa/mlx5/core/mr.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/vdpa/mlx5/core/mr.c +3 -0
@@ -581,6 +581,9 @@ static void mlx5_vdpa_show_mr_leaks(struct mlx5_vdpa_dev *mvdev)void mlx5_vdpa_destroy_mr_resources (struct mlx5_vdpa_dev *mvdev) { +if (!mvdev->res.valid) +return ; +for (int i =0 ; i <MLX5_VDPA_NUM_AS ; i++)mlx5_vdpa_update_mr (mvdev,NULL , i);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 471/695 vhost_vdpa: assign irq bypass producer token correctly
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Wang <[email protected]>
[ Upstream commit 02e9e9366fefe461719da5d173385b6685f70319 ]
We used to call irq_bypass_unregister_producer() in vhost_vdpa_setup_vq_irq() which is problematic as we don't know if the token pointer is still valid or not.
Actually, we use the eventfd_ctx as the token so the life cycle of the token should be bound to the VHOST_SET_VRING_CALL instead of vhost_vdpa_setup_vq_irq() which could be called by set_status().
Fixing this by setting up irq bypass producer's token when handling VHOST_SET_VRING_CALL and un-registering the producer before calling vhost_vring_ioctl() to prevent a possible use after free as eventfd could have been released in vhost_vring_ioctl(). And such registering and unregistering will only be done if DRIVER_OK is set.
Message-Id: <[email protected]>
--- drivers/vhost/vdpa.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
drivers/vhost/vdpa.c +13 -3
@@ -209,11 +209,9 @@ static void vhost_vdpa_setup_vq_irq(struct vhost_vdpa *v, u16 qid)if (irq <0 )return ; -irq_bypass_unregister_producer (&vq->call_ctx.producer);if (!vq->call_ctx.ctx)return ; - vq->call_ctx.producer.token = vq->call_ctx.ctx; vq->call_ctx.producer.irq = irq; ret =irq_bypass_register_producer (&vq->call_ctx.producer);if (unlikely (ret))
@@ -709,6 +707,14 @@ static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd, vq->last_avail_idx = vq_state.split.avail_index; }break ; +case VHOST_SET_VRING_CALL : +if (vq->call_ctx.ctx) { +if (ops->get_status (vdpa) & +VIRTIO_CONFIG_S_DRIVER_OK ) +vhost_vdpa_unsetup_vq_irq (v, idx); + vq->call_ctx.producer.token =NULL ; + } +break ; } r =vhost_vring_ioctl (&v->vdev, cmd, argp);
@@ -747,13 +753,16 @@ static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd, cb.callback = vhost_vdpa_virtqueue_cb; cb.private = vq; cb.trigger = vq->call_ctx.ctx; + vq->call_ctx.producer.token = vq->call_ctx.ctx; +if (ops->get_status (vdpa) & +VIRTIO_CONFIG_S_DRIVER_OK ) +vhost_vdpa_setup_vq_irq (v, idx); }else { cb.callback =NULL ; cb.private =NULL ; cb.trigger =NULL ; } ops->set_vq_cb (vdpa, idx, &cb); -vhost_vdpa_setup_vq_irq (v, idx);break ;case VHOST_SET_VRING_NUM :
@@ -1419,6 +1428,7 @@ static int vhost_vdpa_open(struct inode *inode, struct file *filep)for (i =0 ; i < nvqs; i++) { vqs[i] = &v->vqs[i]; vqs[i]->handle_kick = handle_vq_kick; + vqs[i]->call_ctx.ctx =NULL ; }vhost_dev_init (dev, vqs, nvqs,0 ,0 ,0 , false, vhost_vdpa_process_iotlb_msg);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 472/695 ep93xx: clock: Fix off by one in ep93xx_div_recalc_rate()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit c7f06284a6427475e3df742215535ec3f6cd9662 ]
The psc->div[] array has psc->num_div elements. These values come from when we call clk_hw_register_div(). It's adc_divisors and ARRAY_SIZE(adc_divisors)) and so on. So this condition needs to be >= instead of > to prevent an out of bounds read.
--- arch/arm/mach-ep93xx/clock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-ep93xx/clock.c +1 -1
@@ -359,7 +359,7 @@ static unsigned long ep93xx_div_recalc_rate(struct clk_hw *hw,u32 val =__raw_readl (psc->reg);u8 index = (val & psc->mask) >> psc->shift; -if (index > psc->num_div) +if (index >= psc->num_div)return 0 ;return DIV_ROUND_UP_ULL (parent_rate, psc->div[index]);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 473/695 um: remove ARCH_NO_PREEMPT_DYNAMIC
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 64dcf0b8779363ca07dfb5649a4cc71f9fdf390b ]
There's no such symbol and we currently don't have any of the mechanisms to make boot-time selection cheap enough, so we can't have HAVE_PREEMPT_DYNAMIC_CALL or HAVE_PREEMPT_DYNAMIC_KEY.
Remove the select statement.
--- arch/um/Kconfig | 1 - 1 file changed, 1 deletion(-)
arch/um/Kconfig +0 -1
@@ -11,7 +11,6 @@ config UML select ARCH_HAS_KCOV select ARCH_HAS_STRNCPY_FROM_USER select ARCH_HAS_STRNLEN_USER - select ARCH_NO_PREEMPT_DYNAMIC select HAVE_ARCH_AUDITSYSCALL select HAVE_ARCH_KASAN if X86_64 select HAVE_ARCH_KASAN_VMALLOC if HAVE_ARCH_KASAN
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 474/695 Revert "dm: requeue IO if mapping table not yet available"
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
[ Upstream commit c8691cd0fc11197515ed148de0780d927bfca38b ]
This reverts commit fa247089de9936a46e290d4724cb5f0b845600f5.
The following sequence of commands causes a livelock - there will be workqueue process looping and consuming 100% CPU:
dmsetup create --notable test
truncate -s 1MiB testdata
losetup /dev/loop0 testdata
dmsetup load test --table '0 2048 linear /dev/loop0 0' dd if=/dev/zero of=/dev/dm-0 bs=16k count=1 conv=fdatasync
The livelock is caused by the commit fa247089de99. The commit claims that it fixes a race condition, however, it is unknown what the actual race condition is and what program is involved in the race condition.
When the inactive table is loaded, the nodes /dev/dm-0 and /sys/block/dm-0 are created. /dev/dm-0 has zero size at this point. When the device is suspended and resumed, the nodes /dev/mapper/test and /dev/disk/* are created.
If some program opens a block device before it is created by dmsetup or lvm, the program is buggy, so dm could just report an error as it used to do before.
--- drivers/md/dm-rq.c | 4 +++- drivers/md/dm.c | 11 ++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-)
drivers/md/dm-rq.c +3 -1
@@ -496,8 +496,10 @@ static blk_status_t dm_mq_queue_rq(struct blk_mq_hw_ctx *hctx, map =dm_get_live_table (md, &srcu_idx);if (unlikely (!map)) { +DMERR_LIMIT ("%s: mapping table unavailable, erroring io" , +dm_device_name (md));dm_put_live_table (md, srcu_idx); -return BLK_STS_RESOURCE ; +return BLK_STS_IOERR ; } ti =dm_table_find_target (map,0 );dm_put_live_table (md, srcu_idx);
drivers/md/dm.c +8 -3
@@ -2030,10 +2030,15 @@ static void dm_submit_bio(struct bio *bio)struct dm_table *map; map =dm_get_live_table (md, &srcu_idx); +if (unlikely (!map)) { +DMERR_LIMIT ("%s: mapping table unavailable, erroring io" , +dm_device_name (md)); +bio_io_error (bio); + goto out; + } -/* If suspended, or map not yet available, queue this IO for later */ -if (unlikely (test_bit (DMF_BLOCK_IO_FOR_SUSPEND , &md->flags)) || -unlikely (!map)) { +/* If suspended, queue this IO for later */ +if (unlikely (test_bit (DMF_BLOCK_IO_FOR_SUSPEND , &md->flags))) {if (bio->bi_opf &REQ_NOWAIT )bio_wouldblock_error (bio);else if (bio->bi_opf &REQ_RAHEAD )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 475/695 net: phy: aquantia: fix -ETIMEDOUT PHY probe failure when firmware not present
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Oltean <[email protected]>
[ Upstream commit 194ef9d0de9021df4a0ba8b112f91e56adaddd22 ]
The author of the blamed commit apparently did not notice something about aqr_wait_reset_complete(): it polls the exact same register - MDIO_MMD_VEND1:VEND1_GLOBAL_FW_ID - as aqr_firmware_load().
Thus, the entire logic after the introduction of aqr_wait_reset_complete() is now completely side-stepped, because if aqr_wait_reset_complete() succeeds, MDIO_MMD_VEND1:VEND1_GLOBAL_FW_ID could have only been a non-zero value. The handling of the case where the register reads as 0 is dead code, due to the previous -ETIMEDOUT having stopped execution and returning a fatal error to the caller. We never attempt to load new firmware if no firmware is present.
Based on static code analysis, I guess we should simply introduce a switch/case statement based on the return code from aqr_wait_reset_complete(), to determine whether to load firmware or not. I am not intending to change the procedure through which the driver determines whether to load firmware or not, as I am unaware of alternative possibilities.
At the same time, Russell King suggests that if aqr_wait_reset_complete() is expected to return -ETIMEDOUT as part of normal operation and not just catastrophic failure, the use of phy_read_mmd_poll_timeout() is improper, since that has an embedded print inside. Just open-code a call to read_poll_timeout() to avoid printing -ETIMEDOUT, but continue printing actual read errors from the MDIO bus.
--- drivers/net/phy/aquantia/aquantia_firmware.c | 42 +++++++++++--------- drivers/net/phy/aquantia/aquantia_main.c | 19 +++++++-- 2 files changed, 39 insertions(+), 22 deletions(-)
drivers/net/phy/aquantia/aquantia_firmware.c +24 -18
@@ -353,26 +353,32 @@ int aqr_firmware_load(struct phy_device *phydev) {int ret; - ret =aqr_wait_reset_complete (phydev); -if (ret) -return ret; - -/* Check if the firmware is not already loaded by pooling -* the current version returned by the PHY. If 0 is returned, -* no firmware is loaded. +/* Check if the firmware is not already loaded by polling +* the current version returned by the PHY. */ - ret =phy_read_mmd (phydev,MDIO_MMD_VEND1 ,VEND1_GLOBAL_FW_ID ); -if (ret >0 ) - goto exit; - - ret =aqr_firmware_load_nvmem (phydev); -if (!ret) - goto exit; - - ret =aqr_firmware_load_fs (phydev); -if (ret) + ret =aqr_wait_reset_complete (phydev); +switch (ret) { +case 0 : +/* Some firmware is loaded => do nothing */ +return 0 ; +case -ETIMEDOUT : +/* VEND1_GLOBAL_FW_ID still reads 0 after 2 seconds of polling. +* We don't have full confidence that no firmware is loaded (in +* theory it might just not have loaded yet), but we will +* assume that, and load a new image. +*/ + ret =aqr_firmware_load_nvmem (phydev); +if (!ret) +return ret; + + ret =aqr_firmware_load_fs (phydev); +if (ret) +return ret; +break ; +default : +/* PHY read error, propagate it to the caller */ return ret; + } -exit:return 0 ; }
drivers/net/phy/aquantia/aquantia_main.c +15 -4
@@ -435,6 +435,9 @@ static int aqr107_set_tunable(struct phy_device *phydev, } } +#define AQR_FW_WAIT_SLEEP_US 20000 +#define AQR_FW_WAIT_TIMEOUT_US 2000000 +/* If we configure settings whilst firmware is still initializing the chip, * then these settings may be overwritten. Therefore make sure chip * initialization has completed. Use presence of the firmware ID as
@@ -444,11 +447,19 @@ static int aqr107_set_tunable(struct phy_device *phydev,*/ int aqr_wait_reset_complete (struct phy_device *phydev) { -int val; +int ret, val; + + ret =read_poll_timeout (phy_read_mmd, val, val !=0 , +AQR_FW_WAIT_SLEEP_US ,AQR_FW_WAIT_TIMEOUT_US , + false, phydev,MDIO_MMD_VEND1 , +VEND1_GLOBAL_FW_ID ); +if (val <0 ) { +phydev_err (phydev,"Failed to read VEND1_GLOBAL_FW_ID: %pe\n" , +ERR_PTR (val)); +return val; + } -return phy_read_mmd_poll_timeout (phydev,MDIO_MMD_VEND1 , -VEND1_GLOBAL_FW_ID , val, val !=0 , -20000 ,2000000 , false); +return ret; }static void aqr107_chip_info (struct phy_device *phydev)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 476/695 net: xilinx: axienet: Schedule NAPI in two steps
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Anderson <[email protected]>
[ Upstream commit ba0da2dc934ec5ac32bbeecbd0670da16ba03565 ]
As advised by Documentation/networking/napi.rst, masking IRQs after calling napi_schedule can be racy. Avoid this by only masking/scheduling if napi_schedule_prep returns true.
--- drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/net/ethernet/xilinx/xilinx_axienet_main.c +8 -6
@@ -1222,9 +1222,10 @@ static irqreturn_t axienet_tx_irq(int irq, void *_ndev)u32 cr = lp->tx_dma_cr; cr &= ~(XAXIDMA_IRQ_IOC_MASK |XAXIDMA_IRQ_DELAY_MASK ); -axienet_dma_out32 (lp,XAXIDMA_TX_CR_OFFSET , cr); - -napi_schedule (&lp->napi_tx); +if (napi_schedule_prep (&lp->napi_tx)) { +axienet_dma_out32 (lp,XAXIDMA_TX_CR_OFFSET , cr); +__napi_schedule (&lp->napi_tx); + } }return IRQ_HANDLED ;
@@ -1266,9 +1267,10 @@ static irqreturn_t axienet_rx_irq(int irq, void *_ndev)u32 cr = lp->rx_dma_cr; cr &= ~(XAXIDMA_IRQ_IOC_MASK |XAXIDMA_IRQ_DELAY_MASK ); -axienet_dma_out32 (lp,XAXIDMA_RX_CR_OFFSET , cr); - -napi_schedule (&lp->napi_rx); +if (napi_schedule_prep (&lp->napi_rx)) { +axienet_dma_out32 (lp,XAXIDMA_RX_CR_OFFSET , cr); +__napi_schedule (&lp->napi_rx); + } }return IRQ_HANDLED ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 477/695 net: xilinx: axienet: Fix packet counting
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Anderson <[email protected]>
[ Upstream commit 5a6caa2cfabb559309b5ce29ee7c8e9ce1a9a9df ]
axienet_free_tx_chain returns the number of DMA descriptors it's handled. However, axienet_tx_poll treats the return as the number of packets. When scatter-gather SKBs are enabled, a single packet may use multiple DMA descriptors, which causes incorrect packet counts. Fix this by explicitly keepting track of the number of packets processed as separate from the DMA descriptors.
Budget does not affect the number of Tx completions we can process for NAPI, so we use the ring size as the limit instead of budget. As we no longer return the number of descriptors processed to axienet_tx_poll, we now update tx_bd_ci in axienet_free_tx_chain.
--- .../net/ethernet/xilinx/xilinx_axienet_main.c | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-)
drivers/net/ethernet/xilinx/xilinx_axienet_main.c +14 -9
@@ -674,15 +674,15 @@ static int axienet_device_reset(struct net_device *ndev)* * Would either be called after a successful transmit operation, or after * there was an error when setting up the chain. -* Returns the number of descriptors handled. +* Returns the number of packets handled. */ static int axienet_free_tx_chain (struct axienet_local *lp,u32 first_bd,int nr_bds,bool force,u32 *sizep,int budget) {struct axidma_bd *cur_p;unsigned int status; +int i, packets =0 ;dma_addr_t phys; -int i;for (i =0 ; i < nr_bds; i++) { cur_p = &lp->tx_bd_v[(first_bd + i) % lp->tx_bd_num];
@@ -701,8 +701,10 @@ static int axienet_free_tx_chain(struct axienet_local *lp, u32 first_bd, (cur_p->cntrl &XAXIDMA_BD_CTRL_LENGTH_MASK ), DMA_TO_DEVICE); -if (cur_p->skb && (status &XAXIDMA_BD_STS_COMPLETE_MASK )) +if (cur_p->skb && (status &XAXIDMA_BD_STS_COMPLETE_MASK )) {napi_consume_skb (cur_p->skb, budget); + packets++; + } cur_p->app0 =0 ; cur_p->app1 =0 ;
@@ -718,7 +720,13 @@ static int axienet_free_tx_chain(struct axienet_local *lp, u32 first_bd, *sizep += status &XAXIDMA_BD_STS_ACTUAL_LEN_MASK ; } -return i; +if (!force) { + lp->tx_bd_ci += i; +if (lp->tx_bd_ci >= lp->tx_bd_num) + lp->tx_bd_ci %= lp->tx_bd_num; + } + +return packets; }/**
@@ -891,13 +899,10 @@ static int axienet_tx_poll(struct napi_struct *napi, int budget)u32 size =0 ;int packets; - packets =axienet_free_tx_chain (lp, lp->tx_bd_ci, budget, false, &size, budget); + packets =axienet_free_tx_chain (lp, lp->tx_bd_ci, lp->tx_bd_num, false, + &size, budget);if (packets) { - lp->tx_bd_ci += packets; -if (lp->tx_bd_ci >= lp->tx_bd_num) - lp->tx_bd_ci %= lp->tx_bd_num; -u64_stats_update_begin (&lp->tx_stat_sync);u64_stats_add (&lp->tx_packets, packets);u64_stats_add (&lp->tx_bytes, size);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 478/695 netfilter: nf_reject_ipv6: fix nf_reject_ip6_tcphdr_put()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 9c778fe48d20ef362047e3376dee56d77f8500d4 ]
syzbot reported that nf_reject_ip6_tcphdr_put() was possibly sending garbage on the four reserved tcp bits (th->res1)
Use skb_put_zero() to clear the whole TCP header,
as done in nf_reject_ip_tcphdr_put()
BUG: KMSAN: uninit-value in nf_reject_ip6_tcphdr_put+0x688/0x6c0 net/ipv6/netfilter/nf_reject_ipv6.c:255 nf_reject_ip6_tcphdr_put+0x688/0x6c0 net/ipv6/netfilter/nf_reject_ipv6.c:255 nf_send_reset6+0xd84/0x15b0 net/ipv6/netfilter/nf_reject_ipv6.c:344 nft_reject_inet_eval+0x3c1/0x880 net/netfilter/nft_reject_inet.c:48 expr_call_ops_eval net/netfilter/nf_tables_core.c:240 [inline] nft_do_chain+0x438/0x22a0 net/netfilter/nf_tables_core.c:288 nft_do_chain_inet+0x41a/0x4f0 net/netfilter/nft_chain_filter.c:161 nf_hook_entry_hookfn include/linux/netfilter.h:154 [inline] nf_hook_slow+0xf4/0x400 net/netfilter/core.c:626 nf_hook include/linux/netfilter.h:269 [inline] NF_HOOK include/linux/netfilter.h:312 [inline] ipv6_rcv+0x29b/0x390 net/ipv6/ip6_input.c:310 __netif_receive_skb_one_core net/core/dev.c:5661 [inline] __netif_receive_skb+0x1da/0xa00 net/core/dev.c:5775 process_backlog+0x4ad/0xa50 net/core/dev.c:6108 __napi_poll+0xe7/0x980 net/core/dev.c:6772 napi_poll net/core/dev.c:6841 [inline] net_rx_action+0xa5a/0x19b0 net/core/dev.c:6963 handle_softirqs+0x1ce/0x800 kernel/softirq.c:554 __do_softirq+0x14/0x1a kernel/softirq.c:588 do_softirq+0x9a/0x100 kernel/softirq.c:455 __local_bh_enable_ip+0x9f/0xb0 kernel/softirq.c:382 local_bh_enable include/linux/bottom_half.h:33 [inline] rcu_read_unlock_bh include/linux/rcupdate.h:908 [inline] __dev_queue_xmit+0x2692/0x5610 net/core/dev.c:4450 dev_queue_xmit include/linux/netdevice.h:3105 [inline] neigh_resolve_output+0x9ca/0xae0 net/core/neighbour.c:1565 neigh_output include/net/neighbour.h:542 [inline] ip6_finish_output2+0x2347/0x2ba0 net/ipv6/ip6_output.c:141 __ip6_finish_output net/ipv6/ip6_output.c:215 [inline] ip6_finish_output+0xbb8/0x14b0 net/ipv6/ip6_output.c:226 NF_HOOK_COND include/linux/netfilter.h:303 [inline] ip6_output+0x356/0x620 net/ipv6/ip6_output.c:247 dst_output include/net/dst.h:450 [inline] NF_HOOK include/linux/netfilter.h:314 [inline] ip6_xmit+0x1ba6/0x25d0 net/ipv6/ip6_output.c:366 inet6_csk_xmit+0x442/0x530 net/ipv6/inet6_connection_sock.c:135 __tcp_transmit_skb+0x3b07/0x4880 net/ipv4/tcp_output.c:1466 tcp_transmit_skb net/ipv4/tcp_output.c:1484 [inline] tcp_connect+0x35b6/0x7130 net/ipv4/tcp_output.c:4143 tcp_v6_connect+0x1bcc/0x1e40 net/ipv6/tcp_ipv6.c:333 __inet_stream_connect+0x2ef/0x1730 net/ipv4/af_inet.c:679 inet_stream_connect+0x6a/0xd0 net/ipv4/af_inet.c:750 __sys_connect_file net/socket.c:2061 [inline] __sys_connect+0x606/0x690 net/socket.c:2078 __do_sys_connect net/socket.c:2088 [inline] __se_sys_connect net/socket.c:2085 [inline] __x64_sys_connect+0x91/0xe0 net/socket.c:2085 x64_sys_call+0x27a5/0x3ba0 arch/x86/include/generated/asm/syscalls_64.h:43 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xcd/0x1e0 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f
Uninit was stored to memory at:
nf_reject_ip6_tcphdr_put+0x60c/0x6c0 net/ipv6/netfilter/nf_reject_ipv6.c:249 nf_send_reset6+0xd84/0x15b0 net/ipv6/netfilter/nf_reject_ipv6.c:344 nft_reject_inet_eval+0x3c1/0x880 net/netfilter/nft_reject_inet.c:48 expr_call_ops_eval net/netfilter/nf_tables_core.c:240 [inline] nft_do_chain+0x438/0x22a0 net/netfilter/nf_tables_core.c:288 nft_do_chain_inet+0x41a/0x4f0 net/netfilter/nft_chain_filter.c:161 nf_hook_entry_hookfn include/linux/netfilter.h:154 [inline] nf_hook_slow+0xf4/0x400 net/netfilter/core.c:626 nf_hook include/linux/netfilter.h:269 [inline] NF_HOOK include/linux/netfilter.h:312 [inline] ipv6_rcv+0x29b/0x390 net/ipv6/ip6_input.c:310 __netif_receive_skb_one_core net/core/dev.c:5661 [inline] __netif_receive_skb+0x1da/0xa00 net/core/dev.c:5775 process_backlog+0x4ad/0xa50 net/core/dev.c:6108 __napi_poll+0xe7/0x980 net/core/dev.c:6772 napi_poll net/core/dev.c:6841 [inline] net_rx_action+0xa5a/0x19b0 net/core/dev.c:6963 handle_softirqs+0x1ce/0x800 kernel/softirq.c:554 __do_softirq+0x14/0x1a kernel/softirq.c:588
Uninit was stored to memory at:
nf_reject_ip6_tcphdr_put+0x2ca/0x6c0 net/ipv6/netfilter/nf_reject_ipv6.c:231 nf_send_reset6+0xd84/0x15b0 net/ipv6/netfilter/nf_reject_ipv6.c:344 nft_reject_inet_eval+0x3c1/0x880 net/netfilter/nft_reject_inet.c:48 expr_call_ops_eval net/netfilter/nf_tables_core.c:240 [inline] nft_do_chain+0x438/0x22a0 net/netfilter/nf_tables_core.c:288 nft_do_chain_inet+0x41a/0x4f0 net/netfilter/nft_chain_filter.c:161 nf_hook_entry_hookfn include/linux/netfilter.h:154 [inline] nf_hook_slow+0xf4/0x400 net/netfilter/core.c:626 nf_hook include/linux/netfilter.h:269 [inline] NF_HOOK include/linux/netfilter.h:312 [inline] ipv6_rcv+0x29b/0x390 net/ipv6/ip6_input.c:310 __netif_receive_skb_one_core net/core/dev.c:5661 [inline] __netif_receive_skb+0x1da/0xa00 net/core/dev.c:5775 process_backlog+0x4ad/0xa50 net/core/dev.c:6108 __napi_poll+0xe7/0x980 net/core/dev.c:6772 napi_poll net/core/dev.c:6841 [inline] net_rx_action+0xa5a/0x19b0 net/core/dev.c:6963 handle_softirqs+0x1ce/0x800 kernel/softirq.c:554 __do_softirq+0x14/0x1a kernel/softirq.c:588
Uninit was created at:
slab_post_alloc_hook mm/slub.c:3998 [inline] slab_alloc_node mm/slub.c:4041 [inline] kmem_cache_alloc_node_noprof+0x6bf/0xb80 mm/slub.c:4084 kmalloc_reserve+0x13d/0x4a0 net/core/skbuff.c:583 __alloc_skb+0x363/0x7b0 net/core/skbuff.c:674 alloc_skb include/linux/skbuff.h:1320 [inline] nf_send_reset6+0x98d/0x15b0 net/ipv6/netfilter/nf_reject_ipv6.c:327 nft_reject_inet_eval+0x3c1/0x880 net/netfilter/nft_reject_inet.c:48 expr_call_ops_eval net/netfilter/nf_tables_core.c:240 [inline] nft_do_chain+0x438/0x22a0 net/netfilter/nf_tables_core.c:288 nft_do_chain_inet+0x41a/0x4f0 net/netfilter/nft_chain_filter.c:161 nf_hook_entry_hookfn include/linux/netfilter.h:154 [inline] nf_hook_slow+0xf4/0x400 net/netfilter/core.c:626 nf_hook include/linux/netfilter.h:269 [inline] NF_HOOK include/linux/netfilter.h:312 [inline] ipv6_rcv+0x29b/0x390 net/ipv6/ip6_input.c:310 __netif_receive_skb_one_core net/core/dev.c:5661 [inline] __netif_receive_skb+0x1da/0xa00 net/core/dev.c:5775 process_backlog+0x4ad/0xa50 net/core/dev.c:6108 __napi_poll+0xe7/0x980 net/core/dev.c:6772 napi_poll net/core/dev.c:6841 [inline] net_rx_action+0xa5a/0x19b0 net/core/dev.c:6963 handle_softirqs+0x1ce/0x800 kernel/softirq.c:554 __do_softirq+0x14/0x1a kernel/softirq.c:588
--- net/ipv6/netfilter/nf_reject_ipv6.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-)
net/ipv6/netfilter/nf_reject_ipv6.c +2 -12
@@ -223,33 +223,23 @@ void nf_reject_ip6_tcphdr_put(struct sk_buff *nskb, const struct tcphdr *oth, unsigned int otcplen) { struct tcphdr *tcph; -int needs_ack;skb_reset_transport_header (nskb); - tcph =skb_put (nskb,sizeof (struct tcphdr )); + tcph =skb_put_zero (nskb,sizeof (struct tcphdr ));/* Truncate to length (no data) */ tcph->doff =sizeof (struct tcphdr )/4 ; tcph->source = oth->dest; tcph->dest = oth->source;if (oth->ack) { - needs_ack =0 ; tcph->seq = oth->ack_seq; - tcph->ack_seq =0 ; }else { - needs_ack =1 ; tcph->ack_seq =htonl (ntohl (oth->seq) + oth->syn + oth->fin + otcplen - (oth->doff<<2 )); - tcph->seq =0 ; + tcph->ack =1 ; } -/* Reset flags */ - ((u_int8_t *)tcph)[13 ] =0 ; tcph->rst =1 ; - tcph->ack = needs_ack; - tcph->window =0 ; - tcph->urg_ptr =0 ; - tcph->check =0 ;/* Adjust TCP checksum */ tcph->check = csum_ipv6_magic(&ipv6_hdr(nskb)->saddr,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 479/695 net: seeq: Fix use after free vulnerability in ether3 Driver Due to Race Condition
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kaixin Wang <[email protected]>
[ Upstream commit b5109b60ee4fcb2f2bb24f589575e10cc5283ad4 ]
In the ether3_probe function, a timer is initialized with a callback function ether3_ledoff, bound to &prev(dev)->timer. Once the timer is started, there is a risk of a race condition if the module or device is removed, triggering the ether3_remove function to perform cleanup. The sequence of operations that may lead to a UAF bug is as follows:
CPU0 CPU1
| ether3_ledoff
ether3_remove |
free_netdev(dev); |
put_devic |
kfree(dev); |
| ether3_outw(priv(dev)->regs.config2 |= CFG2_CTRLO, REG_CONFIG2);
| // use devFix it by ensuring that the timer is canceled before proceeding with the cleanup in ether3_remove.
--- drivers/net/ethernet/seeq/ether3.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/seeq/ether3.c +2 -0
@@ -847,9 +847,11 @@ static void ether3_remove(struct expansion_card *ec) {struct net_device *dev =ecard_get_drvdata (ec); +ether3_outw (priv (dev)->regs.config2 |=CFG2_CTRLO ,REG_CONFIG2 );ecard_set_drvdata (ec,NULL );unregister_netdev (dev); +del_timer_sync (&priv (dev)->timer);free_netdev (dev);ecard_release_resources (ec); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 480/695 net: ipv6: select DST_CACHE from IPV6_RPL_LWTUNNEL
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Weißschuh <[email protected]>
[ Upstream commit 93c21077bb9ba08807c459982d440dbbee4c7af3 ]
The rpl sr tunnel code contains calls to dst_cache_*() which are only present when the dst cache is built.
Select DST_CACHE to build the dst cache, similar to other kconfig options in the same file.
Compiling the rpl sr tunnel without DST_CACHE will lead to linker errors.
--- net/ipv6/Kconfig | 1 + 1 file changed, 1 insertion(+)
net/ipv6/Kconfig +1 -0
@@ -323,6 +323,7 @@ config IPV6_RPL_LWTUNNEL bool "IPv6: RPL Source Routing Header support" depends on IPV6 select LWTUNNEL + select DST_CACHE help Support for RFC6554 RPL Source Routing Header using the lightweight tunnels mechanism.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 481/695 tcp: check skb is non-NULL in tcp_rto_delta_us()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josh Hunt <[email protected]>
[ Upstream commit c8770db2d54437a5f49417ae7b46f7de23d14db6 ]
We have some machines running stock Ubuntu 20.04.6 which is their 5.4.0-174-generic kernel that are running ceph and recently hit a null ptr dereference in tcp_rearm_rto(). Initially hitting it from the TLP path, but then later we also saw it getting hit from the RACK case as well. Here are examples of the oops messages we saw in each of those cases:
Jul 26 15:05:02 rx [11061395.780353] BUG: kernel NULL pointer dereference, address: 0000000000000020 Jul 26 15:05:02 rx [11061395.787572] #PF: supervisor read access in kernel mode Jul 26 15:05:02 rx [11061395.792971] #PF: error_code(0x0000) - not-present page Jul 26 15:05:02 rx [11061395.798362] PGD 0 P4D 0 Jul 26 15:05:02 rx [11061395.801164] Oops: 0000 [#1] SMP NOPTI Jul 26 15:05:02 rx [11061395.805091] CPU: 0 PID: 9180 Comm: msgr-worker-1 Tainted: G W 5.4.0-174-generic #193-Ubuntu Jul 26 15:05:02 rx [11061395.814996] Hardware name: Supermicro SMC 2x26 os-gen8 64C NVME-Y 256G/H12SSW-NTR, BIOS 2.5.V1.2U.NVMe.UEFI 05/09/2023 Jul 26 15:05:02 rx [11061395.825952] RIP: 0010:tcp_rearm_rto+0xe4/0x160 Jul 26 15:05:02 rx [11061395.830656] Code: 87 ca 04 00 00 00 5b 41 5c 41 5d 5d c3 c3 49 8b bc 24 40 06 00 00 eb 8d 48 bb cf f7 53 e3 a5 9b c4 20 4c 89 ef e8 0c fe 0e 00 <48> 8b 78 20 48 c1 ef 03 48 89 f8 41 8b bc 24 80 04 00 00 48 f7 e3 Jul 26 15:05:02 rx [11061395.849665] RSP: 0018:ffffb75d40003e08 EFLAGS: 00010246 Jul 26 15:05:02 rx [11061395.855149] RAX: 0000000000000000 RBX: 20c49ba5e353f7cf RCX: 0000000000000000 Jul 26 15:05:02 rx [11061395.862542] RDX: 0000000062177c30 RSI: 000000000000231c RDI: ffff9874ad283a60 Jul 26 15:05:02 rx [11061395.869933] RBP: ffffb75d40003e20 R08: 0000000000000000 R09: ffff987605e20aa8 Jul 26 15:05:02 rx [11061395.877318] R10: ffffb75d40003f00 R11: ffffb75d4460f740 R12: ffff9874ad283900 Jul 26 15:05:02 rx [11061395.884710] R13: ffff9874ad283a60 R14: ffff9874ad283980 R15: ffff9874ad283d30 Jul 26 15:05:02 rx [11061395.892095] FS: 00007f1ef4a2e700(0000) GS:ffff987605e00000(0000) knlGS:0000000000000000 Jul 26 15:05:02 rx [11061395.900438] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 Jul 26 15:05:02 rx [11061395.906435] CR2: 0000000000000020 CR3: 0000003e450ba003 CR4: 0000000000760ef0 Jul 26 15:05:02 rx [11061395.913822] PKRU: 55555554 Jul 26 15:05:02 rx [11061395.916786] Call Trace: Jul 26 15:05:02 rx [11061395.919488] Jul 26 15:05:02 rx [11061395.921765] ? show_regs.cold+0x1a/0x1f Jul 26 15:05:02 rx [11061395.925859] ? __die+0x90/0xd9 Jul 26 15:05:02 rx [11061395.929169] ? no_context+0x196/0x380 Jul 26 15:05:02 rx [11061395.933088] ? ip6_protocol_deliver_rcu+0x4e0/0x4e0 Jul 26 15:05:02 rx [11061395.938216] ? ip6_sublist_rcv_finish+0x3d/0x50 Jul 26 15:05:02 rx [11061395.943000] ? __bad_area_nosemaphore+0x50/0x1a0 Jul 26 15:05:02 rx [11061395.947873] ? bad_area_nosemaphore+0x16/0x20 Jul 26 15:05:02 rx [11061395.952486] ? do_user_addr_fault+0x267/0x450 Jul 26 15:05:02 rx [11061395.957104] ? ipv6_list_rcv+0x112/0x140 Jul 26 15:05:02 rx [11061395.961279] ? __do_page_fault+0x58/0x90 Jul 26 15:05:02 rx [11061395.965458] ? do_page_fault+0x2c/0xe0 Jul 26 15:05:02 rx [11061395.969465] ? page_fault+0x34/0x40 Jul 26 15:05:02 rx [11061395.973217] ? tcp_rearm_rto+0xe4/0x160 Jul 26 15:05:02 rx [11061395.977313] ? tcp_rearm_rto+0xe4/0x160 Jul 26 15:05:02 rx [11061395.981408] tcp_send_loss_probe+0x10b/0x220 Jul 26 15:05:02 rx [11061395.985937] tcp_write_timer_handler+0x1b4/0x240 Jul 26 15:05:02 rx [11061395.990809] tcp_write_timer+0x9e/0xe0 Jul 26 15:05:02 rx [11061395.994814] ? tcp_write_timer_handler+0x240/0x240 Jul 26 15:05:02 rx [11061395.999866] call_timer_fn+0x32/0x130 Jul 26 15:05:02 rx [11061396.003782] __run_timers.part.0+0x180/0x280 Jul 26 15:05:02 rx [11061396.008309] ? recalibrate_cpu_khz+0x10/0x10 Jul 26 15:05:02 rx [11061396.012841] ? native_x2apic_icr_write+0x30/0x30 Jul 26 15:05:02 rx [11061396.017718] ? lapic_next_event+0x21/0x30 Jul 26 15:05:02 rx [11061396.021984] ? clockevents_program_event+0x8f/0xe0 Jul 26 15:05:02 rx [11061396.027035] run_timer_softirq+0x2a/0x50 Jul 26 15:05:02 rx [11061396.031212] __do_softirq+0xd1/0x2c1 Jul 26 15:05:02 rx [11061396.035044] do_softirq_own_stack+0x2a/0x40 Jul 26 15:05:02 rx [11061396.039480] Jul 26 15:05:02 rx [11061396.041840] do_softirq.part.0+0x46/0x50 Jul 26 15:05:02 rx [11061396.046022] __local_bh_enable_ip+0x50/0x60 Jul 26 15:05:02 rx [11061396.050460] _raw_spin_unlock_bh+0x1e/0x20 Jul 26 15:05:02 rx [11061396.054817] nf_conntrack_tcp_packet+0x29e/0xbe0 [nf_conntrack] Jul 26 15:05:02 rx [11061396.060994] ? get_l4proto+0xe7/0x190 [nf_conntrack] Jul 26 15:05:02 rx [11061396.066220] nf_conntrack_in+0xe9/0x670 [nf_conntrack] Jul 26 15:05:02 rx [11061396.071618] ipv6_conntrack_local+0x14/0x20 [nf_conntrack] Jul 26 15:05:02 rx [11061396.077356] nf_hook_slow+0x45/0xb0 Jul 26 15:05:02 rx [11061396.081098] ip6_xmit+0x3f0/0x5d0 Jul 26 15:05:02 rx [11061396.084670] ? ipv6_anycast_cleanup+0x50/0x50 Jul 26 15:05:02 rx [11061396.089282] ? __sk_dst_check+0x38/0x70 Jul 26 15:05:02 rx [11061396.093381] ? inet6_csk_route_socket+0x13b/0x200 Jul 26 15:05:02 rx [11061396.098346] inet6_csk_xmit+0xa7/0xf0 Jul 26 15:05:02 rx [11061396.102263] __tcp_transmit_skb+0x550/0xb30 Jul 26 15:05:02 rx [11061396.106701] tcp_write_xmit+0x3c6/0xc20 Jul 26 15:05:02 rx [11061396.110792] ? __alloc_skb+0x98/0x1d0 Jul 26 15:05:02 rx [11061396.114708] __tcp_push_pending_frames+0x37/0x100 Jul 26 15:05:02 rx [11061396.119667] tcp_push+0xfd/0x100 Jul 26 15:05:02 rx [11061396.123150] tcp_sendmsg_locked+0xc70/0xdd0 Jul 26 15:05:02 rx [11061396.127588] tcp_sendmsg+0x2d/0x50 Jul 26 15:05:02 rx [11061396.131245] inet6_sendmsg+0x43/0x70 Jul 26 15:05:02 rx [11061396.135075] __sock_sendmsg+0x48/0x70 Jul 26 15:05:02 rx [11061396.138994] ____sys_sendmsg+0x212/0x280 Jul 26 15:05:02 rx [11061396.143172] ___sys_sendmsg+0x88/0xd0 Jul 26 15:05:02 rx [11061396.147098] ? __seccomp_filter+0x7e/0x6b0 Jul 26 15:05:02 rx [11061396.151446] ? __switch_to+0x39c/0x460 Jul 26 15:05:02 rx [11061396.155453] ? __switch_to_asm+0x42/0x80 Jul 26 15:05:02 rx [11061396.159636] ? __switch_to_asm+0x5a/0x80 Jul 26 15:05:02 rx [11061396.163816] __sys_sendmsg+0x5c/0xa0 Jul 26 15:05:02 rx [11061396.167647] __x64_sys_sendmsg+0x1f/0x30 Jul 26 15:05:02 rx [11061396.171832] do_syscall_64+0x57/0x190 Jul 26 15:05:02 rx [11061396.175748] entry_SYSCALL_64_after_hwframe+0x5c/0xc1 Jul 26 15:05:02 rx [11061396.181055] RIP: 0033:0x7f1ef692618d Jul 26 15:05:02 rx [11061396.184893] Code: 28 89 54 24 1c 48 89 74 24 10 89 7c 24 08 e8 ca ee ff ff 8b 54 24 1c 48 8b 74 24 10 41 89 c0 8b 7c 24 08 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 2f 44 89 c7 48 89 44 24 08 e8 fe ee ff ff 48 Jul 26 15:05:02 rx [11061396.203889] RSP: 002b:00007f1ef4a26aa0 EFLAGS: 00000293 ORIG_RAX: 000000000000002e Jul 26 15:05:02 rx [11061396.211708] RAX: ffffffffffffffda RBX: 000000000000084b RCX: 00007f1ef692618d Jul 26 15:05:02 rx [11061396.219091] RDX: 0000000000004000 RSI: 00007f1ef4a26b10 RDI: 0000000000000275 Jul 26 15:05:02 rx [11061396.226475] RBP: 0000000000004000 R08: 0000000000000000 R09: 0000000000000020 Jul 26 15:05:02 rx [11061396.233859] R10: 0000000000000000 R11: 0000000000000293 R12: 000000000000084b Jul 26 15:05:02 rx [11061396.241243] R13: 00007f1ef4a26b10 R14: 0000000000000275 R15: 000055592030f1e8 Jul 26 15:05:02 rx [11061396.248628] Modules linked in: vrf bridge stp llc vxlan ip6_udp_tunnel udp_tunnel nls_iso8859_1 amd64_edac_mod edac_mce_amd kvm_amd kvm crct10dif_pclmul ghash_clmulni_intel aesni_intel crypto_simd cryptd glue_helper wmi_bmof ipmi_ssif input_leds joydev rndis_host cdc_ether usbnet mii ast drm_vram_helper ttm drm_kms_helper i2c_algo_bit fb_sys_fops syscopyarea sysfillrect sysimgblt ccp mac_hid ipmi_si ipmi_devintf ipmi_msghandler nft_ct sch_fq_codel nf_tables_set nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nf_tables nfnetlink ramoops reed_solomon efi_pstore drm ip_tables x_tables autofs4 raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx xor raid6_pq libcrc32c raid0 multipath linear mlx5_ib ib_uverbs ib_core raid1 mlx5_core hid_generic pci_hyperv_intf crc32_pclmul tls usbhid ahci mlxfw bnxt_en libahci hid nvme i2c_piix4 nvme_core wmi Jul 26 15:05:02 rx [11061396.324334] CR2: 0000000000000020 Jul 26 15:05:02 rx [11061396.327944] ---[ end trace 68a2b679d1cfb4f1 ]--- Jul 26 15:05:02 rx [11061396.433435] RIP: 0010:tcp_rearm_rto+0xe4/0x160 Jul 26 15:05:02 rx [11061396.438137] Code: 87 ca 04 00 00 00 5b 41 5c 41 5d 5d c3 c3 49 8b bc 24 40 06 00 00 eb 8d 48 bb cf f7 53 e3 a5 9b c4 20 4c 89 ef e8 0c fe 0e 00 <48> 8b 78 20 48 c1 ef 03 48 89 f8 41 8b bc 24 80 04 00 00 48 f7 e3 Jul 26 15:05:02 rx [11061396.457144] RSP: 0018:ffffb75d40003e08 EFLAGS: 00010246 Jul 26 15:05:02 rx [11061396.462629] RAX: 0000000000000000 RBX: 20c49ba5e353f7cf RCX: 0000000000000000 Jul 26 15:05:02 rx [11061396.470012] RDX: 0000000062177c30 RSI: 000000000000231c RDI: ffff9874ad283a60 Jul 26 15:05:02 rx [11061396.477396] RBP: ffffb75d40003e20 R08: 0000000000000000 R09: ffff987605e20aa8 Jul 26 15:05:02 rx [11061396.484779] R10: ffffb75d40003f00 R11: ffffb75d4460f740 R12: ffff9874ad283900 Jul 26 15:05:02 rx [11061396.492164] R13: ffff9874ad283a60 R14: ffff9874ad283980 R15: ffff9874ad283d30 Jul 26 15:05:02 rx [11061396.499547] FS: 00007f1ef4a2e700(0000) GS:ffff987605e00000(0000) knlGS:0000000000000000 Jul 26 15:05:02 rx [11061396.507886] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 Jul 26 15:05:02 rx [11061396.513884] CR2: 0000000000000020 CR3: 0000003e450ba003 CR4: 0000000000760ef0 Jul 26 15:05:02 rx [11061396.521267] PKRU: 55555554 Jul 26 15:05:02 rx [11061396.524230] Kernel panic - not syncing: Fatal exception in interrupt Jul 26 15:05:02 rx [11061396.530885] Kernel Offset: 0x1b200000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff) Jul 26 15:05:03 rx [11061396.660181] ---[ end Kernel panic - not syncing: Fatal exception in interrupt ]---
After we hit this we disabled TLP by setting tcp_early_retrans to 0 and then hit the crash in the RACK case:
Aug 7 07:26:16 rx [1006006.265582] BUG: kernel NULL pointer dereference, address: 0000000000000020
Aug 7 07:26:16 rx [1006006.272719] #PF: supervisor read access in kernel mode
Aug 7 07:26:16 rx [1006006.278030] #PF: error_code(0x0000) - not-present page
Aug 7 07:26:16 rx [1006006.283343] PGD 0 P4D 0
Aug 7 07:26:16 rx [1006006.286057] Oops: 0000 [#1] SMP NOPTI
Aug 7 07:26:16 rx [1006006.289896] CPU: 5 PID: 0 Comm: swapper/5 Tainted: G W 5.4.0-174-generic #193-Ubuntu
Aug 7 07:26:16 rx [1006006.299107] Hardware name: Supermicro SMC 2x26 os-gen8 64C NVME-Y 256G/H12SSW-NTR, BIOS 2.5.V1.2U.NVMe.UEFI 05/09/2023
Aug 7 07:26:16 rx [1006006.309970] RIP: 0010:tcp_rearm_rto+0xe4/0x160
Aug 7 07:26:16 rx [1006006.314584] Code: 87 ca 04 00 00 00 5b 41 5c 41 5d 5d c3 c3 49 8b bc 24 40 06 00 00 eb 8d 48 bb cf f7 53 e3 a5 9b c4 20 4c 89 ef e8 0c fe 0e 00 <48> 8b 78 20 48 c1 ef 03 48 89 f8 41 8b bc 24 80 04 00 00 48 f7 e3
Aug 7 07:26:16 rx [1006006.333499] RSP: 0018:ffffb42600a50960 EFLAGS: 00010246
Aug 7 07:26:16 rx [1006006.338895] RAX: 0000000000000000 RBX: 20c49ba5e353f7cf RCX: 0000000000000000
Aug 7 07:26:16 rx [1006006.346193] RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff92d687ed8160
Aug 7 07:26:16 rx [1006006.353489] RBP: ffffb42600a50978 R08: 0000000000000000 R09: 00000000cd896dcc
Aug 7 07:26:16 rx [1006006.360786] R10: ffff92dc3404f400 R11: 0000000000000001 R12: ffff92d687ed8000
Aug 7 07:26:16 rx [1006006.368084] R13: ffff92d687ed8160 R14: 00000000cd896dcc R15: 00000000cd8fca81
Aug 7 07:26:16 rx [1006006.375381] FS: 0000000000000000(0000) GS:ffff93158ad40000(0000) knlGS:0000000000000000
Aug 7 07:26:16 rx [1006006.383632] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
Aug 7 07:26:16 rx [1006006.389544] CR2: 0000000000000020 CR3: 0000003e775ce006 CR4: 0000000000760ee0
Aug 7 07:26:16 rx [1006006.396839] PKRU: 55555554
Aug 7 07:26:16 rx [1006006.399717] Call Trace:
Aug 7 07:26:16 rx [1006006.402335]
Aug 7 07:26:16 rx [1006006.404525] ? show_regs.cold+0x1a/0x1f
Aug 7 07:26:16 rx [1006006.408532] ? __die+0x90/0xd9
Aug 7 07:26:16 rx [1006006.411760] ? no_context+0x196/0x380
Aug 7 07:26:16 rx [1006006.415599] ? __bad_area_nosemaphore+0x50/0x1a0
Aug 7 07:26:16 rx [1006006.420392] ? _raw_spin_lock+0x1e/0x30
Aug 7 07:26:16 rx [1006006.424401] ? bad_area_nosemaphore+0x16/0x20
Aug 7 07:26:16 rx [1006006.428927] ? do_user_addr_fault+0x267/0x450
Aug 7 07:26:16 rx [1006006.433450] ? __do_page_fault+0x58/0x90
Aug 7 07:26:16 rx [1006006.437542] ? do_page_fault+0x2c/0xe0
Aug 7 07:26:16 rx [1006006.441470] ? page_fault+0x34/0x40
Aug 7 07:26:16 rx [1006006.445134] ? tcp_rearm_rto+0xe4/0x160
Aug 7 07:26:16 rx [1006006.449145] tcp_ack+0xa32/0xb30
Aug 7 07:26:16 rx [1006006.452542] tcp_rcv_established+0x13c/0x670
Aug 7 07:26:16 rx [1006006.456981] ? sk_filter_trim_cap+0x48/0x220
Aug 7 07:26:16 rx [1006006.461419] tcp_v6_do_rcv+0xdb/0x450
Aug 7 07:26:16 rx [1006006.465257] tcp_v6_rcv+0xc2b/0xd10
Aug 7 07:26:16 rx [1006006.468918] ip6_protocol_deliver_rcu+0xd3/0x4e0
Aug 7 07:26:16 rx [1006006.473706] ip6_input_finish+0x15/0x20
Aug 7 07:26:16 rx [1006006.477710] ip6_input+0xa2/0xb0
Aug 7 07:26:16 rx [1006006.481109] ? ip6_protocol_deliver_rcu+0x4e0/0x4e0
Aug 7 07:26:16 rx [1006006.486151] ip6_sublist_rcv_finish+0x3d/0x50
Aug 7 07:26:16 rx [1006006.490679] ip6_sublist_rcv+0x1aa/0x250
Aug 7 07:26:16 rx [1006006.494779] ? ip6_rcv_finish_core.isra.0+0xa0/0xa0
Aug 7 07:26:16 rx [1006006.499828] ipv6_list_rcv+0x112/0x140
Aug 7 07:26:16 rx [1006006.503748] __netif_receive_skb_list_core+0x1a4/0x250
Aug 7 07:26:16 rx [1006006.509057] netif_receive_skb_list_internal+0x1a1/0x2b0
Aug 7 07:26:16 rx [1006006.514538] gro_normal_list.part.0+0x1e/0x40
Aug 7 07:26:16 rx [1006006.519068] napi_complete_done+0x91/0x130
Aug 7 07:26:16 rx [1006006.523352] mlx5e_napi_poll+0x18e/0x610 [mlx5_core]
Aug 7 07:26:16 rx [1006006.528481] net_rx_action+0x142/0x390
Aug 7 07:26:16 rx [1006006.532398] __do_softirq+0xd1/0x2c1
Aug 7 07:26:16 rx [1006006.536142] irq_exit+0xae/0xb0
Aug 7 07:26:16 rx [1006006.539452] do_IRQ+0x5a/0xf0
Aug 7 07:26:16 rx [1006006.542590] common_interrupt+0xf/0xf
Aug 7 07:26:16 rx [1006006.546421]
Aug 7 07:26:16 rx [1006006.548695] RIP: 0010:native_safe_halt+0xe/0x10
Aug 7 07:26:16 rx [1006006.553399] Code: 7b ff ff ff eb bd 90 90 90 90 90 90 e9 07 00 00 00 0f 00 2d 36 2c 50 00 f4 c3 66 90 e9 07 00 00 00 0f 00 2d 26 2c 50 00 fb f4 90 0f 1f 44 00 00 55 48 89 e5 41 55 41 54 53 e8 dd 5e 61 ff 65
Aug 7 07:26:16 rx [1006006.572309] RSP: 0018:ffffb42600177e70 EFLAGS: 00000246 ORIG_RAX: ffffffffffffffc2
Aug 7 07:26:16 rx [1006006.580040] RAX: ffffffff8ed08b20 RBX: 0000000000000005 RCX: 0000000000000001
Aug 7 07:26:16 rx [1006006.587337] RDX: 00000000f48eeca2 RSI: 0000000000000082 RDI: 0000000000000082
Aug 7 07:26:16 rx [1006006.594635] RBP: ffffb42600177e90 R08: 0000000000000000 R09: 000000000000020f
Aug 7 07:26:16 rx [1006006.601931] R10: 0000000000100000 R11: 0000000000000000 R12: 0000000000000005
Aug 7 07:26:16 rx [1006006.609229] R13: ffff93157deb5f00 R14: 0000000000000000 R15: 0000000000000000
Aug 7 07:26:16 rx [1006006.616530] ? __cpuidle_text_start+0x8/0x8
Aug 7 07:26:16 rx [1006006.620886] ? default_idle+0x20/0x140
Aug 7 07:26:16 rx [1006006.624804] arch_cpu_idle+0x15/0x20
Aug 7 07:26:16 rx [1006006.628545] default_idle_call+0x23/0x30
Aug 7 07:26:16 rx [1006006.632640] do_idle+0x1fb/0x270
Aug 7 07:26:16 rx [1006006.636035] cpu_startup_entry+0x20/0x30
Aug 7 07:26:16 rx [1006006.640126] start_secondary+0x178/0x1d0
Aug 7 07:26:16 rx [1006006.644218] secondary_startup_64+0xa4/0xb0
Aug 7 07:26:17 rx [1006006.648568] Modules linked in: vrf bridge stp llc vxlan ip6_udp_tunnel udp_tunnel nls_iso8859_1 nft_ct amd64_edac_mod edac_mce_amd kvm_amd kvm crct10dif_pclmul ghash_clmulni_intel aesni_intel crypto_simd cryptd glue_helper wmi_bmof ipmi_ssif input_leds joydev rndis_host cdc_ether usbnet ast mii drm_vram_helper ttm drm_kms_helper i2c_algo_bit fb_sys_fops syscopyarea sysfillrect sysimgblt ccp mac_hid ipmi_si ipmi_devintf ipmi_msghandler sch_fq_codel nf_tables_set nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nf_tables nfnetlink ramoops reed_solomon efi_pstore drm ip_tables x_tables autofs4 raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx xor raid6_pq libcrc32c raid0 multipath linear mlx5_ib ib_uverbs ib_core raid1 hid_generic mlx5_core pci_hyperv_intf crc32_pclmul usbhid ahci tls mlxfw bnxt_en hid libahci nvme i2c_piix4 nvme_core wmi [last unloaded: cpuid] Aug 7 07:26:17 rx [1006006.726180] CR2: 0000000000000020
Aug 7 07:26:17 rx [1006006.729718] ---[ end trace e0e2e37e4e612984 ]---
Prior to seeing the first crash and on other machines we also see the warning in tcp_send_loss_probe() where packets_out is non-zero, but both transmit and retrans queues are empty so we know the box is seeing some accounting issue in this area:
Jul 26 09:15:27 kernel: ------------[ cut here ]------------ Jul 26 09:15:27 kernel: invalid inflight: 2 state 1 cwnd 68 mss 8988 Jul 26 09:15:27 kernel: WARNING: CPU: 16 PID: 0 at net/ipv4/tcp_output.c:2605 tcp_send_loss_probe+0x214/0x220 Jul 26 09:15:27 kernel: Modules linked in: vrf bridge stp llc vxlan ip6_udp_tunnel udp_tunnel nls_iso8859_1 nft_ct amd64_edac_mod edac_mce_amd kvm_amd kvm crct10dif_pclmul ghash_clmulni_intel aesni_intel crypto_simd cryptd glue_helper wmi_bmof ipmi_ssif joydev input_leds rndis_host cdc_ether usbnet mii ast drm_vram_helper ttm drm_kms_he> Jul 26 09:15:27 kernel: CPU: 16 PID: 0 Comm: swapper/16 Not tainted 5.4.0-174-generic #193-Ubuntu Jul 26 09:15:27 kernel: Hardware name: Supermicro SMC 2x26 os-gen8 64C NVME-Y 256G/H12SSW-NTR, BIOS 2.5.V1.2U.NVMe.UEFI 05/09/2023 Jul 26 09:15:27 kernel: RIP: 0010:tcp_send_loss_probe+0x214/0x220 Jul 26 09:15:27 kernel: Code: 08 26 01 00 75 e2 41 0f b6 54 24 12 41 8b 8c 24 c0 06 00 00 45 89 f0 48 c7 c7 e0 b4 20 a7 c6 05 8d 08 26 01 01 e8 4a c0 0f 00 <0f> 0b eb ba 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 89 e5 41 Jul 26 09:15:27 kernel: RSP: 0018:ffffb7838088ce00 EFLAGS: 00010286 Jul 26 09:15:27 kernel: RAX: 0000000000000000 RBX: ffff9b84b5630430 RCX: 0000000000000006 Jul 26 09:15:27 kernel: RDX: 0000000000000007 RSI: 0000000000000096 RDI: ffff9b8e4621c8c0 Jul 26 09:15:27 kernel: RBP: ffffb7838088ce18 R08: 0000000000000927 R09: 0000000000000004 Jul 26 09:15:27 kernel: R10: 0000000000000000 R11: 0000000000000001 R12: ffff9b84b5630000 Jul 26 09:15:27 kernel: R13: 0000000000000000 R14: 000000000000231c R15: ffff9b84b5630430 Jul 26 09:15:27 kernel: FS: 0000000000000000(0000) GS:ffff9b8e46200000(0000) knlGS:0000000000000000 Jul 26 09:15:27 kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 Jul 26 09:15:27 kernel: CR2: 000056238cec2380 CR3: 0000003e49ede005 CR4: 0000000000760ee0 Jul 26 09:15:27 kernel: PKRU: 55555554 Jul 26 09:15:27 kernel: Call Trace: Jul 26 09:15:27 kernel: <IRQ> Jul 26 09:15:27 kernel: ? show_regs.cold+0x1a/0x1f Jul 26 09:15:27 kernel: ? __warn+0x98/0xe0 Jul 26 09:15:27 kernel: ? tcp_send_loss_probe+0x214/0x220 Jul 26 09:15:27 kernel: ? report_bug+0xd1/0x100 Jul 26 09:15:27 kernel: ? do_error_trap+0x9b/0xc0 Jul 26 09:15:27 kernel: ? do_invalid_op+0x3c/0x50 Jul 26 09:15:27 kernel: ? tcp_send_loss_probe+0x214/0x220 Jul 26 09:15:27 kernel: ? invalid_op+0x1e/0x30 Jul 26 09:15:27 kernel: ? tcp_send_loss_probe+0x214/0x220 Jul 26 09:15:27 kernel: tcp_write_timer_handler+0x1b4/0x240 Jul 26 09:15:27 kernel: tcp_write_timer+0x9e/0xe0 Jul 26 09:15:27 kernel: ? tcp_write_timer_handler+0x240/0x240 Jul 26 09:15:27 kernel: call_timer_fn+0x32/0x130 Jul 26 09:15:27 kernel: __run_timers.part.0+0x180/0x280 Jul 26 09:15:27 kernel: ? timerqueue_add+0x9b/0xb0 Jul 26 09:15:27 kernel: ? enqueue_hrtimer+0x3d/0x90 Jul 26 09:15:27 kernel: ? do_error_trap+0x9b/0xc0 Jul 26 09:15:27 kernel: ? do_invalid_op+0x3c/0x50 Jul 26 09:15:27 kernel: ? tcp_send_loss_probe+0x214/0x220 Jul 26 09:15:27 kernel: ? invalid_op+0x1e/0x30 Jul 26 09:15:27 kernel: ? tcp_send_loss_probe+0x214/0x220 Jul 26 09:15:27 kernel: tcp_write_timer_handler+0x1b4/0x240 Jul 26 09:15:27 kernel: tcp_write_timer+0x9e/0xe0 Jul 26 09:15:27 kernel: ? tcp_write_timer_handler+0x240/0x240 Jul 26 09:15:27 kernel: call_timer_fn+0x32/0x130 Jul 26 09:15:27 kernel: __run_timers.part.0+0x180/0x280 Jul 26 09:15:27 kernel: ? timerqueue_add+0x9b/0xb0 Jul 26 09:15:27 kernel: ? enqueue_hrtimer+0x3d/0x90 Jul 26 09:15:27 kernel: ? recalibrate_cpu_khz+0x10/0x10 Jul 26 09:15:27 kernel: ? ktime_get+0x3e/0xa0 Jul 26 09:15:27 kernel: ? native_x2apic_icr_write+0x30/0x30 Jul 26 09:15:27 kernel: run_timer_softirq+0x2a/0x50 Jul 26 09:15:27 kernel: __do_softirq+0xd1/0x2c1 Jul 26 09:15:27 kernel: irq_exit+0xae/0xb0 Jul 26 09:15:27 kernel: smp_apic_timer_interrupt+0x7b/0x140 Jul 26 09:15:27 kernel: apic_timer_interrupt+0xf/0x20 Jul 26 09:15:27 kernel: </IRQ> Jul 26 09:15:27 kernel: RIP: 0010:native_safe_halt+0xe/0x10 Jul 26 09:15:27 kernel: Code: 7b ff ff ff eb bd 90 90 90 90 90 90 e9 07 00 00 00 0f 00 2d 36 2c 50 00 f4 c3 66 90 e9 07 00 00 00 0f 00 2d 26 2c 50 00 fb f4 <c3> 90 0f 1f 44 00 00 55 48 89 e5 41 55 41 54 53 e8 dd 5e 61 ff 65 Jul 26 09:15:27 kernel: RSP: 0018:ffffb783801cfe70 EFLAGS: 00000246 ORIG_RAX: ffffffffffffff13 Jul 26 09:15:27 kernel: RAX: ffffffffa6908b20 RBX: 0000000000000010 RCX: 0000000000000001 Jul 26 09:15:27 kernel: RDX: 000000006fc0c97e RSI: 0000000000000082 RDI: 0000000000000082 Jul 26 09:15:27 kernel: RBP: ffffb783801cfe90 R08: 0000000000000000 R09: 0000000000000225 Jul 26 09:15:27 kernel: R10: 0000000000100000 R11: 0000000000000000 R12: 0000000000000010 Jul 26 09:15:27 kernel: R13: ffff9b8e390b0000 R14: 0000000000000000 R15: 0000000000000000 Jul 26 09:15:27 kernel: ? __cpuidle_text_start+0x8/0x8 Jul 26 09:15:27 kernel: ? default_idle+0x20/0x140 Jul 26 09:15:27 kernel: arch_cpu_idle+0x15/0x20 Jul 26 09:15:27 kernel: default_idle_call+0x23/0x30 Jul 26 09:15:27 kernel: do_idle+0x1fb/0x270 Jul 26 09:15:27 kernel: cpu_startup_entry+0x20/0x30 Jul 26 09:15:27 kernel: start_secondary+0x178/0x1d0 Jul 26 09:15:27 kernel: secondary_startup_64+0xa4/0xb0 Jul 26 09:15:27 kernel: ---[ end trace e7ac822987e33be1 ]---
The NULL ptr deref is coming from tcp_rto_delta_us() attempting to pull an skb off the head of the retransmit queue and then dereferencing that skb to get the skb_mstamp_ns value via tcp_skb_timestamp_us(skb).
The crash is the same one that was reported a # of years ago here:
https://lore.kernel.org/netdev/[email protected]/T/#t
and the kernel we're running has the fix which was added to resolve this issue.
Unfortunately we've been unsuccessful so far in reproducing this problem in the lab and do not have the luxury of pushing out a new kernel to try and test if newer kernels resolve this issue at the moment. I realize this is a report against both an Ubuntu kernel and also an older 5.4 kernel. I have reported this issue to Ubuntu here: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2077657
however I feel like since this issue has possibly cropped up again it makes sense to build in some protection in this path (even on the latest kernel versions) since the code in question just blindly assumes there's a valid skb without testing if it's NULL b/f it looks at the timestamp.
Given we have seen crashes in this path before and now this case it seems like we should protect ourselves for when packets_out accounting is incorrect. While we should fix that root cause we should also just make sure the skb is not NULL before dereferencing it. Also add a warn once here to capture some information if/when the problem case is hit again.
--- include/net/tcp.h | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
include/net/tcp.h +19 -2
@@ -2434,9 +2434,26 @@ static inline s64 tcp_rto_delta_us(const struct sock *sk) {const struct sk_buff *skb =tcp_rtx_queue_head (sk);u32 rto =inet_csk (sk)->icsk_rto; -u64 rto_time_stamp_us =tcp_skb_timestamp_us (skb) +jiffies_to_usecs (rto); -return rto_time_stamp_us -tcp_sk (sk)->tcp_mstamp; +if (likely (skb)) { +u64 rto_time_stamp_us =tcp_skb_timestamp_us (skb) +jiffies_to_usecs (rto); + +return rto_time_stamp_us -tcp_sk (sk)->tcp_mstamp; + }else { +WARN_ONCE (1 , +"rtx queue emtpy: " +"out:%u sacked:%u lost:%u retrans:%u " +"tlp_high_seq:%u sk_state:%u ca_state:%u " +"advmss:%u mss_cache:%u pmtu:%u\n" , +tcp_sk (sk)->packets_out,tcp_sk (sk)->sacked_out, +tcp_sk (sk)->lost_out,tcp_sk (sk)->retrans_out, +tcp_sk (sk)->tlp_high_seq, sk->sk_state, +inet_csk (sk)->icsk_ca_state, +tcp_sk (sk)->advmss,tcp_sk (sk)->mss_cache, +inet_csk (sk)->icsk_pmtu_cookie); +return jiffies_to_usecs (rto); + } + }/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 482/695 net: qrtr: Update packets cloning when broadcasting
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Youssef Samir <[email protected]>
[ Upstream commit f011b313e8ebd5b7abd8521b5119aecef403de45 ]
When broadcasting data to multiple nodes via MHI, using skb_clone() causes all nodes to receive the same header data. This can result in packets being discarded by endpoints, leading to lost data.
This issue occurs when a socket is closed, and a QRTR_TYPE_DEL_CLIENT packet is broadcasted. All nodes receive the same destination node ID, causing the node connected to the client to discard the packet and remain unaware of the client's deletion.
Replace skb_clone() with pskb_copy(), to create a separate copy of the header for each sk_buff.
--- net/qrtr/af_qrtr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/qrtr/af_qrtr.c +1 -1
@@ -884,7 +884,7 @@ static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,mutex_lock (&qrtr_node_lock);list_for_each_entry (node, &qrtr_all_nodes, item) { - skbn =skb_clone (skb,GFP_KERNEL ); + skbn =pskb_copy (skb,GFP_KERNEL );if (!skbn)break ;skb_set_owner_w (skbn, skb->sk);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 483/695 net: phy: aquantia: fix setting active_low bit
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Golle <[email protected]>
[ Upstream commit d2b366c43443a21d9bcf047f3ee1f09cf9792dc4 ]
phy_modify_mmd was used wrongly in aqr_phy_led_active_low_set() resulting in a no-op instead of setting the VEND1_GLOBAL_LED_DRIVE_VDD bit. Correctly set VEND1_GLOBAL_LED_DRIVE_VDD bit.
--- drivers/net/phy/aquantia/aquantia_leds.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/phy/aquantia/aquantia_leds.c +2 -1
@@ -120,7 +120,8 @@ int aqr_phy_led_hw_control_set(struct phy_device *phydev, u8 index,int aqr_phy_led_active_low_set (struct phy_device *phydev,int index,bool enable) {return phy_modify_mmd (phydev,MDIO_MMD_VEND1 ,AQR_LED_DRIVE (index), -VEND1_GLOBAL_LED_DRIVE_VDD , enable); +VEND1_GLOBAL_LED_DRIVE_VDD , + enable ?VEND1_GLOBAL_LED_DRIVE_VDD :0 ); }int aqr_phy_led_polarity_set (struct phy_device *phydev,int index,unsigned long modes)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 484/695 net: phy: aquantia: fix applying active_low bit after reset
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Golle <[email protected]>
[ Upstream commit 6f9defaf99122d1af9c2562181c77bc99be0672d ]
for_each_set_bit was used wrongly in aqr107_config_init() when iterating over LEDs. Drop misleading 'index' variable and call aqr_phy_led_active_low_set() for each set bit representing an LED which is driven by VDD instead of GND pin.
--- drivers/net/phy/aquantia/aquantia_main.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/net/phy/aquantia/aquantia_main.c +2 -3
@@ -489,7 +489,7 @@ static int aqr107_config_init(struct phy_device *phydev) {struct aqr107_priv *priv = phydev->priv;u32 led_active_low; -int ret, index =0 ; +int ret;/* Check that the PHY interface type is compatible */ if (phydev->interface != PHY_INTERFACE_MODE_SGMII &&
@@ -516,10 +516,9 @@ static int aqr107_config_init(struct phy_device *phydev)/* Restore LED polarity state after reset */ for_each_set_bit (led_active_low, &priv->leds_active_low,AQR_MAX_LEDS ) { - ret =aqr_phy_led_active_low_set (phydev, index, led_active_low); + ret =aqr_phy_led_active_low_set (phydev, led_active_low, true);if (ret)return ret; - index++; }return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 485/695 net: ravb: Fix maximum TX frame size for GbEth devices
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Barker <[email protected]>
[ Upstream commit 1d63864299cafa7c8cbde56491c9932afdbff7ea ]
The datasheets for all SoCs using the GbEth IP specify a maximum transmission frame size of 1.5 kByte. I've confirmed through internal discussions that support for 1522 byte frames has been validated, which allows us to support the default MTU of 1500 bytes after reserving space for the Ethernet header, frame checksums and an optional VLAN tag.
--- drivers/net/ethernet/renesas/ravb.h | 1 + drivers/net/ethernet/renesas/ravb_main.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-)
drivers/net/ethernet/renesas/ravb.h +1 -0
@@ -1052,6 +1052,7 @@ struct ravb_hw_info {netdev_features_t net_features;int stats_len;u32 tccr_mask; +u32 tx_max_frame_size;u32 rx_max_frame_size;u32 rx_buffer_size;u32 rx_desc_size;
drivers/net/ethernet/renesas/ravb_main.c +5 -1
@@ -2674,6 +2674,7 @@ static const struct ravb_hw_info ravb_gen2_hw_info = { .net_features = NETIF_F_RXCSUM, .stats_len = ARRAY_SIZE(ravb_gstrings_stats), .tccr_mask = TCCR_TSRQ0 | TCCR_TSRQ1 | TCCR_TSRQ2 | TCCR_TSRQ3, + .tx_max_frame_size = SZ_2K, .rx_max_frame_size = SZ_2K, .rx_buffer_size =SZ_2K + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)),
@@ -2696,6 +2697,7 @@ static const struct ravb_hw_info ravb_gen3_hw_info = { .net_features = NETIF_F_RXCSUM, .stats_len = ARRAY_SIZE(ravb_gstrings_stats), .tccr_mask = TCCR_TSRQ0 | TCCR_TSRQ1 | TCCR_TSRQ2 | TCCR_TSRQ3, + .tx_max_frame_size = SZ_2K, .rx_max_frame_size = SZ_2K, .rx_buffer_size =SZ_2K + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)),
@@ -2721,6 +2723,7 @@ static const struct ravb_hw_info ravb_gen4_hw_info = { .net_features = NETIF_F_RXCSUM, .stats_len = ARRAY_SIZE(ravb_gstrings_stats), .tccr_mask = TCCR_TSRQ0 | TCCR_TSRQ1 | TCCR_TSRQ2 | TCCR_TSRQ3, + .tx_max_frame_size = SZ_2K, .rx_max_frame_size = SZ_2K, .rx_buffer_size =SZ_2K + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)),
@@ -2770,6 +2773,7 @@ static const struct ravb_hw_info gbeth_hw_info = { .net_features = NETIF_F_RXCSUM | NETIF_F_HW_CSUM, .stats_len = ARRAY_SIZE(ravb_gstrings_stats_gbeth), .tccr_mask = TCCR_TSRQ0, + .tx_max_frame_size = 1522, .rx_max_frame_size = SZ_8K, .rx_buffer_size = SZ_2K, .rx_desc_size = sizeof(struct ravb_rx_desc),
@@ -2981,7 +2985,7 @@ static int ravb_probe(struct platform_device *pdev) priv->avb_link_active_low =of_property_read_bool (np,"renesas,ether-link-active-low" ); - ndev->max_mtu = info->rx_max_frame_size - + ndev->max_mtu = info->tx_max_frame_size - (ETH_HLEN +VLAN_HLEN +ETH_FCS_LEN ); ndev->min_mtu =ETH_MIN_MTU ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 486/695 net: ravb: Fix R-Car RX frame size limit
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Barker <[email protected]>
[ Upstream commit ec8234717db8589078d08b17efa528a235c61f4f ]
The RX frame size limit should not be based on the current MTU setting. Instead it should be based on the hardware capabilities.
While we're here, improve the description of the receive frame length setting as suggested by Niklas.
--- drivers/net/ethernet/renesas/ravb_main.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/net/ethernet/renesas/ravb_main.c +10 -2
@@ -555,8 +555,16 @@ static void ravb_emac_init_gbeth(struct net_device *ndev)static void ravb_emac_init_rcar (struct net_device *ndev) { -/* Receive frame limit set register */ -ravb_write (ndev, ndev->mtu +ETH_HLEN +VLAN_HLEN +ETH_FCS_LEN ,RFLR ); +struct ravb_private *priv =netdev_priv (ndev); + +/* Set receive frame length +* +* The length set here describes the frame from the destination address +* up to and including the CRC data. However only the frame data, +* excluding the CRC, are transferred to memory. To allow for the +* largest frames add the CRC length to the maximum Rx descriptor size. +*/ +ravb_write (ndev, priv->info->rx_max_frame_size +ETH_FCS_LEN ,RFLR );/* EMAC Mode: PAUSE prohibition; Duplex; RX Checksum; TX; RX */ ravb_write(ndev, ECMR_ZPF | ECMR_DM |
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 487/695 bonding: Fix unnecessary warnings and logs from bond_xdp_get_xmit_slave()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiwon Kim <[email protected]>
[ Upstream commit 0cbfd45fbcf0cb26d85c981b91c62fe73cdee01c ]
syzbot reported a WARNING in bond_xdp_get_xmit_slave. To reproduce this[1], one bond device (bond1) has xdpdrv, which increases bpf_master_redirect_enabled_key. Another bond device (bond0) which is unsupported by XDP but its slave (veth3) has xdpgeneric that returns XDP_TX. This triggers WARN_ON_ONCE() from the xdp_master_redirect(). To reduce unnecessary warnings and improve log management, we need to delete the WARN_ON_ONCE() and add ratelimit to the netdev_err().
[1] Steps to reproduce:
# Needs tx_xdp with return XDP_TX;
ip l add veth0 type veth peer veth1
ip l add veth3 type veth peer veth4
ip l add bond0 type bond mode 6 # BOND_MODE_ALB, unsupported by XDP ip l add bond1 type bond # BOND_MODE_ROUNDROBIN by default ip l set veth0 master bond1
ip l set bond1 up
# Increases bpf_master_redirect_enabled_key
ip l set dev bond1 xdpdrv object tx_xdp.o section xdp_tx ip l set veth3 master bond0
ip l set bond0 up
ip l set veth4 up
# Triggers WARN_ON_ONCE() from the xdp_master_redirect() ip l set veth3 xdpgeneric object tx_xdp.o section xdp_tx
--- drivers/net/bonding/bond_main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/bonding/bond_main.c +3 -3
@@ -5536,9 +5536,9 @@ bond_xdp_get_xmit_slave(struct net_device *bond_dev, struct xdp_buff *xdp)break ;default : -/* Should never happen. Mode guarded by bond_xdp_check() */ -netdev_err (bond_dev,"Unknown bonding mode %d for xdp xmit\n" ,BOND_MODE (bond)); -WARN_ON_ONCE (1 ); +if (net_ratelimit ()) +netdev_err (bond_dev,"Unknown bonding mode %d for xdp xmit\n" , +BOND_MODE (bond));return NULL ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 488/695 virtio_net: Fix mismatched buf address when unmapping for small packets
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wenbo Li <[email protected]>
[ Upstream commit c11a49d58ad229a1be1ebe08a2b68fedf83db6c8 ]
Currently, the virtio-net driver will perform a pre-dma-mapping for small or mergeable RX buffer. But for small packets, a mismatched address without VIRTNET_RX_PAD and xdp_headroom is used for unmapping.
That will result in unsynchronized buffers when SWIOTLB is enabled, for example, when running as a TDX guest.
This patch unifies the address passed to the virtio core as the address of the virtnet header and fixes the mismatched buffer address.
Changes from v2: unify the buf that passed to the virtio core in small and merge mode.
Changes from v1: Use ctx to get xdp_headroom.
--- drivers/net/virtio_net.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/net/virtio_net.c +8 -2
@@ -1807,6 +1807,11 @@ static struct sk_buff *receive_small(struct net_device *dev,struct page *page =virt_to_head_page (buf);struct sk_buff *skb; +/* We passed the address of virtnet header to virtio-core, +* so truncate the padding. +*/ + buf -=VIRTNET_RX_PAD + xdp_headroom; + len -= vi->hdr_len;u64_stats_add (&stats->bytes, len);
@@ -2422,8 +2427,9 @@ static int add_recvbuf_small(struct virtnet_info *vi, struct receive_queue *rq,if (unlikely (!buf))return -ENOMEM ; -virtnet_rq_init_one_sg (rq, buf +VIRTNET_RX_PAD + xdp_headroom, - vi->hdr_len +GOOD_PACKET_LEN ); + buf +=VIRTNET_RX_PAD + xdp_headroom; + +virtnet_rq_init_one_sg (rq, buf, vi->hdr_len +GOOD_PACKET_LEN ); err =virtqueue_add_inbuf_ctx (rq->vq, rq->sg,1 , buf, ctx, gfp);if (err <0 ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 489/695 net: stmmac: set PP_FLAG_DMA_SYNC_DEV only if XDP is enabled
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Furong Xu <[email protected]>
[ Upstream commit b514c47ebf41a6536551ed28a05758036e6eca7c ]
Commit 5fabb01207a2 ("net: stmmac: Add initial XDP support") sets PP_FLAG_DMA_SYNC_DEV flag for page_pool unconditionally, page_pool_recycle_direct() will call page_pool_dma_sync_for_device() on every page even the page is not going to be reused by XDP program.
When XDP is not enabled, the page which holds the received buffer will be recycled once the buffer is copied into new SKB by skb_copy_to_linear_data(), then the MAC core will never reuse this page any longer. Always setting PP_FLAG_DMA_SYNC_DEV wastes CPU cycles on unnecessary calling of page_pool_dma_sync_for_device().
After this patch, up to 9% noticeable performance improvement was observed on certain platforms.
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +1 -1
@@ -2022,7 +2022,7 @@ static int __alloc_dma_rx_desc_resources(struct stmmac_priv *priv, rx_q->queue_index = queue; rx_q->priv_data = priv; - pp_params.flags =PP_FLAG_DMA_MAP |PP_FLAG_DMA_SYNC_DEV ; + pp_params.flags =PP_FLAG_DMA_MAP | (xdp_prog ?PP_FLAG_DMA_SYNC_DEV :0 ); pp_params.pool_size = dma_conf->dma_rx_size; num_pages =DIV_ROUND_UP (dma_conf->dma_buf_sz,PAGE_SIZE ); pp_params.order =ilog2 (num_pages);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 490/695 netfilter: nf_tables: Keep deleted flowtable hooks until after RCU
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Phil Sutter <[email protected]>
[ Upstream commit 642c89c475419b4d0c0d90e29d9c1a0e4351f379 ]
Documentation of list_del_rcu() warns callers to not immediately free the deleted list item. While it seems not necessary to use the RCU-variant of list_del() here in the first place, doing so seems to require calling kfree_rcu() on the deleted item as well.
--- net/netfilter/nf_tables_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/netfilter/nf_tables_api.c +1 -1
@@ -9185,7 +9185,7 @@ static void nf_tables_flowtable_destroy(struct nft_flowtable *flowtable) flowtable->data.type->setup (&flowtable->data, hook->ops.dev,FLOW_BLOCK_UNBIND );list_del_rcu (&hook->list); -kfree (hook); +kfree_rcu (hook, rcu); }kfree (flowtable->name);module_put (flowtable->data.type->owner);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 491/695 netfilter: ctnetlink: compile ctnetlink_label_size with CONFIG_NF_CONNTRACK_EVENTS
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Simon Horman <[email protected]>
[ Upstream commit e1f1ee0e9ad8cbe660f5c104e791c5f1a7cf4c31 ]
Only provide ctnetlink_label_size when it is used, which is when CONFIG_NF_CONNTRACK_EVENTS is configured.
Flagged by clang-18 W=1 builds as:
.../nf_conntrack_netlink.c:385:19: warning: unused function 'ctnetlink_label_size' [-Wunused-function]
385 | static inline int ctnetlink_label_size(const struct nf_conn *ct)
| ^~~~~~~~~~~~~~~~~~~~
The condition on CONFIG_NF_CONNTRACK_LABELS being removed by this patch guards compilation of non-trivial implementations of ctnetlink_dump_labels() and ctnetlink_label_size().
However, this is not necessary as each of these functions will always return 0 if CONFIG_NF_CONNTRACK_LABELS is not defined as each function starts with the equivalent of:
struct nf_conn_labels *labels = nf_ct_labels_find(ct); if (!labels) return 0;
And nf_ct_labels_find always returns NULL if CONFIG_NF_CONNTRACK_LABELS is not enabled. So I believe that the compiler optimises the code away in such cases anyway.
Found by inspection.
Compile tested only.
Originally splitted in two patches, Pablo Neira Ayuso collapsed them and added Fixes: tag.
--- net/netfilter/nf_conntrack_netlink.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
net/netfilter/nf_conntrack_netlink.c +2 -5
@@ -382,7 +382,7 @@ static int ctnetlink_dump_secctx(struct sk_buff *skb, const struct nf_conn *ct)#define ctnetlink_dump_secctx (a, b) (0)#endif -#ifdef CONFIG_NF_CONNTRACK_LABELS +#ifdef CONFIG_NF_CONNTRACK_EVENTS static inline int ctnetlink_label_size (const struct nf_conn *ct) {struct nf_conn_labels *labels =nf_ct_labels_find (ct);
@@ -391,6 +391,7 @@ static inline int ctnetlink_label_size(const struct nf_conn *ct)return 0 ; return nla_total_size(sizeof(labels->bits)); } +#endif static int ctnetlink_dump_labels (struct sk_buff *skb,const struct nf_conn *ct)
@@ -411,10 +412,6 @@ ctnetlink_dump_labels(struct sk_buff *skb, const struct nf_conn *ct)return 0 ; } -#else -#define ctnetlink_dump_labels (a, b) (0) -#define ctnetlink_label_size (a) (0) -#endif #define master_tuple (ct) &(ct->master->tuplehash[IP_CT_DIR_ORIGINAL].tuple)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 492/695 netfilter: nf_tables: use rcu chain hook list iterator from netlink dump path
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 4ffcf5ca81c3b83180473eb0d3c010a1a7c6c4de ]
Lockless iteration over hook list is possible from netlink dump path, use rcu variant to iterate over the hook list as is done with flowtable hooks.
--- net/netfilter/nf_tables_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/netfilter/nf_tables_api.c +1 -1
@@ -1847,7 +1847,7 @@ static int nft_dump_basechain_hook(struct sk_buff *skb, int family,if (!hook_list) hook_list = &basechain->hook_list; -list_for_each_entry (hook, hook_list, list) { +list_for_each_entry_rcu (hook, hook_list, list) {if (!first) first = hook;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 493/695 netfilter: nf_tables: missing objects with no memcg accounting
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 69e687cea79fc99a17dfb0116c8644b9391b915e ]
Several ruleset objects are still not using GFP_KERNEL_ACCOUNT for memory accounting, update them. This includes:
- catchall elements
- compat match large info area
- log prefix
- meta secctx
- numgen counters
- pipapo set backend datastructure
- tunnel private objects
--- net/netfilter/nf_tables_api.c | 2 +- net/netfilter/nft_compat.c | 6 +++--- net/netfilter/nft_log.c | 2 +- net/netfilter/nft_meta.c | 2 +- net/netfilter/nft_numgen.c | 2 +- net/netfilter/nft_set_pipapo.c | 13 +++++++------ net/netfilter/nft_tunnel.c | 5 +++-- 7 files changed, 17 insertions(+), 15 deletions(-)
net/netfilter/nf_tables_api.c +1 -1
@@ -6679,7 +6679,7 @@ static int nft_setelem_catchall_insert(const struct net *net, } } - catchall =kmalloc (sizeof (*catchall),GFP_KERNEL ); + catchall =kmalloc (sizeof (*catchall),GFP_KERNEL_ACCOUNT );if (!catchall)return -ENOMEM ;
net/netfilter/nft_compat.c +3 -3
@@ -536,7 +536,7 @@ nft_match_large_init(const struct nft_ctx *ctx, const struct nft_expr *expr,struct xt_match *m = expr->ops->data;int ret; - priv->info =kmalloc (XT_ALIGN (m->matchsize),GFP_KERNEL ); + priv->info =kmalloc (XT_ALIGN (m->matchsize),GFP_KERNEL_ACCOUNT );if (!priv->info)return -ENOMEM ;
@@ -810,7 +810,7 @@ nft_match_select_ops(const struct nft_ctx *ctx, goto err; } - ops =kzalloc (sizeof (struct nft_expr_ops ),GFP_KERNEL ); + ops =kzalloc (sizeof (struct nft_expr_ops ),GFP_KERNEL_ACCOUNT );if (!ops) { err = -ENOMEM ; goto err;
@@ -900,7 +900,7 @@ nft_target_select_ops(const struct nft_ctx *ctx, goto err; } - ops =kzalloc (sizeof (struct nft_expr_ops ),GFP_KERNEL ); + ops =kzalloc (sizeof (struct nft_expr_ops ),GFP_KERNEL_ACCOUNT );if (!ops) { err = -ENOMEM ; goto err;
net/netfilter/nft_log.c +1 -1
@@ -163,7 +163,7 @@ static int nft_log_init(const struct nft_ctx *ctx, nla = tb[NFTA_LOG_PREFIX ];if (nla !=NULL ) { - priv->prefix =kmalloc (nla_len (nla) +1 ,GFP_KERNEL ); + priv->prefix =kmalloc (nla_len (nla) +1 ,GFP_KERNEL_ACCOUNT );if (priv->prefix ==NULL )return -ENOMEM ;nla_strscpy (priv->prefix, nla,nla_len (nla) +1 );
net/netfilter/nft_meta.c +1 -1
@@ -954,7 +954,7 @@ static int nft_secmark_obj_init(const struct nft_ctx *ctx,if (tb[NFTA_SECMARK_CTX ] ==NULL )return -EINVAL ; - priv->ctx =nla_strdup (tb[NFTA_SECMARK_CTX ],GFP_KERNEL ); + priv->ctx =nla_strdup (tb[NFTA_SECMARK_CTX ],GFP_KERNEL_ACCOUNT );if (!priv->ctx)return -ENOMEM ;
net/netfilter/nft_numgen.c +1 -1
@@ -66,7 +66,7 @@ static int nft_ng_inc_init(const struct nft_ctx *ctx,if (priv->offset + priv->modulus -1 < priv->offset)return -EOVERFLOW ; - priv->counter =kmalloc (sizeof (*priv->counter),GFP_KERNEL ); + priv->counter =kmalloc (sizeof (*priv->counter),GFP_KERNEL_ACCOUNT );if (!priv->counter)return -ENOMEM ;
net/netfilter/nft_set_pipapo.c +7 -6
@@ -663,7 +663,7 @@ static int pipapo_realloc_mt(struct nft_pipapo_field *f, check_add_overflow(rules, extra, &rules_alloc))return -EOVERFLOW ; - new_mt =kvmalloc_array (rules_alloc,sizeof (*new_mt),GFP_KERNEL ); + new_mt =kvmalloc_array (rules_alloc,sizeof (*new_mt),GFP_KERNEL_ACCOUNT );if (!new_mt)return -ENOMEM ;
@@ -936,7 +936,7 @@ static void pipapo_lt_bits_adjust(struct nft_pipapo_field *f)return ; } - new_lt =kvzalloc (lt_size +NFT_PIPAPO_ALIGN_HEADROOM ,GFP_KERNEL ); + new_lt =kvzalloc (lt_size +NFT_PIPAPO_ALIGN_HEADROOM ,GFP_KERNEL_ACCOUNT );if (!new_lt)return ;
@@ -1212,7 +1212,7 @@ static int pipapo_realloc_scratch(struct nft_pipapo_match *clone, scratch =kzalloc_node (struct_size (scratch, map, bsize_max *2 ) +NFT_PIPAPO_ALIGN_HEADROOM , -GFP_KERNEL ,cpu_to_node (i)); +GFP_KERNEL_ACCOUNT ,cpu_to_node (i));if (!scratch) {/* On failure, there's no need to undo previous * allocations: this means that some scratch maps have
@@ -1427,7 +1427,7 @@ static struct nft_pipapo_match *pipapo_clone(struct nft_pipapo_match *old)struct nft_pipapo_match *new;int i; - new =kmalloc (struct_size (new, f, old->field_count),GFP_KERNEL ); + new =kmalloc (struct_size (new, f, old->field_count),GFP_KERNEL_ACCOUNT );if (!new)return NULL ;
@@ -1457,7 +1457,7 @@ static struct nft_pipapo_match *pipapo_clone(struct nft_pipapo_match *old) new_lt =kvzalloc (src->groups *NFT_PIPAPO_BUCKETS (src->bb) * src->bsize *sizeof (*dst->lt) +NFT_PIPAPO_ALIGN_HEADROOM , -GFP_KERNEL ); +GFP_KERNEL_ACCOUNT );if (!new_lt) goto out_lt;
@@ -1470,7 +1470,8 @@ static struct nft_pipapo_match *pipapo_clone(struct nft_pipapo_match *old)if (src->rules >0 ) { dst->mt =kvmalloc_array (src->rules_alloc, -sizeof (*src->mt),GFP_KERNEL ); +sizeof (*src->mt), +GFP_KERNEL_ACCOUNT );if (!dst->mt) goto out_mt;
net/netfilter/nft_tunnel.c +3 -2
@@ -509,13 +509,14 @@ static int nft_tunnel_obj_init(const struct nft_ctx *ctx,return err; } - md =metadata_dst_alloc (priv->opts.len,METADATA_IP_TUNNEL ,GFP_KERNEL ); + md =metadata_dst_alloc (priv->opts.len,METADATA_IP_TUNNEL , +GFP_KERNEL_ACCOUNT );if (!md)return -ENOMEM ;memcpy (&md->u.tun_info, &info,sizeof (info));#ifdef CONFIG_DST_CACHE - err =dst_cache_init (&md->u.tun_info.dst_cache,GFP_KERNEL ); + err =dst_cache_init (&md->u.tun_info.dst_cache,GFP_KERNEL_ACCOUNT );if (err <0 ) {metadata_dst_free (md);return err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 494/695 selftests: netfilter: Avoid hanging ipvs.sh
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Phil Sutter <[email protected]>
[ Upstream commit fc786304ad9803e8bb86b8599bc64d1c1746c75f ]
If the client can't reach the server, the latter remains listening forever. Kill it after 5s of waiting.
--- tools/testing/selftests/net/netfilter/ipvs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/net/netfilter/ipvs.sh +1 -1
@@ -97,7 +97,7 @@ cleanup() { } server_listen() { - ip netns exec "$ns2" socat -u -4 TCP-LISTEN:8080,reuseaddr STDOUT > "${outfile}" & + ip netns exec "$ns2" timeout 5 socat -u -4 TCP-LISTEN:8080,reuseaddr STDOUT > "${outfile}" & server_pid=$! sleep 0.2 }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 495/695 io_uring/sqpoll: do not allow pinning outside of cpuset
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Moessbauer <[email protected]>
commit f011c9cf04c06f16b24f583d313d3c012e589e50 upstream.
The submit queue polling threads are userland threads that just never exit to the userland. When creating the thread with IORING_SETUP_SQ_AFF, the affinity of the poller thread is set to the cpu specified in sq_thread_cpu. However, this CPU can be outside of the cpuset defined by the cgroup cpuset controller. This violates the rules defined by the cpuset controller and is a potential issue for realtime applications.
In b7ed6d8ffd6 we fixed the default affinity of the poller thread, in case no explicit pinning is required by inheriting the one of the creating task. In case of explicit pinning, the check is more complicated, as also a cpu outside of the parent cpumask is allowed. We implemented this by using cpuset_cpus_allowed (that has support for cgroup cpusets) and testing if the requested cpu is in the set.
--- io_uring/sqpoll.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
io_uring/sqpoll.c +4 -1
@@ -10,6 +10,7 @@#include <linux/slab.h> #include <linux/audit.h> #include <linux/security.h> +#include <linux/cpuset.h> #include <linux/io_uring.h> #include <uapi/linux/io_uring.h>
@@ -460,10 +461,12 @@ __cold int io_sq_offload_create(struct ireturn 0 ;if (p->flags &IORING_SETUP_SQ_AFF ) { +struct cpumask allowed_mask;int cpu = p->sq_thread_cpu; ret = -EINVAL ; -if (cpu >= nr_cpu_ids || !cpu_online (cpu)) +cpuset_cpus_allowed (current, &allowed_mask); +if (!cpumask_test_cpu (cpu, &allowed_mask)) goto err_sqpoll; sqd->sq_cpu = cpu; }else {
Greg Kroah-Hartman
maintainerPATCH 496/695 io_uring/rw: treat -EOPNOTSUPP for IOCB_NOWAIT like -EAGAIN
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Axboe <[email protected]>
commit c0a9d496e0fece67db777bd48550376cf2960c47 upstream.
Some file systems, ocfs2 in this case, will return -EOPNOTSUPP for an IOCB_NOWAIT read/write attempt. While this can be argued to be correct, the usual return value for something that requires blocking issue is -EAGAIN.
A refactoring io_uring commit dropped calling kiocb_done() for negative return values, which is otherwise where we already do that transformation. To ensure we catch it in both spots, check it in __io_read() itself as well.
--- io_uring/rw.c | 8 ++++++++ 1 file changed, 8 insertions(+)
io_uring/rw.c +8 -0
@@ -855,6 +855,14 @@ static int __io_read(struct io_kiocb *re ret =io_iter_do_read (rw, &io->iter); +/* +* Some file systems like to return -EOPNOTSUPP for an IOCB_NOWAIT +* issue, even though they should be returning -EAGAIN. To be safe, +* retry from blocking context for either. +*/ +if (ret == -EOPNOTSUPP && force_nonblock) + ret = -EAGAIN ; +if (ret == -EAGAIN || (req->flags &REQ_F_REISSUE )) { req->flags &= ~REQ_F_REISSUE ;/* If we can poll, just do that. */
Greg Kroah-Hartman
maintainerPATCH 497/695 io_uring: check for presence of task_work rather than TIF_NOTIFY_SIGNAL
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Axboe <[email protected]>
commit 04beb6e0e08c30c6f845f50afb7d7953603d7a6f upstream.
If some part of the kernel adds task_work that needs executing, in terms of signaling it'll generally use TWA_SIGNAL or TWA_RESUME. Those two directly translate to TIF_NOTIFY_SIGNAL or TIF_NOTIFY_RESUME, and can be used for a variety of use case outside of task_work.
However, io_cqring_wait_schedule() only tests explicitly for TIF_NOTIFY_SIGNAL. This means it can miss if task_work got added for the task, but used a different kind of signaling mechanism (or none at all). Normally this doesn't matter as any task_work will be run once the task exits to userspace, except if:
1) The ring is setup with DEFER_TASKRUN
2) The local work item may generate normal task_work
For condition 2, this can happen when closing a file and it's the final put of that file, for example. This can cause stalls where a task is waiting to make progress inside io_cqring_wait(), but there's nothing else that will wake it up. Hence change the "should we schedule or loop around" check to check for the presence of task_work explicitly, rather than just TIF_NOTIFY_SIGNAL as the mechanism. While in there, also change the ordering of what type of task_work first in terms of ordering, to both make it consistent with other task_work runs in io_uring, but also to better handle the case of defer task_work generating normal task_work, like in the above example.
--- io_uring/io_uring.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
io_uring/io_uring.c +2 -2
@@ -2360,7 +2360,7 @@ static inline int io_cqring_wait_schedulreturn 1 ;if (unlikely (!llist_empty (&ctx->work_llist)))return 1 ; -if (unlikely (test_thread_flag (TIF_NOTIFY_SIGNAL ))) +if (unlikely (task_work_pending (current)))return 1 ;if (unlikely (task_sigpending (current)))return -EINTR ;
@@ -2463,9 +2463,9 @@ static int io_cqring_wait(struct io_ring* If we got woken because of task_work being processed, run it * now rather than let the caller do another wait loop. */ -io_run_task_work ();if (!llist_empty (&ctx->work_llist))io_run_local_work (ctx, nr_wait); +io_run_task_work ();/* * Non-local task_work will be run on exit to userspace, but
Greg Kroah-Hartman
maintainerPATCH 498/695 fuse: use exclusive lock when FUSE_I_CACHE_IO_MODE is set
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: yangyun <[email protected]>
commit 2f3d8ff457982f4055fe8f7bf19d3821ba22c376 upstream.
This may be a typo. The comment has said shared locks are not allowed when this bit is set. If using shared lock, the wait in fuse_file_cached_io_open may be forever.
--- fs/fuse/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/fuse/file.c +1 -1
@@ -1345,7 +1345,7 @@ static bool fuse_dio_wr_exclusive_lock(s/* shared locks are not allowed with parallel page cache IO */ if (test_bit (FUSE_I_CACHE_IO_MODE , &fi->state)) -return false; +return true;/* Parallel dio beyond EOF is not supported, at least for now. */ if (fuse_io_past_eof (iocb, from))
Greg Kroah-Hartman
maintainerPATCH 499/695 mm: migrate: annotate data-race in migrate_folio_unmap()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeongjun Park <[email protected]>
commit 8001070cfbec5cd4ea00b8b48ea51df91122f265 upstream.
I found a report from syzbot [1]
This report shows that the value can be changed, but in reality, the value of __folio_set_movable() cannot be changed because it holds the folio refcount.
Therefore, it is appropriate to add an annotate to make KCSAN ignore that data-race.
[1]
==================================================================
BUG: KCSAN: data-race in __filemap_remove_folio / migrate_pages_batch
write to 0xffffea0004b81dd8 of 8 bytes by task 6348 on cpu 0:
page_cache_delete mm/filemap.c:153 [inline] __filemap_remove_folio+0x1ac/0x2c0 mm/filemap.c:233 filemap_remove_folio+0x6b/0x1f0 mm/filemap.c:265 truncate_inode_folio+0x42/0x50 mm/truncate.c:178 shmem_undo_range+0x25b/0xa70 mm/shmem.c:1028 shmem_truncate_range mm/shmem.c:1144 [inline] shmem_evict_inode+0x14d/0x530 mm/shmem.c:1272 evict+0x2f0/0x580 fs/inode.c:731 iput_final fs/inode.c:1883 [inline] iput+0x42a/0x5b0 fs/inode.c:1909 dentry_unlink_inode+0x24f/0x260 fs/dcache.c:412 __dentry_kill+0x18b/0x4c0 fs/dcache.c:615 dput+0x5c/0xd0 fs/dcache.c:857 __fput+0x3fb/0x6d0 fs/file_table.c:439 ____fput+0x1c/0x30 fs/file_table.c:459 task_work_run+0x13a/0x1a0 kernel/task_work.c:228 resume_user_mode_work include/linux/resume_user_mode.h:50 [inline] exit_to_user_mode_loop kernel/entry/common.c:114 [inline] exit_to_user_mode_prepare include/linux/entry-common.h:328 [inline] __syscall_exit_to_user_mode_work kernel/entry/common.c:207 [inline] syscall_exit_to_user_mode+0xbe/0x130 kernel/entry/common.c:218 do_syscall_64+0xd6/0x1c0 arch/x86/entry/common.c:89 entry_SYSCALL_64_after_hwframe+0x77/0x7f
read to 0xffffea0004b81dd8 of 8 bytes by task 6342 on cpu 1:
__folio_test_movable include/linux/page-flags.h:699 [inline] migrate_folio_unmap mm/migrate.c:1199 [inline] migrate_pages_batch+0x24c/0x1940 mm/migrate.c:1797 migrate_pages_sync mm/migrate.c:1963 [inline] migrate_pages+0xff1/0x1820 mm/migrate.c:2072 do_mbind mm/mempolicy.c:1390 [inline] kernel_mbind mm/mempolicy.c:1533 [inline] __do_sys_mbind mm/mempolicy.c:1607 [inline] __se_sys_mbind+0xf76/0x1160 mm/mempolicy.c:1603 __x64_sys_mbind+0x78/0x90 mm/mempolicy.c:1603 x64_sys_call+0x2b4d/0x2d60 arch/x86/include/generated/asm/syscalls_64.h:238 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xc9/0x1c0 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f
value changed: 0xffff888127601078 -> 0x0000000000000000
--- mm/migrate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/migrate.c +1 -1
@@ -1118,7 +1118,7 @@ static int migrate_folio_unmap(new_folioint rc = -EAGAIN ;int old_page_state =0 ;struct anon_vma *anon_vma =NULL ; -bool is_lru = !__folio_test_movable (src); +bool is_lru =data_race (!__folio_test_movable (src));bool locked = false;bool dst_locked = false;
Greg Kroah-Hartman
maintainerPATCH 500/695 mm: call the security_mmap_file() LSM hook in remap_file_pages()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shu Han <[email protected]>
commit ea7e2d5e49c05e5db1922387b09ca74aa40f46e2 upstream.
The remap_file_pages syscall handler calls do_mmap() directly, which doesn't contain the LSM security check. And if the process has called personality(READ_IMPLIES_EXEC) before and remap_file_pages() is called for RW pages, this will actually result in remapping the pages to RWX, bypassing a W^X policy enforced by SELinux.
So we should check prot by security_mmap_file LSM hook in the remap_file_pages syscall handler before do_mmap() is called. Otherwise, it potentially permits an attacker to bypass a W^X policy enforced by SELinux.
The bypass is similar to CVE-2016-10044, which bypass the same thing via AIO and can be found in [1].
The PoC:
$ cat > test.c
int main(void) {
size_t pagesz = sysconf(_SC_PAGE_SIZE);
int mfd = syscall(SYS_memfd_create, "test", 0);
const char *buf = mmap(NULL, 4 * pagesz, PROT_READ | PROT_WRITE,
MAP_SHARED, mfd, 0);
unsigned int old = syscall(SYS_personality, 0xffffffff);
syscall(SYS_personality, READ_IMPLIES_EXEC | old);
syscall(SYS_remap_file_pages, buf, pagesz, 0, 2, 0);
syscall(SYS_personality, old);
// show the RWX page exists even if W^X policy is enforced
int fd = open("/proc/self/maps", O_RDONLY);
unsigned char buf2[1024];
while (1) {
int ret = read(fd, buf2, 1024);
if (ret <= 0) break;
write(1, buf2, ret);
}
close(fd);
}$ gcc test.c -o test $ ./test | grep rwx 7f1836c34000-7f1836c35000 rwxs 00002000 00:01 2050 /memfd:test (deleted)
--- mm/mmap.c | 4 ++++ 1 file changed, 4 insertions(+)
mm/mmap.c +4 -0
@@ -3198,8 +3198,12 @@ SYSCALL_DEFINE5(remap_file_pages, unsign flags |=MAP_LOCKED ; file =get_file (vma->vm_file); + ret =security_mmap_file (vma->vm_file, prot, flags); +if (ret) + goto out_fput; ret =do_mmap (vma->vm_file, start, size, prot, flags,0 , pgoff, &populate,NULL ); +out_fput:fput (file); out:mmap_write_unlock (mm);
Greg Kroah-Hartman
maintainerPATCH 501/695 drm/amd/display: Fix Synaptics Cascaded Panamera DSC Determination
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fangzhi Zuo <[email protected]>
commit 4437936c6b696b98f3fe1d8679a2788c41b4df77 upstream.
Synaptics Cascaded Panamera topology needs to unconditionally acquire root aux for dsc decoding.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +1 -1
@@ -253,7 +253,7 @@ static bool validate_dsc_caps_on_connect aconnector->dsc_aux = &aconnector->mst_root->dm_dp_aux.aux;/* synaptics cascaded MST hub case */ -if (!aconnector->dsc_aux &&is_synaptics_cascaded_panamera (aconnector->dc_link, port)) +if (is_synaptics_cascaded_panamera (aconnector->dc_link, port)) aconnector->dsc_aux = port->mgr->aux;if (!aconnector->dsc_aux)
Greg Kroah-Hartman
maintainerPATCH 502/695 drm/amd/display: Add DSC Debug Log
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fangzhi Zuo <[email protected]>
commit 3715112c1b35036039e8c4f75868a0b56a71a51d upstream.
Add DSC log in each critical routines to facilitate debugging.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 9 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 18 - drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 131 +++++++++--- 3 files changed, 119 insertions(+), 39 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +5 -4
@@ -6484,7 +6484,8 @@ static void apply_dsc_policy_for_stream( dc_link_get_highest_encoding_format(aconnector->dc_link), &stream->timing.dsc_cfg)) { stream->timing.flags.DSC =1 ; -DRM_DEBUG_DRIVER ("%s: [%s] DSC is selected from SST RX\n" , __func__, drm_connector->name); +DRM_DEBUG_DRIVER ("%s: SST_DSC [%s] DSC is selected from SST RX\n" , + __func__, drm_connector->name); } }else if (sink->link->dpcd_caps.dongle_type ==DISPLAY_DONGLE_DP_HDMI_CONVERTER ) { timing_bw_in_kbps = dc_bandwidth_in_kbps_from_timing(&stream->timing,
@@ -6503,7 +6504,7 @@ static void apply_dsc_policy_for_stream( dc_link_get_highest_encoding_format(aconnector->dc_link), &stream->timing.dsc_cfg)) { stream->timing.flags.DSC =1 ; -DRM_DEBUG_DRIVER ("%s: [%s] DSC is selected from DP-HDMI PCON\n" , +DRM_DEBUG_DRIVER ("%s: SST_DSC [%s] DSC is selected from DP-HDMI PCON\n" , __func__, drm_connector->name); } }
@@ -11664,7 +11665,7 @@ static int amdgpu_dm_atomic_check(structif (dc_resource_is_dsc_encoding_supported (dc)) { ret =compute_mst_dsc_configs_for_state (state, dm_state->context, vars);if (ret) { -drm_dbg_atomic (dev,"compute_mst_dsc_configs_for_state() failed\n" ); +drm_dbg_atomic (dev,"MST_DSC compute_mst_dsc_configs_for_state() failed\n" ); ret = -EINVAL ; goto fail; }
@@ -11685,7 +11686,7 @@ static int amdgpu_dm_atomic_check(struct*/ ret =drm_dp_mst_atomic_check (state);if (ret) { -drm_dbg_atomic (dev,"drm_dp_mst_atomic_check() failed\n" ); +drm_dbg_atomic (dev,"MST drm_dp_mst_atomic_check() failed\n" ); goto fail; } status =dc_validate_global_state (dc, dm_state->context, true);
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +9 -9
@@ -759,7 +759,7 @@ static uint8_t write_dsc_enable_synapticuint8_t ret =0 ;drm_dbg_dp (aux->drm_dev, -"Configure DSC to non-virtual dpcd synaptics\n" ); +"MST_DSC Configure DSC to non-virtual dpcd synaptics\n" );if (enable) {/* When DSC is enabled on previous boot and reboot with the hub,
@@ -772,7 +772,7 @@ static uint8_t write_dsc_enable_synapticapply_synaptics_fifo_reset_wa (aux); ret =drm_dp_dpcd_write (aux,DP_DSC_ENABLE , &enable,1 ); -DRM_INFO ("Send DSC enable to synaptics\n" ); +DRM_INFO ("MST_DSC Send DSC enable to synaptics\n" ); }else {/* Synaptics hub not support virtual dpcd,
@@ -781,7 +781,7 @@ static uint8_t write_dsc_enable_synaptic*/ if (!stream->link->link_status.link_active) { ret =drm_dp_dpcd_write (aux,DP_DSC_ENABLE , &enable,1 ); -DRM_INFO ("Send DSC disable to synaptics\n" ); +DRM_INFO ("MST_DSC Send DSC disable to synaptics\n" ); } }
@@ -823,14 +823,14 @@ bool dm_helpers_dp_write_dsc_enable(DP_DSC_ENABLE , &enable_passthrough, 1);drm_dbg_dp (dev, -"Sent DSC pass-through enable to virtual dpcd port, ret = %u\n" , +"MST_DSC Sent DSC pass-through enable to virtual dpcd port, ret = %u\n" , ret); } ret =drm_dp_dpcd_write (aconnector->dsc_aux,DP_DSC_ENABLE , &enable_dsc,1 );drm_dbg_dp (dev, -"Sent DSC decoding enable to %s port, ret = %u\n" , +"MST_DSC Sent DSC decoding enable to %s port, ret = %u\n" , (port->passthrough_aux) ?"remote RX" :"virtual dpcd" , ret);
@@ -838,7 +838,7 @@ bool dm_helpers_dp_write_dsc_enable( ret =drm_dp_dpcd_write (aconnector->dsc_aux,DP_DSC_ENABLE , &enable_dsc,1 );drm_dbg_dp (dev, -"Sent DSC decoding disable to %s port, ret = %u\n" , +"MST_DSC Sent DSC decoding disable to %s port, ret = %u\n" , (port->passthrough_aux) ?"remote RX" :"virtual dpcd" , ret);
@@ -848,7 +848,7 @@ bool dm_helpers_dp_write_dsc_enable(DP_DSC_ENABLE , &enable_passthrough, 1);drm_dbg_dp (dev, -"Sent DSC pass-through disable to virtual dpcd port, ret = %u\n" , +"MST_DSC Sent DSC pass-through disable to virtual dpcd port, ret = %u\n" , ret); } }
@@ -858,12 +858,12 @@ bool dm_helpers_dp_write_dsc_enable(if (stream->sink->link->dpcd_caps.dongle_type ==DISPLAY_DONGLE_NONE ) { ret =dm_helpers_dp_write_dpcd (ctx, stream->link,DP_DSC_ENABLE , &enable_dsc,1 );drm_dbg_dp (dev, -"Send DSC %s to SST RX\n" , +"SST_DSC Send DSC %s to SST RX\n" , enable_dsc ?"enable" :"disable" ); }else if (stream->sink->link->dpcd_caps.dongle_type ==DISPLAY_DONGLE_DP_HDMI_CONVERTER ) { ret =dm_helpers_dp_write_dpcd (ctx, stream->link,DP_DSC_ENABLE , &enable_dsc,1 );drm_dbg_dp (dev, -"Send DSC %s to DP-HDMI PCON\n" , +"SST_DSC Send DSC %s to DP-HDMI PCON\n" , enable_dsc ?"enable" :"disable" ); } }
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +105 -26
344 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 503/695 drm/amdgpu/display: Fix a mistake in revert commit
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fangzhi Zuo <[email protected]>
commit 7745a1dee0a687044888179e6e7fcd6d704992a9 upstream.
[why]
It is to fix in try_disable_dsc() due to misrevert of
commit 338567d17627 ("drm/amd/display: Fix MST BW calculation Regression")
[How]
Fix restoring minimum compression bw by 'max_kbps', instead of native bw 'stream_kbps'
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +1 -1
@@ -1072,7 +1072,7 @@ static int try_disable_dsc(struct drm_at vars[next_index].bpp_x16 =0 ; }else {DRM_DEBUG_DRIVER ("MST_DSC index #%d, restore minimum compression\n" , next_index); - vars[next_index].pbn =kbps_to_peak_pbn (params[next_index].bw_range.stream_kbps, fec_overhead_multiplier_x1000); + vars[next_index].pbn =kbps_to_peak_pbn (params[next_index].bw_range.max_kbps, fec_overhead_multiplier_x1000); ret = drm_dp_atomic_find_time_slots(state, params[next_index].port->mgr, params[next_index].port,
Greg Kroah-Hartman
maintainerPATCH 504/695 xen: move checks for e820 conflicts further up
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Juergen Gross <[email protected]>
commit c4498ae316da5b5786ccd448fc555f3339b8e4ca upstream.
Move the checks for e820 memory map conflicts using the xen_chk_is_e820_usable() helper further up in order to prepare resolving some of the possible conflicts by doing some e820 map modifications, which must happen before evaluating the RAM layout.
--- arch/x86/xen/setup.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-)
arch/x86/xen/setup.c +22 -22
@@ -854,6 +854,28 @@ char * __init xen_memory_setup(void)/* Make sure the Xen-supplied memory map is well-ordered. */ e820__update_table (&xen_e820_table); +/* +* Check whether the kernel itself conflicts with the target E820 map. +* Failing now is better than running into weird problems later due +* to relocating (and even reusing) pages with kernel text or data. +*/ +xen_chk_is_e820_usable (__pa_symbol (_text), +__pa_symbol (_end) -__pa_symbol (_text), +"kernel" ); + +/* +* Check for a conflict of the xen_start_info memory with the target +* E820 map. +*/ +xen_chk_is_e820_usable (__pa (xen_start_info),sizeof (*xen_start_info), +"xen_start_info" ); + +/* +* Check for a conflict of the hypervisor supplied page tables with +* the target E820 map. +*/ +xen_pt_check_e820 (); + max_pages =xen_get_max_pages ();/* How many extra pages do we need due to remapping? */
@@ -926,28 +948,6 @@ char * __init xen_memory_setup(void)e820__update_table (e820_table); -/* -* Check whether the kernel itself conflicts with the target E820 map. -* Failing now is better than running into weird problems later due -* to relocating (and even reusing) pages with kernel text or data. -*/ -xen_chk_is_e820_usable (__pa_symbol (_text), -__pa_symbol (_end) -__pa_symbol (_text), -"kernel" ); - -/* -* Check for a conflict of the xen_start_info memory with the target -* E820 map. -*/ -xen_chk_is_e820_usable (__pa (xen_start_info),sizeof (*xen_start_info), -"xen_start_info" ); - -/* -* Check for a conflict of the hypervisor supplied page tables with -* the target E820 map. -*/ -xen_pt_check_e820 (); -xen_reserve_xen_mfnlist ();/* Check for a conflict of the initrd with the target E820 map. */
Greg Kroah-Hartman
maintainerPATCH 505/695 xen: allow mapping ACPI data using a different physical address
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Juergen Gross <[email protected]>
commit 9221222c717dbddac1e3c49906525475d87a3a44 upstream.
When running as a Xen PV dom0 the system needs to map ACPI data of the host using host physical addresses, while those addresses can conflict with the guest physical addresses of the loaded linux kernel. The same problem might apply in case a PV guest is configured to use the host memory map.
This conflict can be solved by mapping the ACPI data to a different guest physical address, but mapping the data via acpi_os_ioremap() must still be possible using the host physical address, as this address might be generated by AML when referencing some of the ACPI data.
When configured to support running as a Xen PV domain, have an implementation of acpi_os_ioremap() being aware of the possibility to need above mentioned translation of a host physical address to the guest physical address.
This modification requires to #include linux/acpi.h in some sources which need to include asm/acpi.h directly.
--- arch/x86/include/asm/acpi.h | 8 ++++++++ arch/x86/kernel/acpi/boot.c | 11 +++++++++++ arch/x86/kernel/jailhouse.c | 1 + arch/x86/kernel/mmconf-fam10h_64.c | 1 + arch/x86/kernel/smpboot.c | 1 + arch/x86/kernel/x86_init.c | 1 + arch/x86/xen/p2m.c | 35 +++++++++++++++++++++++++++++++++++ arch/x86/xen/setup.c | 2 +- 8 files changed, 59 insertions(+), 1 deletion(-)
arch/x86/include/asm/acpi.h +8 -0
@@ -174,6 +174,14 @@ void acpi_generic_reduced_hw_init(void);void x86_default_set_root_pointer (u64 addr);u64 x86_default_get_root_pointer (void ); +#ifdef CONFIG_XEN_PV +/* A Xen PV domain needs a special acpi_os_ioremap() handling. */ +extern void __iomem * (*acpi_os_ioremap)(acpi_physical_address phys, +acpi_size size); +void __iomem *x86_acpi_os_ioremap (acpi_physical_address phys,acpi_size size); +#define acpi_os_ioremap acpi_os_ioremap +#endif +#else /* !CONFIG_ACPI */ #define acpi_lapic 0
arch/x86/kernel/acpi/boot.c +11 -0
@@ -1778,3 +1778,14 @@ u64 x86_default_get_root_pointer(void) {return boot_params.acpi_rsdp_addr; } + +#ifdef CONFIG_XEN_PV +void __iomem *x86_acpi_os_ioremap (acpi_physical_address phys,acpi_size size) +{ +return ioremap_cache (phys, size); +} + +void __iomem * (*acpi_os_ioremap)(acpi_physical_address phys,acpi_size size) = + x86_acpi_os_ioremap; +EXPORT_SYMBOL_GPL (acpi_os_ioremap); +#endif
arch/x86/kernel/jailhouse.c +1 -0
@@ -12,6 +12,7 @@#include <linux/kernel.h> #include <linux/reboot.h> #include <linux/serial_8250.h> +#include <linux/acpi.h> #include <asm/apic.h> #include <asm/io_apic.h> #include <asm/acpi.h>
arch/x86/kernel/mmconf-fam10h_64.c +1 -0
@@ -9,6 +9,7 @@#include <linux/pci.h> #include <linux/dmi.h> #include <linux/range.h> +#include <linux/acpi.h> #include <asm/pci-direct.h> #include <linux/sort.h>
arch/x86/kernel/smpboot.c +1 -0
@@ -60,6 +60,7 @@#include <linux/stackprotector.h> #include <linux/cpuhotplug.h> #include <linux/mc146818rtc.h> +#include <linux/acpi.h> #include <asm/acpi.h> #include <asm/cacheinfo.h>
arch/x86/kernel/x86_init.c +1 -0
@@ -8,6 +8,7 @@#include <linux/ioport.h> #include <linux/export.h> #include <linux/pci.h> +#include <linux/acpi.h> #include <asm/acpi.h> #include <asm/bios_ebda.h>
arch/x86/xen/p2m.c +35 -0
@@ -70,6 +70,7 @@#include <linux/memblock.h> #include <linux/slab.h> #include <linux/vmalloc.h> +#include <linux/acpi.h> #include <asm/cache.h> #include <asm/setup.h>
@@ -834,6 +835,34 @@ void __init xen_do_remap_nonram(void)pr_info ("Remapped %u non-RAM page(s)\n" , remapped); } +#ifdef CONFIG_ACPI +/* +* Xen variant of acpi_os_ioremap() taking potentially remapped non-RAM +* regions into account. +* Any attempt to map an area crossing a remap boundary will produce a +* WARN() splat. +* phys is related to remap->maddr on input and will be rebased to remap->paddr. +*/ +static void __iomem *xen_acpi_os_ioremap (acpi_physical_address phys, +acpi_size size) +{ +unsigned int i; +const struct nonram_remap *remap = xen_nonram_remap; + +for (i =0 ; i < nr_nonram_remap; i++) { +if (phys + size > remap->maddr && + phys < remap->maddr + remap->size) { +WARN_ON (phys < remap->maddr || + phys + size > remap->maddr + remap->size); + phys += remap->paddr - remap->maddr; +break ; + } + } + +return x86_acpi_os_ioremap (phys, size); +} +#endif /* CONFIG_ACPI */ +/* * Add a new non-RAM remap entry. * In case of no free entry found, just crash the system.
@@ -848,6 +877,12 @@ void __init xen_add_remap_nonram(phys_adBUG (); } +#ifdef CONFIG_ACPI +/* Switch to the Xen acpi_os_ioremap() variant. */ +if (nr_nonram_remap ==0 ) + acpi_os_ioremap = xen_acpi_os_ioremap; +#endif + xen_nonram_remap[nr_nonram_remap].maddr = maddr; xen_nonram_remap[nr_nonram_remap].paddr = paddr; xen_nonram_remap[nr_nonram_remap].size = size;
arch/x86/xen/setup.c +1 -1
@@ -15,12 +15,12 @@#include <linux/cpuidle.h> #include <linux/cpufreq.h> #include <linux/memory_hotplug.h> +#include <linux/acpi.h> #include <asm/elf.h> #include <asm/vdso.h> #include <asm/e820/api.h> #include <asm/setup.h> -#include <asm/acpi.h> #include <asm/numa.h> #include <asm/idtentry.h> #include <asm/xen/hypervisor.h>
Greg Kroah-Hartman
maintainerPATCH 506/695 io_uring/sqpoll: retain test for whether the CPU is valid
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Axboe <[email protected]>
commit a09c17240bdf2e9fa6d0591afa9448b59785f7d4 upstream.
A recent commit ensured that SQPOLL cannot be setup with a CPU that isn't in the current tasks cpuset, but it also dropped testing whether the CPU is valid in the first place. Without that, if a task passes in a CPU value that is too high, the following KASAN splat can get triggered:
BUG: KASAN: stack-out-of-bounds in io_sq_offload_create+0x858/0xaa4 Read of size 8 at addr ffff800089bc7b90 by task wq-aff.t/1391 CPU: 4 UID: 1000 PID: 1391 Comm: wq-aff.t Not tainted 6.11.0-rc7-00227-g371c468f4db6 #7080 Hardware name: linux,dummy-virt (DT) Call trace: dump_backtrace.part.0+0xcc/0xe0 show_stack+0x14/0x1c dump_stack_lvl+0x58/0x74 print_report+0x16c/0x4c8 kasan_report+0x9c/0xe4 __asan_report_load8_noabort+0x1c/0x24 io_sq_offload_create+0x858/0xaa4 io_uring_setup+0x1394/0x17c4 __arm64_sys_io_uring_setup+0x6c/0x180 invoke_syscall+0x6c/0x260 el0_svc_common.constprop.0+0x158/0x224 do_el0_svc+0x3c/0x5c el0_svc+0x34/0x70 el0t_64_sync_handler+0x118/0x124 el0t_64_sync+0x168/0x16c The buggy address belongs to stack of task wq-aff.t/1391 and is located at offset 48 in frame: io_sq_offload_create+0x0/0xaa4
This frame has 1 object:
[32, 40) 'allowed_mask'
The buggy address belongs to the virtual mapping at
[ffff800089bc0000, ffff800089bc9000) created by:
kernel_clone+0x124/0x7e0
The buggy address belongs to the physical page:
page: refcount:1 mapcount:0 mapping:0000000000000000 index:0xffff0000d740af80 pfn:0x11740a
memcg:ffff0000c2706f02
flags: 0xbffe00000000000(node=0|zone=2|lastcpupid=0x1fff)
raw: 0bffe00000000000 0000000000000000 dead000000000122 0000000000000000
raw: ffff0000d740af80 0000000000000000 00000001ffffffff ffff0000c2706f02
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffff800089bc7a80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ffff800089bc7b00: 00 00 00 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1
>ffff800089bc7b80: 00 f3 f3 f3 00 00 00 00 00 00 00 00 00 00 00 00
^
ffff800089bc7c00: 00 00 00 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1
ffff800089bc7c80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f3--- io_uring/sqpoll.c | 2 ++ 1 file changed, 2 insertions(+)
io_uring/sqpoll.c +2 -0
@@ -465,6 +465,8 @@ __cold int io_sq_offload_create(struct iint cpu = p->sq_thread_cpu; ret = -EINVAL ; +if (cpu >= nr_cpu_ids || !cpu_online (cpu)) + goto err_sqpoll;cpuset_cpus_allowed (current, &allowed_mask);if (!cpumask_test_cpu (cpu, &allowed_mask)) goto err_sqpoll;
Greg Kroah-Hartman
maintainerPATCH 507/695 drm/amd/display: disable_hpo_dp_link_output: Check link_res->hpo_dp_link_enc before using it
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Hung <[email protected]>
commit d925c04d974c657d10471c0c2dba3bc9c7d994ee upstream.
[WHAT & HOW]
Functions dp_enable_link_phy and dp_disable_link_phy can pass link_res without initializing hpo_dp_link_enc and it is necessary to check for null before dereferencing.
This fixes 1 FORWARD_NULL issue reported by Coverity.
--- drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_hpo_dp.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_hpo_dp.c +5 -0
@@ -110,6 +110,11 @@ void enable_hpo_dp_link_output(struct dc enum clock_source_id clock_source, const struct dc_link_settings *link_settings) { +if (!link_res->hpo_dp_link_enc) { +DC_LOG_ERROR ("%s: invalid hpo_dp_link_enc\n" , __func__); +return ; + } +if (link->dc->res_pool->dccg->funcs->set_symclk32_le_root_clock_gating) link->dc->res_pool->dccg->funcs->set_symclk32_le_root_clock_gating( link->dc->res_pool->dccg,
Greg Kroah-Hartman
maintainerPATCH 508/695 drm/xe: fix engine_class bounds check again
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Auld <[email protected]>
commit 23ab1cb6591dba7c97b65eb407cd71147bd878b8 upstream.
This was fixed in commit b7dce525c4fc ("drm/xe/queue: fix engine_class bounds check"), but then re-introduced in commit 6f20fc09936e ("drm/xe:
Move and export xe_hw_engine lookup.") which should only be simple code movement of the existing function.
--- drivers/gpu/drm/xe/xe_hw_engine.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/xe/xe_hw_engine.c +1 -1
@@ -1153,7 +1153,7 @@ xe_hw_engine_lookup(struct xe_device *xe {unsigned int idx; -if (eci.engine_class >ARRAY_SIZE (user_to_xe_engine_class)) +if (eci.engine_class >=ARRAY_SIZE (user_to_xe_engine_class))return NULL ;if (eci.gt_id >= xe->info.gt_count)
Greg Kroah-Hartman
maintainerPATCH 509/695 io_uring/sqpoll: do not put cpumask on stack
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Moessbauer <[email protected]>
commit 7f44beadcc11adb98220556d2ddbe9c97aa6d42d upstream.
Putting the cpumask on the stack is deprecated for a long time (since 2d3854a37e8), as these can be big. Given that, change the on-stack allocation of allowed_mask to be dynamically allocated.
--- io_uring/sqpoll.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
io_uring/sqpoll.c +10 -3
@@ -461,15 +461,22 @@ __cold int io_sq_offload_create(struct ireturn 0 ;if (p->flags &IORING_SETUP_SQ_AFF ) { -struct cpumask allowed_mask; +cpumask_var_t allowed_mask;int cpu = p->sq_thread_cpu; ret = -EINVAL ;if (cpu >= nr_cpu_ids || !cpu_online (cpu)) goto err_sqpoll; -cpuset_cpus_allowed (current, &allowed_mask); -if (!cpumask_test_cpu (cpu, &allowed_mask)) + ret = -ENOMEM ; +if (!alloc_cpumask_var (&allowed_mask,GFP_KERNEL )) goto err_sqpoll; + ret = -EINVAL ; +cpuset_cpus_allowed (current, allowed_mask); +if (!cpumask_test_cpu (cpu, allowed_mask)) { +free_cpumask_var (allowed_mask); + goto err_sqpoll; + } +free_cpumask_var (allowed_mask); sqd->sq_cpu = cpu; }else { sqd->sq_cpu =-1 ;
Greg Kroah-Hartman
maintainerPATCH 510/695 selftests/bpf: correctly move log upon successful match
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eduard Zingerman <[email protected]>
commit d0a29cdb6ef95d8a175e09ab2d1334271f047e60 upstream.
Suppose log="foo bar buz" and msg->substr="bar".
In such case current match processing logic would update 'log' as
follows: log += strlen(msg->substr); -> log += 3 -> log=" bar". However, the intent behind the 'log' update is to make it point after the successful match, e.g. to make log=" buz" in the example above.
--- tools/testing/selftests/bpf/test_loader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/bpf/test_loader.c +1 -1
@@ -545,7 +545,7 @@ static void validate_msgs(char *log_buf,if (msg->substr) { match =strstr (log, msg->substr);if (match) - log +=strlen (msg->substr); + log = match +strlen (msg->substr); }else { err =regexec (&msg->regex, log,1 , reg_match,0 );if (err ==0 ) {
Greg Kroah-Hartman
maintainerPATCH 511/695 Remove *.orig pattern from .gitignore
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Laurent Pinchart <[email protected]>
commit 76be4f5a784533c71afbbb1b8f2963ef9e2ee258 upstream.
Commit 3f1b0e1f2875 (".gitignore update") added *.orig and *.rej patterns to .gitignore in v2.6.23. The commit message didn't give a rationale. Later on, commit 1f5d3a6b6532 ("Remove *.rej pattern from .gitignore") removed the *.rej pattern in v2.6.26, on the rationale that *.rej files indicated something went really wrong and should not be ignored.
The *.rej files are now shown by git status, which helps located conflicts when applying patches and lowers the probability that they will go unnoticed. It is however still easy to overlook the *.orig files which slowly polute the source tree. That's not as big of a deal as not noticing a conflict, but it's still not nice.
Drop the *.orig pattern from .gitignore to avoid this and help keep the source tree clean.
[[email protected]:
I do not have a strong opinion about this. Perhaps some people may have a different opinion.
If you are someone who wants to ignore *.orig, it is likely you would want to do so across all projects. Then, $XDG_CONFIG_HOME/git/ignore would be more suitable for your needs. gitignore(5) suggests, "Patterns which a user wants Git to ignore in all situations generally go into a file specified by core.excludesFile in the user's ~/.gitconfig".
Please note that you cannot do the opposite; if *.orig is ignored by the project's .gitignore, you cannot override the decision because $XDG_CONFIG_HOME/git/ignore has a lower priority.
If *.orig is sitting on the fence, I'd leave it to the users. ]
--- .gitignore | 1 - 1 file changed, 1 deletion(-)
.gitignore +0 -1
@@ -142,7 +142,6 @@ GTAGS # id-utils files ID -*.orig *~ \#*#
Greg Kroah-Hartman
maintainerPATCH 512/695 PCI: Revert to the original speed after PCIe failed link retraining
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej W. Rozycki <[email protected]>
commit f68dea13405c94381d08f42dbf0416261622bdad upstream.
When `pcie_failed_link_retrain' has failed to retrain the link by hand it leaves the link speed restricted to 2.5GT/s, which will then affect any device that has been plugged in later on, which may not suffer from the problem that caused the speed restriction to have been attempted. Consequently such a downstream device will suffer from an unnecessary communication throughput limitation and therefore performance loss.
Remove the speed restriction then and revert the Link Control 2 register to its original state if link retraining with the speed restriction in place has failed. Retrain the link again afterwards so as to remove any residual state, waiting on LT rather than DLLLA to avoid an excessive delay and ignoring the result as this training is supposed to fail anyway.
--- drivers/pci/quirks.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/pci/quirks.c +10 -1
@@ -66,7 +66,7 @@* apply this erratum workaround to any downstream ports as long as they * support Link Active reporting and have the Link Control 2 register. * Restrict the speed to 2.5GT/s then with the Target Link Speed field, -* request a retrain and wait 200ms for the data link to go up. +* request a retrain and check the result. * * If this turns out successful and we know by the Vendor:Device ID it is * safe to do so, then lift the restriction, letting the devices negotiate
@@ -74,6 +74,10 @@* firmware may have already arranged and lift it with ports that already * report their data link being up. * +* Otherwise revert the speed to the original setting and request a retrain +* again to remove any residual state, ignoring the result as it's supposed +* to fail anyway. +* * Return TRUE if the link has been successfully retrained, otherwise FALSE. */ bool pcie_failed_link_retrain (struct pci_dev *dev)
@@ -92,6 +96,8 @@ bool pcie_failed_link_retrain(struct pcipcie_capability_read_word (dev,PCI_EXP_LNKSTA , &lnksta);if ((lnksta & (PCI_EXP_LNKSTA_LBMS |PCI_EXP_LNKSTA_DLLLA )) ==PCI_EXP_LNKSTA_LBMS ) { +u16 oldlnkctl2 = lnkctl2; +pci_info (dev,"broken device, retraining non-functional downstream link at 2.5GT/s\n" ); lnkctl2 &= ~PCI_EXP_LNKCTL2_TLS ;
@@ -100,6 +106,9 @@ bool pcie_failed_link_retrain(struct pciif (pcie_retrain_link (dev, false)) {pci_info (dev,"retraining failed\n" ); +pcie_capability_write_word (dev,PCI_EXP_LNKCTL2 , + oldlnkctl2); +pcie_retrain_link (dev, true);return false; }
Greg Kroah-Hartman
maintainerPATCH 513/695 PCI: Clear the LBMS bit after a link retrain
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej W. Rozycki <[email protected]>
commit 8037ac08c2bbb3186f83a5a924f52d1048dbaec5 upstream.
The LBMS bit, where implemented, is set by hardware either in response to the completion of retraining caused by writing 1 to the Retrain Link bit or whenever hardware has changed the link speed or width in attempt to correct unreliable link operation. It is never cleared by hardware other than by software writing 1 to the bit position in the Link Status register and we never do such a write.
We currently have two places, namely apply_bad_link_workaround() and pcie_failed_link_retrain() in drivers/pci/controller/dwc/pcie-tegra194.c and drivers/pci/quirks.c respectively where we check the state of the LBMS bit and neither is interested in the state of the bit resulting from the completion of retraining, both check for a link fault.
And in particular pcie_failed_link_retrain() causes issues consequently, by trying to retrain a link where there's no downstream device anymore and the state of 1 in the LBMS bit has been retained from when there was a device downstream that has since been removed.
Clear the LBMS bit then at the conclusion of pcie_retrain_link(), so that we have a single place that controls it and that our code can track link speed or width changes resulting from unreliable link operation.
--- drivers/pci/pci.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/pci/pci.c +9 -1
@@ -4718,7 +4718,15 @@ int pcie_retrain_link(struct pci_dev *pdpcie_capability_clear_word (pdev,PCI_EXP_LNKCTL ,PCI_EXP_LNKCTL_RL ); } -return pcie_wait_for_link_status (pdev, use_lt, !use_lt); + rc =pcie_wait_for_link_status (pdev, use_lt, !use_lt); + +/* +* Clear LBMS after a manual retrain so that the bit can be used +* to track link speed or width changes made by hardware itself +* in attempt to correct unreliable link operation. +*/ +pcie_capability_write_word (pdev,PCI_EXP_LNKSTA ,PCI_EXP_LNKSTA_LBMS ); +return rc; }/**
Greg Kroah-Hartman
maintainerPATCH 514/695 PCI: dra7xx: Fix threaded IRQ request for "dra7xx-pcie-main" IRQ
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Siddharth Vadapalli <[email protected]>
commit 03f84b3baba7836bdfc162c19288d5ce1aa92890 upstream.
Commit da87d35a6e51 ("PCI: dra7xx: Use threaded IRQ handler for "dra7xx-pcie-main" IRQ") switched from devm_request_irq() to devm_request_threaded_irq() for the "dra7xx-pcie-main" interrupt.
Since the primary handler was set to NULL, the "IRQF_ONESHOT" flag should have also been set. Fix this.
--- drivers/pci/controller/dwc/pci-dra7xx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/pci/controller/dwc/pci-dra7xx.c +2 -1
@@ -850,7 +850,8 @@ static int dra7xx_pcie_probe(struct plat dra7xx->mode = mode; ret =devm_request_threaded_irq (dev, irq,NULL , dra7xx_pcie_irq_handler, -IRQF_SHARED ,"dra7xx-pcie-main" , dra7xx); +IRQF_SHARED |IRQF_ONESHOT , +"dra7xx-pcie-main" , dra7xx);if (ret) {dev_err (dev,"failed to request irq\n" ); goto err_gpio;
Greg Kroah-Hartman
maintainerPATCH 515/695 PCI: imx6: Fix missing call to phy_power_off() in error handling
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Li <[email protected]>
commit 5b04d44d5c74e4d8aab1678496b84700b4b343fe upstream.
Fix missing call to phy_power_off() in the error path of imx6_pcie_host_init(). Remove unnecessary check for imx6_pcie->phy as the PHY API already handles NULL pointers.
--- drivers/pci/controller/dwc/pci-imx6.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/pci/controller/dwc/pci-imx6.c +4 -3
@@ -953,7 +953,7 @@ static int imx6_pcie_host_init(struct dw ret =phy_power_on (imx6_pcie->phy);if (ret) {dev_err (dev,"waiting for PHY ready timeout!\n" ); - goto err_phy_off; + goto err_phy_exit; } }
@@ -968,8 +968,9 @@ static int imx6_pcie_host_init(struct dwreturn 0 ; err_phy_off: -if (imx6_pcie->phy) -phy_exit (imx6_pcie->phy); +phy_power_off (imx6_pcie->phy); +err_phy_exit: +phy_exit (imx6_pcie->phy); err_clk_disable:imx6_pcie_clk_disable (imx6_pcie); err_reg_disable:
Greg Kroah-Hartman
maintainerPATCH 516/695 PCI: imx6: Fix establish link failure in EP mode for i.MX8MM and i.MX8MP
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Zhu <[email protected]>
commit 5214ff221a14cadab1e2ee29499750fd5e884feb upstream.
Add IMX6_PCIE_FLAG_HAS_APP_RESET flag to IMX8MM_EP and IMX8MP_EP drvdata.
This flag was overlooked during code restructuring. It is crucial to release the app-reset from the System Reset Controller before initiating LTSSM to rectify the issue.
--- drivers/pci/controller/dwc/pci-imx6.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/pci/controller/dwc/pci-imx6.c +4 -2
@@ -1563,7 +1563,8 @@ static const struct imx6_pcie_drvdata dr }, [IMX8MM_EP] = { .variant = IMX8MM_EP, - .flags = IMX6_PCIE_FLAG_HAS_PHYDRV, + .flags =IMX6_PCIE_FLAG_HAS_APP_RESET | + IMX6_PCIE_FLAG_HAS_PHYDRV, .mode = DW_PCIE_EP_TYPE, .gpr = "fsl,imx8mm-iomuxc-gpr", .clk_names = imx8mm_clks,
@@ -1574,7 +1575,8 @@ static const struct imx6_pcie_drvdata dr }, [IMX8MP_EP] = { .variant = IMX8MP_EP, - .flags = IMX6_PCIE_FLAG_HAS_PHYDRV, + .flags =IMX6_PCIE_FLAG_HAS_APP_RESET | + IMX6_PCIE_FLAG_HAS_PHYDRV, .mode = DW_PCIE_EP_TYPE, .gpr = "fsl,imx8mp-iomuxc-gpr", .clk_names = imx8mm_clks,
Greg Kroah-Hartman
maintainerPATCH 517/695 PCI: imx6: Fix i.MX8MP PCIe EPs occasional failure to trigger MSI
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Zhu <[email protected]>
commit 5cb3aa92c7cf182940ae575c3f450d3708af087c upstream.
Correct occasional MSI triggering failures in i.MX8MP PCIe EP by applying the correct hardware outbound alignment requirement.
The i.MX platform has a restriction about outbound address translation. The pci-epc-mem uses page_size to manage it. Set the correct page_size for i.MX platform to meet the hardware requirement, which is the same as inbound address alignment.
Thus, align it with epc_features::align.
--- drivers/pci/controller/dwc/pci-imx6.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/pci/controller/dwc/pci-imx6.c +2 -0
@@ -1114,6 +1114,8 @@ static int imx6_add_pcie_ep(struct imx6_if (imx6_check_flag (imx6_pcie,IMX6_PCIE_FLAG_SUPPORT_64BIT ))dma_set_mask_and_coherent (dev,DMA_BIT_MASK (64 )); + ep->page_size = imx6_pcie->drvdata->epc_features->align; + ret =dw_pcie_ep_init (ep);if (ret) {dev_err (dev,"failed to initialize endpoint\n" );
Greg Kroah-Hartman
maintainerPATCH 518/695 PCI: Correct error reporting with PCIe failed link retraining
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej W. Rozycki <[email protected]>
commit 712e49c967064a3a7a5738c6f65ac540a3f6a1df upstream.
Only return successful completion status from pcie_failed_link_retrain() if retraining has actually been done, preventing excessive delays from being triggered at call sites in a hope that communication will finally be established with the downstream device where in fact nothing has been done about the link in question that would justify such a hope.
--- drivers/pci/quirks.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/pci/quirks.c +8 -4
@@ -78,7 +78,8 @@* again to remove any residual state, ignoring the result as it's supposed * to fail anyway. * -* Return TRUE if the link has been successfully retrained, otherwise FALSE. +* Return TRUE if the link has been successfully retrained. Return FALSE +* if retraining was not needed or we attempted a retrain and it failed. */ bool pcie_failed_link_retrain (struct pci_dev *dev) {
@@ -87,6 +88,7 @@ bool pcie_failed_link_retrain(struct pci {} };u16 lnksta, lnkctl2; +bool ret = false;if (!pci_is_pcie (dev) || !pcie_downstream_port (dev) || !pcie_cap_has_lnkctl2 (dev) || !dev->link_active_reporting)
@@ -104,7 +106,8 @@ bool pcie_failed_link_retrain(struct pci lnkctl2 |=PCI_EXP_LNKCTL2_TLS_2_5GT ;pcie_capability_write_word (dev,PCI_EXP_LNKCTL2 , lnkctl2); -if (pcie_retrain_link (dev, false)) { + ret =pcie_retrain_link (dev, false) ==0 ; +if (!ret) {pci_info (dev,"retraining failed\n" );pcie_capability_write_word (dev,PCI_EXP_LNKCTL2 , oldlnkctl2);
@@ -126,13 +129,14 @@ bool pcie_failed_link_retrain(struct pci lnkctl2 |= lnkcap &PCI_EXP_LNKCAP_SLS ;pcie_capability_write_word (dev,PCI_EXP_LNKCTL2 , lnkctl2); -if (pcie_retrain_link (dev, false)) { + ret =pcie_retrain_link (dev, false) ==0 ; +if (!ret) {pci_info (dev,"retraining failed\n" );return false; } } -return true; +return ret; } static ktime_t fixup_debug_start(struct pci_dev *dev,
Greg Kroah-Hartman
maintainerPATCH 519/695 PCI: Use an error code with PCIe failed link retraining
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej W. Rozycki <[email protected]>
commit 59100eb248c0b15585affa546c7f6834b30eb5a4 upstream.
Given how the call place in pcie_wait_for_link_delay() got structured now, and that pcie_retrain_link() returns a potentially useful error code, convert pcie_failed_link_retrain() to return an error code rather than a boolean status, fixing handling at the call site mentioned. Update the other call site accordingly.
--- drivers/pci/pci.c | 2 +- drivers/pci/pci.h | 6 +++--- drivers/pci/quirks.c | 20 ++++++++++---------- 3 files changed, 14 insertions(+), 14 deletions(-)
drivers/pci/pci.c +1 -1
@@ -1324,7 +1324,7 @@ static int pci_dev_wait(struct pci_dev *if (delay >PCI_RESET_WAIT ) {if (retrain) { retrain = false; -if (pcie_failed_link_retrain (bridge)) { +if (pcie_failed_link_retrain (bridge) ==0 ) { delay =1 ;continue ; }
drivers/pci/pci.h +3 -3
@@ -606,7 +606,7 @@ void pci_acs_init(struct pci_dev *dev);int pci_dev_specific_acs_enabled (struct pci_dev *dev,u16 acs_flags);int pci_dev_specific_enable_acs (struct pci_dev *dev);int pci_dev_specific_disable_acs_redir (struct pci_dev *dev); -bool pcie_failed_link_retrain (struct pci_dev *dev); +int pcie_failed_link_retrain (struct pci_dev *dev);#else static inline int pci_dev_specific_acs_enabled (struct pci_dev *dev,u16 acs_flags)
@@ -621,9 +621,9 @@ static inline int pci_dev_specific_disab {return -ENOTTY ; } -static inline bool pcie_failed_link_retrain (struct pci_dev *dev) +static inline int pcie_failed_link_retrain (struct pci_dev *dev) { -return false; +return -ENOTTY ; }#endif
drivers/pci/quirks.c +10 -10
@@ -78,21 +78,21 @@* again to remove any residual state, ignoring the result as it's supposed * to fail anyway. * -* Return TRUE if the link has been successfully retrained. Return FALSE +* Return 0 if the link has been successfully retrained. Return an error * if retraining was not needed or we attempted a retrain and it failed. */ -bool pcie_failed_link_retrain (struct pci_dev *dev) +int pcie_failed_link_retrain (struct pci_dev *dev) {static const struct pci_device_id ids[] = { {PCI_VDEVICE (ASMEDIA ,0x2824 ) },/* ASMedia ASM2824 */ {} };u16 lnksta, lnkctl2; -bool ret = false; +int ret = -ENOTTY ;if (!pci_is_pcie (dev) || !pcie_downstream_port (dev) || !pcie_cap_has_lnkctl2 (dev) || !dev->link_active_reporting) -return false; +return ret;pcie_capability_read_word (dev,PCI_EXP_LNKCTL2 , &lnkctl2);pcie_capability_read_word (dev,PCI_EXP_LNKSTA , &lnksta);
@@ -106,13 +106,13 @@ bool pcie_failed_link_retrain(struct pci lnkctl2 |=PCI_EXP_LNKCTL2_TLS_2_5GT ;pcie_capability_write_word (dev,PCI_EXP_LNKCTL2 , lnkctl2); - ret =pcie_retrain_link (dev, false) ==0 ; -if (!ret) { + ret =pcie_retrain_link (dev, false); +if (ret) {pci_info (dev,"retraining failed\n" );pcie_capability_write_word (dev,PCI_EXP_LNKCTL2 , oldlnkctl2);pcie_retrain_link (dev, true); -return false; +return ret; }pcie_capability_read_word (dev,PCI_EXP_LNKSTA , &lnksta);
@@ -129,10 +129,10 @@ bool pcie_failed_link_retrain(struct pci lnkctl2 |= lnkcap &PCI_EXP_LNKCAP_SLS ;pcie_capability_write_word (dev,PCI_EXP_LNKCTL2 , lnkctl2); - ret =pcie_retrain_link (dev, false) ==0 ; -if (!ret) { + ret =pcie_retrain_link (dev, false); +if (ret) {pci_info (dev,"retraining failed\n" ); -return false; +return ret; } }
Greg Kroah-Hartman
maintainerPATCH 520/695 PCI: xilinx-nwl: Fix off-by-one in INTx IRQ handler
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Anderson <[email protected]>
commit 0199d2f2bd8cd97b310f7ed82a067247d7456029 upstream.
MSGF_LEG_MASK is laid out with INTA in bit 0, INTB in bit 1, INTC in bit 2, and INTD in bit 3. Hardware IRQ numbers start at 0, and we register PCI_NUM_INTX IRQs. So to enable INTA (aka hwirq 0) we should set bit 0. Remove the subtraction of one.
This bug would cause INTx interrupts not to be delivered, as enabling INTB would actually enable INTA, and enabling INTA wouldn't enable anything at all. It is likely that this got overlooked for so long since most PCIe hardware uses MSIs. This fixes the following UBSAN error:
UBSAN: shift-out-of-bounds in ../drivers/pci/controller/pcie-xilinx-nwl.c:389:11 shift exponent 18446744073709551615 is too large for 32-bit type 'int' CPU: 1 PID: 61 Comm: kworker/u10:1 Not tainted 6.6.20+ #268 Hardware name: xlnx,zynqmp (DT) Workqueue: events_unbound deferred_probe_work_func Call trace: dump_backtrace (arch/arm64/kernel/stacktrace.c:235) show_stack (arch/arm64/kernel/stacktrace.c:242) dump_stack_lvl (lib/dump_stack.c:107) dump_stack (lib/dump_stack.c:114) __ubsan_handle_shift_out_of_bounds (lib/ubsan.c:218 lib/ubsan.c:387) nwl_unmask_leg_irq (drivers/pci/controller/pcie-xilinx-nwl.c:389 (discriminator 1)) irq_enable (kernel/irq/internals.h:234 kernel/irq/chip.c:170 kernel/irq/chip.c:439 kernel/irq/chip.c:432 kernel/irq/chip.c:345) __irq_startup (kernel/irq/internals.h:239 kernel/irq/chip.c:180 kernel/irq/chip.c:250) irq_startup (kernel/irq/chip.c:270) __setup_irq (kernel/irq/manage.c:1800) request_threaded_irq (kernel/irq/manage.c:2206) pcie_pme_probe (include/linux/interrupt.h:168 drivers/pci/pcie/pme.c:348)
--- drivers/pci/controller/pcie-xilinx-nwl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/pci/controller/pcie-xilinx-nwl.c +2 -2
@@ -371,7 +371,7 @@ static void nwl_mask_intx_irq(struct irqu32 mask;u32 val; - mask =1 << (data->hwirq -1 ); + mask =1 << data->hwirq;raw_spin_lock_irqsave (&pcie->leg_mask_lock, flags); val =nwl_bridge_readl (pcie,MSGF_LEG_MASK );nwl_bridge_writel (pcie, (val & (~mask)),MSGF_LEG_MASK );
@@ -385,7 +385,7 @@ static void nwl_unmask_intx_irq(struct iu32 mask;u32 val; - mask =1 << (data->hwirq -1 ); + mask =1 << data->hwirq;raw_spin_lock_irqsave (&pcie->leg_mask_lock, flags); val =nwl_bridge_readl (pcie,MSGF_LEG_MASK );nwl_bridge_writel (pcie, (val | mask),MSGF_LEG_MASK );
Greg Kroah-Hartman
maintainerPATCH 521/695 PCI: dra7xx: Fix error handling when IRQ request fails in probe
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Siddharth Vadapalli <[email protected]>
commit 4d60f6d4b8fa4d7bad4aeb2b3ee5c10425bc60a4 upstream.
Commit d4c7d1a089d6 ("PCI: dwc: dra7xx: Push request_irq() call to the bottom of probe") moved the IRQ request for "dra7xx-pcie-main" towards the end of dra7xx_pcie_probe().
However, the error handling does not take into account the initialization performed by either dra7xx_add_pcie_port() or dra7xx_add_pcie_ep(), depending on the mode of operation.
Fix the error handling to address this.
--- drivers/pci/controller/dwc/pci-dra7xx.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/pci/controller/dwc/pci-dra7xx.c +7 -1
@@ -854,11 +854,17 @@ static int dra7xx_pcie_probe(struct plat "dra7xx-pcie-main", dra7xx);if (ret) {dev_err (dev,"failed to request irq\n" ); - goto err_gpio; + goto err_deinit; }return 0 ; +err_deinit: +if (dra7xx->mode ==DW_PCIE_RC_TYPE ) +dw_pcie_host_deinit (&dra7xx->pci->pp); +else +dw_pcie_ep_deinit (&dra7xx->pci->ep); + err_gpio: err_get_sync:pm_runtime_put (dev);
Greg Kroah-Hartman
maintainerPATCH 522/695 Revert "soc: qcom: smd-rpm: Match rpmsg channel instead of compatible"
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
commit b17155133391d7f6dd18d3fb94a7d492fdec18fa upstream.
The rpm_requests device nodes have the compatible node. As such the rpmsg core uses OF modalias instead of a native rpmsg modalias. Thus if smd-rpm is built as a module, it doesn't get autoloaded for the device.
Revert the commit bcabe1e09135 ("soc: qcom: smd-rpm: Match rpmsg channel instead of compatible")
--- drivers/soc/qcom/smd-rpm.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-)
drivers/soc/qcom/smd-rpm.c +26 -9
@@ -196,9 +196,6 @@ static int qcom_smd_rpm_probe(struct rpm {struct qcom_smd_rpm *rpm; -if (!rpdev->dev.of_node) -return -EINVAL ; - rpm =devm_kzalloc (&rpdev->dev,sizeof (*rpm),GFP_KERNEL );if (!rpm)return -ENOMEM ;
@@ -218,18 +215,38 @@ static void qcom_smd_rpm_remove(struct rof_platform_depopulate (&rpdev->dev); } -static const struct rpmsg_device_id qcom_smd_rpm_id_table[] = { - { .name ="rpm_requests" , }, - {/* sentinel */ } +static const struct of_device_id qcom_smd_rpm_of_match[] = { + { .compatible ="qcom,rpm-apq8084" }, + { .compatible ="qcom,rpm-ipq6018" }, + { .compatible ="qcom,rpm-ipq9574" }, + { .compatible ="qcom,rpm-msm8226" }, + { .compatible ="qcom,rpm-msm8909" }, + { .compatible ="qcom,rpm-msm8916" }, + { .compatible ="qcom,rpm-msm8936" }, + { .compatible ="qcom,rpm-msm8953" }, + { .compatible ="qcom,rpm-msm8974" }, + { .compatible ="qcom,rpm-msm8976" }, + { .compatible ="qcom,rpm-msm8994" }, + { .compatible ="qcom,rpm-msm8996" }, + { .compatible ="qcom,rpm-msm8998" }, + { .compatible ="qcom,rpm-sdm660" }, + { .compatible ="qcom,rpm-sm6115" }, + { .compatible ="qcom,rpm-sm6125" }, + { .compatible ="qcom,rpm-sm6375" }, + { .compatible ="qcom,rpm-qcm2290" }, + { .compatible ="qcom,rpm-qcs404" }, + {} }; -MODULE_DEVICE_TABLE (rpmsg, qcom_smd_rpm_id_table); +MODULE_DEVICE_TABLE (of, qcom_smd_rpm_of_match);static struct rpmsg_driver qcom_smd_rpm_driver = { .probe = qcom_smd_rpm_probe, .remove = qcom_smd_rpm_remove, .callback = qcom_smd_rpm_callback, - .id_table = qcom_smd_rpm_id_table, - .drv.name ="qcom_smd_rpm" , + .drv = { + .name ="qcom_smd_rpm" , + .of_match_table = qcom_smd_rpm_of_match, + }, };static int __init qcom_smd_rpm_init (void )
Greg Kroah-Hartman
maintainerPATCH 523/695 ASoC: rt5682: Return devm_of_clk_add_hw_provider to transfer the error
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ma Ke <[email protected]>
commit fcca6d05ef49d5650514ea1dcfd12e4ae3ff2be6 upstream.
Return devm_of_clk_add_hw_provider() in order to transfer the error, if it fails due to resource allocation failure or device tree clock provider registration failure.
--- sound/soc/codecs/rt5682.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
sound/soc/codecs/rt5682.c +3 -1
@@ -2903,8 +2903,10 @@ int rt5682_register_dai_clks(struct rt56 }if (dev->of_node) { -devm_of_clk_add_hw_provider (dev, of_clk_hw_simple_get, + ret =devm_of_clk_add_hw_provider (dev, of_clk_hw_simple_get, dai_clk_hw); +if (ret) +return ret; }else { ret = devm_clk_hw_register_clkdev(dev, dai_clk_hw, init.name,
Greg Kroah-Hartman
maintainerPATCH 524/695 soc: fsl: cpm1: qmc: Update TRNSYNC only in transparent mode
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herve Codina <[email protected]>
commit c3cc3e69b33fee3d276895e0e2d1a8fb37ea5d0e upstream.
The TRNSYNC feature is available (and enabled) only in transparent mode.
Since commit 7cc9bda9c163 ("soc: fsl: cpm1: qmc: Handle timeslot entries at channel start() and stop()") TRNSYNC register is updated in transparent and hdlc mode. In hdlc mode, the address of the TRNSYNC register is used by the QMC for other internal purpose. Even if no weird results were observed in hdlc mode, touching this register in this mode is wrong.
Update TRNSYNC only in transparent mode.
--- drivers/soc/fsl/qe/qmc.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-)
drivers/soc/fsl/qe/qmc.c +14 -10
@@ -940,11 +940,13 @@ static int qmc_chan_start_rx(struct qmc_ goto end; } - ret =qmc_setup_chan_trnsync (chan->qmc, chan); -if (ret) { -dev_err (chan->qmc->dev,"chan %u: setup TRNSYNC failed (%d)\n" , - chan->id, ret); - goto end; +if (chan->mode ==QMC_TRANSPARENT ) { + ret =qmc_setup_chan_trnsync (chan->qmc, chan); +if (ret) { +dev_err (chan->qmc->dev,"chan %u: setup TRNSYNC failed (%d)\n" , + chan->id, ret); + goto end; + } }/* Restart the receiver */
@@ -982,11 +984,13 @@ static int qmc_chan_start_tx(struct qmc_ goto end; } - ret =qmc_setup_chan_trnsync (chan->qmc, chan); -if (ret) { -dev_err (chan->qmc->dev,"chan %u: setup TRNSYNC failed (%d)\n" , - chan->id, ret); - goto end; +if (chan->mode ==QMC_TRANSPARENT ) { + ret =qmc_setup_chan_trnsync (chan->qmc, chan); +if (ret) { +dev_err (chan->qmc->dev,"chan %u: setup TRNSYNC failed (%d)\n" , + chan->id, ret); + goto end; + } }/*
Greg Kroah-Hartman
maintainerPATCH 525/695 soc: fsl: cpm1: tsa: Fix tsa_write8()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herve Codina <[email protected]>
commit 47a347bae9a491b467ab3543e4725a3e4fbe30f5 upstream.
The tsa_write8() parameter is an u32 value. This is not consistent with the function itself. Indeed, tsa_write8() writes an 8bits value.
Be consistent and use an u8 parameter value.
--- drivers/soc/fsl/qe/tsa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/soc/fsl/qe/tsa.c +1 -1
@@ -140,7 +140,7 @@ static inline void tsa_write32(void __ioiowrite32be (val, addr); } -static inline void tsa_write8 (void __iomem *addr,u32 val) +static inline void tsa_write8 (void __iomem *addr,u8 val) {iowrite8 (val, addr); }
Greg Kroah-Hartman
maintainerPATCH 526/695 soc: versatile: integrator: fix OF node leak in probe() error path
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
commit 874c5b601856adbfda10846b9770a6c66c41e229 upstream.
Driver is leaking OF node reference obtained fromof_find_matching_node().
--- drivers/soc/versatile/soc-integrator.c | 1 + 1 file changed, 1 insertion(+)
drivers/soc/versatile/soc-integrator.c +1 -0
@@ -113,6 +113,7 @@ static int __init integrator_soc_init(voreturn -ENODEV ; syscon_regmap =syscon_node_to_regmap (np); +of_node_put (np);if (IS_ERR (syscon_regmap))return PTR_ERR (syscon_regmap);
Greg Kroah-Hartman
maintainerPATCH 527/695 Revert "media: tuners: fix error return code of hybrid_tuner_request_state()"
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roman Smirnov <[email protected]>
commit e25cc4be4616fcf5689622b3226d648aab253cdb upstream.
This reverts commit b9302fa7ed979e84b454e4ca92192cf485a4ed41.
As Fedor Pchelkin pointed out, this commit violates the convention of using the macro return value, which causes errors. For example, in functions tda18271_attach(), xc5000_attach(), simple_tuner_attach().
--- drivers/media/tuners/tuner-i2c.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/media/tuners/tuner-i2c.h +1 -3
@@ -133,10 +133,8 @@ static inline int tuner_i2c_xfer_send_re } \if (0 == __ret) { \ state =kzalloc (sizeof (type),GFP_KERNEL ); \ -if (!state) { \ - __ret = -ENOMEM ; \ +if (NULL == state) \ goto __fail; \ - } \ state->i2c_props.addr = i2caddr; \ state->i2c_props.adap = i2cadap; \ state->i2c_props.name = devname; \
Greg Kroah-Hartman
maintainerPATCH 528/695 iommu/amd: Fix argument order in amd_iommu_dev_flush_pasid_all()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eliav Bar-ilan <[email protected]>
commit 8386207f37e98453e1de3f51e50eeeea089103f9 upstream.
An incorrect argument order calling amd_iommu_dev_flush_pasid_pages() causes improper flushing of the IOMMU, leaving the old value of GCR3 from a previous process attached to the same PASID.
The function has the signature:
void amd_iommu_dev_flush_pasid_pages(struct iommu_dev_data *dev_data,
ioasid_t pasid, u64 address, size_t size)
Correct the argument order.
--- drivers/iommu/amd/iommu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/iommu/amd/iommu.c +2 -2
@@ -1550,8 +1550,8 @@ void amd_iommu_dev_flush_pasid_pages(strvoid amd_iommu_dev_flush_pasid_all (struct iommu_dev_data *dev_data,ioasid_t pasid) { -amd_iommu_dev_flush_pasid_pages (dev_data,0 , -CMD_INV_IOMMU_ALL_PAGES_ADDRESS , pasid); +amd_iommu_dev_flush_pasid_pages (dev_data, pasid,0 , +CMD_INV_IOMMU_ALL_PAGES_ADDRESS ); }void amd_iommu_domain_flush_complete (struct protection_domain *domain)
Greg Kroah-Hartman
maintainerPATCH 529/695 iommufd: Protect against overflow of ALIGN() during iova allocation
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
commit 8f6887349b2f829a4121c518aeb064fc922714e4 upstream.
Userspace can supply an iova and uptr such that the target iova alignment becomes really big and ALIGN() overflows which corrupts the selected area range during allocation. CONFIG_IOMMUFD_TEST can detect this:
WARNING: CPU: 1 PID: 5092 at drivers/iommu/iommufd/io_pagetable.c:268 iopt_alloc_area_pages drivers/iommu/iommufd/io_pagetable.c:268 [inline]
WARNING: CPU: 1 PID: 5092 at drivers/iommu/iommufd/io_pagetable.c:268 iopt_map_pages+0xf95/0x1050 drivers/iommu/iommufd/io_pagetable.c:352
Modules linked in:
CPU: 1 PID: 5092 Comm: syz-executor294 Not tainted 6.10.0-rc5-syzkaller-00294-g3ffea9a7a6f7 #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 06/07/2024
RIP: 0010:iopt_alloc_area_pages drivers/iommu/iommufd/io_pagetable.c:268 [inline]
RIP: 0010:iopt_map_pages+0xf95/0x1050 drivers/iommu/iommufd/io_pagetable.c:352
Code: fc e9 a4 f3 ff ff e8 1a 8b 4c fc 41 be e4 ff ff ff e9 8a f3 ff ff e8 0a 8b 4c fc 90 0f 0b 90 e9 37 f5 ff ff e8 fc 8a 4c fc 90 <0f> 0b 90 e9 68 f3 ff ff 48 c7 c1 ec 82 ad 8f 80 e1 07 80 c1 03 38
RSP: 0018:ffffc90003ebf9e0 EFLAGS: 00010293
RAX: ffffffff85499fa4 RBX: 00000000ffffffef RCX: ffff888079b49e00
RDX: 0000000000000000 RSI: 00000000ffffffef RDI: 0000000000000000
RBP: ffffc90003ebfc50 R08: ffffffff85499b30 R09: ffffffff85499942
R10: 0000000000000002 R11: ffff888079b49e00 R12: ffff8880228e0010
R13: 0000000000000000 R14: 1ffff920007d7f68 R15: ffffc90003ebfd00
FS: 000055557d760380(0000) GS:ffff8880b9500000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00000000005fdeb8 CR3: 000000007404a000 CR4: 00000000003506f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
<TASK>
iommufd_ioas_copy+0x610/0x7b0 drivers/iommu/iommufd/ioas.c:274
iommufd_fops_ioctl+0x4d9/0x5a0 drivers/iommu/iommufd/main.c:421
vfs_ioctl fs/ioctl.c:51 [inline]
__do_sys_ioctl fs/ioctl.c:907 [inline]
__se_sys_ioctl+0xfc/0x170 fs/ioctl.c:893
do_syscall_x64 arch/x86/entry/common.c:52 [inline]
do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83
entry_SYSCALL_64_after_hwframe+0x77/0x7fCap the automatic alignment to the huge page size, which is probably a better idea overall. Huge automatic alignments can fragment and chew up the available IOVA space without any reason.
--- drivers/iommu/iommufd/io_pagetable.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/iommu/iommufd/io_pagetable.c +8 -0
@@ -112,6 +112,7 @@ static int iopt_alloc_iova(struct io_pagunsigned long page_offset = uptr %PAGE_SIZE ;struct interval_tree_double_span_iter used_span;struct interval_tree_span_iter allowed_span; +unsigned long max_alignment =PAGE_SIZE ;unsigned long iova_alignment;lockdep_assert_held (&iopt->iova_rwsem);
@@ -131,6 +132,13 @@ static int iopt_alloc_iova(struct io_pagroundup_pow_of_two (length), 1UL << __ffs64(uptr)); +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + max_alignment =HPAGE_SIZE ; +#endif +/* Protect against ALIGN() overflow */ +if (iova_alignment >= max_alignment) + iova_alignment = max_alignment; +if (iova_alignment < iopt->iova_alignment)return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 530/695 Input: adp5588-keys - fix check on return code
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nuno Sa <[email protected]>
commit eb017f4ea13b1a5ad7f4332279f2e4c67b44bdea upstream.
During adp5588_setup(), we read all the events to clear the event FIFO. However, adp5588_read() just calls i2c_smbus_read_byte_data() which returns the byte read in case everything goes well. Hence, we need to explicitly check for a negative error code instead of checking for something different than 0.
--- drivers/input/keyboard/adp5588-keys.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/input/keyboard/adp5588-keys.c +1 -1
@@ -627,7 +627,7 @@ static int adp5588_setup(struct adp5588_for (i =0 ; i <KEYP_MAX_EVENT ; i++) { ret =adp5588_read (client,KEY_EVENTA ); -if (ret) +if (ret <0 )return ret; }
Greg Kroah-Hartman
maintainerPATCH 531/695 Input: i8042 - add TUXEDO Stellaris 16 Gen5 AMD to i8042 quirk table
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Werner Sembach <[email protected]>
commit e06edf96dea065dd1d9df695bf8b92784992333e upstream.
Some TongFang barebones have touchpad and/or keyboard issues after suspend, fixable with nomux + reset + noloop + nopnp. Luckily, none of them have an external PS/2 port so this can safely be set for all of them.
I'm not entirely sure if every device listed really needs all four quirks, but after testing and production use, no negative effects could be observed when setting all four.
--- drivers/input/serio/i8042-acpipnpio.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
drivers/input/serio/i8042-acpipnpio.h +23 -0
@@ -1121,6 +1121,29 @@ static const struct dmi_system_id i8042_ .driver_data = (void *)(SERIO_QUIRK_NOLOOP) },/* +* Some TongFang barebones have touchpad and/or keyboard issues after +* suspend fixable with nomux + reset + noloop + nopnp. Luckily, none of +* them have an external PS/2 port so this can safely be set for all of +* them. +* TongFang barebones come with board_vendor and/or system_vendor set to +* a different value for each individual reseller. The only somewhat +* universal way to identify them is by board_name. +*/ + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "GM6XGxX"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_RESET_ALWAYS | +SERIO_QUIRK_NOLOOP |SERIO_QUIRK_NOPNP ) + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "GMxXGxX"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_RESET_ALWAYS | +SERIO_QUIRK_NOLOOP |SERIO_QUIRK_NOPNP ) + }, +/* * A lot of modern Clevo barebones have touchpad and/or keyboard issues * after suspend fixable with nomux + reset + noloop + nopnp. Luckily, * none of them have an external PS/2 port so this can safely be set for
Greg Kroah-Hartman
maintainerPATCH 532/695 Input: i8042 - add TUXEDO Stellaris 15 Slim Gen6 AMD to i8042 quirk table
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Werner Sembach <[email protected]>
commit 3870e2850b56306d1d1e435c5a1ccbccd7c59291 upstream.
The Gen6 devices have the same problem and the same Solution as the Gen5 ones.
Some TongFang barebones have touchpad and/or keyboard issues after suspend, fixable with nomux + reset + noloop + nopnp. Luckily, none of them have an external PS/2 port so this can safely be set for all of them.
I'm not entirely sure if every device listed really needs all four quirks, but after testing and production use, no negative effects could be observed when setting all four.
--- drivers/input/serio/i8042-acpipnpio.h | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/input/serio/i8042-acpipnpio.h +7 -0
@@ -1143,6 +1143,13 @@ static const struct dmi_system_id i8042_ .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) }, + { + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "GMxHGxx"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS | + SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP) + }, /* * A lot of modern Clevo barebones have touchpad and/or keyboard issues * after suspend fixable with nomux + reset + noloop + nopnp. Luckily,
Greg Kroah-Hartman
maintainerPATCH 533/695 Input: i8042 - add another board name for TUXEDO Stellaris Gen5 AMD line
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Werner Sembach <[email protected]>
commit 01eed86d50af9fab27d876fd677b86259ebe9de3 upstream.
There might be devices out in the wild where the board name is GMxXGxx instead of GMxXGxX.
Adding both to be on the safe side.
--- drivers/input/serio/i8042-acpipnpio.h | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/input/serio/i8042-acpipnpio.h +7 -0
@@ -1138,6 +1138,13 @@ static const struct dmi_system_id i8042_ }, { .matches = { + DMI_MATCH(DMI_BOARD_NAME, "GMxXGxx"), + }, + .driver_data = (void *)(SERIO_QUIRK_NOMUX |SERIO_QUIRK_RESET_ALWAYS | +SERIO_QUIRK_NOLOOP |SERIO_QUIRK_NOPNP ) + }, + { + .matches = { DMI_MATCH(DMI_BOARD_NAME, "GMxXGxX"), }, .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
Greg Kroah-Hartman
maintainerPATCH 534/695 KVM: arm64: Add memory length checks and remove inline in do_ffa_mem_xfer
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Snehal Koukuntla <[email protected]>
commit f26a525b77e040d584e967369af1e018d2d59112 upstream.
When we share memory through FF-A and the description of the buffers exceeds the size of the mapped buffer, the fragmentation API is used. The fragmentation API allows specifying chunks of descriptors in subsequent FF-A fragment calls and no upper limit has been established for this. The entire memory region transferred is identified by a handle which can be used to reclaim the transferred memory.
To be able to reclaim the memory, the description of the buffers has to fit in the ffa_desc_buf.
Add a bounds check on the FF-A sharing path to prevent the memory reclaim from failing.
Also do_ffa_mem_xfer() does not need __always_inline, except for the BUILD_BUG_ON() aspect, which gets moved to a macro.
[maz: fixed the BUILD_BUG_ON() breakage with LLVM, thanks to Wei-Lin Chang
for the timely report]
--- arch/arm64/kvm/hyp/nvhe/ffa.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)
arch/arm64/kvm/hyp/nvhe/ffa.c +15 -6
@@ -426,9 +426,9 @@ out:return ; } -static __always_inline void do_ffa_mem_xfer(const u64 func_id, -struct arm_smccc_res *res, -struct kvm_cpu_context *ctxt) +static void __do_ffa_mem_xfer (const u64 func_id, +struct arm_smccc_res *res, +struct kvm_cpu_context *ctxt) {DECLARE_REG (u32, len, ctxt,1 );DECLARE_REG (u32, fraglen, ctxt,2 );
@@ -440,9 +440,6 @@ static __always_inline void do_ffa_mem_xu32 offset, nr_ranges;int ret =0 ; -BUILD_BUG_ON (func_id !=FFA_FN64_MEM_SHARE && - func_id !=FFA_FN64_MEM_LEND ); -if (addr_mbz || npages_mbz || fraglen > len || fraglen >KVM_FFA_MBOX_NR_PAGES *PAGE_SIZE ) { ret =FFA_RET_INVALID_PARAMETERS ;
@@ -461,6 +458,11 @@ static __always_inline void do_ffa_mem_x goto out_unlock; } +if (len > ffa_desc_buf.len) { + ret =FFA_RET_NO_MEMORY ; + goto out_unlock; + } + buf = hyp_buffers.tx;memcpy (buf, host_buffers.tx, fraglen);
@@ -512,6 +514,13 @@ err_unshare: goto out_unlock; } +#define do_ffa_mem_xfer (fid, res, ctxt) \ + do { \ + BUILD_BUG_ON((fid) != FFA_FN64_MEM_SHARE && \ + (fid) != FFA_FN64_MEM_LEND); \ + __do_ffa_mem_xfer((fid), (res), (ctxt)); \ + } while (0); +static void do_ffa_mem_reclaim (struct arm_smccc_res *res,struct kvm_cpu_context *ctxt) {
Greg Kroah-Hartman
maintainerPATCH 535/695 KVM: x86: Enforce x2APICs must-be-zero reserved ICR bits
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
commit 71bf395a276f0578d19e0ae137a7d1d816d08e0e upstream.
Inject a #GP on a WRMSR(ICR) that attempts to set any reserved bits that are must-be-zero on both Intel and AMD, i.e. any reserved bits other than the BUSY bit, which Intel ignores and basically says is undefined.
KVM's xapic_state_test selftest has been fudging the bug since commit 4b88b1a518b3 ("KVM: selftests: Enhance handling WRMSR ICR register in x2APIC mode"), which essentially removed the testcase instead of fixing the bug.
WARN if the nodecode path triggers a #GP, as the CPU is supposed to check reserved bits for ICR when it's partially virtualized.
--- arch/x86/kvm/lapic.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
arch/x86/kvm/lapic.c +14 -1
@@ -2470,7 +2470,7 @@ void kvm_apic_write_nodecode(struct kvm_* maybe-unecessary write, and both are in the noise anyways. */ if (apic_x2apic_mode (apic) && offset ==APIC_ICR ) -kvm_x2apic_icr_write (apic,kvm_lapic_get_reg64 (apic,APIC_ICR )); +WARN_ON_ONCE (kvm_x2apic_icr_write (apic,kvm_lapic_get_reg64 (apic,APIC_ICR )));else kvm_lapic_reg_write (apic, offset,kvm_lapic_get_reg (apic, offset)); }
@@ -3194,8 +3194,21 @@ int kvm_lapic_set_vapic_addr(struct kvm_return 0 ; } +#define X2APIC_ICR_RESERVED_BITS (GENMASK_ULL(31, 20) | GENMASK_ULL(17, 16) | BIT(13)) +int kvm_x2apic_icr_write (struct kvm_lapic *apic,u64 data) { +if (data &X2APIC_ICR_RESERVED_BITS ) +return 1 ; + +/* +* The BUSY bit is reserved on both Intel and AMD in x2APIC mode, but +* only AMD requires it to be zero, Intel essentially just ignores the +* bit. And if IPI virtualization (Intel) or x2AVIC (AMD) is enabled, +* the CPU performs the reserved bits checks, i.e. the underlying CPU +* behavior will "win". Arbitrarily clear the BUSY bit, as there is no +* sane way to provide consistent behavior with respect to hardware. +*/ data &= ~APIC_ICR_BUSY ;kvm_apic_send_ipi (apic, (u32 )data, (u32)(data >>32 ));
Greg Kroah-Hartman
maintainerPATCH 536/695 KVM: x86: Move x2APIC ICR helper above kvm_apic_write_nodecode()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
commit d33234342f8b468e719e05649fd26549fb37ef8a upstream.
Hoist kvm_x2apic_icr_write() above kvm_apic_write_nodecode() so that a local helper to _read_ the x2APIC ICR can be added and used in the nodecode path without needing a forward declaration.
No functional change intended.
--- arch/x86/kvm/lapic.c | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-)
arch/x86/kvm/lapic.c +23 -23
@@ -2453,6 +2453,29 @@ void kvm_lapic_set_eoi(struct kvm_vcpu * }EXPORT_SYMBOL_GPL (kvm_lapic_set_eoi); +#define X2APIC_ICR_RESERVED_BITS (GENMASK_ULL(31, 20) | GENMASK_ULL(17, 16) | BIT(13)) + +int kvm_x2apic_icr_write (struct kvm_lapic *apic,u64 data) +{ +if (data &X2APIC_ICR_RESERVED_BITS ) +return 1 ; + +/* +* The BUSY bit is reserved on both Intel and AMD in x2APIC mode, but +* only AMD requires it to be zero, Intel essentially just ignores the +* bit. And if IPI virtualization (Intel) or x2AVIC (AMD) is enabled, +* the CPU performs the reserved bits checks, i.e. the underlying CPU +* behavior will "win". Arbitrarily clear the BUSY bit, as there is no +* sane way to provide consistent behavior with respect to hardware. +*/ + data &= ~APIC_ICR_BUSY ; + +kvm_apic_send_ipi (apic, (u32 )data, (u32)(data >>32 )); +kvm_lapic_set_reg64 (apic,APIC_ICR , data); +trace_kvm_apic_write (APIC_ICR , data); +return 0 ; +} +/* emulate APIC access in a trap manner */ void kvm_apic_write_nodecode (struct kvm_vcpu *vcpu,u32 offset) {
@@ -3194,29 +3217,6 @@ int kvm_lapic_set_vapic_addr(struct kvm_return 0 ; } -#define X2APIC_ICR_RESERVED_BITS (GENMASK_ULL(31, 20) | GENMASK_ULL(17, 16) | BIT(13)) - -int kvm_x2apic_icr_write (struct kvm_lapic *apic,u64 data) -{ -if (data &X2APIC_ICR_RESERVED_BITS ) -return 1 ; - -/* -* The BUSY bit is reserved on both Intel and AMD in x2APIC mode, but -* only AMD requires it to be zero, Intel essentially just ignores the -* bit. And if IPI virtualization (Intel) or x2AVIC (AMD) is enabled, -* the CPU performs the reserved bits checks, i.e. the underlying CPU -* behavior will "win". Arbitrarily clear the BUSY bit, as there is no -* sane way to provide consistent behavior with respect to hardware. -*/ - data &= ~APIC_ICR_BUSY ; - -kvm_apic_send_ipi (apic, (u32 )data, (u32)(data >>32 )); -kvm_lapic_set_reg64 (apic,APIC_ICR , data); -trace_kvm_apic_write (APIC_ICR , data); -return 0 ; -} -static int kvm_lapic_msr_read (struct kvm_lapic *apic,u32 reg,u64 *data) {u32 low;
Greg Kroah-Hartman
maintainerPATCH 537/695 KVM: x86: Re-split x2APIC ICR into ICR+ICR2 for AMD (x2AVIC)
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
commit 73b42dc69be8564d4951a14d00f827929fe5ef79 upstream.
Re-introduce the "split" x2APIC ICR storage that KVM used prior to Intel's IPI virtualization support, but only for AMD. While not stated anywhere in the APM, despite stating the ICR is a single 64-bit register, AMD CPUs store the 64-bit ICR as two separate 32-bit values in ICR and ICR2. When IPI virtualization (IPIv on Intel, all AVIC flavors on AMD) is enabled, KVM needs to match CPU behavior as some ICR ICR writes will be handled by the CPU, not by KVM.
Add a kvm_x86_ops knob to control the underlying format used by the CPU to store the x2APIC ICR, and tune it to AMD vs. Intel regardless of whether or not x2AVIC is enabled. If KVM is handling all ICR writes, the storage format for x2APIC mode doesn't matter, and having the behavior follow AMD versus Intel will provide better test coverage and ease debugging.
--- arch/x86/include/asm/kvm_host.h | 2 + arch/x86/kvm/lapic.c | 42 ++++++++++++++++++++++++++++------------ arch/x86/kvm/svm/svm.c | 2 + arch/x86/kvm/vmx/main.c | 2 + 4 files changed, 36 insertions(+), 12 deletions(-)
arch/x86/include/asm/kvm_host.h +2 -0
@@ -1727,6 +1727,8 @@ struct kvm_x86_ops {void (*enable_nmi_window)(struct kvm_vcpu *vcpu);void (*enable_irq_window)(struct kvm_vcpu *vcpu);void (*update_cr8_intercept)(struct kvm_vcpu *vcpu,int tpr,int irr); + +const bool x2apic_icr_is_split;const unsigned long required_apicv_inhibits;bool allow_apicv_in_x2apic_without_x2apic_virtualization;void (*refresh_apicv_exec_ctrl)(struct kvm_vcpu *vcpu);
arch/x86/kvm/lapic.c +30 -12
73 lines not on this page · raw message
arch/x86/kvm/svm/svm.c +2 -0
@@ -5062,6 +5062,8 @@ static struct kvm_x86_ops svm_x86_ops __ .enable_nmi_window = svm_enable_nmi_window, .enable_irq_window = svm_enable_irq_window, .update_cr8_intercept = svm_update_cr8_intercept, + + .x2apic_icr_is_split = true, .set_virtual_apic_mode = avic_refresh_virtual_apic_mode, .refresh_apicv_exec_ctrl = avic_refresh_apicv_exec_ctrl, .apicv_post_state_restore = avic_apicv_post_state_restore,
arch/x86/kvm/vmx/main.c +2 -0
@@ -89,6 +89,8 @@ struct kvm_x86_ops vt_x86_ops __initdata .enable_nmi_window = vmx_enable_nmi_window, .enable_irq_window = vmx_enable_irq_window, .update_cr8_intercept = vmx_update_cr8_intercept, + + .x2apic_icr_is_split = false, .set_virtual_apic_mode = vmx_set_virtual_apic_mode, .set_apic_access_page_addr = vmx_set_apic_access_page_addr, .refresh_apicv_exec_ctrl = vmx_refresh_apicv_exec_ctrl,