5.12.6-rc1 review
Greg Kroah-Hartman
maintainerPATCH 1/45 x86/msr: Fix wr/rdmsr_safe_regs_on_cpu() prototypes
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
commit 396a66aa1172ef2b78c21651f59b40b87b2e5e1e upstream.
gcc-11 warns about mismatched prototypes here:
arch/x86/lib/msr-smp.c:255:51: error: argument 2 of type ‘u32 *’ {aka ‘unsigned int *’} declared as a pointer [-Werror=array-parameter=]
255 | int rdmsr_safe_regs_on_cpu(unsigned int cpu, u32 *regs)
| ~~~~~^~~~
arch/x86/include/asm/msr.h:347:50: note: previously declared as an array ‘u32[8]’ {aka ‘unsigned int[8]’}
GCC is right here - fix up the types.
[ mingo: Twiddled the changelog. ]
--- arch/x86/lib/msr-smp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/x86/lib/msr-smp.c +2 -2
@@ -252,7 +252,7 @@ static void __wrmsr_safe_regs_on_cpu(voi rv->err =wrmsr_safe_regs (rv->regs); } -int rdmsr_safe_regs_on_cpu (unsigned int cpu,u32 *regs) +int rdmsr_safe_regs_on_cpu (unsigned int cpu,u32 regs[8 ]) {int err;struct msr_regs_info rv;
@@ -265,7 +265,7 @@ int rdmsr_safe_regs_on_cpu(unsigned int }EXPORT_SYMBOL (rdmsr_safe_regs_on_cpu); -int wrmsr_safe_regs_on_cpu (unsigned int cpu,u32 *regs) +int wrmsr_safe_regs_on_cpu (unsigned int cpu,u32 regs[8 ]) {int err;struct msr_regs_info rv;
Greg Kroah-Hartman
maintainerPATCH 10/45 NFS: Fix fscache invalidation in nfs_set_cache_invalid()
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
[ Upstream commit beab450d8ea93cdf4c6cb7714bdc31a9e0f34738 ]
Ensure that we invalidate the fscache before we strip the NFS_INO_INVALID_DATA flag.
--- fs/nfs/inode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/nfs/inode.c +2 -2
@@ -223,11 +223,11 @@ void nfs_set_cache_invalid(struct inode *inode, unsigned long flags)if (!nfs_has_xattr_cache (nfsi)) flags &= ~NFS_INO_INVALID_XATTR ; +if (flags &NFS_INO_INVALID_DATA ) +nfs_fscache_invalidate (inode);if (inode->i_mapping->nrpages ==0 ) flags &= ~(NFS_INO_INVALID_DATA |NFS_INO_DATA_INVAL_DEFER ); nfsi->cache_validity |= flags; -if (flags &NFS_INO_INVALID_DATA ) -nfs_fscache_invalidate (inode); }EXPORT_SYMBOL_GPL (nfs_set_cache_invalid);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 11/45 ACPI / hotplug / PCI: Fix reference count leak in enable_slot()
In reply to Greg Kroah-HartmanFrom: Feilong Lin <[email protected]>
[ Upstream commit 3bbfd319034ddce59e023837a4aa11439460509b ]
In enable_slot(), if pci_get_slot() returns NULL, we clear the SLOT_ENABLED flag. When pci_get_slot() finds a device, it increments the device's reference count. In this case, we did not call pci_dev_put() to decrement the reference count, so the memory of the device (struct pci_dev type) will eventually leak.
Call pci_dev_put() to decrement its reference count when pci_get_slot() returns a PCI device.
--- drivers/pci/hotplug/acpiphp_glue.c | 1 + 1 file changed, 1 insertion(+)
drivers/pci/hotplug/acpiphp_glue.c +1 -0
@@ -533,6 +533,7 @@ static void enable_slot(struct acpiphp_slot *slot, bool bridge) slot->flags &= ~SLOT_ENABLED ;continue ; } +pci_dev_put (dev); } }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 12/45 PCI: tegra: Fix runtime PM imbalance in pex_ep_event_pex_rst_deassert()
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit 5859c926d1f052ee61b5815b14658875c14f6243 ]
pm_runtime_get_sync() will increase the runtime PM counter even it returns an error. Thus a pairing decrement is needed to prevent refcount leak. Fix this by replacing this API with pm_runtime_resume_and_get(), which will not change the runtime PM counter on error.
--- drivers/pci/controller/dwc/pcie-tegra194.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/controller/dwc/pcie-tegra194.c +1 -1
@@ -1645,7 +1645,7 @@ static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie)if (pcie->ep_state ==EP_STATE_ENABLED )return ; - ret =pm_runtime_get_sync (dev); + ret =pm_runtime_resume_and_get (dev);if (ret <0 ) {dev_err (dev,"Failed to get runtime sync for PCIe dev: %d\n" , ret);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 13/45 Input: elants_i2c - do not bind to i2c-hid compatible ACPI instantiated devices
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 65299e8bfb24774e6340e93ae49f6626598917c8 ]
Several users have been reporting that elants_i2c gives several errors during probe and that their touchscreen does not work on their Lenovo AMD based laptops with a touchscreen with a ELAN0001 ACPI hardware-id:
[ 0.550596] elants_i2c i2c-ELAN0001:00: i2c-ELAN0001:00 supply vcc33 not found, using dummy regulator [ 0.551836] elants_i2c i2c-ELAN0001:00: i2c-ELAN0001:00 supply vccio not found, using dummy regulator [ 0.560932] elants_i2c i2c-ELAN0001:00: elants_i2c_send failed (77 77 77 77): -121 [ 0.562427] elants_i2c i2c-ELAN0001:00: software reset failed: -121 [ 0.595925] elants_i2c i2c-ELAN0001:00: elants_i2c_send failed (77 77 77 77): -121 [ 0.597974] elants_i2c i2c-ELAN0001:00: software reset failed: -121 [ 0.621893] elants_i2c i2c-ELAN0001:00: elants_i2c_send failed (77 77 77 77): -121 [ 0.622504] elants_i2c i2c-ELAN0001:00: software reset failed: -121 [ 0.632650] elants_i2c i2c-ELAN0001:00: elants_i2c_send failed (4d 61 69 6e): -121 [ 0.634256] elants_i2c i2c-ELAN0001:00: boot failed: -121 [ 0.699212] elants_i2c i2c-ELAN0001:00: invalid 'hello' packet: 00 00 ff ff [ 1.630506] elants_i2c i2c-ELAN0001:00: Failed to read fw id: -121 [ 1.645508] elants_i2c i2c-ELAN0001:00: unknown packet 00 00 ff ff
Despite these errors, the elants_i2c driver stays bound to the device (it returns 0 from its probe method despite the errors), blocking the i2c-hid driver from binding.
Manually unbinding the elants_i2c driver and binding the i2c-hid driver makes the touchscreen work.
Check if the ACPI-fwnode for the touchscreen contains one of the i2c-hid compatiblity-id strings and if it has the I2C-HID spec's DSM to get the HID descriptor address, If it has both then make elants_i2c not bind, so that the i2c-hid driver can bind.
This assumes that non of the (older) elan touchscreens which actually need the elants_i2c driver falsely advertise an i2c-hid compatiblity-id
+ DSM in their ACPI-fwnodes. If some of them actually do have this false advertising, then this change may lead to regressions.
While at it also drop the unnecessary DEVICE_NAME prefixing of the "I2C check functionality error", dev_err already outputs the driver-name.
--- drivers/input/touchscreen/elants_i2c.c | 44 ++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-)
drivers/input/touchscreen/elants_i2c.c +42 -2
@@ -38,6 +38,7 @@#include <linux/of.h> #include <linux/gpio/consumer.h> #include <linux/regulator/consumer.h> +#include <linux/uuid.h> #include <asm/unaligned.h> /* Device, Driver information */
@@ -1334,6 +1335,40 @@ static void elants_i2c_power_off(void *_data) } } +#ifdef CONFIG_ACPI +static const struct acpi_device_id i2c_hid_ids[] = { + {"ACPI0C50" ,0 }, + {"PNP0C50" ,0 }, + { }, +}; + +static const guid_t i2c_hid_guid = +GUID_INIT (0x3CDFF6F7 ,0x4267 ,0x4555 , +0xAD ,0x05 ,0xB3 ,0x0A ,0x3D ,0x89 ,0x38 ,0xDE ); + +static bool elants_acpi_is_hid_device (struct device *dev) +{ +acpi_handle handle =ACPI_HANDLE (dev); +union acpi_object *obj; + +if (acpi_match_device_ids (ACPI_COMPANION (dev), i2c_hid_ids)) +return false; + + obj =acpi_evaluate_dsm_typed (handle, &i2c_hid_guid,1 ,1 ,NULL ,ACPI_TYPE_INTEGER ); +if (obj) { +ACPI_FREE (obj); +return true; + } + +return false; +} +#else +static bool elants_acpi_is_hid_device (struct device *dev) +{ +return false; +} +#endif +static int elants_i2c_probe (struct i2c_client *client,const struct i2c_device_id *id) {
@@ -1342,9 +1377,14 @@ static int elants_i2c_probe(struct i2c_client *client,unsigned long irqflags;int error; +/* Don't bind to i2c-hid compatible devices, these are handled by the i2c-hid drv. */ +if (elants_acpi_is_hid_device (&client->dev)) { +dev_warn (&client->dev,"This device appears to be an I2C-HID device, not binding\n" ); +return -ENODEV ; + } +if (!i2c_check_functionality (client->adapter,I2C_FUNC_I2C )) { -dev_err (&client->dev, -"%s: i2c check functionality error\n" ,DEVICE_NAME ); +dev_err (&client->dev,"I2C check functionality error\n" );return -ENXIO ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 14/45 Input: silead - add workaround for x86 BIOS-es which bring the chip up in a stuck state
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit e479187748a8f151a85116a7091c599b121fdea5 ]
Some buggy BIOS-es bring up the touchscreen-controller in a stuck state where it blocks the I2C bus. Specifically this happens on the Jumper EZpad 7 tablet model.
After much poking at this problem I have found that the following steps are necessary to unstuck the chip / bus:
1. Turn off the Silead chip.
2. Try to do an I2C transfer with the chip, this will fail in response to which the I2C-bus-driver will call: i2c_recover_bus() which will unstuck the I2C-bus. Note the unstuck-ing of the I2C bus only works if we first drop the chip of the bus by turning it off.
3. Turn the chip back on.
On the x86/ACPI systems were this problem is seen, step 1. and 3. require making ACPI calls and dealing with ACPI Power Resources. This commit adds a workaround which runtime-suspends the chip to turn it off, leaving it up to the ACPI subsystem to deal with all the ACPI specific details.
There is no good way to detect this bug, so the workaround gets activated by a new "silead,stuck-controller-bug" boolean device-property. Since this is only used on x86/ACPI, this will be set by model specific device-props set by drivers/platform/x86/touchscreen_dmi.c. Therefor this new device-property is not documented in the DT-bindings.
Dmesg will contain the following messages on systems where the workaround is activated:
[ 54.309029] silead_ts i2c-MSSL1680:00: [Firmware Bug]: Stuck I2C bus: please ignore the next 'controller timed out' error [ 55.373593] i2c_designware 808622C1:04: controller timed out [ 55.582186] silead_ts i2c-MSSL1680:00: Silead chip ID: 0x80360000
--- drivers/input/touchscreen/silead.c | 44 +++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 4 deletions(-)
drivers/input/touchscreen/silead.c +40 -4
@@ -20,6 +20,7 @@#include <linux/input/mt.h> #include <linux/input/touchscreen.h> #include <linux/pm.h> +#include <linux/pm_runtime.h> #include <linux/irq.h> #include <linux/regulator/consumer.h>
@@ -335,10 +336,8 @@ static int silead_ts_get_id(struct i2c_client *client) error =i2c_smbus_read_i2c_block_data (client,SILEAD_REG_ID ,sizeof (chip_id), (u8 *)&chip_id); -if (error <0 ) { -dev_err (&client->dev,"Chip ID read error %d\n" , error); +if (error <0 )return error; - } data->chip_id =le32_to_cpu (chip_id);dev_info (&client->dev,"Silead chip ID: 0x%8X" , data->chip_id);
@@ -351,12 +350,49 @@ static int silead_ts_setup(struct i2c_client *client)int error;u32 status; +/* +* Some buggy BIOS-es bring up the chip in a stuck state where it +* blocks the I2C bus. The following steps are necessary to +* unstuck the chip / bus: +* 1. Turn off the Silead chip. +* 2. Try to do an I2C transfer with the chip, this will fail in +* response to which the I2C-bus-driver will call: +* i2c_recover_bus() which will unstuck the I2C-bus. Note the +* unstuck-ing of the I2C bus only works if we first drop the +* chip off the bus by turning it off. +* 3. Turn the chip back on. +* +* On the x86/ACPI systems were this problem is seen, step 1. and +* 3. require making ACPI calls and dealing with ACPI Power +* Resources. The workaround below runtime-suspends the chip to +* turn it off, leaving it up to the ACPI subsystem to deal with +* this. +*/ + +if (device_property_read_bool (&client->dev, +"silead,stuck-controller-bug" )) { +pm_runtime_set_active (&client->dev); +pm_runtime_enable (&client->dev); +pm_runtime_allow (&client->dev); + +pm_runtime_suspend (&client->dev); + +dev_warn (&client->dev,FW_BUG "Stuck I2C bus: please ignore the next 'controller timed out' error\n" ); +silead_ts_get_id (client); + +/* The forbid will also resume the device */ +pm_runtime_forbid (&client->dev); +pm_runtime_disable (&client->dev); + } +silead_ts_set_power (client,SILEAD_POWER_OFF );silead_ts_set_power (client,SILEAD_POWER_ON ); error =silead_ts_get_id (client); -if (error) +if (error) { +dev_err (&client->dev,"Chip ID read error %d\n" , error);return error; + } error =silead_ts_init (client);if (error)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 15/45 NFS: NFS_INO_REVAL_PAGECACHE should mark the change attribute invalid
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
[ Upstream commit 50c7a7994dd20af56e4d47e90af10bab71b71001 ]
When we're looking to revalidate the page cache, we should just ensure that we mark the change attribute invalid.
--- fs/nfs/inode.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/nfs/inode.c +2 -1
@@ -219,7 +219,8 @@ void nfs_set_cache_invalid(struct inode *inode, unsigned long flags) | NFS_INO_INVALID_SIZE |NFS_INO_REVAL_PAGECACHE | NFS_INO_INVALID_XATTR); - } + }else if (flags &NFS_INO_REVAL_PAGECACHE ) + flags |=NFS_INO_INVALID_CHANGE |NFS_INO_INVALID_SIZE ;if (!nfs_has_xattr_cache (nfsi)) flags &= ~NFS_INO_INVALID_XATTR ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 16/45 f2fs: fix to avoid NULL pointer dereference
In reply to Greg Kroah-HartmanFrom: Yi Chen <[email protected]>
[ Upstream commit 594b6d0428ae304e0b44457398beb458b938f005 ]
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 pc : f2fs_put_page+0x1c/0x26c lr : __revoke_inmem_pages+0x544/0x75c f2fs_put_page+0x1c/0x26c __revoke_inmem_pages+0x544/0x75c __f2fs_commit_inmem_pages+0x364/0x3c0 f2fs_commit_inmem_pages+0xc8/0x1a0 f2fs_ioc_commit_atomic_write+0xa4/0x15c f2fs_ioctl+0x5b0/0x1574 file_ioctl+0x154/0x320 do_vfs_ioctl+0x164/0x740 __arm64_sys_ioctl+0x78/0xa4 el0_svc_common+0xbc/0x1d0 el0_svc_handler+0x74/0x98 el0_svc+0x8/0xc
In f2fs_put_page, we access page->mapping is NULL. The root cause is:
In some cases, the page refcount and ATOMIC_WRITTEN_PAGE flag miss set for page-priavte flag has been set. We add f2fs_bug_on like this:
f2fs_register_inmem_page()
{
...
f2fs_set_page_private(page, ATOMIC_WRITTEN_PAGE);
f2fs_bug_on(F2FS_I_SB(inode), !IS_ATOMIC_WRITTEN_PAGE(page));
...
}The bug on stack follow link this:
PC is at f2fs_register_inmem_page+0x238/0x2b4
LR is at f2fs_register_inmem_page+0x2a8/0x2b4
f2fs_register_inmem_page+0x238/0x2b4 f2fs_set_data_page_dirty+0x104/0x164 set_page_dirty+0x78/0xc8 f2fs_write_end+0x1b4/0x444 generic_perform_write+0x144/0x1cc __generic_file_write_iter+0xc4/0x174 f2fs_file_write_iter+0x2c0/0x350 __vfs_write+0x104/0x134 vfs_write+0xe8/0x19c SyS_pwrite64+0x78/0xb8
To fix this issue, let's add page refcount add page-priavte flag. The page-private flag is not cleared and needs further analysis.
--- fs/f2fs/segment.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/f2fs/segment.c +4 -1
@@ -186,7 +186,10 @@ void f2fs_register_inmem_page(struct inode *inode, struct page *page) {struct inmem_pages *new; -f2fs_set_page_private (page,ATOMIC_WRITTEN_PAGE ); +if (PagePrivate (page)) +set_page_private (page, (unsigned long )ATOMIC_WRITTEN_PAGE ); +else +f2fs_set_page_private (page,ATOMIC_WRITTEN_PAGE ); new =f2fs_kmem_cache_alloc (inmem_entry_slab,GFP_NOFS );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 17/45 svcrdma: Dont leak send_ctxt on Send errors
In reply to Greg Kroah-HartmanFrom: Chuck Lever <[email protected]>
[ Upstream commit 351461f332db5670056a9c6bce6916027f91072f ]
Address a rare send_ctxt leak in the svc_rdma_sendto() error paths.
--- net/sunrpc/xprtrdma/svc_rdma_sendto.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/sunrpc/xprtrdma/svc_rdma_sendto.c +4 -4
@@ -958,7 +958,7 @@ int svc_rdma_sendto(struct svc_rqst *rqstp) p =xdr_reserve_space (&sctxt->sc_stream, rpcrdma_fixed_maxsz *sizeof (*p));if (!p) - goto err0; + goto err1; ret =svc_rdma_send_reply_chunk (rdma, rctxt, &rqstp->rq_res);if (ret <0 )
@@ -970,11 +970,11 @@ int svc_rdma_sendto(struct svc_rqst *rqstp) *p =pcl_is_empty (&rctxt->rc_reply_pcl) ? rdma_msg : rdma_nomsg;if (svc_rdma_encode_read_list (sctxt) <0 ) - goto err0; + goto err1;if (svc_rdma_encode_write_list (rctxt, sctxt) <0 ) - goto err0; + goto err1;if (svc_rdma_encode_reply_chunk (rctxt, sctxt, ret) <0 ) - goto err0; + goto err1; ret =svc_rdma_send_reply_msg (rdma, sctxt, rctxt, rqstp);if (ret <0 )
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 18/45 um: Mark all kernel symbols as local
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
[ Upstream commit d5027ca63e0e778b641cf23e3f5c6d6212cf412b ]
Ritesh reported a bug [1] against UML, noting that it crashed on startup. The backtrace shows the following (heavily redacted):
(gdb) bt
...
#26 0x0000000060015b5d in sem_init () at ipc/sem.c:268
#27 0x00007f89906d92f7 in ?? () from /lib/x86_64-linux-gnu/libcom_err.so.2 #28 0x00007f8990ab8fb2 in call_init (...) at dl-init.c:72
...
#40 0x00007f89909bf3a6 in nss_load_library (...) at nsswitch.c:359
...
#44 0x00007f8990895e35 in _nss_compat_getgrnam_r (...) at nss_compat/compat-grp.c:486 #45 0x00007f8990968b85 in __getgrnam_r [...]
#46 0x00007f89909d6b77 in grantpt [...]
#47 0x00007f8990a9394e in __GI_openpty [...]
#48 0x00000000604a1f65 in openpty_cb (...) at arch/um/os-Linux/sigio.c:407 #49 0x00000000604a58d0 in start_idle_thread (...) at arch/um/os-Linux/skas/process.c:598 #50 0x0000000060004a3d in start_uml () at arch/um/kernel/skas/process.c:45 #51 0x00000000600047b2 in linux_main (...) at arch/um/kernel/um_arch.c:334 #52 0x000000006000574f in main (...) at arch/um/os-Linux/main.c:144
indicating that the UML function openpty_cb() calls openpty(), which internally calls __getgrnam_r(), which causes the nsswitch machinery to get started.
This loads, through lots of indirection that I snipped, the libcom_err.so.2 library, which (in an unknown function, "??") calls sem_init().
Now, of course it wants to get libpthread's sem_init(), since it's linked against libpthread. However, the dynamic linker looks up that symbol against the binary first, and gets the kernel's sem_init().
Hajime Tazaki noted that "objcopy -L" can localize a symbol, so the dynamic linker wouldn't do the lookup this way. I tried, but for some reason that didn't seem to work.
Doing the same thing in the linker script instead does seem to work, though I cannot entirely explain - it *also* works if I just add "VERSION { { global: *; }; }" instead, indicating that something else is happening that I don't really understand. It may be that explicitly doing that marks them with some kind of empty version, and that's different from the default.
Explicitly marking them with a version breaks kallsyms, so that doesn't seem to be possible.
Marking all the symbols as local seems correct, and does seem to address the issue, so do that. Also do it for static link, nsswitch libraries could still be loaded there.
[1] https://bugs.debian.org/983379
--- arch/um/kernel/dyn.lds.S | 6 ++++++ arch/um/kernel/uml.lds.S | 6 ++++++ 2 files changed, 12 insertions(+)
arch/um/kernel/dyn.lds.S +6 -0
@@ -6,6 +6,12 @@ OUTPUT_ARCH(ELF_ARCH) ENTRY(_start) jiffies = jiffies_64; +VERSION { + { + local: *; + }; +} + SECTIONS { PROVIDE (__executable_start = START);
arch/um/kernel/uml.lds.S +6 -0
@@ -7,6 +7,12 @@ OUTPUT_ARCH(ELF_ARCH) ENTRY(_start) jiffies = jiffies_64; +VERSION { + { + local: *; + }; +} + SECTIONS { /* This must contain the right address - not quite the default ELF one.*/
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 19/45 um: Disable CONFIG_GCOV with MODULES
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
[ Upstream commit ad3d19911632debc886ef4a992d41d6de7927006 ]
CONFIG_GCOV doesn't work with modules, and for various reasons it cannot work, see also
https://lore.kernel.org/r/[email protected]
Make CONFIG_GCOV depend on !MODULES to avoid anyone running into issues there. This also means we need not export the gcov symbols.
--- arch/um/Kconfig.debug | 1 + arch/um/kernel/Makefile | 1 - arch/um/kernel/gmon_syms.c | 16 ---------------- 3 files changed, 1 insertion(+), 17 deletions(-) delete mode 100644 arch/um/kernel/gmon_syms.c
arch/um/Kconfig.debug +1 -0
@@ -17,6 +17,7 @@ config GCOV bool "Enable gcov support" depends on DEBUG_INFO depends on !KCOV + depends on !MODULES help This option allows developers to retrieve coverage data from a UML session.
arch/um/kernel/Makefile +0 -1
@@ -21,7 +21,6 @@ obj-y = config.o exec.o exitcode.o irq.o ksyms.o mem.o \ obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o obj-$(CONFIG_GPROF) += gprof_syms.o -obj-$(CONFIG_GCOV) += gmon_syms.o obj-$(CONFIG_EARLY_PRINTK) += early_printk.o obj-$(CONFIG_STACKTRACE) += stacktrace.o
arch/um/kernel/gmon_syms.c deleted +0 -16
@@ -1,16 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* -* Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) -*/ - -#include <linux/module.h> - -extern void __bb_init_func (void *) __attribute__((weak)); -EXPORT_SYMBOL (__bb_init_func); - -extern void __gcov_init (void *) __attribute__((weak)); -EXPORT_SYMBOL (__gcov_init); -extern void __gcov_merge_add (void *,unsigned int ) __attribute__((weak)); -EXPORT_SYMBOL (__gcov_merge_add); -extern void __gcov_exit (void ) __attribute__((weak)); -EXPORT_SYMBOL (__gcov_exit);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 2/45 drm/i915/display: fix compiler warning about array overrun
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit fec4d42724a1bf3dcba52307e55375fdb967b852 upstream.
intel_dp_check_mst_status() uses a 14-byte array to read the DPRX Event Status Indicator data, but then passes that buffer at offset 10 off as an argument to drm_dp_channel_eq_ok().
End result: there are only 4 bytes remaining of the buffer, yet drm_dp_channel_eq_ok() wants a 6-byte buffer. gcc-11 correctly warns about this case:
drivers/gpu/drm/i915/display/intel_dp.c: In function ‘intel_dp_check_mst_status’:
drivers/gpu/drm/i915/display/intel_dp.c:3491:22: warning: ‘drm_dp_channel_eq_ok’ reading 6 bytes from a region of size 4 [-Wstringop-overread]
3491 | !drm_dp_channel_eq_ok(&esi[10], intel_dp->lane_count)) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/i915/display/intel_dp.c:3491:22: note: referencing argument 1 of type ‘const u8 *’ {aka ‘const unsigned char *’}
In file included from drivers/gpu/drm/i915/display/intel_dp.c:38:
include/drm/drm_dp_helper.h:1466:6: note: in a call to function ‘drm_dp_channel_eq_ok’
1466 | bool drm_dp_channel_eq_ok(const u8 link_status[DP_LINK_STATUS_SIZE],
| ^~~~~~~~~~~~~~~~~~~~
6:14 elapsedThis commit just extends the original array by 2 zero-initialized bytes, avoiding the warning.
There may be some underlying bug in here that caused this confusion, but this is at least no worse than the existing situation that could use random data off the stack.
--- drivers/gpu/drm/i915/display/intel_dp.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/display/intel_dp.c +12 -1
@@ -4488,7 +4488,18 @@ intel_dp_check_mst_status(struct intel_ddrm_WARN_ON_ONCE (&i915->drm, intel_dp->active_mst_links <0 );for (;;) { -u8 esi[DP_DPRX_ESI_LEN ] = {}; +/* +* The +2 is because DP_DPRX_ESI_LEN is 14, but we then +* pass in "esi+10" to drm_dp_channel_eq_ok(), which +* takes a 6-byte array. So we actually need 16 bytes +* here. +* +* Somebody who knows what the limits actually are +* should check this, but for now this is at least +* harmless and avoids a valid compiler warning about +* using more of the array than we have allocated. +*/ +u8 esi[DP_DPRX_ESI_LEN +2 ] = {};bool handled;int retry;
Greg Kroah-Hartman
maintainerPATCH 20/45 PCI: tegra: Add Tegra194 MCFG quirks for ECAM errata
In reply to Greg Kroah-HartmanFrom: Vidya Sagar <[email protected]>
[ Upstream commit 7f100744749e4fe547dece3bb6557fae5f0a7252 ]
The PCIe controller in Tegra194 SoC is not ECAM-compliant. With the current hardware design, ECAM can be enabled only for one controller (the C5 controller) with bus numbers starting from 160 instead of 0. A different approach is taken to avoid this abnormal way of enabling ECAM for just one controller but to enable configuration space access for all the other controllers. In this approach, ops are added through MCFG quirk mechanism which access the configuration spaces by dynamically programming iATU (internal AddressTranslation Unit) to generate respective configuration accesses just like the way it is done in DesignWare core sub-system.
This issue is specific to Tegra194 and it would be fixed in the future generations of Tegra SoCs.
--- drivers/acpi/pci_mcfg.c | 7 ++ drivers/pci/controller/dwc/Makefile | 2 +- drivers/pci/controller/dwc/pcie-tegra194.c | 102 +++++++++++++++++++++ include/linux/pci-ecam.h | 1 + 4 files changed, 111 insertions(+), 1 deletion(-)
drivers/acpi/pci_mcfg.c +7 -0
@@ -116,6 +116,13 @@ static struct mcfg_fixup mcfg_quirks[] = {THUNDER_ECAM_QUIRK (2 ,12 ),THUNDER_ECAM_QUIRK (2 ,13 ), + { "NVIDIA", "TEGRA194", 1, 0, MCFG_BUS_ANY, &tegra194_pcie_ops}, + { "NVIDIA", "TEGRA194", 1, 1, MCFG_BUS_ANY, &tegra194_pcie_ops}, + { "NVIDIA", "TEGRA194", 1, 2, MCFG_BUS_ANY, &tegra194_pcie_ops}, + { "NVIDIA", "TEGRA194", 1, 3, MCFG_BUS_ANY, &tegra194_pcie_ops}, + { "NVIDIA", "TEGRA194", 1, 4, MCFG_BUS_ANY, &tegra194_pcie_ops}, + { "NVIDIA", "TEGRA194", 1, 5, MCFG_BUS_ANY, &tegra194_pcie_ops}, + #define XGENE_V1_ECAM_MCFG(rev, seg) \ {"APM ", "XGENE ", rev, seg, MCFG_BUS_ANY, \ &xgene_v1_pcie_ecam_ops }
drivers/pci/controller/dwc/Makefile +1 -1
@@ -17,7 +17,6 @@ obj-$(CONFIG_PCIE_INTEL_GW) += pcie-intel-gw.o obj-$(CONFIG_PCIE_KIRIN) += pcie-kirin.o obj-$(CONFIG_PCIE_HISI_STB) += pcie-histb.o obj-$(CONFIG_PCI_MESON) += pci-meson.o -obj-$(CONFIG_PCIE_TEGRA194) += pcie-tegra194.o obj-$(CONFIG_PCIE_UNIPHIER) += pcie-uniphier.o obj-$(CONFIG_PCIE_UNIPHIER_EP) += pcie-uniphier-ep.o
@@ -34,4 +33,5 @@ obj-$(CONFIG_PCIE_UNIPHIER_EP) += pcie-uniphier-ep.o ifdef CONFIG_PCI obj-$(CONFIG_ARM64) += pcie-al.o obj-$(CONFIG_ARM64) += pcie-hisi.o +obj-$(CONFIG_ARM64) += pcie-tegra194.o endif
drivers/pci/controller/dwc/pcie-tegra194.c +102 -0
117 lines not on this page · raw message
include/linux/pci-ecam.h +1 -0
@@ -85,6 +85,7 @@ extern const struct pci_ecam_ops pci_thunder_ecam_ops; /* Cavium ThunderX 1.x */extern const struct pci_ecam_ops xgene_v1_pcie_ecam_ops;/* APM X-Gene PCIe v1 */ extern const struct pci_ecam_ops xgene_v2_pcie_ecam_ops;/* APM X-Gene PCIe v2.x */ extern const struct pci_ecam_ops al_pcie_ops;/* Amazon Annapurna Labs PCIe */ +extern const struct pci_ecam_ops tegra194_pcie_ops;/* Tegra194 PCIe */ #endif #if IS_ENABLED (CONFIG_PCI_HOST_COMMON )
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 21/45 ARM: 9075/1: kernel: Fix interrupted SMC calls
In reply to Greg Kroah-HartmanFrom: Manivannan Sadhasivam <[email protected]>
[ Upstream commit 57ac51667d8cd62731223d687e5fe7b41c502f89 ]
On Qualcomm ARM32 platforms, the SMC call can return before it has completed. If this occurs, the call can be restarted, but it requires using the returned session ID value from the interrupted SMC call.
The ARM32 SMCC code already has the provision to add platform specific quirks for things like this. So let's make use of it and add the Qualcomm specific quirk (ARM_SMCCC_QUIRK_QCOM_A6) used by the QCOM_SCM driver.
This change is similar to the below one added for ARM64 a while ago:
commit 82bcd087029f ("firmware: qcom: scm: Fix interrupted SCM calls")
Without this change, the Qualcomm ARM32 platforms like SDX55 will return -EINVAL for SMC calls used for modem firmware loading and validation.
--- arch/arm/kernel/asm-offsets.c | 3 +++ arch/arm/kernel/smccc-call.S | 11 ++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-)
arch/arm/kernel/asm-offsets.c +3 -0
@@ -24,6 +24,7 @@#include <asm/vdso_datapage.h> #include <asm/hardware/cache-l2x0.h> #include <linux/kbuild.h> +#include <linux/arm-smccc.h> #include "signal.h" /*
@@ -148,6 +149,8 @@ int main(void)DEFINE (SLEEP_SAVE_SP_PHYS , offsetof(struct sleep_save_sp , save_ptr_stash_phys));DEFINE (SLEEP_SAVE_SP_VIRT , offsetof(struct sleep_save_sp , save_ptr_stash));#endif +DEFINE (ARM_SMCCC_QUIRK_ID_OFFS , offsetof(struct arm_smccc_quirk , id)); +DEFINE (ARM_SMCCC_QUIRK_STATE_OFFS , offsetof(struct arm_smccc_quirk , state));BLANK ();DEFINE (DMA_BIDIRECTIONAL ,DMA_BIDIRECTIONAL );DEFINE (DMA_TO_DEVICE ,DMA_TO_DEVICE );
arch/arm/kernel/smccc-call.S +10 -1
@@ -3,7 +3,9 @@ * Copyright (c) 2015, Linaro Limited */ #include <linux/linkage.h> +#include <linux/arm-smccc.h> +#include <asm/asm-offsets.h> #include <asm/opcodes-sec.h> #include <asm/opcodes-virt.h> #include <asm/unwind.h>
@@ -27,7 +29,14 @@ UNWIND( .fnstart) UNWIND( .save {r4-r7}) ldm r12, {r4-r7} \instr - pop {r4-r7} + ldr r4, [sp, #36] + cmp r4, #0 + beq 1f // No quirk structure + ldr r5, [r4, #ARM_SMCCC_QUIRK_ID_OFFS] + cmp r5, #ARM_SMCCC_QUIRK_QCOM_A6 + bne 1f // No quirk present + str r6, [r4, #ARM_SMCCC_QUIRK_STATE_OFFS] +1: pop {r4-r7} ldr r12, [sp, #(4 * 4)] stm r12, {r0-r3} bx lr
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 22/45 platform/chrome: cros_ec_typec: Add DP mode check
In reply to Greg Kroah-HartmanFrom: Prashant Malani <[email protected]>
[ Upstream commit c5bb32f57bf3a30ed03be51f7be0840325ba8b4a ]
There are certain transitional situations where the dp_mode field in the PD_CONTROL response might not be populated with the right DP pin assignment value yet. Add a check for that to avoid sending an invalid value to the Type C mode switch.
--- drivers/platform/chrome/cros_ec_typec.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/platform/chrome/cros_ec_typec.c +5 -0
@@ -483,6 +483,11 @@ static int cros_typec_enable_dp(struct cros_typec_data *typec,return -ENOTSUPP ; } +if (!pd_ctrl->dp_mode) { +dev_err (typec->dev,"No valid DP mode provided.\n" ); +return -EINVAL ; + } +/* Status VDO. */ dp_data.status =DP_STATUS_ENABLED ;if (port->mux_flags &USB_PD_MUX_HPD_IRQ )
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 23/45 riscv: Use $(LD) instead of $(CC) to link vDSO
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
[ Upstream commit 7f3d349065d0c643f7f7013fbf9bc9f2c90b675f ]
Currently, the VDSO is being linked through $(CC). This does not match how the rest of the kernel links objects, which is through the $(LD) variable.
When linking with clang, there are a couple of warnings about flags that will not be used during the link:
clang-12: warning: argument unused during compilation: '-no-pie' [-Wunused-command-line-argument]
clang-12: warning: argument unused during compilation: '-pg' [-Wunused-command-line-argument]
'-no-pie' was added in commit 85602bea297f ("RISC-V: build vdso-dummy.o with -no-pie") to override '-pie' getting added to the ld command from distribution versions of GCC that enable PIE by default. It is technically no longer needed after commit c2c81bb2f691 ("RISC-V: Fix the VDSO symbol generaton for binutils-2.35+"), which removed vdso-dummy.o in favor of generating vdso-syms.S from vdso.so with $(NM) but this also resolves the issue in case it ever comes back due to having full control over the $(LD) command. '-pg' is for function tracing, it is not used during linking as clang states.
These flags could be removed/filtered to fix the warnings but it is easier to just match the rest of the kernel and use $(LD) directly for linking. See commits
fe00e50b2db8 ("ARM: 8858/1: vdso: use $(LD) instead of $(CC) to link VDSO")
691efbedc60d ("arm64: vdso: use $(LD) instead of $(CC) to link VDSO")
2ff906994b6c ("MIPS: VDSO: Use $(LD) instead of $(CC) to link VDSO")
2b2a25845d53 ("s390/vdso: Use $(LD) instead of $(CC) to link vDSO")for more information.
The flags are converted to linker flags and '--eh-frame-hdr' is added to match what is added by GCC implicitly, which can be seen by adding '-v' to GCC's invocation.
Additionally, since this area is being modified, use the $(OBJCOPY) variable instead of an open coded $(CROSS_COMPILE)objcopy so that the user's choice of objcopy binary is respected.
--- arch/riscv/kernel/vdso/Makefile | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
arch/riscv/kernel/vdso/Makefile +4 -8
@@ -41,11 +41,10 @@ KASAN_SANITIZE := n $(obj)/vdso.o: $(obj)/vdso.so # link rule for the .so file, .lds has to be first -SYSCFLAGS_vdso.so.dbg = $(c_flags) $(obj)/vdso.so.dbg: $(src)/vdso.lds $(obj-vdso) FORCE $(call if_changed,vdsold) -SYSCFLAGS_vdso.so.dbg = -shared -s -Wl,-soname=linux-vdso.so.1 \ - -Wl,--build-id=sha1 -Wl,--hash-style=both +LDFLAGS_vdso.so.dbg = -shared -s -soname=linux-vdso.so.1 \ + --build-id=sha1 --hash-style=both --eh-frame-hdr # We also create a special relocatable object that should mirror the symbol # table and layout of the linked DSO. With ld --just-symbols we can then
@@ -60,13 +59,10 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE # actual build commands # The DSO images are built using a special linker script -# Add -lgcc so rv32 gets static muldi3 and lshrdi3 definitions. # Make sure only to export the intended __vdso_xxx symbol offsets. quiet_cmd_vdsold = VDSOLD $@ - cmd_vdsold = $(CC) $(KBUILD_CFLAGS) $(call cc-option, -no-pie) -nostdlib -nostartfiles $(SYSCFLAGS_$(@F)) \ - -Wl,-T,$(filter-out FORCE,$^) -o [email protected] && \ - $(CROSS_COMPILE)objcopy \ - $(patsubst %, -G __vdso_%, $(vdso-syms)) [email protected] $@ && \ + cmd_vdsold = $(LD) $(ld_flags) -T $(filter-out FORCE,$^) -o [email protected] && \ + $(OBJCOPY) $(patsubst %, -G __vdso_%, $(vdso-syms)) [email protected] $@ && \ rm [email protected] # Extracts symbol offsets from the VDSO, converting them into an assembly file
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 24/45 scripts/recordmcount.pl: Fix RISC-V regex for clang
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
[ Upstream commit 2f095504f4b9cf75856d6a9cf90299cf75aa46c5 ]
Clang can generate R_RISCV_CALL_PLT relocations to _mcount:
$ llvm-objdump -dr build/riscv/init/main.o | rg mcount
000000000000000e: R_RISCV_CALL_PLT _mcount
000000000000004e: R_RISCV_CALL_PLT _mcountAfter this, the __start_mcount_loc section is properly generated and function tracing still works.
--- scripts/recordmcount.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/recordmcount.pl +1 -1
@@ -392,7 +392,7 @@ if ($arch eq "x86_64") { $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$"; } elsif ($arch eq "riscv") { $function_regex = "^([0-9a-fA-F]+)\\s+<([^.0-9][0-9a-zA-Z_\\.]+)>:"; - $mcount_regex = "^\\s*([0-9a-fA-F]+):\\sR_RISCV_CALL\\s_mcount\$"; + $mcount_regex = "^\\s*([0-9a-fA-F]+):\\sR_RISCV_CALL(_PLT)?\\s_mcount\$"; $type = ".quad"; $alignment = 2; } elsif ($arch eq "nds32") {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 25/45 riscv: Workaround mcount name prior to clang-13
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
[ Upstream commit 7ce04771503074a7de7f539cc43f5e1b385cb99b ]
Prior to clang 13.0.0, the RISC-V name for the mcount symbol was "mcount", which differs from the GCC version of "_mcount", which results in the following errors:
riscv64-linux-gnu-ld: init/main.o: in function `__traceiter_initcall_level':
main.c:(.text+0xe): undefined reference to `mcount'
riscv64-linux-gnu-ld: init/main.o: in function `__traceiter_initcall_start':
main.c:(.text+0x4e): undefined reference to `mcount'
riscv64-linux-gnu-ld: init/main.o: in function `__traceiter_initcall_finish':
main.c:(.text+0x92): undefined reference to `mcount'
riscv64-linux-gnu-ld: init/main.o: in function `.LBB32_28':
main.c:(.text+0x30c): undefined reference to `mcount'
riscv64-linux-gnu-ld: init/main.o: in function `free_initmem':
main.c:(.text+0x54c): undefined reference to `mcount'
This has been corrected in https://reviews.llvm.org/D98881 but the minimum supported clang version is 10.0.1. To avoid build errors and to gain a working function tracer, adjust the name of the mcount symbol for older versions of clang in mount.S and recordmcount.pl.
--- arch/riscv/include/asm/ftrace.h | 14 ++++++++++++-- arch/riscv/kernel/mcount.S | 10 +++++----- scripts/recordmcount.pl | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-)
arch/riscv/include/asm/ftrace.h +12 -2
@@ -13,9 +13,19 @@#endif #define HAVE_FUNCTION_GRAPH_RET_ADDR_PTR +/* +* Clang prior to 13 had "mcount" instead of "_mcount": +* https://reviews.llvm.org/D98881 +*/ +#if defined(CONFIG_CC_IS_GCC ) ||CONFIG_CLANG_VERSION >=130000 +#define MCOUNT_NAME _mcount +#else +#define MCOUNT_NAME mcount +#endif +#define ARCH_SUPPORTS_FTRACE_OPS 1#ifndef __ASSEMBLY__ -void _mcount (void ); +void MCOUNT_NAME (void );static inline unsigned long ftrace_call_adjust (unsigned long addr) {return addr;
@@ -36,7 +46,7 @@ struct dyn_arch_ftrace {* both auipc and jalr at the same time. */ -#define MCOUNT_ADDR ((unsigned long)_mcount) +#define MCOUNT_ADDR ((unsigned long)MCOUNT_NAME)#define JALR_SIGN_MASK (0x00000800)#define JALR_OFFSET_MASK (0x00000fff)#define AUIPC_OFFSET_MASK (0xfffff000)
arch/riscv/kernel/mcount.S +5 -5
@@ -47,8 +47,8 @@ ENTRY(ftrace_stub) #ifdef CONFIG_DYNAMIC_FTRACE - .global _mcount - .set _mcount, ftrace_stub + .global MCOUNT_NAME + .set MCOUNT_NAME, ftrace_stub #endif ret ENDPROC(ftrace_stub)
@@ -78,7 +78,7 @@ ENDPROC(return_to_handler) #endif #ifndef CONFIG_DYNAMIC_FTRACE -ENTRY(_mcount) +ENTRY(MCOUNT_NAME) la t4, ftrace_stub #ifdef CONFIG_FUNCTION_GRAPH_TRACER la t0, ftrace_graph_return
@@ -124,6 +124,6 @@ do_trace: jalr t5 RESTORE_ABI_STATE ret -ENDPROC(_mcount) +ENDPROC(MCOUNT_NAME) #endif -EXPORT_SYMBOL(_mcount) +EXPORT_SYMBOL(MCOUNT_NAME)
scripts/recordmcount.pl +1 -1
@@ -392,7 +392,7 @@ if ($arch eq "x86_64") { $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$"; } elsif ($arch eq "riscv") { $function_regex = "^([0-9a-fA-F]+)\\s+<([^.0-9][0-9a-zA-Z_\\.]+)>:"; - $mcount_regex = "^\\s*([0-9a-fA-F]+):\\sR_RISCV_CALL(_PLT)?\\s_mcount\$"; + $mcount_regex = "^\\s*([0-9a-fA-F]+):\\sR_RISCV_CALL(_PLT)?\\s_?mcount\$"; $type = ".quad"; $alignment = 2; } elsif ($arch eq "nds32") {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 26/45 scsi: lpfc: Fix illegal memory access on Abort IOCBs
In reply to Greg Kroah-HartmanFrom: James Smart <[email protected]>
[ Upstream commit e1364711359f3ced054bda9920477c8bf93b74c5 ]
In devloss timer handler and in backend calls to terminate remote port I/O, there is logic to walk through all active IOCBs and validate them to potentially trigger an abort request. This logic is causing illegal memory accesses which leads to a crash. Abort IOCBs, which may be on the list, do not have an associated lpfc_io_buf struct. The driver is trying to map an lpfc_io_buf struct on the IOCB and which results in a bogus address thus the issue.
Fix by skipping over ABORT IOCBs (CLOSE IOCBs are ABORTS that don't send ABTS) in the IOCB scan logic.
--- drivers/scsi/lpfc/lpfc_sli.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/scsi/lpfc/lpfc_sli.c +9 -2
@@ -11807,13 +11807,20 @@ lpfc_sli_validate_fcp_iocb(struct lpfc_iocbq *iocbq, struct lpfc_vport *vport, lpfc_ctx_cmd ctx_cmd) {struct lpfc_io_buf *lpfc_cmd; +IOCB_t *icmd =NULL ;int rc =1 ;if (!iocbq || iocbq->vport != vport)return rc; -if (!(iocbq->iocb_flag &LPFC_IO_FCP ) || - !(iocbq->iocb_flag &LPFC_IO_ON_TXCMPLQ )) +if (!(iocbq->iocb_flag &LPFC_IO_FCP ) || + !(iocbq->iocb_flag &LPFC_IO_ON_TXCMPLQ ) || + iocbq->iocb_flag &LPFC_DRIVER_ABORTED ) +return rc; + + icmd = &iocbq->iocb; +if (icmd->ulpCommand ==CMD_ABORT_XRI_CN || + icmd->ulpCommand ==CMD_CLOSE_XRI_CN )return rc; lpfc_cmd = container_of(iocbq, struct lpfc_io_buf, cur_iocbq);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 27/45 ceph: fix fscache invalidation
In reply to Greg Kroah-HartmanFrom: Jeff Layton <[email protected]>
[ Upstream commit 10a7052c7868bc7bc72d947f5aac6f768928db87 ]
Ensure that we invalidate the fscache whenever we invalidate the pagecache.
--- fs/ceph/caps.c | 1 + fs/ceph/inode.c | 1 + 2 files changed, 2 insertions(+)
fs/ceph/caps.c +1 -0
@@ -1867,6 +1867,7 @@ static int try_nonblocking_invalidate(struct inode *inode)u32 invalidating_gen = ci->i_rdcache_gen;spin_unlock (&ci->i_ceph_lock); +ceph_fscache_invalidate (inode);invalidate_mapping_pages (&inode->i_data,0 ,-1 );spin_lock (&ci->i_ceph_lock);
fs/ceph/inode.c +1 -0
@@ -1863,6 +1863,7 @@ static void ceph_do_invalidate_pages(struct inode *inode) orig_gen = ci->i_rdcache_gen;spin_unlock (&ci->i_ceph_lock); +ceph_fscache_invalidate (inode);if (invalidate_inode_pages2 (inode->i_mapping) <0 ) {pr_err ("invalidate_pages %p fails\n" , inode); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 28/45 ceph: dont clobber i_snap_caps on non-I_NEW inode
In reply to Greg Kroah-HartmanFrom: Jeff Layton <[email protected]>
[ Upstream commit d3c51ae1b8cce5bdaf91a1ce32b33cf5626075dc ]
We want the snapdir to mirror the non-snapped directory's attributes for most things, but i_snap_caps represents the caps granted on the snapshot directory by the MDS itself. A misbehaving MDS could issue different caps for the snapdir and we lose them here.
Only reset i_snap_caps when the inode is I_NEW. Also, move the setting of i_op and i_fop inside the if block since they should never change anyway.
--- fs/ceph/inode.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
fs/ceph/inode.c +5 -4
@@ -87,14 +87,15 @@ struct inode *ceph_get_snapdir(struct inode *parent) inode->i_mtime = parent->i_mtime; inode->i_ctime = parent->i_ctime; inode->i_atime = parent->i_atime; - inode->i_op = &ceph_snapdir_iops; - inode->i_fop = &ceph_snapdir_fops; - ci->i_snap_caps =CEPH_CAP_PIN ;/* so we can open */ ci->i_rbytes =0 ; ci->i_btime =ceph_inode (parent)->i_btime; -if (inode->i_state &I_NEW ) +if (inode->i_state &I_NEW ) { + inode->i_op = &ceph_snapdir_iops; + inode->i_fop = &ceph_snapdir_fops; + ci->i_snap_caps =CEPH_CAP_PIN ;/* so we can open */ unlock_new_inode (inode); + }return inode; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 29/45 ceph: dont allow access to MDS-private inodes
In reply to Greg Kroah-HartmanFrom: Jeff Layton <[email protected]>
[ Upstream commit d4f6b31d721779d91b5e2f8072478af73b196c34 ]
The MDS reserves a set of inodes for its own usage, and these should never be accessible to clients. Add a new helper to vet a proposed inode number against that range, and complain loudly and refuse to create or look it up if it's in it.
Also, ensure that the MDS doesn't try to delegate inodes that are in that range or lower. Print a warning if it does, and don't save the range in the xarray.
URL: https://tracker.ceph.com/issues/49922
--- fs/ceph/export.c | 8 ++++++++ fs/ceph/inode.c | 3 +++ fs/ceph/mds_client.c | 7 +++++++ fs/ceph/super.h | 24 ++++++++++++++++++++++++ 4 files changed, 42 insertions(+)
fs/ceph/export.c +8 -0
@@ -129,6 +129,10 @@ static struct inode *__lookup_inode(struct super_block *sb, u64 ino) vino.ino = ino; vino.snap =CEPH_NOSNAP ; + +if (ceph_vino_is_reserved (vino)) +return ERR_PTR (-ESTALE ); + inode =ceph_find_inode (sb, vino);if (!inode) {struct ceph_mds_request *req;
@@ -214,6 +218,10 @@ static struct dentry *__snapfh_to_dentry(struct super_block *sb, vino.ino = sfh->ino; vino.snap = sfh->snapid; } + +if (ceph_vino_is_reserved (vino)) +return ERR_PTR (-ESTALE ); + inode =ceph_find_inode (sb, vino);if (inode)return d_obtain_alias (inode);
fs/ceph/inode.c +3 -0
@@ -56,6 +56,9 @@ struct inode *ceph_get_inode(struct super_block *sb, struct ceph_vino vino) {struct inode *inode; +if (ceph_vino_is_reserved (vino)) +return ERR_PTR (-EREMOTEIO ); + inode =iget5_locked (sb, (unsigned long )vino.ino, ceph_ino_compare, ceph_set_ino_cb, &vino);if (!inode)
fs/ceph/mds_client.c +7 -0
@@ -433,6 +433,13 @@ static int ceph_parse_deleg_inos(void **p, void *end,ceph_decode_64_safe (p, end, start, bad);ceph_decode_64_safe (p, end, len, bad); + +/* Don't accept a delegation of system inodes */ +if (start <CEPH_INO_SYSTEM_BASE ) { +pr_warn_ratelimited ("ceph: ignoring reserved inode range delegation (start=0x%llx len=0x%llx)\n" , + start, len); +continue ; + }while (len--) { int err = xa_insert(&s->s_delegated_inos, ino = start++, DELEGATED_INO_AVAILABLE,
fs/ceph/super.h +24 -0
@@ -529,10 +529,34 @@ static inline int ceph_ino_compare(struct inode *inode, void *data) ci->i_vino.snap == pvino->snap; } +/* +* The MDS reserves a set of inodes for its own usage. These should never +* be accessible by clients, and so the MDS has no reason to ever hand these +* out. The range is CEPH_MDS_INO_MDSDIR_OFFSET..CEPH_INO_SYSTEM_BASE. +* +* These come from src/mds/mdstypes.h in the ceph sources. +*/ +#define CEPH_MAX_MDS 0x100 +#define CEPH_NUM_STRAY 10 +#define CEPH_MDS_INO_MDSDIR_OFFSET (1 * CEPH_MAX_MDS) +#define CEPH_INO_SYSTEM_BASE ((6*CEPH_MAX_MDS) + (CEPH_MAX_MDS * CEPH_NUM_STRAY)) + +static inline bool ceph_vino_is_reserved (const struct ceph_vino vino) +{ +if (vino.ino <CEPH_INO_SYSTEM_BASE && + vino.ino >=CEPH_MDS_INO_MDSDIR_OFFSET ) { +WARN_RATELIMIT (1 ,"Attempt to access reserved inode number 0x%llx" , vino.ino); +return true; + } +return false; +}static inline struct inode *ceph_find_inode (struct super_block *sb,struct ceph_vino vino) { +if (ceph_vino_is_reserved (vino)) +return NULL ; +/* * NB: The hashval will be run through the fs/inode.c hash function * anyway, so there is no need to squash the inode number down to
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 3/45 airo: work around stack usage warning
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
commit 7909a590eba6d021f104958857cbc4f0089daceb upstream.
gcc-11 with KASAN on 32-bit arm produces a warning about a function that needs a lot of stack space:
drivers/net/wireless/cisco/airo.c: In function 'setup_card.constprop':drivers/net/wireless/cisco/airo.c:3960:1: error: the frame size of 1512 bytes is larger than 1400 bytes [-Werror=frame-larger-than=]
Most of this is from a single large structure that could be dynamically allocated or moved into the per-device structure. However, as the callers all seem to have a fairly well bounded call chain, the easiest change is to pull out the part of the function that needs the large variables into a separate function and mark that as noinline_for_stack. This does not reduce the total stack usage, but it gets rid of the warning and requires minimal changes otherwise.
--- drivers/net/wireless/cisco/airo.c | 117 +++++++++++++++++++++----------------- 1 file changed, 65 insertions(+), 52 deletions(-)
drivers/net/wireless/cisco/airo.c +65 -52
@@ -3817,6 +3817,68 @@ static inline void set_auth_type(struct local->last_auth = auth_type; } +static int noinline_for_stack airo_readconfig(struct airo_info *ai, u8 *mac, int lock) +{ +int i, status; +/* large variables, so don't inline this function, +* maybe change to kmalloc +*/ +tdsRssiRid rssi_rid; +CapabilityRid cap_rid; + +kfree (ai->SSID); + ai->SSID =NULL ; +// general configuration (read/modify/write) + status =readConfigRid (ai, lock); +if (status !=SUCCESS )return ERROR ; + + status =readCapabilityRid (ai, &cap_rid, lock); +if (status !=SUCCESS )return ERROR ; + + status =PC4500_readrid (ai,RID_RSSI , &rssi_rid,sizeof (rssi_rid), lock); +if (status ==SUCCESS ) { +if (ai->rssi || (ai->rssi =kmalloc (512 ,GFP_KERNEL )) !=NULL ) +memcpy (ai->rssi, (u8 *)&rssi_rid +2 ,512 );/* Skip RID length member */ + } +else { +kfree (ai->rssi); + ai->rssi =NULL ; +if (cap_rid.softCap &cpu_to_le16 (8 )) + ai->config.rmode |=RXMODE_NORMALIZED_RSSI ; +else +airo_print_warn (ai->dev->name,"unknown received signal " +"level scale" ); + } + ai->config.opmode = adhoc ?MODE_STA_IBSS :MODE_STA_ESS ; +set_auth_type (ai,AUTH_OPEN ); + ai->config.modulation =MOD_CCK ; + +if (le16_to_cpu (cap_rid.len) >=sizeof (cap_rid) && + (cap_rid.extSoftCap &cpu_to_le16 (1 )) && +micsetup (ai) ==SUCCESS ) { + ai->config.opmode |=MODE_MIC ; +set_bit (FLAG_MIC_CAPABLE , &ai->flags); + } + +/* Save off the MAC */ +for (i =0 ; i <ETH_ALEN ; i++) { + mac[i] = ai->config.macAddr[i]; + } + +/* Check to see if there are any insmod configured +rates to add */ +if (rates[0 ]) { +memset (ai->config.rates,0 ,sizeof (ai->config.rates)); +for (i =0 ; i <8 && rates[i]; i++) { + ai->config.rates[i] = rates[i]; + } + } +set_bit (FLAG_COMMIT , &ai->flags); + +return SUCCESS ; +} + +static u16 setup_card (struct airo_info *ai,u8 *mac,int lock) {Cmd cmd;
@@ -3863,58 +3925,9 @@ static u16 setup_card(struct airo_info *if (lock)up (&ai->sem);if (ai->config.len ==0 ) { -int i; -tdsRssiRid rssi_rid; -CapabilityRid cap_rid; - -kfree (ai->SSID); - ai->SSID =NULL ; -// general configuration (read/modify/write) - status =readConfigRid (ai, lock); -if (status !=SUCCESS )return ERROR ; - - status =readCapabilityRid (ai, &cap_rid, lock); -if (status !=SUCCESS )return ERROR ; - - status =PC4500_readrid (ai,RID_RSSI ,&rssi_rid,sizeof (rssi_rid), lock); -if (status ==SUCCESS ) { -if (ai->rssi || (ai->rssi =kmalloc (512 ,GFP_KERNEL )) !=NULL ) -memcpy (ai->rssi, (u8 *)&rssi_rid +2 ,512 );/* Skip RID length member */ - } -else { -kfree (ai->rssi); - ai->rssi =NULL ; -if (cap_rid.softCap &cpu_to_le16 (8 )) - ai->config.rmode |=RXMODE_NORMALIZED_RSSI ; -else -airo_print_warn (ai->dev->name,"unknown received signal " -"level scale" ); - } - ai->config.opmode = adhoc ?MODE_STA_IBSS :MODE_STA_ESS ; -set_auth_type (ai,AUTH_OPEN ); - ai->config.modulation =MOD_CCK ; - -if (le16_to_cpu (cap_rid.len) >=sizeof (cap_rid) && - (cap_rid.extSoftCap &cpu_to_le16 (1 )) && -micsetup (ai) ==SUCCESS ) { - ai->config.opmode |=MODE_MIC ; -set_bit (FLAG_MIC_CAPABLE , &ai->flags); - } - -/* Save off the MAC */ -for (i =0 ; i <ETH_ALEN ; i++) { - mac[i] = ai->config.macAddr[i]; - } - -/* Check to see if there are any insmod configured -rates to add */ -if (rates[0 ]) { -memset (ai->config.rates,0 ,sizeof (ai->config.rates)); -for (i =0 ; i <8 && rates[i]; i++) { - ai->config.rates[i] = rates[i]; - } - } -set_bit (FLAG_COMMIT , &ai->flags); + status =airo_readconfig (ai, mac, lock); +if (status !=SUCCESS ) +return ERROR ; }/* Setup the SSIDs if present */
Greg Kroah-Hartman
maintainerPATCH 30/45 scsi: target: tcmu: Return from tcmu_handle_completions() if cmd_id not found
In reply to Greg Kroah-HartmanFrom: Bodo Stroesser <[email protected]>
[ Upstream commit 9814b55cde0588b6d9bc496cee43f87316cbc6f1 ]
If tcmu_handle_completions() finds an invalid cmd_id while looping over cmd responses from userspace it sets TCMU_DEV_BIT_BROKEN and breaks the loop. This means that it does further handling for the tcmu device.
Skip that handling by replacing 'break' with 'return'.
Additionally change tcmu_handle_completions() from unsigned int to bool, since the value used in return already is bool.
--- drivers/target/target_core_user.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/target/target_core_user.c +2 -2
@@ -1377,7 +1377,7 @@ static int tcmu_run_tmr_queue(struct tcmu_dev *udev)return 1 ; } -static unsigned int tcmu_handle_completions (struct tcmu_dev *udev) +static bool tcmu_handle_completions (struct tcmu_dev *udev) {struct tcmu_mailbox *mb;struct tcmu_cmd *cmd;
@@ -1420,7 +1420,7 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev)pr_err ("cmd_id %u not found, ring is broken\n" , entry->hdr.cmd_id);set_bit (TCMU_DEV_BIT_BROKEN , &udev->flags); -break ; +return false; }tcmu_handle_completion (cmd, entry);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 31/45 amdgpu/pm: Prevent force of DCEFCLK on NAVI10 and SIENNA_CICHLID
In reply to Greg Kroah-HartmanFrom: Darren Powell <[email protected]>
[ Upstream commit b117b3964f38a988cb79825950dbd607c02237f3 ]
Writing to dcefclk causes the gpu to become unresponsive, and requires a reboot. Patch ignores a .force_clk_levels(SMU_DCEFCLK) call and issues an info message.
--- drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c | 5 ++++- drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c +4 -1
@@ -1110,7 +1110,6 @@ static int navi10_force_clk_levels(struct smu_context *smu,case SMU_SOCCLK :case SMU_MCLK :case SMU_UCLK : -case SMU_DCEFCLK :case SMU_FCLK :/* There is only 2 levels for fine grained DPM */ if (navi10_is_support_fine_grained_dpm (smu, clk_type)) {
@@ -1130,6 +1129,10 @@ static int navi10_force_clk_levels(struct smu_context *smu,if (ret)return size;break ; +case SMU_DCEFCLK : +dev_info (smu->adev->dev,"Setting DCEFCLK min/max dpm level is not supported!\n" ); +break ; +default :break ; }
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c +3 -1
@@ -1127,7 +1127,6 @@ static int sienna_cichlid_force_clk_levels(struct smu_context *smu,case SMU_SOCCLK :case SMU_MCLK :case SMU_UCLK : -case SMU_DCEFCLK :case SMU_FCLK :/* There is only 2 levels for fine grained DPM */ if (sienna_cichlid_is_support_fine_grained_dpm (smu, clk_type)) {
@@ -1147,6 +1146,9 @@ static int sienna_cichlid_force_clk_levels(struct smu_context *smu,if (ret) goto forec_level_out;break ; +case SMU_DCEFCLK : +dev_info (smu->adev->dev,"Setting DCEFCLK min/max dpm level is not supported!\n" ); +break ;default :break ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 32/45 bridge: Fix possible races between assigning rx_handler_data and setting IFF_BRIDGE_PORT bit
In reply to Greg Kroah-HartmanFrom: Zhang Zhengming <[email protected]>
[ Upstream commit 59259ff7a81b9eb6213891c6451221e567f8f22f ]
There is a crash in the function br_get_link_af_size_filtered, as the port_exists(dev) is true and the rx_handler_data of dev is NULL. But the rx_handler_data of dev is correct saved in vmcore.
The oops looks something like:
...
pc : br_get_link_af_size_filtered+0x28/0x1c8 [bridge] ... Call trace: br_get_link_af_size_filtered+0x28/0x1c8 [bridge] if_nlmsg_size+0x180/0x1b0 rtnl_calcit.isra.12+0xf8/0x148 rtnetlink_rcv_msg+0x334/0x370 netlink_rcv_skb+0x64/0x130 rtnetlink_rcv+0x28/0x38 netlink_unicast+0x1f0/0x250 netlink_sendmsg+0x310/0x378 sock_sendmsg+0x4c/0x70 __sys_sendto+0x120/0x150 __arm64_sys_sendto+0x30/0x40 el0_svc_common+0x78/0x130 el0_svc_handler+0x38/0x78 el0_svc+0x8/0xc
In br_add_if(), we found there is no guarantee that assigning rx_handler_data to dev->rx_handler_data will before setting the IFF_BRIDGE_PORT bit of priv_flags. So there is a possible data competition:
CPU 0: CPU 1:
(RCU read lock) (RTNL lock)
rtnl_calcit() br_add_slave()
if_nlmsg_size() br_add_if()
br_get_link_af_size_filtered() -> netdev_rx_handler_register
...
// The order is not guaranteed
... -> dev->priv_flags |= IFF_BRIDGE_PORT;
// The IFF_BRIDGE_PORT bit of priv_flags has been set
-> if (br_port_exists(dev)) {
// The dev->rx_handler_data has NOT been assigned
-> p = br_port_get_rcu(dev);
....
-> rcu_assign_pointer(dev->rx_handler_data, rx_handler_data);
...Fix it in br_get_link_af_size_filtered, using br_port_get_check_rcu() and checking the return value.
--- net/bridge/br_netlink.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/bridge/br_netlink.c +3 -2
@@ -103,8 +103,9 @@ static size_t br_get_link_af_size_filtered(const struct net_device *dev,rcu_read_lock ();if (netif_is_bridge_port (dev)) { - p =br_port_get_rcu (dev); - vg =nbp_vlan_group_rcu (p); + p =br_port_get_check_rcu (dev); +if (p) + vg =nbp_vlan_group_rcu (p); }else if (dev->priv_flags &IFF_EBRIDGE ) { br =netdev_priv (dev); vg =br_vlan_group_rcu (br);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 33/45 net: hsr: check skb can contain struct hsr_ethhdr in fill_frame_info
In reply to Greg Kroah-HartmanFrom: Phillip Potter <[email protected]>
[ Upstream commit 2e9f60932a2c19e8a11b4a69d419f107024b05a0 ]
Check at start of fill_frame_info that the MAC header in the supplied skb is large enough to fit a struct hsr_ethhdr, as otherwise this is not a valid HSR frame. If it is too small, return an error which will then cause the callers to clean up the skb. Fixes a KMSAN-found uninit-value bug reported by syzbot at:
https://syzkaller.appspot.com/bug?id=f7e9b601f1414f814f7602a82b6619a8d80bce3f
--- net/hsr/hsr_forward.c | 4 ++++ 1 file changed, 4 insertions(+)
net/hsr/hsr_forward.c +4 -0
@@ -520,6 +520,10 @@ static int fill_frame_info(struct hsr_frame_info *frame,struct ethhdr *ethhdr;__be16 proto; +/* Check if skb contains hsr_ethhdr */ +if (skb->mac_len <sizeof (struct hsr_ethhdr )) +return -EINVAL ; +memset (frame,0 ,sizeof (*frame)); frame->is_supervision =is_supervision_frame (port->hsr, skb); frame->node_src = hsr_get_node(port, &hsr->node_db, skb,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 4/45 kgdb: fix gcc-11 warning on indentation
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
commit 40cc3a80bb42587db1e6ae21d6f3090582d33e89 upstream.
gcc-11 starts warning about misleading indentation inside of macros:
drivers/misc/kgdbts.c: In function ‘kgdbts_break_test’:drivers/misc/kgdbts.c:103:9: error: this ‘if’ clause does not guard... [-Werror=misleading-indentation]
103 | if (verbose > 1) \
| ^~
drivers/misc/kgdbts.c:200:9: note: in expansion of macro ‘v2printk’
200 | v2printk("kgdbts: breakpoint complete\n");
| ^~~~~~~~
drivers/misc/kgdbts.c:105:17: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’
105 | touch_nmi_watchdog(); \
| ^~~~~~~~~~~~~~~~~~The code looks correct to me, so just reindent it for readability.
--- drivers/misc/kgdbts.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-)
drivers/misc/kgdbts.c +13 -13
@@ -95,19 +95,19 @@#include <asm/sections.h> -#define v1printk(a...) do { \ - if (verbose) \ - printk(KERN_INFO a); \ - } while (0) -#define v2printk(a...) do { \ - if (verbose > 1) \ - printk(KERN_INFO a); \ - touch_nmi_watchdog(); \ - } while (0) -#define eprintk(a...) do { \ - printk(KERN_ERR a); \ - WARN_ON(1); \ - } while (0) +#define v1printk(a...) do { \ + if (verbose) \ + printk(KERN_INFO a); \ +} while (0) +#define v2printk(a...) do { \ + if (verbose > 1) \ + printk(KERN_INFO a); \ + touch_nmi_watchdog(); \ +} while (0) +#define eprintk(a...) do { \ + printk(KERN_ERR a); \ + WARN_ON(1); \ +} while (0)#define MAX_CONFIG_LEN 40static struct kgdb_io kgdbts_io_ops;
Greg Kroah-Hartman
maintainerPATCH 5/45 usb: sl811-hcd: improve misleading indentation
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
commit 8460f6003a1d2633737b89c4f69d6f4c0c7c65a3 upstream.
gcc-11 now warns about a confusingly indented code block:
drivers/usb/host/sl811-hcd.c: In function ‘sl811h_hub_control’:drivers/usb/host/sl811-hcd.c:1291:9: error: this ‘if’ clause does not guard... [-Werror=misleading-indentation]
1291 | if (*(u16*)(buf+2)) /* only if wPortChange is interesting */
| ^~drivers/usb/host/sl811-hcd.c:1295:17: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’
1295 | break;
Rewrite this to use a single if() block with the __is_defined() macro.
--- drivers/usb/host/sl811-hcd.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/usb/host/sl811-hcd.c +4 -5
@@ -1287,11 +1287,10 @@ sl811h_hub_control( goto error;put_unaligned_le32 (sl811->port1, buf); -#ifndef VERBOSE - if (*(u16*)(buf+2)) /* only if wPortChange is interesting */ -#endif -dev_dbg (hcd->self.controller,"GetPortStatus %08x\n" , - sl811->port1); +if (__is_defined (VERBOSE ) || + *(u16 *)(buf+2 ))/* only if wPortChange is interesting */ +dev_dbg (hcd->self.controller,"GetPortStatus %08x\n" , + sl811->port1);break ;case SetPortFeature:if (wIndex !=1 || wLength !=0 )
Greg Kroah-Hartman
maintainerPATCH 6/45 ARM: 9058/1: cache-v7: refactor v7_invalidate_l1 to avoid clobbering r5/r6
In reply to Greg Kroah-HartmanFrom: Ard Biesheuvel <[email protected]>
[ Upstream commit f9e7a99fb6b86aa6a00e53b34ee6973840e005aa ]
The cache invalidation code in v7_invalidate_l1 can be tweaked to re-read the associativity from CCSIDR, and keep the way identifier component in a single register that is assigned in the outer loop. This way, we need 2 registers less.
Given that the number of sets is typically much larger than the associativity, rearrange the code so that the outer loop has the fewer number of iterations, ensuring that the re-read of CCSIDR only occurs a handful of times in practice.
Fix the whitespace while at it, and update the comment to indicate that this code is no longer a clone of anything else.
--- arch/arm/mm/cache-v7.S | 51 +++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 26 deletions(-)
arch/arm/mm/cache-v7.S +25 -26
@@ -33,41 +33,40 @@ icache_size: * processor. We fix this by performing an invalidate, rather than a * clean + invalidate, before jumping into the kernel. * - * This function is cloned from arch/arm/mach-tegra/headsmp.S, and needs - * to be called for both secondary cores startup and primary core resume - * procedures. + * This function needs to be called for both secondary cores startup and + * primary core resume procedures. */ ENTRY(v7_invalidate_l1) mov r0, #0 mcr p15, 2, r0, c0, c0, 0 mrc p15, 1, r0, c0, c0, 0 - movw r1, #0x7fff - and r2, r1, r0, lsr #13 + movw r3, #0x3ff + and r3, r3, r0, lsr #3 @ 'Associativity' in CCSIDR[12:3] + clz r1, r3 @ WayShift + mov r2, #1 + mov r3, r3, lsl r1 @ NumWays-1 shifted into bits [31:...] + movs r1, r2, lsl r1 @ #1 shifted left by same amount + moveq r1, #1 @ r1 needs value > 0 even if only 1 way - movw r1, #0x3ff + and r2, r0, #0x7 + add r2, r2, #4 @ SetShift - and r3, r1, r0, lsr #3 @ NumWays - 1 - add r2, r2, #1 @ NumSets +1: movw r4, #0x7fff + and r0, r4, r0, lsr #13 @ 'NumSets' in CCSIDR[27:13] - and r0, r0, #0x7 - add r0, r0, #4 @ SetShift - - clz r1, r3 @ WayShift - add r4, r3, #1 @ NumWays -1: sub r2, r2, #1 @ NumSets-- - mov r3, r4 @ Temp = NumWays -2: subs r3, r3, #1 @ Temp-- - mov r5, r3, lsl r1 - mov r6, r2, lsl r0 - orr r5, r5, r6 @ Reg = (Temp<<WayShift)|(NumSets<<SetShift) - mcr p15, 0, r5, c7, c6, 2 - bgt 2b - cmp r2, #0 - bgt 1b - dsb st - isb - ret lr +2: mov r4, r0, lsl r2 @ NumSet << SetShift + orr r4, r4, r3 @ Reg = (Temp<<WayShift)|(NumSets<<SetShift) + mcr p15, 0, r4, c7, c6, 2 + subs r0, r0, #1 @ Set-- + bpl 2b + subs r3, r3, r1 @ Way-- + bcc 3f + mrc p15, 1, r0, c0, c0, 0 @ re-read cache geometry from CCSIDR + b 1b +3: dsb st + isb + ret lr ENDPROC(v7_invalidate_l1) /*
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 7/45 PCI: thunder: Fix compile testing
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 16f7ae5906dfbeff54f74ec75d0563bb3a87ab0b ]
Compile-testing these drivers is currently broken. Enabling it causes a couple of build failures though:
drivers/pci/controller/pci-thunder-ecam.c:119:30: error: shift count >= width of type [-Werror,-Wshift-count-overflow] drivers/pci/controller/pci-thunder-pem.c:54:2: error: implicit declaration of function 'writeq' [-Werror,-Wimplicit-function-declaration] drivers/pci/controller/pci-thunder-pem.c:392:8: error: implicit declaration of function 'acpi_get_rc_resources' [-Werror,-Wimplicit-function-declaration]
Fix them with the obvious one-line changes.
--- drivers/pci/controller/pci-thunder-ecam.c | 2 +- drivers/pci/controller/pci-thunder-pem.c | 13 +++++++------ drivers/pci/pci.h | 6 ++++++ 3 files changed, 14 insertions(+), 7 deletions(-)
drivers/pci/controller/pci-thunder-ecam.c +1 -1
@@ -116,7 +116,7 @@ static int thunder_ecam_p2_config_read(struct pci_bus *bus, unsigned int devfn,* the config space access window. Since we are working with * the high-order 32 bits, shift everything down by 32 bits. */ - node_bits = (cfg->res.start >>32 ) & (1 <<12 ); + node_bits =upper_32_bits (cfg->res.start) & (1 <<12 ); v |= node_bits;set_val (v, where, size, val);
drivers/pci/controller/pci-thunder-pem.c +7 -6
@@ -12,6 +12,7 @@#include <linux/pci-acpi.h> #include <linux/pci-ecam.h> #include <linux/platform_device.h> +#include <linux/io-64-nonatomic-lo-hi.h> #include "../pci.h" #if defined(CONFIG_PCI_HOST_THUNDER_PEM ) || (defined(CONFIG_ACPI ) && defined(CONFIG_PCI_QUIRKS ))
@@ -324,9 +325,9 @@ static int thunder_pem_init(struct device *dev, struct pci_config_window *cfg,* structure here for the BAR. */ bar4_start = res_pem->start +0xf00000 ; - pem_pci->ea_entry[0 ] = (u32 )bar4_start |2 ; - pem_pci->ea_entry[1 ] = (u32)(res_pem->end - bar4_start) & ~3u ; - pem_pci->ea_entry[2 ] = (u32)(bar4_start >>32 ); + pem_pci->ea_entry[0 ] =lower_32_bits (bar4_start) |2 ; + pem_pci->ea_entry[1 ] =lower_32_bits (res_pem->end - bar4_start) & ~3u ; + pem_pci->ea_entry[2 ] =upper_32_bits (bar4_start); cfg->priv = pem_pci;return 0 ;
@@ -334,9 +335,9 @@ static int thunder_pem_init(struct device *dev, struct pci_config_window *cfg,#if defined(CONFIG_ACPI ) && defined(CONFIG_PCI_QUIRKS ) -#define PEM_RES_BASE 0x87e0c0000000UL -#define PEM_NODE_MASK GENMASK(45, 44) -#define PEM_INDX_MASK GENMASK(26, 24) +#define PEM_RES_BASE 0x87e0c0000000ULL +#define PEM_NODE_MASK GENMASK_ULL(45, 44) +#define PEM_INDX_MASK GENMASK_ULL(26, 24)#define PEM_MIN_DOM_IN_NODE 4#define PEM_MAX_DOM_IN_NODE 10
drivers/pci/pci.h +6 -0
@@ -624,6 +624,12 @@ static inline int pci_dev_specific_reset(struct pci_dev *dev, int probe)#if defined(CONFIG_PCI_QUIRKS ) && defined(CONFIG_ARM64 )int acpi_get_rc_resources (struct device *dev,const char *hid,u16 segment,struct resource *res); +#else +static inline int acpi_get_rc_resources (struct device *dev,const char *hid, +u16 segment,struct resource *res) +{ +return -ENODEV ; +}#endif int pci_rebar_get_current_size (struct pci_dev *pdev,int bar);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 8/45 dmaengine: dw-edma: Fix crash on loading/unloading driver
In reply to Greg Kroah-HartmanFrom: Gustavo Pimentel <[email protected]>
[ Upstream commit e970dcc4bd8e0a1376e794fc81d41d0fc98262dd ]
When the driver is compiled as a module and loaded if we try to unload it, the Kernel shows a crash log. This Kernel crash is due to the dma_async_device_unregister() call done after deleting the channels, this patch fixes this issue.
--- drivers/dma/dw-edma/dw-edma-core.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/dma/dw-edma/dw-edma-core.c +5 -6
@@ -937,22 +937,21 @@ int dw_edma_remove(struct dw_edma_chip *chip)/* Power management */ pm_runtime_disable (dev); +/* Deregister eDMA device */ +dma_async_device_unregister (&dw->wr_edma);list_for_each_entry_safe (chan, _chan, &dw->wr_edma.channels, vc.chan.device_node) { -list_del (&chan->vc.chan.device_node);tasklet_kill (&chan->vc.task); +list_del (&chan->vc.chan.device_node); } +dma_async_device_unregister (&dw->rd_edma);list_for_each_entry_safe (chan, _chan, &dw->rd_edma.channels, vc.chan.device_node) { -list_del (&chan->vc.chan.device_node);tasklet_kill (&chan->vc.task); +list_del (&chan->vc.chan.device_node); } -/* Deregister eDMA device */ -dma_async_device_unregister (&dw->wr_edma); -dma_async_device_unregister (&dw->rd_edma); -/* Turn debugfs off */ dw_edma_v0_core_debugfs_off ();
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 9/45 ARM: 9066/1: ftrace: pause/unpause function graph tracer in cpu_suspend()
In reply to Greg Kroah-HartmanFrom: louis.wang <[email protected]>
[ Upstream commit 8252ca87c7a2111502ee13994956f8c309faad7f ]
Enabling function_graph tracer on ARM causes kernel panic, because the function graph tracer updates the "return address" of a function in order to insert a trace callback on function exit, it saves the function's original return address in a return trace stack, but cpu_suspend() may not return through the normal return path.
cpu_suspend() will resume directly via the cpu_resume path, but the return trace stack has been set-up by the subfunctions of cpu_suspend(), which makes the "return address" inconsistent with cpu_suspend().
This patch refers to Commit de818bd4522c40ea02a81b387d2fa86f989c9623 ("arm64: kernel: pause/unpause function graph tracer in cpu_suspend()"),
fixes the issue by pausing/resuming the function graph tracer on the thread executing cpu_suspend(), so that the function graph tracer state is kept consistent across functions that enter power down states and never return by effectively disabling graph tracer while they are executing.
--- arch/arm/kernel/suspend.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-)
arch/arm/kernel/suspend.c +18 -1
@@ -1,4 +1,5 @@// SPDX-License-Identifier: GPL-2.0 +#include <linux/ftrace.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/mm_types.h>
@@ -25,6 +26,13 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))if (!idmap_pgd)return -EINVAL ; +/* +* Function graph tracer state gets incosistent when the kernel +* calls functions that never return (aka suspend finishers) hence +* disable graph tracing during their execution. +*/ +pause_graph_tracing (); +/* * Provide a temporary page table with an identity mapping for * the MMU-enable code, required for resuming. On successful
@@ -32,6 +40,9 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))* back to the correct page tables. */ ret =__cpu_suspend (arg, fn, __mpidr); + +unpause_graph_tracing (); +if (ret ==0 ) {cpu_switch_mm (mm->pgd, mm);local_flush_bp_all ();
@@ -45,7 +56,13 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))int cpu_suspend (unsigned long arg,int (*fn)(unsigned long )) {u32 __mpidr =cpu_logical_map (smp_processor_id ()); -return __cpu_suspend (arg, fn, __mpidr); +int ret; + +pause_graph_tracing (); + ret =__cpu_suspend (arg, fn, __mpidr); +unpause_graph_tracing (); + +return ret; }#define idmap_pgd NULL#endif
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainercover 5.12.6-rc1 review
This is the start of the stable review cycle for the 5.12.6 release. There are 45 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 22 May 2021 09:20:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.12.6-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-5.12.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.12.6-rc1
Eric Dumazet <[email protected]>
ipv6: remove extra dev_hold() for fallback tunnels
Eric Dumazet <[email protected]>
ip6_tunnel: sit: proper dev_{hold|put} in ndo_[un]init methods
Eric Dumazet <[email protected]>
sit: proper dev_{hold|put} in ndo_[un]init methods
Eric Dumazet <[email protected]>
ip6_gre: proper dev_{hold|put} in ndo_[un]init methods
Yannick Vignon <[email protected]>
net: stmmac: Do not enable RX FIFO overflow interrupts
Zqiang <[email protected]>
lib: stackdepot: turn depot_lock spinlock to raw_spinlock
yangerkun <[email protected]>
block: reexpand iov_iter after read/write
Hui Wang <[email protected]>
ALSA: hda: generic: change the DAC ctl name for LO+SPK or LO+HP
Íñigo Huguet <[email protected]>
net:CXGB4: fix leak if sk_buff is not used
Hans de Goede <[email protected]>
gpiolib: acpi: Add quirk to ignore EC wakeups on Dell Venue 10 Pro 5055
Rodrigo Siqueira <[email protected]>
drm/amd/display: Fix two cursor duplication when using overlay
Keith Busch <[email protected]>
nvmet: remove unsupported command noise
Phillip Potter <[email protected]>
net: hsr: check skb can contain struct hsr_ethhdr in fill_frame_info
Zhang Zhengming <[email protected]>
bridge: Fix possible races between assigning rx_handler_data and setting IFF_BRIDGE_PORT bit
Darren Powell <[email protected]>
amdgpu/pm: Prevent force of DCEFCLK on NAVI10 and SIENNA_CICHLID
Bodo Stroesser <[email protected]>
scsi: target: tcmu: Return from tcmu_handle_completions() if cmd_id not found
Jeff Layton <[email protected]>
ceph: don't allow access to MDS-private inodes
Jeff Layton <[email protected]>
ceph: don't clobber i_snap_caps on non-I_NEW inode
Jeff Layton <[email protected]>
ceph: fix fscache invalidation
James Smart <[email protected]>
scsi: lpfc: Fix illegal memory access on Abort IOCBs
Nathan Chancellor <[email protected]>
riscv: Workaround mcount name prior to clang-13
Nathan Chancellor <[email protected]>
scripts/recordmcount.pl: Fix RISC-V regex for clang
Nathan Chancellor <[email protected]>
riscv: Use $(LD) instead of $(CC) to link vDSO
Prashant Malani <[email protected]>
platform/chrome: cros_ec_typec: Add DP mode check
Manivannan Sadhasivam <[email protected]>
ARM: 9075/1: kernel: Fix interrupted SMC calls
Vidya Sagar <[email protected]>
PCI: tegra: Add Tegra194 MCFG quirks for ECAM errata
Johannes Berg <[email protected]>
um: Disable CONFIG_GCOV with MODULES
Johannes Berg <[email protected]>
um: Mark all kernel symbols as local
Chuck Lever <[email protected]>
svcrdma: Don't leak send_ctxt on Send errors
Yi Chen <[email protected]>
f2fs: fix to avoid NULL pointer dereference
Trond Myklebust <[email protected]>
NFS: NFS_INO_REVAL_PAGECACHE should mark the change attribute invalid
Hans de Goede <[email protected]>
Input: silead - add workaround for x86 BIOS-es which bring the chip up in a stuck state
Hans de Goede <[email protected]>
Input: elants_i2c - do not bind to i2c-hid compatible ACPI instantiated devices
Dinghao Liu <[email protected]>
PCI: tegra: Fix runtime PM imbalance in pex_ep_event_pex_rst_deassert()
Feilong Lin <[email protected]>
ACPI / hotplug / PCI: Fix reference count leak in enable_slot()
Trond Myklebust <[email protected]>
NFS: Fix fscache invalidation in nfs_set_cache_invalid()
louis.wang <[email protected]>
ARM: 9066/1: ftrace: pause/unpause function graph tracer in cpu_suspend()
Gustavo Pimentel <[email protected]>
dmaengine: dw-edma: Fix crash on loading/unloading driver
Arnd Bergmann <[email protected]>
PCI: thunder: Fix compile testing
Ard Biesheuvel <[email protected]>
ARM: 9058/1: cache-v7: refactor v7_invalidate_l1 to avoid clobbering r5/r6
Arnd Bergmann <[email protected]>
usb: sl811-hcd: improve misleading indentation
Arnd Bergmann <[email protected]>
kgdb: fix gcc-11 warning on indentation
Arnd Bergmann <[email protected]>
airo: work around stack usage warning
Linus Torvalds <[email protected]>
drm/i915/display: fix compiler warning about array overrun
Arnd Bergmann <[email protected]>
x86/msr: Fix wr/rdmsr_safe_regs_on_cpu() prototypes
-------------
Diffstat:
Makefile | 4 +- arch/arm/kernel/asm-offsets.c | 3 + arch/arm/kernel/smccc-call.S | 11 +- arch/arm/kernel/suspend.c | 19 +++- arch/arm/mm/cache-v7.S | 51 +++++---- arch/riscv/include/asm/ftrace.h | 14 ++- arch/riscv/kernel/mcount.S | 10 +- arch/riscv/kernel/vdso/Makefile | 12 +-- arch/um/Kconfig.debug | 1 + arch/um/kernel/Makefile | 1 - arch/um/kernel/dyn.lds.S | 6 ++ arch/um/kernel/gmon_syms.c | 16 --- arch/um/kernel/uml.lds.S | 6 ++ arch/x86/lib/msr-smp.c | 4 +- drivers/acpi/pci_mcfg.c | 7 ++ drivers/dma/dw-edma/dw-edma-core.c | 11 +- drivers/gpio/gpiolib-acpi.c | 14 +++ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 51 +++++++++ drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c | 5 +- .../drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 4 +- drivers/gpu/drm/i915/display/intel_dp.c | 13 ++- drivers/input/touchscreen/elants_i2c.c | 44 +++++++- drivers/input/touchscreen/silead.c | 44 +++++++- drivers/misc/kgdbts.c | 26 ++--- drivers/net/ethernet/chelsio/cxgb4/sge.c | 16 +-- drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c | 7 +- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 14 +-- drivers/net/wireless/cisco/airo.c | 117 ++++++++++++--------- drivers/nvme/target/admin-cmd.c | 6 +- drivers/pci/controller/dwc/Makefile | 2 +- drivers/pci/controller/dwc/pcie-tegra194.c | 104 +++++++++++++++++- drivers/pci/controller/pci-thunder-ecam.c | 2 +- drivers/pci/controller/pci-thunder-pem.c | 13 +-- drivers/pci/hotplug/acpiphp_glue.c | 1 + drivers/pci/pci.h | 6 ++ drivers/platform/chrome/cros_ec_typec.c | 5 + drivers/scsi/lpfc/lpfc_sli.c | 11 +- drivers/target/target_core_user.c | 4 +- drivers/usb/host/sl811-hcd.c | 9 +- fs/block_dev.c | 20 +++- fs/ceph/caps.c | 1 + fs/ceph/export.c | 8 ++ fs/ceph/inode.c | 13 ++- fs/ceph/mds_client.c | 7 ++ fs/ceph/super.h | 24 +++++ fs/f2fs/segment.c | 5 +- fs/nfs/inode.c | 7 +- include/linux/pci-ecam.h | 1 + lib/stackdepot.c | 6 +- net/bridge/br_netlink.c | 5 +- net/hsr/hsr_forward.c | 4 + net/ipv6/ip6_gre.c | 7 +- net/ipv6/ip6_tunnel.c | 3 +- net/ipv6/ip6_vti.c | 1 - net/ipv6/sit.c | 5 +- net/sunrpc/xprtrdma/svc_rdma_sendto.c | 8 +- scripts/recordmcount.pl | 2 +- sound/pci/hda/hda_generic.c | 16 ++- 58 files changed, 609 insertions(+), 228 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 35/45 drm/amd/display: Fix two cursor duplication when using overlay
From: Rodrigo Siqueira <[email protected]>
[ Upstream commit 16e9b3e58bc3fce7391539e0eb3fd167cbf9951f ]
Our driver supports overlay planes, and as expected, some userspace compositor takes advantage of these features. If the userspace is not enabling the cursor, they can use multiple planes as they please. Nevertheless, we start to have constraints when userspace tries to enable hardware cursor with various planes. Basically, we cannot draw the cursor at the same size and position on two separated pipes since it uses extra bandwidth and DML only run with one cursor.
For those reasons, when we enable hardware cursor and multiple planes, our driver should accept variations like the ones described below:
+-------------+ +--------------+ | +---------+ | | | | |Primary | | | Primary | | | | | | Overlay | | +---------+ | | | |Overlay | | | +-------------+ +--------------+
In this scenario, we can have the desktop UI in the overlay and some other framebuffer attached to the primary plane (e.g., video). However, userspace needs to obey some rules and avoid scenarios like the ones described below (when enabling hw cursor):
+--------+
|Overlay |
+-------------+ +-----+-------+ +-| |--+
| +--------+ | +--------+ | | +--------+ |
| |Overlay | | |Overlay | | | |
| | | | | | | | |
| +--------+ | +--------+ | | |
| Primary | | Primary | | Primary |
+-------------+ +-------------+ +-------------+ +-------------+ +-------------+
| +--------+ | Primary |
| |Overlay | | |
| | | | |
| +--------+ | +--------+ |
| Primary | | |Overlay | |
+-------------+ +-| |--+
+--------+If the userspace violates some of the above scenarios, our driver needs to reject the commit; otherwise, we can have unexpected behavior. Since we don't have a proper driver validation for the above case, we can see some problems like a duplicate cursor in applications that use multiple planes. This commit fixes the cursor issue and others by adding adequate verification for multiple planes.
Change since V1 (Harry and Sean):
- Remove cursor verification from the equation.
--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +51 -0
@@ -9344,6 +9344,53 @@ static int add_affected_mst_dsc_crtcs(struct drm_atomic_state *state, struct drm }#endif +static int validate_overlay (struct drm_atomic_state *state) +{ +int i; +struct drm_plane *plane; +struct drm_plane_state *old_plane_state, *new_plane_state; +struct drm_plane_state *primary_state, *overlay_state =NULL ; + +/* Check if primary plane is contained inside overlay */ +for_each_oldnew_plane_in_state_reverse (state, plane, old_plane_state, new_plane_state, i) { +if (plane->type ==DRM_PLANE_TYPE_OVERLAY ) { +if (drm_atomic_plane_disabling (plane->state, new_plane_state)) +return 0 ; + + overlay_state = new_plane_state; +continue ; + } + } + +/* check if we're making changes to the overlay plane */ +if (!overlay_state) +return 0 ; + +/* check if overlay plane is enabled */ +if (!overlay_state->crtc) +return 0 ; + +/* find the primary plane for the CRTC that the overlay is enabled on */ + primary_state =drm_atomic_get_plane_state (state, overlay_state->crtc->primary); +if (IS_ERR (primary_state)) +return PTR_ERR (primary_state); + +/* check if primary plane is enabled */ +if (!primary_state->crtc) +return 0 ; + +/* Perform the bounds check to ensure the overlay plane covers the primary */ +if (primary_state->crtc_x < overlay_state->crtc_x || + primary_state->crtc_y < overlay_state->crtc_y || + primary_state->crtc_x + primary_state->crtc_w > overlay_state->crtc_x + overlay_state->crtc_w || + primary_state->crtc_y + primary_state->crtc_h > overlay_state->crtc_y + overlay_state->crtc_h) { +DRM_DEBUG_ATOMIC ("Overlay plane is enabled with hardware cursor but does not fully cover primary plane\n" ); +return -EINVAL ; + } + +return 0 ; +} +/** * amdgpu_dm_atomic_check() - Atomic check implementation for AMDgpu DM. * @dev: The DRM device
@@ -9518,6 +9565,10 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, goto fail; } + ret =validate_overlay (state); +if (ret) + goto fail; +/* Add new/modified planes */ for_each_oldnew_plane_in_state_reverse (state, plane, old_plane_state, new_plane_state, i) { ret = dm_update_plane_state(dc, state, plane,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 44/45 ip6_tunnel: sit: proper dev_{hold|put} in ndo_[un]init methods
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit 48bb5697269a7cbe5194dbb044dc38c517e34c58 upstream.
Same reasons than for the previous commits :6289a98f0817 ("sit: proper dev_{hold|put} in ndo_[un]init methods") 40cb881b5aaa ("ip6_vti: proper dev_{hold|put} in ndo_[un]init methods") 7f700334be9a ("ip6_gre: proper dev_{hold|put} in ndo_[un]init methods")
After adopting CONFIG_PCPU_DEV_REFCNT=n option, syzbot was able to trigger a warning [1]
Issue here is that:
- all dev_put() should be paired with a corresponding prior dev_hold().
- A driver doing a dev_put() in its ndo_uninit() MUST also do a dev_hold() in its ndo_init(), only when ndo_init() is returning 0.
Otherwise, register_netdevice() would call ndo_uninit() in its error path and release a refcount too soon.
[1]
WARNING: CPU: 1 PID: 21059 at lib/refcount.c:31 refcount_warn_saturate+0xbf/0x1e0 lib/refcount.c:31 Modules linked in: CPU: 1 PID: 21059 Comm: syz-executor.4 Not tainted 5.12.0-rc4-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 RIP: 0010:refcount_warn_saturate+0xbf/0x1e0 lib/refcount.c:31 Code: 1d 6a 5a e8 09 31 ff 89 de e8 8d 1a ab fd 84 db 75 e0 e8 d4 13 ab fd 48 c7 c7 a0 e1 c1 89 c6 05 4a 5a e8 09 01 e8 2e 36 fb 04 <0f> 0b eb c4 e8 b8 13 ab fd 0f b6 1d 39 5a e8 09 31 ff 89 de e8 58 RSP: 0018:ffffc900025aefe8 EFLAGS: 00010282 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000 RDX: 0000000000040000 RSI: ffffffff815c51f5 RDI: fffff520004b5def RBP: 0000000000000004 R08: 0000000000000000 R09: 0000000000000000 R10: ffffffff815bdf8e R11: 0000000000000000 R12: ffff888023488568 R13: ffff8880254e9000 R14: 00000000dfd82cfd R15: ffff88802ee2d7c0 FS: 00007f13bc590700(0000) GS:ffff8880b9c00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f0943e74000 CR3: 0000000025273000 CR4: 00000000001506f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: __refcount_dec include/linux/refcount.h:344 [inline] refcount_dec include/linux/refcount.h:359 [inline] dev_put include/linux/netdevice.h:4135 [inline] ip6_tnl_dev_uninit+0x370/0x3d0 net/ipv6/ip6_tunnel.c:387 register_netdevice+0xadf/0x1500 net/core/dev.c:10308 ip6_tnl_create2+0x1b5/0x400 net/ipv6/ip6_tunnel.c:263 ip6_tnl_newlink+0x312/0x580 net/ipv6/ip6_tunnel.c:2052 __rtnl_newlink+0x1062/0x1710 net/core/rtnetlink.c:3443 rtnl_newlink+0x64/0xa0 net/core/rtnetlink.c:3491 rtnetlink_rcv_msg+0x44e/0xad0 net/core/rtnetlink.c:5553 netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2502 netlink_unicast_kernel net/netlink/af_netlink.c:1312 [inline] netlink_unicast+0x533/0x7d0 net/netlink/af_netlink.c:1338 netlink_sendmsg+0x856/0xd90 net/netlink/af_netlink.c:1927 sock_sendmsg_nosec net/socket.c:654 [inline] sock_sendmsg+0xcf/0x120 net/socket.c:674 ____sys_sendmsg+0x6e8/0x810 net/socket.c:2350 ___sys_sendmsg+0xf3/0x170 net/socket.c:2404 __sys_sendmsg+0xe5/0x1b0 net/socket.c:2433 do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46 entry_SYSCALL_64_after_hwframe+0x44/0xae
--- net/ipv6/ip6_tunnel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv6/ip6_tunnel.c +1 -1
@@ -266,7 +266,6 @@ static int ip6_tnl_create2(struct net_destrcpy (t->parms.name, dev->name); -dev_hold (dev);ip6_tnl_link (ip6n, t);return 0 ;
@@ -1882,6 +1881,7 @@ ip6_tnl_dev_init_gen(struct net_device * dev->min_mtu =ETH_MIN_MTU ; dev->max_mtu =IP6_MAX_MTU - dev->hard_header_len; +dev_hold (dev);return 0 ; destroy_dst:
Greg Kroah-Hartman
maintainerPATCH 45/45 ipv6: remove extra dev_hold() for fallback tunnels
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit 0d7a7b2014b1a499a0fe24c9f3063d7856b5aaaf upstream.
My previous commits added a dev_hold() in tunnels ndo_init(), but forgot to remove it from special functions setting up fallback tunnels.
Fallback tunnels do call their respective ndo_init()
This leads to various reports like :
unregister_netdevice: waiting for ip6gre0 to become free. Usage count = 2
--- net/ipv6/ip6_gre.c | 3 --- net/ipv6/ip6_tunnel.c | 1 - net/ipv6/ip6_vti.c | 1 - net/ipv6/sit.c | 1 - 4 files changed, 6 deletions(-)
net/ipv6/ip6_gre.c +0 -3
@@ -387,7 +387,6 @@ static struct ip6_tnl *ip6gre_tunnel_locif (!(nt->parms.o_flags &TUNNEL_SEQ )) dev->features |=NETIF_F_LLTX ; -dev_hold (dev);ip6gre_tunnel_link (ign, nt);return nt;
@@ -1539,8 +1538,6 @@ static void ip6gre_fb_tunnel_init(structstrcpy (tunnel->parms.name, dev->name); tunnel->hlen =sizeof (struct ipv6hdr ) +4 ; - -dev_hold (dev); }static struct inet6_protocol ip6gre_protocol__read_mostly = {
net/ipv6/ip6_tunnel.c +0 -1
@@ -1925,7 +1925,6 @@ static int __net_init ip6_fb_tnl_dev_inistruct ip6_tnl_net *ip6n =net_generic (net, ip6_tnl_net_id); t->parms.proto =IPPROTO_IPV6 ; -dev_hold (dev);rcu_assign_pointer (ip6n->tnls_wc[0 ], t);return 0 ;
net/ipv6/ip6_vti.c +0 -1
@@ -965,7 +965,6 @@ static int __net_init vti6_fb_tnl_dev_instruct vti6_net *ip6n =net_generic (net, vti6_net_id); t->parms.proto =IPPROTO_IPV6 ; -dev_hold (dev);rcu_assign_pointer (ip6n->tnls_wc[0 ], t);return 0 ;
net/ipv6/sit.c +0 -1
@@ -1470,7 +1470,6 @@ static void __net_init ipip6_fb_tunnel_i iph->ihl =5 ; iph->ttl =64 ; -dev_hold (dev);rcu_assign_pointer (sitn->tunnels_wc[0 ], tunnel); }
Greg Kroah-Hartman
maintainerPATCH 36/45 gpiolib: acpi: Add quirk to ignore EC wakeups on Dell Venue 10 Pro 5055
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit da91ece226729c76f60708efc275ebd4716ad089 ]
Like some other Bay and Cherry Trail SoC based devices the Dell Venue 10 Pro 5055 has an embedded-controller which uses ACPI GPIO events to report events instead of using the standard ACPI EC interface for this.
The EC interrupt is only used to report battery-level changes and it keeps doing this while the system is suspended, causing the system to not stay suspended.
Add an ignore-wake quirk for the GPIO pin used by the EC to fix the spurious wakeups from suspend.
--- drivers/gpio/gpiolib-acpi.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
drivers/gpio/gpiolib-acpi.c +14 -0
@@ -1438,6 +1438,20 @@ static const struct dmi_system_id gpiolib_acpi_quirks[] __initconst = { .no_edge_events_on_boot = true, }, }, + { +/* +* The Dell Venue 10 Pro 5055, with Bay Trail SoC + TI PMIC uses an +* external embedded-controller connected via I2C + an ACPI GPIO +* event handler on INT33FFC:02 pin 12, causing spurious wakeups. +*/ + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), + DMI_MATCH(DMI_PRODUCT_NAME, "Venue 10 Pro 5055"), + }, + .driver_data = &(struct acpi_gpiolib_dmi_quirk ) { + .ignore_wake ="INT33FC:02@12" , + }, + }, {/* * HP X2 10 models with Cherry Trail SoC + TI PMIC use an
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 37/45 net:CXGB4: fix leak if sk_buff is not used
In reply to Greg Kroah-HartmanFrom: Íñigo Huguet <[email protected]>
[ Upstream commit 52bfcdd87e83d9e69d22da5f26b1512ffc81deed ]
An sk_buff is allocated to send a flow control message, but it's not sent in all cases: in case the state is not appropiate to send it or if it can't be enqueued.
In the first of these 2 cases, the sk_buff was discarded but not freed, producing a memory leak.
--- drivers/net/ethernet/chelsio/cxgb4/sge.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
drivers/net/ethernet/chelsio/cxgb4/sge.c +9 -7
@@ -2563,12 +2563,12 @@ int cxgb4_ethofld_send_flowc(struct net_device *dev, u32 eotid, u32 tc)spin_lock_bh (&eosw_txq->lock);if (tc !=FW_SCHED_CLS_NONE ) {if (eosw_txq->state !=CXGB4_EO_STATE_CLOSED ) - goto out_unlock; + goto out_free_skb; next_state =CXGB4_EO_STATE_FLOWC_OPEN_SEND ; }else {if (eosw_txq->state !=CXGB4_EO_STATE_ACTIVE ) - goto out_unlock; + goto out_free_skb; next_state =CXGB4_EO_STATE_FLOWC_CLOSE_SEND ; }
@@ -2604,17 +2604,19 @@ int cxgb4_ethofld_send_flowc(struct net_device *dev, u32 eotid, u32 tc)eosw_txq_flush_pending_skbs (eosw_txq); ret =eosw_txq_enqueue (eosw_txq, skb); -if (ret) { -dev_consume_skb_any (skb); - goto out_unlock; - } +if (ret) + goto out_free_skb; eosw_txq->state = next_state; eosw_txq->flowc_idx = eosw_txq->pidx;eosw_txq_advance (eosw_txq,1 );ethofld_xmit (dev, eosw_txq); -out_unlock: +spin_unlock_bh (&eosw_txq->lock); +return 0 ; + +out_free_skb: +dev_consume_skb_any (skb);spin_unlock_bh (&eosw_txq->lock);return ret; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 38/45 ALSA: hda: generic: change the DAC ctl name for LO+SPK or LO+HP
In reply to Greg Kroah-HartmanFrom: Hui Wang <[email protected]>
[ Upstream commit f48652bbe3ae62ba2835a396b7e01f063e51c4cd ]
Without this change, the DAC ctl's name could be changed only when the machine has both Speaker and Headphone, but we met some machines which only has Lineout and Headhpone, and the Lineout and Headphone share the Audio Mixer0 and DAC0, the ctl's name is set to "Front".
On most of machines, the "Front" is used for Speaker only or Lineout only, but on this machine it is shared by Lineout and Headphone, This introduces an issue in the pipewire and pulseaudio, suppose users want the Headphone to be on and the Speaker/Lineout to be off, they could turn off the "Front", this works on most of the machines, but on this machine, the "Front" couldn't be turned off otherwise the headphone will be off too. Here we do some change to let the ctl's name change to "Headphone+LO" on this machine, and pipewire and pulseaudio already could handle "Headphone+LO" and "Speaker+LO".
(https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/747)
--- sound/pci/hda/hda_generic.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
sound/pci/hda/hda_generic.c +11 -5
@@ -1202,11 +1202,17 @@ static const char *get_line_out_pfx(struct hda_codec *codec, int ch, *index = ch;return "Headphone" ;case AUTO_PIN_LINE_OUT : -/* This deals with the case where we have two DACs and -* one LO, one HP and one Speaker */ -if (!ch && cfg->speaker_outs && cfg->hp_outs) { -bool hp_lo_shared = !path_has_mixer (codec, spec->hp_paths[0 ], ctl_type); -bool spk_lo_shared = !path_has_mixer (codec, spec->speaker_paths[0 ], ctl_type); +/* This deals with the case where one HP or one Speaker or +* one HP + one Speaker need to share the DAC with LO +*/ +if (!ch) { +bool hp_lo_shared = false, spk_lo_shared = false; + +if (cfg->speaker_outs) + spk_lo_shared = !path_has_mixer (codec, + spec->speaker_paths[0 ], ctl_type); +if (cfg->hp_outs) + hp_lo_shared = !path_has_mixer (codec, spec->hp_paths[0 ], ctl_type);if (hp_lo_shared && spk_lo_shared)return spec->vmaster_mute.hook ?"PCM" :"Master" ;if (hp_lo_shared)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 39/45 block: reexpand iov_iter after read/write
In reply to Greg Kroah-HartmanFrom: yangerkun <[email protected]>
[ Upstream commit cf7b39a0cbf6bf57aa07a008d46cf695add05b4c ]
We get a bug:
BUG: KASAN: slab-out-of-bounds in iov_iter_revert+0x11c/0x404 lib/iov_iter.c:1139 Read of size 8 at addr ffff0000d3fb11f8 by task CPU: 0 PID: 12582 Comm: syz-executor.2 Not tainted 5.10.0-00843-g352c8610ccd2 #2 Hardware name: linux,dummy-virt (DT) Call trace: dump_backtrace+0x0/0x2d0 arch/arm64/kernel/stacktrace.c:132 show_stack+0x28/0x34 arch/arm64/kernel/stacktrace.c:196 __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0x110/0x164 lib/dump_stack.c:118 print_address_description+0x78/0x5c8 mm/kasan/report.c:385 __kasan_report mm/kasan/report.c:545 [inline] kasan_report+0x148/0x1e4 mm/kasan/report.c:562 check_memory_region_inline mm/kasan/generic.c:183 [inline] __asan_load8+0xb4/0xbc mm/kasan/generic.c:252 iov_iter_revert+0x11c/0x404 lib/iov_iter.c:1139 io_read fs/io_uring.c:3421 [inline] io_issue_sqe+0x2344/0x2d64 fs/io_uring.c:5943 __io_queue_sqe+0x19c/0x520 fs/io_uring.c:6260 io_queue_sqe+0x2a4/0x590 fs/io_uring.c:6326 io_submit_sqe fs/io_uring.c:6395 [inline] io_submit_sqes+0x4c0/0xa04 fs/io_uring.c:6624 __do_sys_io_uring_enter fs/io_uring.c:9013 [inline] __se_sys_io_uring_enter fs/io_uring.c:8960 [inline] __arm64_sys_io_uring_enter+0x190/0x708 fs/io_uring.c:8960 __invoke_syscall arch/arm64/kernel/syscall.c:36 [inline] invoke_syscall arch/arm64/kernel/syscall.c:48 [inline] el0_svc_common arch/arm64/kernel/syscall.c:158 [inline] do_el0_svc+0x120/0x290 arch/arm64/kernel/syscall.c:227 el0_svc+0x1c/0x28 arch/arm64/kernel/entry-common.c:367 el0_sync_handler+0x98/0x170 arch/arm64/kernel/entry-common.c:383 el0_sync+0x140/0x180 arch/arm64/kernel/entry.S:670 Allocated by task 12570: stack_trace_save+0x80/0xb8 kernel/stacktrace.c:121 kasan_save_stack mm/kasan/common.c:48 [inline] kasan_set_track mm/kasan/common.c:56 [inline] __kasan_kmalloc+0xdc/0x120 mm/kasan/common.c:461 kasan_kmalloc+0xc/0x14 mm/kasan/common.c:475 __kmalloc+0x23c/0x334 mm/slub.c:3970 kmalloc include/linux/slab.h:557 [inline] __io_alloc_async_data+0x68/0x9c fs/io_uring.c:3210 io_setup_async_rw fs/io_uring.c:3229 [inline] io_read fs/io_uring.c:3436 [inline] io_issue_sqe+0x2954/0x2d64 fs/io_uring.c:5943 __io_queue_sqe+0x19c/0x520 fs/io_uring.c:6260 io_queue_sqe+0x2a4/0x590 fs/io_uring.c:6326 io_submit_sqe fs/io_uring.c:6395 [inline] io_submit_sqes+0x4c0/0xa04 fs/io_uring.c:6624 __do_sys_io_uring_enter fs/io_uring.c:9013 [inline] __se_sys_io_uring_enter fs/io_uring.c:8960 [inline] __arm64_sys_io_uring_enter+0x190/0x708 fs/io_uring.c:8960 __invoke_syscall arch/arm64/kernel/syscall.c:36 [inline] invoke_syscall arch/arm64/kernel/syscall.c:48 [inline] el0_svc_common arch/arm64/kernel/syscall.c:158 [inline] do_el0_svc+0x120/0x290 arch/arm64/kernel/syscall.c:227 el0_svc+0x1c/0x28 arch/arm64/kernel/entry-common.c:367 el0_sync_handler+0x98/0x170 arch/arm64/kernel/entry-common.c:383 el0_sync+0x140/0x180 arch/arm64/kernel/entry.S:670 Freed by task 12570: stack_trace_save+0x80/0xb8 kernel/stacktrace.c:121 kasan_save_stack mm/kasan/common.c:48 [inline] kasan_set_track+0x38/0x6c mm/kasan/common.c:56 kasan_set_free_info+0x20/0x40 mm/kasan/generic.c:355 __kasan_slab_free+0x124/0x150 mm/kasan/common.c:422 kasan_slab_free+0x10/0x1c mm/kasan/common.c:431 slab_free_hook mm/slub.c:1544 [inline] slab_free_freelist_hook mm/slub.c:1577 [inline] slab_free mm/slub.c:3142 [inline] kfree+0x104/0x38c mm/slub.c:4124 io_dismantle_req fs/io_uring.c:1855 [inline] __io_free_req+0x70/0x254 fs/io_uring.c:1867 io_put_req_find_next fs/io_uring.c:2173 [inline] __io_queue_sqe+0x1fc/0x520 fs/io_uring.c:6279 __io_req_task_submit+0x154/0x21c fs/io_uring.c:2051 io_req_task_submit+0x2c/0x44 fs/io_uring.c:2063 task_work_run+0xdc/0x128 kernel/task_work.c:151 get_signal+0x6f8/0x980 kernel/signal.c:2562 do_signal+0x108/0x3a4 arch/arm64/kernel/signal.c:658 do_notify_resume+0xbc/0x25c arch/arm64/kernel/signal.c:722 work_pending+0xc/0x180
blkdev_read_iter can truncate iov_iter's count since the count + pos may exceed the size of the blkdev. This will confuse io_read that we have consume the iovec. And once we do the iov_iter_revert in io_read, we will trigger the slab-out-of-bounds. Fix it by reexpand the count with size has been truncated.
blkdev_write_iter can trigger the problem too.
--- fs/block_dev.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-)
fs/block_dev.c +17 -3
@@ -1684,6 +1684,7 @@ ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)struct inode *bd_inode =bdev_file_inode (file);loff_t size =i_size_read (bd_inode);struct blk_plug plug; +size_t shorted =0 ;ssize_t ret;if (bdev_read_only (I_BDEV (bd_inode)))
@@ -1701,12 +1702,17 @@ ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)if ((iocb->ki_flags & (IOCB_NOWAIT |IOCB_DIRECT )) ==IOCB_NOWAIT )return -EOPNOTSUPP ; -iov_iter_truncate (from, size - iocb->ki_pos); + size -= iocb->ki_pos; +if (iov_iter_count (from) > size) { + shorted =iov_iter_count (from) - size; +iov_iter_truncate (from, size); + }blk_start_plug (&plug); ret =__generic_file_write_iter (iocb, from);if (ret >0 ) ret =generic_write_sync (iocb, ret); +iov_iter_reexpand (from,iov_iter_count (from) + shorted);blk_finish_plug (&plug);return ret; }
@@ -1718,13 +1724,21 @@ ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to)struct inode *bd_inode =bdev_file_inode (file);loff_t size =i_size_read (bd_inode);loff_t pos = iocb->ki_pos; +size_t shorted =0 ; +ssize_t ret;if (pos >= size)return 0 ; size -= pos; -iov_iter_truncate (to, size); -return generic_file_read_iter (iocb, to); +if (iov_iter_count (to) > size) { + shorted =iov_iter_count (to) - size; +iov_iter_truncate (to, size); + } + + ret =generic_file_read_iter (iocb, to); +iov_iter_reexpand (to,iov_iter_count (to) + shorted); +return ret; }EXPORT_SYMBOL_GPL (blkdev_read_iter);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 40/45 lib: stackdepot: turn depot_lock spinlock to raw_spinlock
In reply to Greg Kroah-HartmanFrom: Zqiang <[email protected]>
[ Upstream commit 78564b9434878d686c5f88c4488b20cccbcc42bc ]
In RT system, the spin_lock will be replaced by sleepable rt_mutex lock, in __call_rcu(), disable interrupts before calling kasan_record_aux_stack(), will trigger this calltrace:
BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:951
in_atomic(): 0, irqs_disabled(): 1, non_block: 0, pid: 19, name: pgdatinit0
Call Trace:
___might_sleep.cold+0x1b2/0x1f1
rt_spin_lock+0x3b/0xb0
stack_depot_save+0x1b9/0x440
kasan_save_stack+0x32/0x40
kasan_record_aux_stack+0xa5/0xb0
__call_rcu+0x117/0x880
__exit_signal+0xafb/0x1180
release_task+0x1d6/0x480
exit_notify+0x303/0x750
do_exit+0x678/0xcf0
kthread+0x364/0x4f0
ret_from_fork+0x22/0x30Replace spinlock with raw_spinlock.
--- lib/stackdepot.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
lib/stackdepot.c +3 -3
@@ -71,7 +71,7 @@ static void *stack_slabs[STACK_ALLOC_MAX_SLABS];static int depot_index;static int next_slab_inited;static size_t depot_offset; -static DEFINE_SPINLOCK (depot_lock); +static DEFINE_RAW_SPINLOCK (depot_lock);static bool init_stack_slab (void **prealloc) {
@@ -305,7 +305,7 @@ depot_stack_handle_t stack_depot_save(unsigned long *entries, prealloc =page_address (page); } -spin_lock_irqsave (&depot_lock, flags); +raw_spin_lock_irqsave (&depot_lock, flags); found =find_stack (*bucket, entries, nr_entries, hash);if (!found) {
@@ -329,7 +329,7 @@ depot_stack_handle_t stack_depot_save(unsigned long *entries,WARN_ON (!init_stack_slab (&prealloc)); } -spin_unlock_irqrestore (&depot_lock, flags); +raw_spin_unlock_irqrestore (&depot_lock, flags); exit:if (prealloc) {/* Nobody used this memory, ok to free it. */
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 41/45 net: stmmac: Do not enable RX FIFO overflow interrupts
In reply to Greg Kroah-HartmanFrom: Yannick Vignon <[email protected]>
[ Upstream commit 8a7cb245cf28cb3e541e0d6c8624b95d079e155b ]
The RX FIFO overflows when the system is not able to process all received packets and they start accumulating (first in the DMA queue in memory, then in the FIFO). An interrupt is then raised for each overflowing packet and handled in stmmac_interrupt(). This is counter-productive, since it brings the system (or more likely, one CPU core) to its knees to process the FIFO overflow interrupts.
stmmac_interrupt() handles overflow interrupts by writing the rx tail ptr into the corresponding hardware register (according to the MAC spec, this has the effect of restarting the MAC DMA). However, without freeing any rx descriptors, the DMA stops right away, and another overflow interrupt is raised as the FIFO overflows again. Since the DMA is already restarted at the end of stmmac_rx_refill() after freeing descriptors, disabling FIFO overflow interrupts and the corresponding handling code has no side effect, and eliminates the interrupt storm when the RX FIFO overflows.
--- drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c | 7 +------ drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 14 ++------------ 2 files changed, 3 insertions(+), 18 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c +1 -6
@@ -222,7 +222,7 @@ static void dwmac4_dma_rx_chan_op_mode(void __iomem *ioaddr, int mode, u32 channel, int fifosz, u8 qmode) { unsigned int rqs = fifosz / 256 - 1; -u32 mtl_rx_op, mtl_rx_int; +u32 mtl_rx_op; mtl_rx_op =readl (ioaddr +MTL_CHAN_RX_OP_MODE (channel));
@@ -283,11 +283,6 @@ static void dwmac4_dma_rx_chan_op_mode(void __iomem *ioaddr, int mode, }writel (mtl_rx_op, ioaddr +MTL_CHAN_RX_OP_MODE (channel)); - -/* Enable MTL RX overflow */ - mtl_rx_int =readl (ioaddr +MTL_CHAN_INT_CTRL (channel)); -writel (mtl_rx_int |MTL_RX_OVERFLOW_INT_EN , - ioaddr +MTL_CHAN_INT_CTRL (channel)); } static void dwmac4_dma_tx_chan_op_mode(void __iomem *ioaddr, int mode,
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +2 -12
@@ -4168,7 +4168,6 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id)/* To handle GMAC own interrupts */ if ((priv->plat->has_gmac) || xmac) {int status =stmmac_host_irq_status (priv, priv->hw, &priv->xstats); -int mtl_status;if (unlikely (status)) {/* For LPI we need to save the tx status */
@@ -4179,17 +4178,8 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id) }for (queue =0 ; queue < queues_count; queue++) { -struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; - - mtl_status =stmmac_host_mtl_irq_status (priv, priv->hw, - queue); -if (mtl_status != -EINVAL ) - status |= mtl_status; - -if (status &CORE_IRQ_MTL_RX_OVERFLOW ) -stmmac_set_rx_tail_ptr (priv, priv->ioaddr, - rx_q->rx_tail_addr, - queue); + status =stmmac_host_mtl_irq_status (priv, priv->hw, + queue); }/* PCS link status */
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 42/45 ip6_gre: proper dev_{hold|put} in ndo_[un]init methods
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit 7f700334be9aeb91d5d86ef9ad2d901b9b453e9b upstream.
After adopting CONFIG_PCPU_DEV_REFCNT=n option, syzbot was able to trigger a warning [1]
Issue here is that:
- all dev_put() should be paired with a corresponding dev_hold(), and vice versa.
- A driver doing a dev_put() in its ndo_uninit() MUST also do a dev_hold() in its ndo_init(), only when ndo_init() is returning 0.
Otherwise, register_netdevice() would call ndo_uninit() in its error path and release a refcount too soon.
ip6_gre for example (among others problematic drivers) has to use dev_hold() in ip6gre_tunnel_init_common() instead of from ip6gre_newlink_common(), covering both ip6gre_tunnel_init() and ip6gre_tap_init()/
Note that ip6gre_tunnel_init_common() is not called from ip6erspan_tap_init() thus we also need to add a dev_hold() there, as ip6erspan_tunnel_uninit() does call dev_put()
[1]refcount_t: decrement hit 0; leaking memory.
WARNING: CPU: 0 PID: 8422 at lib/refcount.c:31 refcount_warn_saturate+0xbf/0x1e0 lib/refcount.c:31 Modules linked in: CPU: 1 PID: 8422 Comm: syz-executor854 Not tainted 5.12.0-rc4-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 RIP: 0010:refcount_warn_saturate+0xbf/0x1e0 lib/refcount.c:31 Code: 1d 6a 5a e8 09 31 ff 89 de e8 8d 1a ab fd 84 db 75 e0 e8 d4 13 ab fd 48 c7 c7 a0 e1 c1 89 c6 05 4a 5a e8 09 01 e8 2e 36 fb 04 <0f> 0b eb c4 e8 b8 13 ab fd 0f b6 1d 39 5a e8 09 31 ff 89 de e8 58 RSP: 0018:ffffc900018befd0 EFLAGS: 00010282 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000 RDX: ffff88801ef19c40 RSI: ffffffff815c51f5 RDI: fffff52000317dec RBP: 0000000000000004 R08: 0000000000000000 R09: 0000000000000000 R10: ffffffff815bdf8e R11: 0000000000000000 R12: ffff888018cf4568 R13: ffff888018cf4c00 R14: ffff8880228f2000 R15: ffffffff8d659b80 FS: 00000000014eb300(0000) GS:ffff8880b9c00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000055d7bf2b3138 CR3: 0000000014933000 CR4: 00000000001506f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: __refcount_dec include/linux/refcount.h:344 [inline] refcount_dec include/linux/refcount.h:359 [inline] dev_put include/linux/netdevice.h:4135 [inline] ip6gre_tunnel_uninit+0x3d7/0x440 net/ipv6/ip6_gre.c:420 register_netdevice+0xadf/0x1500 net/core/dev.c:10308 ip6gre_newlink_common.constprop.0+0x158/0x410 net/ipv6/ip6_gre.c:1984 ip6gre_newlink+0x275/0x7a0 net/ipv6/ip6_gre.c:2017 __rtnl_newlink+0x1062/0x1710 net/core/rtnetlink.c:3443 rtnl_newlink+0x64/0xa0 net/core/rtnetlink.c:3491 rtnetlink_rcv_msg+0x44e/0xad0 net/core/rtnetlink.c:5553 netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2502 netlink_unicast_kernel net/netlink/af_netlink.c:1312 [inline] netlink_unicast+0x533/0x7d0 net/netlink/af_netlink.c:1338 netlink_sendmsg+0x856/0xd90 net/netlink/af_netlink.c:1927 sock_sendmsg_nosec net/socket.c:654 [inline] sock_sendmsg+0xcf/0x120 net/socket.c:674 ____sys_sendmsg+0x6e8/0x810 net/socket.c:2350 ___sys_sendmsg+0xf3/0x170 net/socket.c:2404 __sys_sendmsg+0xe5/0x1b0 net/socket.c:2433 do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46
--- net/ipv6/ip6_gre.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv6/ip6_gre.c +2 -2
@@ -1496,6 +1496,7 @@ static int ip6gre_tunnel_init_common(str }ip6gre_tnl_init_features (dev); +dev_hold (dev);return 0 ; cleanup_dst_cache_init:
@@ -1889,6 +1890,7 @@ static int ip6erspan_tap_init(struct net dev->priv_flags |=IFF_LIVE_ADDR_CHANGE ;ip6erspan_tnl_link_config (tunnel,1 ); +dev_hold (dev);return 0 ; cleanup_dst_cache_init:
@@ -1988,8 +1990,6 @@ static int ip6gre_newlink_common(structif (tb[IFLA_MTU ])ip6_tnl_change_mtu (dev,nla_get_u32 (tb[IFLA_MTU ])); -dev_hold (dev); - out:return err; }
Greg Kroah-Hartman
maintainerPATCH 43/45 sit: proper dev_{hold|put} in ndo_[un]init methods
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit 6289a98f0817a4a457750d6345e754838eae9439 upstream.
After adopting CONFIG_PCPU_DEV_REFCNT=n option, syzbot was able to trigger a warning [1]
Issue here is that:
- all dev_put() should be paired with a corresponding prior dev_hold().
- A driver doing a dev_put() in its ndo_uninit() MUST also do a dev_hold() in its ndo_init(), only when ndo_init() is returning 0.
Otherwise, register_netdevice() would call ndo_uninit() in its error path and release a refcount too soon.
--- net/ipv6/sit.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
net/ipv6/sit.c +1 -3
@@ -218,8 +218,6 @@ static int ipip6_tunnel_create(struct neipip6_tunnel_clone_6rd (dev, sitn); -dev_hold (dev); -ipip6_tunnel_link (sitn, t);return 0 ;
@@ -1456,7 +1454,7 @@ static int ipip6_tunnel_init(struct net_ dev->tstats =NULL ;return err; } - +dev_hold (dev);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 34/45 nvmet: remove unsupported command noise
In reply to Greg Kroah-HartmanFrom: Keith Busch <[email protected]>
[ Upstream commit 4a20342572f66c5b20a1ee680f5ac0a13703748f ]
Nothing can stop a host from submitting invalid commands. The target just needs to respond with an appropriate status, but that's not a target error. Demote invalid command messages to the debug level so these events don't spam the kernel logs.
--- drivers/nvme/target/admin-cmd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/nvme/target/admin-cmd.c +3 -3
@@ -307,7 +307,7 @@ static void nvmet_execute_get_log_page(struct nvmet_req *req)case NVME_LOG_ANA :return nvmet_execute_get_log_page_ana (req); } -pr_err ("unhandled lid %d on qid %d\n" , +pr_debug ("unhandled lid %d on qid %d\n" , req->cmd->get_log_page.lid, req->sq->qid); req->error_loc = offsetof(struct nvme_get_log_page_command , lid);nvmet_req_complete (req,NVME_SC_INVALID_FIELD |NVME_SC_DNR );
@@ -659,7 +659,7 @@ static void nvmet_execute_identify(struct nvmet_req *req)return nvmet_execute_identify_desclist (req); } -pr_err ("unhandled identify cns %d on qid %d\n" , +pr_debug ("unhandled identify cns %d on qid %d\n" , req->cmd->identify.cns, req->sq->qid); req->error_loc = offsetof(struct nvme_identify , cns);nvmet_req_complete (req,NVME_SC_INVALID_FIELD |NVME_SC_DNR );
@@ -977,7 +977,7 @@ u16 nvmet_parse_admin_cmd(struct nvmet_req *req)return 0 ; } -pr_err ("unhandled cmd %d on qid %d\n" , cmd->common.opcode, +pr_debug ("unhandled cmd %d on qid %d\n" , cmd->common.opcode, req->sq->qid); req->error_loc = offsetof(struct nvme_common_command , opcode);return NVME_SC_INVALID_OPCODE |NVME_SC_DNR ;
Signature · 1 line
2.30.2
Re: [PATCH 5.12 06/45] ARM: 9058/1: cache-v7: refactor v7_invalidate_l1 to avoid clobbering r5/r6
In reply to Greg Kroah-HartmanQuoted 15 lines · Greg Kroah-Hartman
From: Ard Biesheuvel <[email protected]>
[ Upstream commit
f9e7a99fb6b86aa6a00e53b34ee6973840e005aa]The cache invalidation code in
v7_invalidate_l1can be tweaked to re-read the associativity from CCSIDR, and keep the way identifier component in a single register that is assigned in the outer loop. This way, we need 2 registers less.Given that the number of sets is typically much larger than the associativity, rearrange the code so that the outer loop has the fewer number of iterations, ensuring that the re-read of CCSIDR only occurs a handful of times in practice.
Quoted 7 lines
Fix the whitespace while at it, and update the comment to indicate that this code is no longer a clone of anything else.
Acked-by Nicolas Pitre <[email protected]>Signed-off-by Ard Biesheuvel <[email protected]>Signed-off-by Russell King <[email protected]>Signed-off-by Sasha Levin <[email protected]>
Please do NOT backport this to any stable trees.
It has no cc:stable tag
It has no fixes: tag
It was part of a 3 part series, but only the middle patch was selected. It touches ARM assembly that may assemble without problems but be completely broken at runtime when used out of the original intended context.
Tip: disregard patches touching .S files entirely unless they have a cc:stable or fixes: tag. Or teach the bot never to AUTOSEL anything authored by me: if it needs to go to -stable, I will ask you myself.
--
Ard.
Quoted 80 lines
--- arch/arm/mm/cache-v7.S | 51 +++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 26 deletions(-)arch/arm/mm/cache-v7.S +25
-27@@ -33,41 +33,40 @@ icache_size: * processor. We fix this by performing an invalidate, rather than a * clean + invalidate, before jumping into the kernel. * - * This function is cloned from arch/arm/mach-tegra/headsmp.S, and needs - * to be called for both secondary cores startup and primary core resume - * procedures. + * This function needs to be called for both secondary cores startup and + * primary core resume procedures. */ ENTRY(v7_invalidate_l1) mov r0, #0 mcr p15, 2, r0, c0, c0, 0 mrc p15, 1, r0, c0, c0, 0 - movw r1, #0x7fff - and r2, r1, r0, lsr #13 + movw r3, #0x3ff + and r3, r3, r0, lsr #3 @ 'Associativity' in CCSIDR[12:3] + clz r1, r3 @ WayShift + mov r2, #1 + mov r3, r3, lsl r1 @ NumWays-1 shifted into bits [31:...] + movs r1, r2, lsl r1 @ #1 shifted left by same amount + moveq r1, #1 @ r1 needs value > 0 even if only 1 way - movw r1, #0x3ff + and r2, r0, #0x7 + add r2, r2, #4 @ SetShift - and r3, r1, r0, lsr #3 @ NumWays - 1 - add r2, r2, #1 @ NumSets +1: movw r4, #0x7fff + and r0, r4, r0, lsr #13 @ 'NumSets' in CCSIDR[27:13] - and r0, r0, #0x7 - add r0, r0, #4 @ SetShift - - clz r1, r3 @ WayShift - add r4, r3, #1 @ NumWays -1: sub r2, r2, #1 @ NumSets-- - mov r3, r4 @ Temp = NumWays -2: subs r3, r3, #1 @ Temp-- - mov r5, r3, lsl r1 - mov r6, r2, lsl r0 - orr r5, r5, r6 @ Reg = (Temp<<WayShift)|(NumSets<<SetShift) - mcr p15, 0, r5, c7, c6, 2 - bgt 2b - cmp r2, #0 - bgt 1b - dsb st - isb - ret lr +2: mov r4, r0, lsl r2 @ NumSet << SetShift + orr r4, r4, r3 @ Reg = (Temp<<WayShift)|(NumSets<<SetShift) + mcr p15, 0, r4, c7, c6, 2 + subs r0, r0, #1 @ Set-- + bpl 2b + subs r3, r3, r1 @ Way-- + bcc 3f + mrc p15, 1, r0, c0, c0, 0 @ re-read cache geometry from CCSIDR + b 1b +3: dsb st + isb + ret lr ENDPROC(v7_invalidate_l1) /* --2.30.2
Greg Kroah-Hartman
maintainerRe: [PATCH 5.12 06/45] ARM: 9058/1: cache-v7: refactor v7_invalidate_l1 to avoid clobbering r5/r6
Quoted 25 lines · Ard Biesheuvel
Quoted 15 lines · Greg Kroah-Hartman
From: Ard Biesheuvel <[email protected]>
[ Upstream commit
f9e7a99fb6b86aa6a00e53b34ee6973840e005aa]The cache invalidation code in
v7_invalidate_l1can be tweaked to re-read the associativity from CCSIDR, and keep the way identifier component in a single register that is assigned in the outer loop. This way, we need 2 registers less.Given that the number of sets is typically much larger than the associativity, rearrange the code so that the outer loop has the fewer number of iterations, ensuring that the re-read of CCSIDR only occurs a handful of times in practice.
Quoted 7 lines
Fix the whitespace while at it, and update the comment to indicate that this code is no longer a clone of anything else.
Acked-by Nicolas Pitre <[email protected]>Signed-off-by Ard Biesheuvel <[email protected]>Signed-off-by Russell King <[email protected]>Signed-off-by Sasha Levin <[email protected]>
Quoted 8 lines
Please do NOT backport this to any stable trees.
It has no cc:stable tag
It has no fixes: tag
It was part of a 3 part series, but only the middle patch was selected. It touches ARM assembly that may assemble without problems but be completely broken at runtime when used out of the original intended context.
Now dropped from all stable queues, thanks for letting us know.
greg k-h
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.12.6 release. There are 45 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 22 May 2021 09:20:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.12.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.12.y
and the diffstat can be found below.thanks,
greg k-h
5.12.6-rc1 Successfully Compiled and booted on my Raspberry PI 4b (8g) (bcm2711)
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.12.6 release. There are 45 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 22 May 2021 09:20:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.12.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.12.y
and the diffstat can be found below.thanks,
greg k-h
On Tiger Lake x86_64 kernel:
- tested ok.
Signature · 1 line
Rudi
Greg Kroah-Hartman
maintainerQuoted 15 lines · Fox Chen
Quoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.12.6 release. There are 45 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 22 May 2021 09:20:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.12.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.12.y
and the diffstat can be found below.
Quoted 9 lines
Quoted 4 lines
thanks,
greg k-h
5.12.6-rc1 Successfully Compiled and booted on my Raspberry PI 4b (8g) (bcm2711)
Tested-by Fox Chen <[email protected]>
Thanks for testing and letting me know,
greg k-h