6.6.70-rc1 review
Greg Kroah-Hartman
maintainerPATCH 104/222 memblock: make memblock_set_node() also warn about use of MAX_NUMNODES
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Beulich <[email protected]>
[ Upstream commit e0eec24e2e199873f43df99ec39773ad3af2bff7 ]
On an (old) x86 system with SRAT just covering space above 4Gb:
ACPI: SRAT: Node 0 PXM 0 [mem 0x100000000-0xfffffffff] hotplug
the commit referenced below leads to this NUMA configuration no longer being refused by a CONFIG_NUMA=y kernel (previously
NUMA: nodes only cover 6144MB of your 8185MB e820 RAM. Not used. No NUMA configuration found
Faking a node at [mem 0x0000000000000000-0x000000027fffffff]
was seen in the log directly after the message quoted above), because of memblock_validate_numa_coverage() checking for NUMA_NO_NODE (only). This in turn led to memblock_alloc_range_nid()'s warning about MAX_NUMNODES triggering, followed by a NULL deref in memmap_init() when trying to access node 64's (NODE_SHIFT=6) node data.
To compensate said change, make memblock_set_node() warn on and adjust a passed in value of MAX_NUMNODES, just like various other functions already do.
--- mm/memblock.c | 4 ++++ 1 file changed, 4 insertions(+)
mm/memblock.c +4 -0
@@ -1321,6 +1321,10 @@ int __init_memblock memblock_set_node(phys_addr_t base, phys_addr_t size,int start_rgn, end_rgn;int i, ret; +if (WARN_ONCE (nid ==MAX_NUMNODES , +"Usage of MAX_NUMNODES is deprecated. Use NUMA_NO_NODE instead\n" )) + nid =NUMA_NO_NODE ; + ret =memblock_isolate_range (type, base, size, &start_rgn, &end_rgn);if (ret)return ret;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 105/222 crypto: ecc - Prevent ecc_digits_from_bytes from reading too many bytes
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Berger <[email protected]>
[ Upstream commit c6ab5c915da460c0397960af3c308386c3f3247b ]
Prevent ecc_digits_from_bytes from reading too many bytes from the input byte array in case an insufficient number of bytes is provided to fill the output digit array of ndigits. Therefore, initialize the most significant digits with 0 to avoid trying to read too many bytes later on. Convert the function into a regular function since it is getting too big for an inline function.
If too many bytes are provided on the input byte array the extra bytes are ignored since the input variable 'ndigits' limits the number of digits that will be filled.
--- crypto/ecc.c | 22 ++++++++++++++++++++++ include/crypto/internal/ecc.h | 15 ++------------- 2 files changed, 24 insertions(+), 13 deletions(-)
crypto/ecc.c +22 -0
@@ -66,6 +66,28 @@ const struct ecc_curve *ecc_get_curve(unsigned int curve_id) }EXPORT_SYMBOL (ecc_get_curve); +void ecc_digits_from_bytes (const u8 *in,unsigned int nbytes, +u64 *out,unsigned int ndigits) +{ +int diff = ndigits -DIV_ROUND_UP (nbytes,sizeof (u64)); +unsigned int o = nbytes &7 ; +__be64 msd =0 ; + +/* diff > 0: not enough input bytes: set most significant digits to 0 */ +if (diff >0 ) { + ndigits -= diff; +memset (&out[ndigits -1 ],0 , diff *sizeof (u64)); + } + +if (o) { +memcpy ((u8 *)&msd +sizeof (msd) - o, in, o); + out[--ndigits] =be64_to_cpu (msd); + in += o; + } +ecc_swap_digits (in, out, ndigits); +} +EXPORT_SYMBOL (ecc_digits_from_bytes); +static u64 *ecc_alloc_digits_space (unsigned int ndigits) {size_t len = ndigits *sizeof (u64);
include/crypto/internal/ecc.h +2 -13
@@ -63,19 +63,8 @@ static inline void ecc_swap_digits(const void *in, u64 *out, unsigned int ndigit* @out Output digits array * @ndigits: Number of digits to create from byte array */ -static inline void ecc_digits_from_bytes (const u8 *in,unsigned int nbytes, -u64 *out,unsigned int ndigits) -{ -unsigned int o = nbytes &7 ; -__be64 msd =0 ; - -if (o) { -memcpy ((u8 *)&msd +sizeof (msd) - o, in, o); - out[--ndigits] =be64_to_cpu (msd); - in += o; - } -ecc_swap_digits (in, out, ndigits); -} +void ecc_digits_from_bytes (const u8 *in,unsigned int nbytes, +u64 *out,unsigned int ndigits);/** * ecc_is_key_valid() - Validate a given ECDH private key
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 106/222 cleanup: Remove address space of returned pointer
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uros Bizjak <[email protected]>
[ Upstream commit f730fd535fc51573f982fad629f2fc6b4a0cde2f ]
Guard functions in local_lock.h are defined using DEFINE_GUARD() and DEFINE_LOCK_GUARD_1() macros having lock type defined as pointer in the percpu address space. The functions, defined by these macros return value in generic address space, causing:
cleanup.h:157:18: error: return from pointer to non-enclosed address space
and
cleanup.h:214:18: error: return from pointer to non-enclosed address space
when strict percpu checks are enabled.
Add explicit casts to remove address space of the returned pointer.
Found by GCC's named address space checks.
--- include/linux/cleanup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/linux/cleanup.h +2 -2
@@ -123,7 +123,7 @@ static __maybe_unused const bool class_##_name##_is_conditional = _is_cond__DEFINE_CLASS_IS_CONDITIONAL (_name, false); \ DEFINE_CLASS(_name, _type, if (_T) { _unlock; }, ({ _lock; _T; }), _type _T); \ static inline void * class_##_name##_lock_ptr(class_##_name##_t *_T) \ - {return *_T; } + {return (void *)(__force unsigned long )*_T; }#define DEFINE_GUARD_COND (_name, _ext, _condlock) \ __DEFINE_CLASS_IS_CONDITIONAL(_name##_ext, true); \
@@ -204,7 +204,7 @@ static inline void class_##_name##_destructor(class_##_name##_t *_T) \ \ static inline void *class_##_name##_lock_ptr(class_##_name##_t *_T) \ { \ -return _T->lock; \ +return (void *)(__force unsigned long )_T->lock; \ }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 107/222 scsi: hisi_sas: Fix a deadlock issue related to automatic dump
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yihang Li <[email protected]>
[ Upstream commit 3c4f53b2c341ec6428b98cb51a89a09b025d0953 ]
If we issue a disabling PHY command, the device attached with it will go offline, if a 2 bit ECC error occurs at the same time, a hung task may be found:
[ 4613.652388] INFO: task kworker/u256:0:165233 blocked for more than 120 seconds. [ 4613.666297] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 4613.674809] task:kworker/u256:0 state:D stack: 0 pid:165233 ppid: 2 flags:0x00000208 [ 4613.683959] Workqueue: 0000:74:02.0_disco_q sas_revalidate_domain [libsas] [ 4613.691518] Call trace: [ 4613.694678] __switch_to+0xf8/0x17c [ 4613.698872] __schedule+0x660/0xee0 [ 4613.703063] schedule+0xac/0x240 [ 4613.706994] schedule_timeout+0x500/0x610 [ 4613.711705] __down+0x128/0x36c [ 4613.715548] down+0x240/0x2d0 [ 4613.719221] hisi_sas_internal_abort_timeout+0x1bc/0x260 [hisi_sas_main] [ 4613.726618] sas_execute_internal_abort+0x144/0x310 [libsas] [ 4613.732976] sas_execute_internal_abort_dev+0x44/0x60 [libsas] [ 4613.739504] hisi_sas_internal_task_abort_dev.isra.0+0xbc/0x1b0 [hisi_sas_main] [ 4613.747499] hisi_sas_dev_gone+0x174/0x250 [hisi_sas_main] [ 4613.753682] sas_notify_lldd_dev_gone+0xec/0x2e0 [libsas] [ 4613.759781] sas_unregister_common_dev+0x4c/0x7a0 [libsas] [ 4613.765962] sas_destruct_devices+0xb8/0x120 [libsas] [ 4613.771709] sas_do_revalidate_domain.constprop.0+0x1b8/0x31c [libsas] [ 4613.778930] sas_revalidate_domain+0x60/0xa4 [libsas] [ 4613.784716] process_one_work+0x248/0x950 [ 4613.789424] worker_thread+0x318/0x934 [ 4613.793878] kthread+0x190/0x200 [ 4613.797810] ret_from_fork+0x10/0x18 [ 4613.802121] INFO: task kworker/u256:4:316722 blocked for more than 120 seconds. [ 4613.816026] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 4613.824538] task:kworker/u256:4 state:D stack: 0 pid:316722 ppid: 2 flags:0x00000208 [ 4613.833670] Workqueue: 0000:74:02.0 hisi_sas_rst_work_handler [hisi_sas_main] [ 4613.841491] Call trace: [ 4613.844647] __switch_to+0xf8/0x17c [ 4613.848852] __schedule+0x660/0xee0 [ 4613.853052] schedule+0xac/0x240 [ 4613.856984] schedule_timeout+0x500/0x610 [ 4613.861695] __down+0x128/0x36c [ 4613.865542] down+0x240/0x2d0 [ 4613.869216] hisi_sas_controller_prereset+0x58/0x1fc [hisi_sas_main] [ 4613.876324] hisi_sas_rst_work_handler+0x40/0x8c [hisi_sas_main] [ 4613.883019] process_one_work+0x248/0x950 [ 4613.887732] worker_thread+0x318/0x934 [ 4613.892204] kthread+0x190/0x200 [ 4613.896118] ret_from_fork+0x10/0x18 [ 4613.900423] INFO: task kworker/u256:1:348985 blocked for more than 121 seconds. [ 4613.914341] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 4613.922852] task:kworker/u256:1 state:D stack: 0 pid:348985 ppid: 2 flags:0x00000208 [ 4613.931984] Workqueue: 0000:74:02.0_event_q sas_port_event_worker [libsas] [ 4613.939549] Call trace: [ 4613.942702] __switch_to+0xf8/0x17c [ 4613.946892] __schedule+0x660/0xee0 [ 4613.951083] schedule+0xac/0x240 [ 4613.955015] schedule_timeout+0x500/0x610 [ 4613.959725] wait_for_common+0x200/0x610 [ 4613.964349] wait_for_completion+0x3c/0x5c [ 4613.969146] flush_workqueue+0x198/0x790 [ 4613.973776] sas_porte_broadcast_rcvd+0x1e8/0x320 [libsas] [ 4613.979960] sas_port_event_worker+0x54/0xa0 [libsas] [ 4613.985708] process_one_work+0x248/0x950 [ 4613.990420] worker_thread+0x318/0x934 [ 4613.994868] kthread+0x190/0x200 [ 4613.998800] ret_from_fork+0x10/0x18
This is because when the device goes offline, we obtain the hisi_hba semaphore and send the ABORT_DEV command to the device. However, the internal abort timed out due to the 2 bit ECC error and triggers automatic dump. In addition, since the hisi_hba semaphore has been obtained, the dump cannot be executed and the controller cannot be reset.
Therefore, the deadlocks occur on the following circular dependencies:hisi_sas_dev_gone() -> down() -> hisi_sas_internal_task_abort_dev() -> ... -> hisi_sas_internal_abort_timeout() -> down().
The deadlock is triggered only when the timeout occurs during device goes offline. To fix this issue, use .rst_ha_timeout to distinguish the scenario where a device goes offline from other scenarios.
--- drivers/scsi/hisi_sas/hisi_sas_main.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/scsi/hisi_sas/hisi_sas_main.c +10 -2
@@ -1968,9 +1968,17 @@ static bool hisi_sas_internal_abort_timeout(struct sas_task *task,struct hisi_sas_internal_abort_data *timeout = data;if (hisi_sas_debugfs_enable && hisi_hba->debugfs_itct[0 ].itct) { -down (&hisi_hba->sem); +/* +* If timeout occurs in device gone scenario, to avoid +* circular dependency like: +* hisi_sas_dev_gone() -> down() -> ... -> +* hisi_sas_internal_abort_timeout() -> down(). +*/ +if (!timeout->rst_ha_timeout) +down (&hisi_hba->sem); hisi_hba->hw->debugfs_snapshot_regs (hisi_hba); -up (&hisi_hba->sem); +if (!timeout->rst_ha_timeout) +up (&hisi_hba->sem); }if (task->task_state_flags &SAS_TASK_STATE_DONE ) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 108/222 usb: typec: ucsi: glink: fix off-by-one in connector_status
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 4a22918810980897393fa1776ea3877e4baf8cca ]
UCSI connector's indices start from 1 up to 3, PMIC_GLINK_MAX_PORTS. Correct the condition in the pmic_glink_ucsi_connector_status() callback, fixing Type-C orientation reporting for the third USB-C connector.
--- drivers/usb/typec/ucsi/ucsi_glink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/typec/ucsi/ucsi_glink.c +1 -1
@@ -202,7 +202,7 @@ static void pmic_glink_ucsi_connector_status(struct ucsi_connector *con)struct pmic_glink_ucsi *ucsi =ucsi_get_drvdata (con->ucsi);int orientation; -if (con->num >=PMIC_GLINK_MAX_PORTS || +if (con->num >PMIC_GLINK_MAX_PORTS || !ucsi->port_orientation[con->num -1 ])return ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 109/222 usb: xhci: Avoid queuing redundant Stop Endpoint commands
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Pecio <[email protected]>
[ Upstream commit 474538b8dd1cd9c666e56cfe8ef60fbb0fb513f4 ]
Stop Endpoint command on an already stopped endpoint fails and may be misinterpreted as a known hardware bug by the completion handler. This results in an unnecessary delay with repeated retries of the command.
Avoid queuing this command when endpoint state flags indicate that it's stopped or halted and the command will fail. If commands are pending on the endpoint, their completion handlers will process cancelled TDs so it's done. In case of waiting for external operations like clearing TT buffer, the endpoint is stopped and cancelled TDs can be processed now.
This eliminates practically all unnecessary retries because an endpoint with pending URBs is maintained in Running state by the driver, unless aforementioned commands or other operations are pending on it. This is guaranteed by xhci_ring_ep_doorbell() and by the fact that it is called every time any of those operations completes.
The only known exceptions are hardware bugs (the endpoint never starts at all) and Stream Protocol errors not associated with any TRB, which cause an endpoint reset not followed by restart. Sounds like a bug.
Generally, these retries are only expected to happen when the endpoint fails to start for unknown/no reason, which is a worse problem itself, and fixing the bug eliminates the retries too.
All cases were tested and found to work as expected. SET_DEQ_PENDING was produced by patching uvcvideo to unlink URBs in 100us intervals, which then runs into this case very often. EP_HALTED was produced by restarting 'cat /dev/ttyUSB0' on a serial dongle with broken cable. EP_CLEARING_TT by the same, with the dongle on an external hub.
--- drivers/usb/host/xhci-ring.c | 13 +++++++++++++ drivers/usb/host/xhci.c | 19 +++++++++++++++---- drivers/usb/host/xhci.h | 1 + 3 files changed, 29 insertions(+), 4 deletions(-)
drivers/usb/host/xhci-ring.c +13 -0
@@ -1092,6 +1092,19 @@ static int xhci_invalidate_cancelled_tds(struct xhci_virt_ep *ep)return 0 ; } +/* +* Erase queued TDs from transfer ring(s) and give back those the xHC didn't +* stop on. If necessary, queue commands to move the xHC off cancelled TDs it +* stopped on. Those will be given back later when the commands complete. +* +* Call under xhci->lock on a stopped endpoint. +*/ +void xhci_process_cancelled_tds (struct xhci_virt_ep *ep) +{ +xhci_invalidate_cancelled_tds (ep); +xhci_giveback_invalidated_tds (ep); +} +/* * Returns the TD the endpoint ring halted on. * Only call for non-running rings without streams.
drivers/usb/host/xhci.c +15 -4
@@ -1738,10 +1738,21 @@ static int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) } } -/* Queue a stop endpoint command, but only if this is -* the first cancellation to be handled. -*/ -if (!(ep->ep_state &EP_STOP_CMD_PENDING )) { +/* These completion handlers will sort out cancelled TDs for us */ +if (ep->ep_state & (EP_STOP_CMD_PENDING |EP_HALTED |SET_DEQ_PENDING )) { +xhci_dbg (xhci,"Not queuing Stop Endpoint on slot %d ep %d in state 0x%x\n" , + urb->dev->slot_id, ep_index, ep->ep_state); + goto done; + } + +/* In this case no commands are pending but the endpoint is stopped */ +if (ep->ep_state &EP_CLEARING_TT ) { +/* and cancelled TDs can be given back right away */ +xhci_dbg (xhci,"Invalidating TDs instantly on slot %d ep %d in state 0x%x\n" , + urb->dev->slot_id, ep_index, ep->ep_state); +xhci_process_cancelled_tds (ep); + }else { +/* Otherwise, queue a new Stop Endpoint command */ command =xhci_alloc_command (xhci, false,GFP_ATOMIC );if (!command) { ret = -ENOMEM ;
drivers/usb/host/xhci.h +1 -0
@@ -1952,6 +1952,7 @@ void xhci_ring_doorbell_for_active_rings(struct xhci_hcd *xhci,void xhci_cleanup_command_queue (struct xhci_hcd *xhci);void inc_deq (struct xhci_hcd *xhci,struct xhci_ring *ring);unsigned int count_trbs (u64 addr,u64 len); +void xhci_process_cancelled_tds (struct xhci_virt_ep *ep);/* xHCI roothub code */ void xhci_set_link_state(struct xhci_hcd *xhci, struct xhci_port *port,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 110/222 ALSA: ump: Shut up truncated string warning
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit ed990c07af70d286f5736021c6e25d8df6f2f7b0 ]
The recent change for the legacy substream name update brought a compile warning for some compilers due to the nature of snprintf(). Use scnprintf() to shut up the warning since the truncation is intentional.
--- sound/core/ump.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
sound/core/ump.c +3 -3
@@ -1251,9 +1251,9 @@ static void fill_substream_names(struct snd_ump_endpoint *ump, name = ump->groups[idx].name;if (!*name) name = ump->info.name; -snprintf (s->name,sizeof (s->name),"Group %d (%.16s)%s" , - idx +1 , name, - ump->groups[idx].active ?"" :" [Inactive]" ); +scnprintf (s->name,sizeof (s->name),"Group %d (%.16s)%s" , + idx +1 , name, + ump->groups[idx].active ?"" :" [Inactive]" ); } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 111/222 platform/x86: mlx-platform: call pci_dev_put() to balance the refcount
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joe Hattori <[email protected]>
[ Upstream commit 185e1b1d91e419445d3fd99c1c0376a970438acf ]
mlxplat_pci_fpga_device_init() calls pci_get_device() but does not release the refcount on error path. Call pci_dev_put() on the error path and in mlxplat_pci_fpga_device_exit() to fix this.
This bug was found by an experimental static analysis tool that I am developing.
--- drivers/platform/x86/mlx-platform.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/platform/x86/mlx-platform.c +2 -0
@@ -6237,6 +6237,7 @@ mlxplat_pci_fpga_device_init(unsigned int device, const char *res_name, struct p fail_pci_request_regions:pci_disable_device (pci_dev); fail_pci_enable_device: +pci_dev_put (pci_dev);return err; }
@@ -6247,6 +6248,7 @@ mlxplat_pci_fpga_device_exit(struct pci_dev *pci_bridge,iounmap (pci_bridge_addr);pci_release_regions (pci_bridge);pci_disable_device (pci_bridge); +pci_dev_put (pci_bridge); } static int
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 112/222 f2fs: fix to wait dio completion
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
commit 96cfeb0389530ae32ade8a48ae3ae1ac3b6c009d upstream.
It should wait all existing dio write IOs before block removal, otherwise, previous direct write IO may overwrite data in the block which may be reused by other inode.
--- fs/f2fs/file.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
fs/f2fs/file.c +13 -0
@@ -1037,6 +1037,13 @@ int f2fs_setattr(struct mnt_idmap *idmapreturn err; } +/* +* wait for inflight dio, blocks should be removed after +* IO completion. +*/ +if (attr->ia_size < old_size) +inode_dio_wait (inode); +f2fs_down_write (&F2FS_I (inode)->i_gc_rwsem[WRITE ]);filemap_invalidate_lock (inode->i_mapping);
@@ -1873,6 +1880,12 @@ static long f2fs_fallocate(struct file *if (ret) goto out; +/* +* wait for inflight dio, blocks should be removed after IO +* completion. +*/ +inode_dio_wait (inode); +if (mode &FALLOC_FL_PUNCH_HOLE ) {if (offset >= inode->i_size) goto out;
Greg Kroah-Hartman
maintainerPATCH 113/222 selinux: ignore unknown extended permissions
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thiébaud Weksteen <[email protected]>
commit 900f83cf376bdaf798b6f5dcb2eae0c822e908b6 upstream.
When evaluating extended permissions, ignore unknown permissions instead of calling BUG(). This commit ensures that future permissions can be added without interfering with older kernels.
--- security/selinux/ss/services.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
security/selinux/ss/services.c +6 -2
@@ -956,7 +956,10 @@ void services_compute_xperms_decision(st xpermd->driver))return ; }else { -BUG (); +pr_warn_once ( +"SELinux: unknown extended permission (%u) will be ignored\n" , + node->datum.u.xperms->specified); +return ; }if (node->key.specified ==AVTAB_XPERMS_ALLOWED ) {
@@ -993,7 +996,8 @@ void services_compute_xperms_decision(st node->datum.u.xperms->perms.p[i]; } }else { -BUG (); +pr_warn_once ("SELinux: unknown specified key (%u)\n" , + node->key.specified); } }
Greg Kroah-Hartman
maintainerPATCH 114/222 btrfs: fix use-after-free in btrfs_encoded_read_endio()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Thumshirn <[email protected]>
commit 05b36b04d74a517d6675bf2f90829ff1ac7e28dc upstream.
Shinichiro reported the following use-after free that sometimes is happening in our CI system when running fstests' btrfs/284 on a TCMU runner device:
BUG: KASAN: slab-use-after-free in lock_release+0x708/0x780
Read of size 8 at addr ffff888106a83f18 by task kworker/u80:6/219
CPU: 8 UID: 0 PID: 219 Comm: kworker/u80:6 Not tainted 6.12.0-rc6-kts+ #15
Hardware name: Supermicro Super Server/X11SPi-TF, BIOS 3.3 02/21/2020
Workqueue: btrfs-endio btrfs_end_bio_work [btrfs]
Call Trace:
<TASK>
dump_stack_lvl+0x6e/0xa0
? lock_release+0x708/0x780
print_report+0x174/0x505
? lock_release+0x708/0x780
? __virt_addr_valid+0x224/0x410
? lock_release+0x708/0x780
kasan_report+0xda/0x1b0
? lock_release+0x708/0x780
? __wake_up+0x44/0x60
lock_release+0x708/0x780
? __pfx_lock_release+0x10/0x10
? __pfx_do_raw_spin_lock+0x10/0x10
? lock_is_held_type+0x9a/0x110
_raw_spin_unlock_irqrestore+0x1f/0x60
__wake_up+0x44/0x60
btrfs_encoded_read_endio+0x14b/0x190 [btrfs]
btrfs_check_read_bio+0x8d9/0x1360 [btrfs]
? lock_release+0x1b0/0x780
? trace_lock_acquire+0x12f/0x1a0
? __pfx_btrfs_check_read_bio+0x10/0x10 [btrfs]
? process_one_work+0x7e3/0x1460
? lock_acquire+0x31/0xc0
? process_one_work+0x7e3/0x1460
process_one_work+0x85c/0x1460
? __pfx_process_one_work+0x10/0x10
? assign_work+0x16c/0x240
worker_thread+0x5e6/0xfc0
? __pfx_worker_thread+0x10/0x10
kthread+0x2c3/0x3a0
? __pfx_kthread+0x10/0x10
ret_from_fork+0x31/0x70
? __pfx_kthread+0x10/0x10
ret_from_fork_asm+0x1a/0x30
</TASK>
Allocated by task 3661:
kasan_save_stack+0x30/0x50
kasan_save_track+0x14/0x30
__kasan_kmalloc+0xaa/0xb0
btrfs_encoded_read_regular_fill_pages+0x16c/0x6d0 [btrfs]
send_extent_data+0xf0f/0x24a0 [btrfs]
process_extent+0x48a/0x1830 [btrfs]
changed_cb+0x178b/0x2ea0 [btrfs]
btrfs_ioctl_send+0x3bf9/0x5c20 [btrfs]
_btrfs_ioctl_send+0x117/0x330 [btrfs]
btrfs_ioctl+0x184a/0x60a0 [btrfs]
__x64_sys_ioctl+0x12e/0x1a0
do_syscall_64+0x95/0x180
entry_SYSCALL_64_after_hwframe+0x76/0x7e
Freed by task 3661:
kasan_save_stack+0x30/0x50
kasan_save_track+0x14/0x30
kasan_save_free_info+0x3b/0x70
__kasan_slab_free+0x4f/0x70
kfree+0x143/0x490
btrfs_encoded_read_regular_fill_pages+0x531/0x6d0 [btrfs]
send_extent_data+0xf0f/0x24a0 [btrfs]
process_extent+0x48a/0x1830 [btrfs]
changed_cb+0x178b/0x2ea0 [btrfs]
btrfs_ioctl_send+0x3bf9/0x5c20 [btrfs]
_btrfs_ioctl_send+0x117/0x330 [btrfs]
btrfs_ioctl+0x184a/0x60a0 [btrfs]
__x64_sys_ioctl+0x12e/0x1a0
do_syscall_64+0x95/0x180
entry_SYSCALL_64_after_hwframe+0x76/0x7e
The buggy address belongs to the object at ffff888106a83f00
which belongs to the cache kmalloc-rnd-07-96 of size 96
The buggy address is located 24 bytes inside of
freed 96-byte region [ffff888106a83f00, ffff888106a83f60)
The buggy address belongs to the physical page:
page: refcount:1 mapcount:0 mapping:0000000000000000 index:0xffff888106a83800 pfn:0x106a83
flags: 0x17ffffc0000000(node=0|zone=2|lastcpupid=0x1fffff)
page_type: f5(slab)
raw: 0017ffffc0000000 ffff888100053680 ffffea0004917200 0000000000000004
raw: ffff888106a83800 0000000080200019 00000001f5000000 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffff888106a83e00: fa fb fb fb fb fb fb fb fb fb fb fb fc fc fc fc
ffff888106a83e80: fa fb fb fb fb fb fb fb fb fb fb fb fc fc fc fc
>ffff888106a83f00: fa fb fb fb fb fb fb fb fb fb fb fb fc fc fc fc
^
ffff888106a83f80: fa fb fb fb fb fb fb fb fb fb fb fb fc fc fc fc
ffff888106a84000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
==================================================================Further analyzing the trace and the crash dump's vmcore file shows that the wake_up() call in btrfs_encoded_read_endio() is calling wake_up() on the wait_queue that is in the private data passed to the end_io handler.
Commit 4ff47df40447 ("btrfs: move priv off stack in btrfs_encoded_read_regular_fill_pages()") moved 'struct btrfs_encoded_read_private' off the stack.
Before that commit one can see a corruption of the private data when analyzing the vmcore after a crash:
*(struct btrfs_encoded_read_private *)0xffff88815626eec8 = {
.wait = (wait_queue_head_t){
.lock = (spinlock_t){
.rlock = (struct raw_spinlock){
.raw_lock = (arch_spinlock_t){
.val = (atomic_t){
.counter = (int)-2005885696,
},
.locked = (u8)0,
.pending = (u8)157,
.locked_pending = (u16)40192,
.tail = (u16)34928,
},
.magic = (unsigned int)536325682,
.owner_cpu = (unsigned int)29,
.owner = (void *)__SCT__tp_func_btrfs_transaction_commit+0x0 = 0x0,
.dep_map = (struct lockdep_map){
.key = (struct lock_class_key *)0xffff8881575a3b6c,
.class_cache = (struct lock_class *[2]){ 0xffff8882a71985c0, 0xffffea00066f5d40 },
.name = (const char *)0xffff88815626f100 = "",
.wait_type_outer = (u8)37,
.wait_type_inner = (u8)178,
.lock_type = (u8)154,
},
},
.__padding = (u8 [24]){ 0, 157, 112, 136, 50, 174, 247, 31, 29 },
.dep_map = (struct lockdep_map){
.key = (struct lock_class_key *)0xffff8881575a3b6c,
.class_cache = (struct lock_class *[2]){ 0xffff8882a71985c0, 0xffffea00066f5d40 },
.name = (const char *)0xffff88815626f100 = "",
.wait_type_outer = (u8)37,
.wait_type_inner = (u8)178,
.lock_type = (u8)154,
},
},
.head = (struct list_head){
.next = (struct list_head *)0x112cca,
.prev = (struct list_head *)0x47,
},
},
.pending = (atomic_t){
.counter = (int)-1491499288,
},
.status = (blk_status_t)130,
}Here we can see several indicators of in-memory data corruption, e.g. the large negative atomic values of ->pending or ->wait->lock->rlock->raw_lock->val, as well as the bogus spinlock magic 0x1ff7ae32 (decimal 536325682 above) instead of 0xdead4ead or the bogus pointer values for ->wait->head.
To fix this, change atomic_dec_return() to atomic_dec_and_test() to fix the corruption, as atomic_dec_return() is defined as two instructions on x86_64, whereas atomic_dec_and_test() is defined as a single atomic operation. This can lead to a situation where counter value is already decremented but the if statement in btrfs_encoded_read_endio() is not completely processed, i.e. the 0 test has not completed. If another thread continues executing btrfs_encoded_read_regular_fill_pages() the atomic_dec_return() there can see an already updated ->pending counter and continues by freeing the private data. Continuing in the endio handler the test for 0 succeeds and the wait_queue is woken up, resulting in a use-after-free.
--- fs/btrfs/inode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/inode.c +1 -1
@@ -9972,7 +9972,7 @@ static void btrfs_encoded_read_endio(str*/ WRITE_ONCE (priv->status, bbio->bio.bi_status); } -if (!atomic_dec_return (&priv->pending)) +if (atomic_dec_and_test (&priv->pending))wake_up (&priv->wait);bio_put (&bbio->bio); }
Greg Kroah-Hartman
maintainerPATCH 115/222 mmc: sdhci-msm: fix crypto key eviction
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
commit 8d90a86ed053226a297ce062f4d9f4f521e05c4c upstream.
Commit c7eed31e235c ("mmc: sdhci-msm: Switch to the new ICE API") introduced an incorrect check of the algorithm ID into the key eviction path, and thus qcom_ice_evict_key() is no longer ever called. Fix it.
Message-ID: <[email protected]>
--- drivers/mmc/host/sdhci-msm.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/mmc/host/sdhci-msm.c +8 -8
@@ -1867,20 +1867,20 @@ static int sdhci_msm_program_key(structstruct sdhci_msm_host *msm_host =sdhci_pltfm_priv (pltfm_host);union cqhci_crypto_cap_entry cap; +if (!(cfg->config_enable &CQHCI_CRYPTO_CONFIGURATION_ENABLE )) +return qcom_ice_evict_key (msm_host->ice, slot); +/* Only AES-256-XTS has been tested so far. */ cap = cq_host->crypto_cap_array[cfg->crypto_cap_idx];if (cap.algorithm_id !=CQHCI_CRYPTO_ALG_AES_XTS || cap.key_size !=CQHCI_CRYPTO_KEY_SIZE_256 )return -EINVAL ; -if (cfg->config_enable &CQHCI_CRYPTO_CONFIGURATION_ENABLE ) -return qcom_ice_program_key (msm_host->ice, -QCOM_ICE_CRYPTO_ALG_AES_XTS , -QCOM_ICE_CRYPTO_KEY_SIZE_256 , - cfg->crypto_key, - cfg->data_unit_size, slot); -else - return qcom_ice_evict_key(msm_host->ice, slot); +return qcom_ice_program_key (msm_host->ice, +QCOM_ICE_CRYPTO_ALG_AES_XTS , +QCOM_ICE_CRYPTO_KEY_SIZE_256 , + cfg->crypto_key, + cfg->data_unit_size, slot); }#else /* CONFIG_MMC_CRYPTO */
Greg Kroah-Hartman
maintainerPATCH 116/222 tracing: Have process_string() also allow arrays
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit afc6717628f959941d7b33728570568b4af1c4b8 upstream.
In order to catch a common bug where a TRACE_EVENT() TP_fast_assign() assigns an address of an allocated string to the ring buffer and then references it in TP_printk(), which can be executed hours later when the string is free, the function test_event_printk() runs on all events as they are registered to make sure there's no unwanted dereferencing.
It calls process_string() to handle cases in TP_printk() format that has "%s". It returns whether or not the string is safe. But it can have some false positives.
For instance, xe_bo_move() has:
TP_printk("move_lacks_source:%s, migrate object %p [size %zu] from %s to %s device_id:%s",
__entry->move_lacks_source ? "yes" : "no", __entry->bo, __entry->size,
xe_mem_type_to_name[__entry->old_placement],
xe_mem_type_to_name[__entry->new_placement], __get_str(device_id))Where the "%s" references into xe_mem_type_to_name[]. This is an array of pointers that should be safe for the event to access. Instead of flagging this as a bad reference, if a reference points to an array, where the record field is the index, consider it safe.
--- kernel/trace/trace_events.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
kernel/trace/trace_events.c +12 -0
@@ -361,6 +361,18 @@ static bool process_string(const char *f }while (s < e);/* +* Check for arrays. If the argument has: foo[REC->val] +* then it is very likely that foo is an array of strings +* that are safe to use. +*/ + r =strstr (s,"[" ); +if (r && r < e) { + r =strstr (r,"REC->" ); +if (r && r < e) +return true; + } + +/* * If there's any strings in the argument consider this arg OK as it * could be: REC->field ? "foo" : "bar" and we don't want to get into * verifying that logic here.
Greg Kroah-Hartman
maintainerPATCH 117/222 libceph: add doutc and *_client debug macros support
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiubo Li <[email protected]>
[ Upstream commit 5c5f0d2b5f92c47baf82b9b211e27edd7d195158 ]
This will help print the fsid and client's global_id in debug logs, and also print the function names.
[ idryomov: %lld -> %llu, leading space for doutc(), don't include
__func__ in pr_*() variants ]
Stable-dep-of: 550f7ca98ee0 ("ceph: give up on paths longer than PATH_MAX")
--- include/linux/ceph/ceph_debug.h | 38 +++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+)
include/linux/ceph/ceph_debug.h +38 -0
@@ -19,12 +19,25 @@pr_debug ("%.*s %12.12s:%-4d : " fmt, \8 - (int )sizeof (KBUILD_MODNAME )," " , \ kbasename(__FILE__), __LINE__, ##__VA_ARGS__) +# define doutc (client, fmt, ...) \ + pr_debug("%.*s %12.12s:%-4d : [%pU %llu] " fmt, \ + 8 - (int)sizeof(KBUILD_MODNAME), " ", \ + kbasename(__FILE__), __LINE__, \ + &client->fsid, client->monc.auth->global_id, \ + ##__VA_ARGS__)# else /* faux printk call just to see any compiler warnings. */ # define dout (fmt, ...) do { \ if (0) \ printk(KERN_DEBUG fmt, ##__VA_ARGS__); \ } while (0) +# define doutc (client, fmt, ...) do { \ + if (0) \ + printk(KERN_DEBUG "[%pU %llu] " fmt, \ + &client->fsid, \ + client->monc.auth->global_id, \ + ##__VA_ARGS__); \ + } while (0)# endif #else
@@ -33,7 +46,32 @@* or, just wrap pr_debug */ # define dout (fmt, ...) pr_debug(" " fmt, ##__VA_ARGS__) +# define doutc (client, fmt, ...) \ + pr_debug(" [%pU %llu] %s: " fmt, &client->fsid, \ + client->monc.auth->global_id, __func__, ##__VA_ARGS__)#endif +#define pr_notice_client (client, fmt, ...) \ + pr_notice("[%pU %llu]: " fmt, &client->fsid, \ + client->monc.auth->global_id, ##__VA_ARGS__) +#define pr_info_client (client, fmt, ...) \ + pr_info("[%pU %llu]: " fmt, &client->fsid, \ + client->monc.auth->global_id, ##__VA_ARGS__) +#define pr_warn_client (client, fmt, ...) \ + pr_warn("[%pU %llu]: " fmt, &client->fsid, \ + client->monc.auth->global_id, ##__VA_ARGS__) +#define pr_warn_once_client (client, fmt, ...) \ + pr_warn_once("[%pU %llu]: " fmt, &client->fsid, \ + client->monc.auth->global_id, ##__VA_ARGS__) +#define pr_err_client (client, fmt, ...) \ + pr_err("[%pU %llu]: " fmt, &client->fsid, \ + client->monc.auth->global_id, ##__VA_ARGS__) +#define pr_warn_ratelimited_client (client, fmt, ...) \ + pr_warn_ratelimited("[%pU %llu]: " fmt, &client->fsid, \ + client->monc.auth->global_id, ##__VA_ARGS__) +#define pr_err_ratelimited_client (client, fmt, ...) \ + pr_err_ratelimited("[%pU %llu]: " fmt, &client->fsid, \ + client->monc.auth->global_id, ##__VA_ARGS__) +#endif
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 118/222 ceph: print cluster fsid and client global_id in all debug logs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiubo Li <[email protected]>
[ Upstream commit 38d46409c4639a1d659ebfa70e27a8bed6b8ee1d ]
Multiple CephFS mounts on a host is increasingly common so disambiguating messages like this is necessary and will make it easier to debug issues.
At the same this will improve the debug logs to make them easier to troubleshooting issues, such as print the ino# instead only printing the memory addresses of the corresponding inodes and print the dentry names instead of the corresponding memory addresses for the dentry,etc.
Stable-dep-of: 550f7ca98ee0 ("ceph: give up on paths longer than PATH_MAX")
--- fs/ceph/acl.c | 6 +- fs/ceph/addr.c | 279 +++++++++-------- fs/ceph/caps.c | 710 +++++++++++++++++++++++++------------------ fs/ceph/crypto.c | 39 ++- fs/ceph/debugfs.c | 6 +- fs/ceph/dir.c | 218 +++++++------ fs/ceph/export.c | 39 +-- fs/ceph/file.c | 245 ++++++++------- fs/ceph/inode.c | 485 ++++++++++++++++------------- fs/ceph/ioctl.c | 13 +- fs/ceph/locks.c | 57 ++-- fs/ceph/mds_client.c | 558 +++++++++++++++++++--------------- fs/ceph/mdsmap.c | 24 +- fs/ceph/metric.c | 5 +- fs/ceph/quota.c | 29 +- fs/ceph/snap.c | 174 ++++++----- fs/ceph/super.c | 70 +++-- fs/ceph/super.h | 6 + fs/ceph/xattr.c | 96 +++--- 19 files changed, 1747 insertions(+), 1312 deletions(-)
fs/ceph/acl.c +4 -2
@@ -15,6 +15,7 @@#include <linux/slab.h> #include "super.h" +#include "mds_client.h" static inline void ceph_set_cached_acl (struct inode *inode,int type,struct posix_acl *acl)
@@ -31,6 +32,7 @@ static inline void ceph_set_cached_acl(struct inode *inode,struct posix_acl *ceph_get_acl (struct inode *inode,int type,bool rcu) { +struct ceph_client *cl =ceph_inode_to_client (inode);int size;unsigned int retry_cnt =0 ;const char *name;
@@ -72,8 +74,8 @@ struct posix_acl *ceph_get_acl(struct inode *inode, int type, bool rcu) }else if (size == -ENODATA || size ==0 ) { acl =NULL ; }else { -pr_err_ratelimited ("get acl %llx.%llx failed, err=%d\n" , -ceph_vinop (inode), size); +pr_err_ratelimited_client (cl,"%llx.%llx failed, err=%d\n" , +ceph_vinop (inode), size); acl =ERR_PTR (-EIO ); }
fs/ceph/addr.c +153 -126
757 lines not on this page · raw message
fs/ceph/caps.c +410 -300
1,717 lines not on this page · raw message
fs/ceph/crypto.c +26 -13
@@ -211,6 +211,7 @@ void ceph_fscrypt_as_ctx_to_req(struct ceph_mds_request *req,static struct inode *parse_longname (const struct inode *parent,const char *name,int *name_len) { +struct ceph_client *cl =ceph_inode_to_client (parent);struct inode *dir =NULL ;struct ceph_vino vino = { .snap =CEPH_NOSNAP };char *inode_number;
@@ -222,12 +223,12 @@ static struct inode *parse_longname(const struct inode *parent, name++; name_end =strrchr (name,'_' );if (!name_end) { -dout ("Failed to parse long snapshot name: %s\n" , name); +doutc (cl,"failed to parse long snapshot name: %s\n" , name);return ERR_PTR (-EIO ); } *name_len = (name_end - name);if (*name_len <=0 ) { -pr_err ("Failed to parse long snapshot name\n" ); +pr_err_client (cl,"failed to parse long snapshot name\n" );return ERR_PTR (-EIO ); }
@@ -239,7 +240,7 @@ static struct inode *parse_longname(const struct inode *parent,return ERR_PTR (-ENOMEM ); ret =kstrtou64 (inode_number,10 , &vino.ino);if (ret) { -dout ("Failed to parse inode number: %s\n" , name); +doutc (cl,"failed to parse inode number: %s\n" , name); dir =ERR_PTR (ret); goto out; }
@@ -250,7 +251,7 @@ static struct inode *parse_longname(const struct inode *parent,/* This can happen if we're not mounting cephfs on the root */ dir =ceph_get_inode (parent->i_sb, vino,NULL );if (IS_ERR (dir)) -dout ("Can't find inode %s (%s)\n" , inode_number, name); +doutc (cl,"can't find inode %s (%s)\n" , inode_number, name); } out:
@@ -261,6 +262,7 @@ static struct inode *parse_longname(const struct inode *parent,int ceph_encode_encrypted_dname (struct inode *parent,struct qstr *d_name,char *buf) { +struct ceph_client *cl =ceph_inode_to_client (parent);struct inode *dir = parent;struct qstr iname;u32 len;
@@ -329,7 +331,7 @@ int ceph_encode_encrypted_dname(struct inode *parent, struct qstr *d_name,/* base64 encode the encrypted name */ elen =ceph_base64_encode (cryptbuf, len, buf); -dout ("base64-encoded ciphertext name = %.*s\n" , elen, buf); +doutc (cl,"base64-encoded ciphertext name = %.*s\n" , elen, buf);/* To understand the 240 limit, see CEPH_NOHASH_NAME_MAX comments */ WARN_ON (elen >240 );
@@ -504,7 +506,10 @@ int ceph_fscrypt_decrypt_block_inplace(const struct inode *inode, struct page *page, unsigned int len, unsigned int offs, u64 lblk_num) { - dout("%s: len %u offs %u blk %llu\n", __func__, len, offs, lblk_num); + struct ceph_client *cl = ceph_inode_to_client(inode); + +doutc (cl,"%p %llx.%llx len %u offs %u blk %llu\n" , inode, +ceph_vinop (inode), len, offs, lblk_num);return fscrypt_decrypt_block_inplace (inode, page, len, offs, lblk_num); }
@@ -513,7 +518,10 @@ int ceph_fscrypt_encrypt_block_inplace(const struct inode *inode, unsigned int offs, u64 lblk_num, gfp_t gfp_flags) { - dout("%s: len %u offs %u blk %llu\n", __func__, len, offs, lblk_num); + struct ceph_client *cl = ceph_inode_to_client(inode); + +doutc (cl,"%p %llx.%llx len %u offs %u blk %llu\n" , inode, +ceph_vinop (inode), len, offs, lblk_num);return fscrypt_encrypt_block_inplace (inode, page, len, offs, lblk_num, gfp_flags); }
@@ -582,6 +590,7 @@ int ceph_fscrypt_decrypt_extents(struct inode *inode, struct page **page, u64 off, struct ceph_sparse_extent *map, u32 ext_cnt) { + struct ceph_client *cl = ceph_inode_to_client(inode);int i, ret =0 ;struct ceph_inode_info *ci =ceph_inode (inode);u64 objno, objoff;
@@ -589,7 +598,8 @@ int ceph_fscrypt_decrypt_extents(struct inode *inode, struct page **page,/* Nothing to do for empty array */ if (ext_cnt ==0 ) { -dout ("%s: empty array, ret 0\n" , __func__); +doutc (cl,"%p %llx.%llx empty array, ret 0\n" , inode, +ceph_vinop (inode));return 0 ; }
@@ -603,14 +613,17 @@ int ceph_fscrypt_decrypt_extents(struct inode *inode, struct page **page,int fret;if ((ext->off | ext->len) & ~CEPH_FSCRYPT_BLOCK_MASK ) { -pr_warn ("%s: bad encrypted sparse extent idx %d off %llx len %llx\n" , - __func__, i, ext->off, ext->len); +pr_warn_client (cl, +"%p %llx.%llx bad encrypted sparse extent " +"idx %d off %llx len %llx\n" , + inode,ceph_vinop (inode), i, ext->off, + ext->len);return -EIO ; } fret =ceph_fscrypt_decrypt_pages (inode, &page[pgidx], off + pgsoff, ext->len); -dout ("%s: [%d] 0x%llx~0x%llx fret %d\n" , __func__, i, - ext->off, ext->len, fret); +doutc (cl,"%p %llx.%llx [%d] 0x%llx~0x%llx fret %d\n" , inode, +ceph_vinop (inode), i, ext->off, ext->len, fret);if (fret <0 ) {if (ret ==0 ) ret = fret;
@@ -618,7 +631,7 @@ int ceph_fscrypt_decrypt_extents(struct inode *inode, struct page **page, } ret = pgsoff + fret; } -dout ("%s: ret %d\n" , __func__, ret); +doutc (cl,"ret %d\n" , ret);return ret; }
fs/ceph/debugfs.c +4 -2
@@ -398,7 +398,7 @@ DEFINE_SIMPLE_ATTRIBUTE(congestion_kb_fops, congestion_kb_get,void ceph_fs_debugfs_cleanup (struct ceph_fs_client *fsc) { -dout ("ceph_fs_debugfs_cleanup\n" ); +doutc (fsc->client,"begin\n" );debugfs_remove (fsc->debugfs_bdi);debugfs_remove (fsc->debugfs_congestion_kb);debugfs_remove (fsc->debugfs_mdsmap);
@@ -407,13 +407,14 @@ void ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc)debugfs_remove (fsc->debugfs_status);debugfs_remove (fsc->debugfs_mdsc);debugfs_remove_recursive (fsc->debugfs_metrics_dir); +doutc (fsc->client,"done\n" ); }void ceph_fs_debugfs_init (struct ceph_fs_client *fsc) {char name[100 ]; -dout ("ceph_fs_debugfs_init\n" ); +doutc (fsc->client,"begin\n" ); fsc->debugfs_congestion_kb = debugfs_create_file("writeback_congestion_kb", 0600,
@@ -469,6 +470,7 @@ void ceph_fs_debugfs_init(struct ceph_fs_client *fsc) &metrics_size_fops);debugfs_create_file ("caps" ,0400 , fsc->debugfs_metrics_dir, fsc, &metrics_caps_fops); +doutc (fsc->client,"done\n" ); }
fs/ceph/dir.c +132 -86
353 lines not on this page · raw message
fs/ceph/file.c +141 -104
245 lines not on this page · raw message
fs/ceph/inode.c +267 -218
485 lines not on this page · raw message
fs/ceph/locks.c +33 -24
57 lines not on this page · raw message
fs/ceph/mds_client.c +315 -243
558 lines not on this page · raw message
fs/ceph/snap.c +95 -79
174 lines not on this page · raw message
fs/ceph/super.c +40 -30
70 lines not on this page · raw message
fs/ceph/xattr.c +57 -39
96 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Signature · 1 line
2.39.5
Part of the diff is not shown here. View the raw message.
Re: [PATCH 6.6 118/222] ceph: print cluster fsid and client global_id in all debug logs
Quoted 38 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiubo Li <[email protected]>
[ Upstream commit
38d46409c4639a1d659ebfa70e27a8bed6b8ee1d]Multiple CephFS mounts on a host is increasingly common so disambiguating messages like this is necessary and will make it easier to debug issues.
At the same this will improve the debug logs to make them easier to troubleshooting issues, such as print the ino# instead only printing the memory addresses of the corresponding inodes and print the dentry names instead of the corresponding memory addresses for the dentry,etc.
Signed-off-by Xiubo Li <[email protected]>Reviewed-by Patrick Donnelly <[email protected]>Reviewed-by Milind Changire <[email protected]>Signed-off-by Ilya Dryomov <[email protected]>Stable-dep-of:
550f7ca98ee0("ceph: give up on paths longer thanPATH_MAX")Signed-off-by Sasha Levin <[email protected]>--- fs/ceph/acl.c | 6 +- fs/ceph/addr.c | 279 +++++++++-------- fs/ceph/caps.c | 710 +++++++++++++++++++++++++------------------ fs/ceph/crypto.c | 39 ++- fs/ceph/debugfs.c | 6 +- fs/ceph/dir.c | 218 +++++++------ fs/ceph/export.c | 39 +-- fs/ceph/file.c | 245 ++++++++------- fs/ceph/inode.c | 485 ++++++++++++++++------------- fs/ceph/ioctl.c | 13 +- fs/ceph/locks.c | 57 ++-- fs/ceph/mds_client.c | 558 +++++++++++++++++++---------------
Quoted 8 lines
fs/ceph/mdsmap.c | 24 +- fs/ceph/metric.c | 5 +- fs/ceph/quota.c | 29 +- fs/ceph/snap.c | 174 ++++++----- fs/ceph/super.c | 70 +++-- fs/ceph/super.h | 6 + fs/ceph/xattr.c | 96 +++--- 19 files changed, 1747 insertions(+), 1312 deletions(-)
Hi Greg,
This is a huge patch, albeit mostly mechanical. Commit 550f7ca98ee0 ("ceph: give up on paths longer than PATH_MAX") for which this patch is a dependency just removes the affected log message, so it could be backported with a trivial conflict resolution instead of taking in 5c5f0d2b5f92 ("libceph: add doutc and *_client debug macros support") and 38d46409c463 ("ceph: print cluster fsid and client global_id in all debug logs") to arrange for a "clean" backport.
Were these cherry picks done in an automated fashion by a tool that tries to identify and pull prerequisite patches based on "git blame" output? The result appears to go against the rules laid out in Documentation/process/stable-kernel-rules.rst (particularly the limit on the number of lines), so I wanted to clarify the expected workflow of the stable team in this area. Are "clean" backports considered to justify additional prerequisite patches of this size even when the conflict resolution is "take ours" or otherwise trivial?
Thanks,
Ilya
Greg Kroah-Hartman
maintainerRe: [PATCH 6.6 118/222] ceph: print cluster fsid and client global_id in all debug logs
Quoted 51 lines · Ilya Dryomov
Quoted 38 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiubo Li <[email protected]>
[ Upstream commit
38d46409c4639a1d659ebfa70e27a8bed6b8ee1d]Multiple CephFS mounts on a host is increasingly common so disambiguating messages like this is necessary and will make it easier to debug issues.
At the same this will improve the debug logs to make them easier to troubleshooting issues, such as print the ino# instead only printing the memory addresses of the corresponding inodes and print the dentry names instead of the corresponding memory addresses for the dentry,etc.
Signed-off-by Xiubo Li <[email protected]>Reviewed-by Patrick Donnelly <[email protected]>Reviewed-by Milind Changire <[email protected]>Signed-off-by Ilya Dryomov <[email protected]>Stable-dep-of:
550f7ca98ee0("ceph: give up on paths longer thanPATH_MAX")Signed-off-by Sasha Levin <[email protected]>--- fs/ceph/acl.c | 6 +- fs/ceph/addr.c | 279 +++++++++-------- fs/ceph/caps.c | 710 +++++++++++++++++++++++++------------------ fs/ceph/crypto.c | 39 ++- fs/ceph/debugfs.c | 6 +- fs/ceph/dir.c | 218 +++++++------ fs/ceph/export.c | 39 +-- fs/ceph/file.c | 245 ++++++++------- fs/ceph/inode.c | 485 ++++++++++++++++------------- fs/ceph/ioctl.c | 13 +- fs/ceph/locks.c | 57 ++-- fs/ceph/mds_client.c | 558 +++++++++++++++++++---------------Quoted 8 lines
fs/ceph/mdsmap.c | 24 +- fs/ceph/metric.c | 5 +- fs/ceph/quota.c | 29 +- fs/ceph/snap.c | 174 ++++++----- fs/ceph/super.c | 70 +++-- fs/ceph/super.h | 6 + fs/ceph/xattr.c | 96 +++--- 19 files changed, 1747 insertions(+), 1312 deletions(-)Hi Greg,
Quoted 8 lines
This is a huge patch, albeit mostly mechanical. Commit
550f7ca98ee0("ceph: give up on paths longer thanPATH_MAX") for which this patch is a dependency just removes the affected log message, so it could be backported with a trivial conflict resolution instead of taking in5c5f0d2b5f92("libceph: add doutc and*_clientdebug macros support") and38d46409c463("ceph: print cluster fsid and clientglobal_idin all debug logs") to arrange for a "clean" backport.
Great, can you send such a backport?
Quoted 3 lines
Were these cherry picks done in an automated fashion by a tool that tries to identify and pull prerequisite patches based on "git blame" output?
Yes.
Quoted 6 lines
The result appears to go against the rules laid out in
Documentation/process/stable-kernel-rules.rst(particularly the limit on the number of lines), so I wanted to clarify the expected workflow of the stable team in this area. Are "clean" backports considered to justify additional prerequisite patches of this size even when the conflict resolution is "take ours" or otherwise trivial?
Yes. Keeping the tree in sync is almost always preferred over "one-off" changes that have to be hand-provided, when the maintainer is not involved to ensure that we don't break anything. But if you want to provide a working patch that you think should do the same thing without these dep-of: patches, that would be great!
thanks,
greg k-h
Re: [PATCH 6.6 118/222] ceph: print cluster fsid and client global_id in all debug logs
Quoted 62 lines · Greg Kroah-Hartman
Quoted 51 lines · Ilya Dryomov
Quoted 38 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiubo Li <[email protected]>
[ Upstream commit
38d46409c4639a1d659ebfa70e27a8bed6b8ee1d]Multiple CephFS mounts on a host is increasingly common so disambiguating messages like this is necessary and will make it easier to debug issues.
At the same this will improve the debug logs to make them easier to troubleshooting issues, such as print the ino# instead only printing the memory addresses of the corresponding inodes and print the dentry names instead of the corresponding memory addresses for the dentry,etc.
Signed-off-by Xiubo Li <[email protected]>Reviewed-by Patrick Donnelly <[email protected]>Reviewed-by Milind Changire <[email protected]>Signed-off-by Ilya Dryomov <[email protected]>Stable-dep-of:
550f7ca98ee0("ceph: give up on paths longer thanPATH_MAX")Signed-off-by Sasha Levin <[email protected]>--- fs/ceph/acl.c | 6 +- fs/ceph/addr.c | 279 +++++++++-------- fs/ceph/caps.c | 710 +++++++++++++++++++++++++------------------ fs/ceph/crypto.c | 39 ++- fs/ceph/debugfs.c | 6 +- fs/ceph/dir.c | 218 +++++++------ fs/ceph/export.c | 39 +-- fs/ceph/file.c | 245 ++++++++------- fs/ceph/inode.c | 485 ++++++++++++++++------------- fs/ceph/ioctl.c | 13 +- fs/ceph/locks.c | 57 ++-- fs/ceph/mds_client.c | 558 +++++++++++++++++++---------------Quoted 8 lines
fs/ceph/mdsmap.c | 24 +- fs/ceph/metric.c | 5 +- fs/ceph/quota.c | 29 +- fs/ceph/snap.c | 174 ++++++----- fs/ceph/super.c | 70 +++-- fs/ceph/super.h | 6 + fs/ceph/xattr.c | 96 +++--- 19 files changed, 1747 insertions(+), 1312 deletions(-)Hi Greg,
Quoted 8 lines
This is a huge patch, albeit mostly mechanical. Commit
550f7ca98ee0("ceph: give up on paths longer thanPATH_MAX") for which this patch is a dependency just removes the affected log message, so it could be backported with a trivial conflict resolution instead of taking in5c5f0d2b5f92("libceph: add doutc and*_clientdebug macros support") and38d46409c463("ceph: print cluster fsid and clientglobal_idin all debug logs") to arrange for a "clean" backport.
Quoted 1 line
Great, can you send such a backport?
Sure, you should have one for 5.10-6.1 and a separate one for 6.6 in your inbox now.
Quoted 14 lines
Quoted 4 lines
Were these cherry picks done in an automated fashion by a tool that tries to identify and pull prerequisite patches based on "git blame" output?
Yes.
Quoted 6 lines
The result appears to go against the rules laid out in
Documentation/process/stable-kernel-rules.rst(particularly the limit on the number of lines), so I wanted to clarify the expected workflow of the stable team in this area. Are "clean" backports considered to justify additional prerequisite patches of this size even when the conflict resolution is "take ours" or otherwise trivial?
Quoted 3 lines
Yes. Keeping the tree in sync is almost always preferred over "one-off" changes that have to be hand-provided, when the maintainer is not involved to ensure that we don't break anything. But if you want to
In this case this lead to pulling in
1 file changed, 38 insertions(+)
and
19 files changed, 1747 insertions(+), 1312 deletions(-)
patches as dependencies to satisfy the backport of
1 file changed, 4 insertions(+), 5 deletions(-)
patch. Is this OK given that stable-kernel-rules.rst still has "It cannot be bigger than 100 lines, with context." as one of the rules for what kind of patches are accepted?
Thanks,
Ilya
Greg Kroah-Hartman
maintainerRe: [PATCH 6.6 118/222] ceph: print cluster fsid and client global_id in all debug logs
Quoted 95 lines · Ilya Dryomov
Quoted 62 lines · Greg Kroah-Hartman
Quoted 51 lines · Ilya Dryomov
Quoted 38 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiubo Li <[email protected]>
[ Upstream commit
38d46409c4639a1d659ebfa70e27a8bed6b8ee1d]Multiple CephFS mounts on a host is increasingly common so disambiguating messages like this is necessary and will make it easier to debug issues.
At the same this will improve the debug logs to make them easier to troubleshooting issues, such as print the ino# instead only printing the memory addresses of the corresponding inodes and print the dentry names instead of the corresponding memory addresses for the dentry,etc.
Signed-off-by Xiubo Li <[email protected]>Reviewed-by Patrick Donnelly <[email protected]>Reviewed-by Milind Changire <[email protected]>Signed-off-by Ilya Dryomov <[email protected]>Stable-dep-of:
550f7ca98ee0("ceph: give up on paths longer thanPATH_MAX")Signed-off-by Sasha Levin <[email protected]>--- fs/ceph/acl.c | 6 +- fs/ceph/addr.c | 279 +++++++++-------- fs/ceph/caps.c | 710 +++++++++++++++++++++++++------------------ fs/ceph/crypto.c | 39 ++- fs/ceph/debugfs.c | 6 +- fs/ceph/dir.c | 218 +++++++------ fs/ceph/export.c | 39 +-- fs/ceph/file.c | 245 ++++++++------- fs/ceph/inode.c | 485 ++++++++++++++++------------- fs/ceph/ioctl.c | 13 +- fs/ceph/locks.c | 57 ++-- fs/ceph/mds_client.c | 558 +++++++++++++++++++---------------Quoted 8 lines
fs/ceph/mdsmap.c | 24 +- fs/ceph/metric.c | 5 +- fs/ceph/quota.c | 29 +- fs/ceph/snap.c | 174 ++++++----- fs/ceph/super.c | 70 +++-- fs/ceph/super.h | 6 + fs/ceph/xattr.c | 96 +++--- 19 files changed, 1747 insertions(+), 1312 deletions(-)Hi Greg,
Quoted 8 lines
This is a huge patch, albeit mostly mechanical. Commit
550f7ca98ee0("ceph: give up on paths longer thanPATH_MAX") for which this patch is a dependency just removes the affected log message, so it could be backported with a trivial conflict resolution instead of taking in5c5f0d2b5f92("libceph: add doutc and*_clientdebug macros support") and38d46409c463("ceph: print cluster fsid and clientglobal_idin all debug logs") to arrange for a "clean" backport.Quoted 1 line
Great, can you send such a backport?
Sure, you should have one for 5.10-6.1 and a separate one for 6.6 in your inbox now.
Quoted 14 lines
Quoted 4 lines
Were these cherry picks done in an automated fashion by a tool that tries to identify and pull prerequisite patches based on "git blame" output?
Yes.
Quoted 6 lines
The result appears to go against the rules laid out in
Documentation/process/stable-kernel-rules.rst(particularly the limit on the number of lines), so I wanted to clarify the expected workflow of the stable team in this area. Are "clean" backports considered to justify additional prerequisite patches of this size even when the conflict resolution is "take ours" or otherwise trivial?Quoted 3 lines
Yes. Keeping the tree in sync is almost always preferred over "one-off" changes that have to be hand-provided, when the maintainer is not involved to ensure that we don't break anything. But if you want to
In this case this lead to pulling in
1 file changed, 38 insertions(+)and
19 files changed, 1747 insertions(+), 1312 deletions(-)
Quoted 7 lines
patches as dependencies to satisfy the backport of
1 file changed, 4 insertions(+), 5 deletions(-)patch. Is this OK given that
stable-kernel-rules.rststill has "It cannot be bigger than 100 lines, with context." as one of the rules for what kind of patches are accepted?
It is ok, but I've now dropped it and taken your other patch instead, thanks.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 119/222 ceph: give up on paths longer than PATH_MAX
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Max Kellermann <[email protected]>
[ Upstream commit 550f7ca98ee028a606aa75705a7e77b1bd11720f ]
If the full path to be built by ceph_mdsc_build_path() happens to be longer than PATH_MAX, then this function will enter an endless (retry) loop, effectively blocking the whole task. Most of the machine becomes unusable, making this a very simple and effective DoS vulnerability.
I cannot imagine why this retry was ever implemented, but it seems rather useless and harmful to me. Let's remove it and fail with ENAMETOOLONG instead.
--- fs/ceph/mds_client.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
fs/ceph/mds_client.c +4 -5
@@ -2745,12 +2745,11 @@ char *ceph_mdsc_build_path(struct ceph_mds_client *mdsc, struct dentry *dentry,if (pos <0 ) {/* -* A rename didn't occur, but somehow we didn't end up where -* we thought we would. Throw a warning and try again. +* The path is longer than PATH_MAX and this function +* cannot ever succeed. Creating paths that long is +* possible with Ceph, but Linux cannot use them. */ -pr_warn_client (cl,"did not end path lookup where expected (pos = %d)\n" , - pos); - goto retry; +return ERR_PTR (-ENAMETOOLONG ); } *pbase = base;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 120/222 net: mctp: handle skb cleanup on sock_queue failures
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeremy Kerr <[email protected]>
[ Upstream commit ce1219c3f76bb131d095e90521506d3c6ccfa086 ]
Currently, we don't use the return value from sock_queue_rcv_skb, which means we may leak skbs if a message is not successfully queued to a socket.
Instead, ensure that we're freeing the skb where the sock hasn't otherwise taken ownership of the skb by adding checks on the sock_queue_rcv_skb() to invoke a kfree on failure.
In doing so, rather than using the 'rc' value to trigger the kfree_skb(), use the skb pointer itself, which is more explicit.
Also, add a kunit test for the sock delivery failure cases.
--- net/mctp/route.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-)
net/mctp/route.c +26 -10
@@ -334,8 +334,13 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb) msk =NULL ; rc = -EINVAL ; -/* we may be receiving a locally-routed packet; drop source sk -* accounting +/* We may be receiving a locally-routed packet; drop source sk +* accounting. +* +* From here, we will either queue the skb - either to a frag_queue, or +* to a receiving socket. When that succeeds, we clear the skb pointer; +* a non-NULL skb on exit will be otherwise unowned, and hence +* kfree_skb()-ed. */ skb_orphan (skb);
@@ -389,7 +394,9 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)* pending key. */ if (flags &MCTP_HDR_FLAG_EOM ) { -sock_queue_rcv_skb (&msk->sk, skb); + rc =sock_queue_rcv_skb (&msk->sk, skb); +if (!rc) + skb =NULL ;if (key) {/* we've hit a pending reassembly; not much we * can do but drop it
@@ -398,7 +405,6 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb) MCTP_TRACE_KEY_REPLIED); key =NULL ; } - rc =0 ; goto out_unlock; }
@@ -425,8 +431,10 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)* this function. */ rc =mctp_key_add (key, msk); -if (!rc) +if (!rc) {trace_mctp_key_acquire (key); + skb =NULL ; + }/* we don't need to release key->lock on exit, so * clean up here and suppress the unlock via
@@ -444,6 +452,8 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb) key =NULL ; }else { rc =mctp_frag_queue (key, skb); +if (!rc) + skb =NULL ; } }
@@ -458,12 +468,19 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)else rc =mctp_frag_queue (key, skb); +if (rc) + goto out_unlock; + +/* we've queued; the queue owns the skb now */ + skb =NULL ; +/* end of message? deliver to socket, and we're done with * the reassembly/response key */ -if (!rc && flags &MCTP_HDR_FLAG_EOM ) { -sock_queue_rcv_skb (key->sk, key->reasm_head); - key->reasm_head =NULL ; +if (flags &MCTP_HDR_FLAG_EOM ) { + rc =sock_queue_rcv_skb (key->sk, key->reasm_head); +if (!rc) + key->reasm_head =NULL ;__mctp_key_done_in (key, net, f,MCTP_TRACE_KEY_REPLIED ); key =NULL ; }
@@ -482,8 +499,7 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)if (any_key)mctp_key_unref (any_key); out: -if (rc) -kfree_skb (skb); +kfree_skb (skb);return rc; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 121/222 tracing: Move readpos from seq_buf to trace_seq
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Wilcox (Oracle) <[email protected]>
[ Upstream commit d0ed46b60396cfa7e0056f55e1ce0b43c7db57b6 ]
To make seq_buf more lightweight as a string buf, move the readpos member from seq_buf to its container, trace_seq. That puts the responsibility of maintaining the readpos entirely in the tracing code. If some future users want to package up the readpos with a seq_buf, we can define a new struct then.
Stable-dep-of: afd2627f727b ("tracing: Check "%s" dereference via the field and not the TP_printk format")
--- include/linux/seq_buf.h | 5 +---- include/linux/trace_seq.h | 2 ++ kernel/trace/trace.c | 10 +++++----- kernel/trace/trace_seq.c | 6 +++++- lib/seq_buf.c | 22 ++++++++++------------ 5 files changed, 23 insertions(+), 22 deletions(-)
include/linux/seq_buf.h +1 -4
@@ -14,19 +14,16 @@* @buffer: pointer to the buffer * @size: size of the buffer * @len: the amount of data inside the buffer -* @readpos: The next position to read in the buffer. */ struct seq_buf {char *buffer;size_t size;size_t len; -loff_t readpos; };static inline void seq_buf_clear (struct seq_buf *s) { s->len =0 ; - s->readpos =0 ; } static inline void
@@ -143,7 +140,7 @@ extern __printf(2, 0)int seq_buf_vprintf (struct seq_buf *s,const char *fmt,va_list args);extern int seq_buf_print_seq (struct seq_file *m,struct seq_buf *s);extern int seq_buf_to_user (struct seq_buf *s,char __user *ubuf, -int cnt); +size_t start,int cnt);extern int seq_buf_puts (struct seq_buf *s,const char *str);extern int seq_buf_putc (struct seq_buf *s,unsigned char c);extern int seq_buf_putmem (struct seq_buf *s,const void *mem,unsigned int len);
include/linux/trace_seq.h +2 -0
@@ -14,6 +14,7 @@struct trace_seq {char buffer[PAGE_SIZE ];struct seq_buf seq; +size_t readpos;int full; };
@@ -22,6 +23,7 @@ trace_seq_init(struct trace_seq *s) {seq_buf_init (&s->seq, s->buffer,PAGE_SIZE ); s->full =0 ; + s->readpos =0 ; }/**
kernel/trace/trace.c +5 -5
@@ -1731,15 +1731,15 @@ static ssize_t trace_seq_to_buffer(struct trace_seq *s, void *buf, size_t cnt) {int len; -if (trace_seq_used (s) <= s->seq.readpos) +if (trace_seq_used (s) <= s->readpos)return -EBUSY ; - len =trace_seq_used (s) - s->seq.readpos; + len =trace_seq_used (s) - s->readpos;if (cnt > len) cnt = len; -memcpy (buf, s->buffer + s->seq.readpos, cnt); +memcpy (buf, s->buffer + s->readpos, cnt); - s->seq.readpos += cnt; + s->readpos += cnt;return cnt; }
@@ -7011,7 +7011,7 @@ tracing_read_pipe(struct file *filp, char __user *ubuf,/* Now copy what we have to the user */ sret =trace_seq_to_user (&iter->seq, ubuf, cnt); -if (iter->seq.seq.readpos >=trace_seq_used (&iter->seq)) +if (iter->seq.readpos >=trace_seq_used (&iter->seq))trace_seq_init (&iter->seq);/*
kernel/trace/trace_seq.c +5 -1
@@ -370,8 +370,12 @@ EXPORT_SYMBOL_GPL(trace_seq_path);*/ int trace_seq_to_user (struct trace_seq *s,char __user *ubuf,int cnt) { +int ret;__trace_seq_init (s); -return seq_buf_to_user (&s->seq, ubuf, cnt); + ret =seq_buf_to_user (&s->seq, ubuf, s->readpos, cnt); +if (ret >0 ) + s->readpos += ret; +return ret; }EXPORT_SYMBOL_GPL (trace_seq_to_user);
lib/seq_buf.c +10 -12
@@ -324,23 +324,24 @@ int seq_buf_path(struct seq_buf *s, const struct path *path, const char *esc)* seq_buf_to_user - copy the sequence buffer to user space * @s: seq_buf descriptor * @ubuf: The userspace memory location to copy to +* @start: The first byte in the buffer to copy * @cnt: The amount to copy * * Copies the sequence buffer into the userspace memory pointed to -* by @ubuf. It starts from the last read position (@s->readpos) -* and writes up to @cnt characters or till it reaches the end of -* the content in the buffer (@s->len), which ever comes first. +* by @ubuf. It starts from @start and writes up to @cnt characters +* or until it reaches the end of the content in the buffer (@s->len), +* whichever comes first. * * On success, it returns a positive number of the number of bytes * it copied. * * On failure it returns -EBUSY if all of the content in the * sequence has been already read, which includes nothing in the -* sequence (@s->len == @s->readpos). +* sequence (@s->len == @start). * * Returns -EFAULT if the copy to userspace fails. */ -int seq_buf_to_user (struct seq_buf *s,char __user *ubuf,int cnt) +int seq_buf_to_user (struct seq_buf *s,char __user *ubuf,size_t start,int cnt) {int len;int ret;
@@ -350,20 +351,17 @@ int seq_buf_to_user(struct seq_buf *s, char __user *ubuf, int cnt) len =seq_buf_used (s); -if (len <= s->readpos) +if (len <= start)return -EBUSY ; - len -= s->readpos; + len -= start;if (cnt > len) cnt = len; - ret =copy_to_user (ubuf, s->buffer + s->readpos, cnt); + ret =copy_to_user (ubuf, s->buffer + start, cnt);if (ret == cnt)return -EFAULT ; - cnt -= ret; - - s->readpos += cnt; -return cnt; +return cnt - ret; }/**
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 122/222 powerpc: Remove initialisation of readpos
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Wilcox (Oracle) <[email protected]>
[ Upstream commit 0f7f544af60a6082cfaa3ed4c8f4ca1a858807ee ]
While powerpc doesn't use the seq_buf readpos, it did explicitly initialise it for no good reason.
--- arch/powerpc/kernel/setup-common.c | 1 - 1 file changed, 1 deletion(-)
arch/powerpc/kernel/setup-common.c +0 -1
@@ -601,7 +601,6 @@ struct seq_buf ppc_hw_desc __initdata = { .buffer = ppc_hw_desc_buf, .size = sizeof(ppc_hw_desc_buf), .len = 0, - .readpos = 0, };static __init void probe_machine (void )
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 123/222 seq_buf: Introduce DECLARE_SEQ_BUF and seq_buf_str()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
[ Upstream commit dcc4e5728eeaeda84878ca0018758cff1abfca21 ]
Solve two ergonomic issues with struct seq_buf;
1) Too much boilerplate is required to initialize:
struct seq_buf s; char buf[32]; seq_buf_init(s, buf, sizeof(buf));
Instead, we can build this directly on the stack. Provide DECLARE_SEQ_BUF() macro to do this:
DECLARE_SEQ_BUF(s, 32);
2) %NUL termination is fragile and requires 2 steps to get a valid C String (and is a layering violation exposing the "internals" of seq_buf):
seq_buf_terminate(s); do_something(s->buffer);
Instead, we can just return s->buffer directly after terminating it in the refactored seq_buf_terminate(), now known as seq_buf_str():
do_something(seq_buf_str(s));
Stable-dep-of: afd2627f727b ("tracing: Check "%s" dereference via the field and not the TP_printk format")
--- include/linux/seq_buf.h | 21 +++++++++++++++++---- kernel/trace/trace.c | 11 +---------- lib/seq_buf.c | 4 +--- 3 files changed, 19 insertions(+), 17 deletions(-)
include/linux/seq_buf.h +17 -4
@@ -21,9 +21,18 @@ struct seq_buf {size_t len; }; +#define DECLARE_SEQ_BUF (NAME ,SIZE ) \ + char __ ## NAME ## _buffer[SIZE] = ""; \ + struct seq_buf NAME = { \ + .buffer = &__ ## NAME ## _buffer, \ + .size = SIZE, \ + } +static inline void seq_buf_clear (struct seq_buf *s) { s->len =0 ; +if (s->size) + s->buffer[0 ] ='\0' ; } static inline void
@@ -69,8 +78,8 @@ static inline unsigned int seq_buf_used(struct seq_buf *s) }/** -* seq_buf_terminate - Make sure buffer is nul terminated -* @s: the seq_buf descriptor to terminate. +* seq_buf_str - get %NUL-terminated C string from seq_buf +* @s: the seq_buf handle * * This makes sure that the buffer in @s is nul terminated and * safe to read as a string.
@@ -81,16 +90,20 @@ static inline unsigned int seq_buf_used(struct seq_buf *s)* * After this function is called, s->buffer is safe to use * in string operations. +* +* Returns @s->buf after making sure it is terminated. */ -static inline void seq_buf_terminate (struct seq_buf *s) +static inline const char *seq_buf_str (struct seq_buf *s) {if (WARN_ON (s->size ==0 )) -return ; +return "" ;if (seq_buf_buffer_left (s)) s->buffer[s->len] =0 ;else s->buffer[s->size -1 ] =0 ; + +return s->buffer; }/**
kernel/trace/trace.c +1 -10
@@ -3810,15 +3810,6 @@ static bool trace_safe_str(struct trace_iterator *iter, const char *str,return false; } -static const char *show_buffer (struct trace_seq *s) -{ -struct seq_buf *seq = &s->seq; - -seq_buf_terminate (seq); - -return seq->buffer; -} -static DEFINE_STATIC_KEY_FALSE (trace_no_verify);static int test_can_verify_check (const char *fmt, ...)
@@ -3958,7 +3949,7 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,*/ if (WARN_ONCE (!trace_safe_str (iter, str, star, len),"fmt: '%s' current_buffer: '%s'" , - fmt,show_buffer (&iter->seq))) { + fmt,seq_buf_str (&iter->seq.seq))) {int ret;/* Try to safely read the string */
lib/seq_buf.c +1 -3
@@ -109,9 +109,7 @@ void seq_buf_do_printk(struct seq_buf *s, const char *lvl)if (s->size ==0 || s->len ==0 )return ; -seq_buf_terminate (s); - - start = s->buffer; + start =seq_buf_str (s);while ((lf =strchr (start,'\n' ))) {int len = lf - start +1 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 124/222 tracing: Handle old buffer mappings for event strings and functions
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt (Google) <[email protected]>
[ Upstream commit 07714b4bb3f9800261c8b4b2f47e9010ed60979d ]
Use the saved text_delta and data_delta of a persistent memory mapped ring buffer that was saved from a previous boot, and use the delta in the trace event print output so that strings and functions show up normally.
That is, for an event like trace_kmalloc() that prints the callsite via "%pS", if it used the address saved in the ring buffer it will not match the function that was saved in the previous boot if the kernel remaps itself between boots.
For RCU events that point to saved static strings where only the address of the string is saved in the ring buffer, it too will be adjusted to point to where the string is on the current boot.
Stable-dep-of: afd2627f727b ("tracing: Check "%s" dereference via the field and not the TP_printk format")
--- kernel/trace/trace.c | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-)
kernel/trace/trace.c +39 -3
@@ -3858,8 +3858,11 @@ static void test_can_verify(void)void trace_check_vprintf (struct trace_iterator *iter,const char *fmt,va_list ap) { +long text_delta = iter->tr->text_delta; +long data_delta = iter->tr->data_delta;const char *p = fmt;const char *str; +bool good;int i, j;if (WARN_ON_ONCE (!fmt))
@@ -3878,7 +3881,10 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt, j =0 ; -/* We only care about %s and variants */ +/* +* We only care about %s and variants +* as well as %p[sS] if delta is non-zero +*/ for (i =0 ; p[i]; i++) {if (i +1 >= iter->fmt_size) {/*
@@ -3907,6 +3913,11 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt, }if (p[i+j] =='s' )break ; + +if (text_delta && p[i+1 ] =='p' && + ((p[i+2 ] =='s' || p[i+2 ] =='S' ))) +break ; + star = false; } j =0 ;
@@ -3920,6 +3931,24 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt, iter->fmt[i] ='\0' ;trace_seq_vprintf (&iter->seq, iter->fmt, ap); +/* Add delta to %pS pointers */ +if (p[i+1 ] =='p' ) { +unsigned long addr; +char fmt[4 ]; + + fmt[0 ] ='%' ; + fmt[1 ] ='p' ; + fmt[2 ] = p[i+2 ];/* Either %ps or %pS */ + fmt[3 ] ='\0' ; + + addr = va_arg(ap, unsigned long); + addr += text_delta; +trace_seq_printf (&iter->seq, fmt, (void *)addr); + + p += i +3 ; +continue ; + } +/* * If iter->seq is full, the above call no longer guarantees * that ap is in sync with fmt processing, and further calls
@@ -3938,6 +3967,14 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,/* The ap now points to the string data of the %s */ str = va_arg(ap, const char *); + good =trace_safe_str (iter, str, star, len); + +/* Could be from the last boot */ +if (data_delta && !good) { + str += data_delta; + good =trace_safe_str (iter, str, star, len); + } +/* * If you hit this warning, it is likely that the * trace event in question used %s on a string that
@@ -3947,8 +3984,7 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,* instead. See samples/trace_events/trace-events-sample.h * for reference. */ -if (WARN_ONCE (!trace_safe_str (iter, str, star, len), -"fmt: '%s' current_buffer: '%s'" , +if (WARN_ONCE (!good,"fmt: '%s' current_buffer: '%s'" , fmt,seq_buf_str (&iter->seq.seq))) {int ret;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 125/222 tracing: Fix trace_check_vprintf() when tp_printk is used
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
[ Upstream commit 50a3242d84ee1625b0bfef29b95f935958dccfbe ]
When the tp_printk kernel command line is used, the trace events go directly to printk(). It is still checked via the trace_check_vprintf() function to make sure the pointers of the trace event are legit.
The addition of reading buffers from previous boots required adding a delta between the addresses of the previous boot and the current boot so that the pointers in the old buffer can still be used. But this required adding a trace_array pointer to acquire the delta offsets.
The tp_printk code does not provide a trace_array (tr) pointer, so when the offsets were examined, a NULL pointer dereference happened and the kernel crashed.
If the trace_array does not exist, just default the delta offsets to zero, as that also means the trace event is not being read from a previous boot.
Stable-dep-of: afd2627f727b ("tracing: Check "%s" dereference via the field and not the TP_printk format")
--- kernel/trace/trace.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
kernel/trace/trace.c +13 -2
@@ -3858,8 +3858,8 @@ static void test_can_verify(void)void trace_check_vprintf (struct trace_iterator *iter,const char *fmt,va_list ap) { -long text_delta = iter->tr->text_delta; -long data_delta = iter->tr->data_delta; +long text_delta =0 ; +long data_delta =0 ;const char *p = fmt;const char *str;bool good;
@@ -3871,6 +3871,17 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,if (static_branch_unlikely (&trace_no_verify)) goto print; +/* +* When the kernel is booted with the tp_printk command line +* parameter, trace events go directly through to printk(). +* It also is checked by this function, but it does not +* have an associated trace_array (tr) for it. +*/ +if (iter->tr) { + text_delta = iter->tr->text_delta; + data_delta = iter->tr->data_delta; + } +/* Don't bother checking when doing a ftrace_dump() */ if (iter->fmt == static_fmt_buf) goto print;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 126/222 tracing: Check "%s" dereference via the field and not the TP_printk format
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
[ Upstream commit afd2627f727b89496d79a6b934a025fc916d4ded ]
The TP_printk() portion of a trace event is executed at the time a event is read from the trace. This can happen seconds, minutes, hours, days, months, years possibly later since the event was recorded. If the print format contains a dereference to a string via "%s", and that string was allocated, there's a chance that string could be freed before it is read by the trace file.
To protect against such bugs, there are two functions that verify the event. The first one is test_event_printk(), which is called when the event is created. It reads the TP_printk() format as well as its arguments to make sure nothing may be dereferencing a pointer that was not copied into the ring buffer along with the event. If it is, it will trigger a WARN_ON().
For strings that use "%s", it is not so easy. The string may not reside in the ring buffer but may still be valid. Strings that are static and part of the kernel proper which will not be freed for the life of the running system, are safe to dereference. But to know if it is a pointer to a static string or to something on the heap can not be determined until the event is triggered.
This brings us to the second function that tests for the bad dereferencing of strings, trace_check_vprintf(). It would walk through the printf format looking for "%s", and when it finds it, it would validate that the pointer is safe to read. If not, it would produces a WARN_ON() as well and write into the ring buffer "[UNSAFE-MEMORY]".
The problem with this is how it used va_list to have vsnprintf() handle all the cases that it didn't need to check. Instead of re-implementing vsnprintf(), it would make a copy of the format up to the %s part, and call vsnprintf() with the current va_list ap variable, where the ap would then be ready to point at the string in question.
For architectures that passed va_list by reference this was possible. For architectures that passed it by copy it was not. A test_can_verify() function was used to differentiate between the two, and if it wasn't possible, it would disable it.
Even for architectures where this was feasible, it was a stretch to rely on such a method that is undocumented, and could cause issues later on with new optimizations of the compiler.
Instead, the first function test_event_printk() was updated to look at "%s" as well. If the "%s" argument is a pointer outside the event in the ring buffer, it would find the field type of the event that is the problem and mark the structure with a new flag called "needs_test". The event itself will be marked by TRACE_EVENT_FL_TEST_STR to let it be known that this event has a field that needs to be verified before the event can be printed using the printf format.
When the event fields are created from the field type structure, the fields would copy the field type's "needs_test" value.
Finally, before being printed, a new function ignore_event() is called which will check if the event has the TEST_STR flag set (if not, it returns false). If the flag is set, it then iterates through the events fields looking for the ones that have the "needs_test" flag set.
Then it uses the offset field from the field structure to find the pointer in the ring buffer event. It runs the tests to make sure that pointer is safe to print and if not, it triggers the WARN_ON() and also adds to the trace output that the event in question has an unsafe memory access.
The ignore_event() makes the trace_check_vprintf() obsolete so it is removed.
--- include/linux/trace_events.h | 6 +- kernel/trace/trace.c | 255 ++++++++--------------------------- kernel/trace/trace.h | 6 +- kernel/trace/trace_events.c | 32 +++-- kernel/trace/trace_output.c | 6 +- 5 files changed, 88 insertions(+), 217 deletions(-)
include/linux/trace_events.h +5 -1
@@ -279,7 +279,8 @@ struct trace_event_fields {const char *name;const int size;const int align; -const int is_signed; + const unsigned int is_signed:1; + unsigned int needs_test:1;const int filter_type;const int len; };
@@ -331,6 +332,7 @@ enum {TRACE_EVENT_FL_EPROBE_BIT ,TRACE_EVENT_FL_FPROBE_BIT ,TRACE_EVENT_FL_CUSTOM_BIT , + TRACE_EVENT_FL_TEST_STR_BIT, };/*
@@ -348,6 +350,7 @@ enum {* CUSTOM - Event is a custom event (to be attached to an exsiting tracepoint) * This is set when the custom event has not been attached * to a tracepoint yet, then it is cleared when it is. +* TEST_STR - The event has a "%s" that points to a string outside the event */ enum {TRACE_EVENT_FL_FILTERED = (1 <<TRACE_EVENT_FL_FILTERED_BIT ),
@@ -361,6 +364,7 @@ enum {TRACE_EVENT_FL_EPROBE = (1 <<TRACE_EVENT_FL_EPROBE_BIT ),TRACE_EVENT_FL_FPROBE = (1 <<TRACE_EVENT_FL_FPROBE_BIT ),TRACE_EVENT_FL_CUSTOM = (1 <<TRACE_EVENT_FL_CUSTOM_BIT ), + TRACE_EVENT_FL_TEST_STR = (1 << TRACE_EVENT_FL_TEST_STR_BIT), };#define TRACE_EVENT_FL_UKPROBE (TRACE_EVENT_FL_KPROBE | TRACE_EVENT_FL_UPROBE)
kernel/trace/trace.c +53 -202
303 lines not on this page · raw message
kernel/trace/trace.h +3 -3
@@ -644,9 +644,8 @@ void trace_buffer_unlock_commit_nostack(struct trace_buffer *buffer,bool trace_is_tracepoint_string (const char *str);const char *trace_event_format (struct trace_iterator *iter,const char *fmt); -void trace_check_vprintf(struct trace_iterator *iter, const char *fmt, - va_list ap) __printf(2, 0);char *trace_iter_expand_format (struct trace_iterator *iter); +bool ignore_event (struct trace_iterator *iter);int trace_empty (struct trace_iterator *iter);
@@ -1323,7 +1322,8 @@ struct ftrace_event_field {int filter_type;int offset;int size; -int is_signed; + unsigned int is_signed:1; + unsigned int needs_test:1;int len; };
kernel/trace/trace_events.c +22 -10
@@ -82,7 +82,7 @@ static int system_refcount_dec(struct event_subsystem *system) }static struct ftrace_event_field * -__find_event_field (struct list_head *head,char *name) +__find_event_field (struct list_head *head,const char *name) {struct ftrace_event_field *field;
@@ -114,7 +114,8 @@ trace_find_event_field(struct trace_event_call *call, char *name)static int __trace_define_field (struct list_head *head,const char *type,const char *name,int offset,int size, -int is_signed,int filter_type,int len) +int is_signed,int filter_type,int len, +int need_test) {struct ftrace_event_field *field;
@@ -133,6 +134,7 @@ static int __trace_define_field(struct list_head *head, const char *type, field->offset = offset; field->size = size; field->is_signed = is_signed; + field->needs_test = need_test; field->len = len;list_add (&field->link, head);
@@ -151,13 +153,13 @@ int trace_define_field(struct trace_event_call *call, const char *type, head =trace_get_fields (call);return __trace_define_field (head, type, name, offset, size, - is_signed, filter_type,0 ); + is_signed, filter_type,0 ,0 ); }EXPORT_SYMBOL_GPL (trace_define_field);static int trace_define_field_ext (struct trace_event_call *call,const char *type,const char *name,int offset,int size,int is_signed, -int filter_type,int len) +int filter_type,int len,int need_test) {struct list_head *head;
@@ -166,13 +168,13 @@ static int trace_define_field_ext(struct trace_event_call *call, const char *typ head =trace_get_fields (call);return __trace_define_field (head, type, name, offset, size, - is_signed, filter_type, len); + is_signed, filter_type, len, need_test); }#define __generic_field (type, item, filter_type) \ ret = __trace_define_field(&ftrace_generic_fields, #type, \ #item, 0, 0, is_signed_type(type), \ - filter_type, 0); \ + filter_type, 0, 0); \ if (ret) \ return ret;
@@ -181,7 +183,8 @@ static int trace_define_field_ext(struct trace_event_call *call, const char *typ "common_" #item, \ offsetof(typeof(ent), item), \ sizeof(ent.item), \ - is_signed_type(type), FILTER_OTHER, 0); \ + is_signed_type(type), FILTER_OTHER, \ + 0, 0); \ if (ret) \ return ret;
@@ -332,6 +335,7 @@ static bool process_pointer(const char *fmt, int len, struct trace_event_call *c/* Return true if the string is safe */ static bool process_string (const char *fmt,int len,struct trace_event_call *call) { +struct trace_event_fields *field;const char *r, *e, *s; e = fmt + len;
@@ -384,8 +388,16 @@ static bool process_string(const char *fmt, int len, struct trace_event_call *caif (process_pointer (fmt, len, call))return true; -/* Make sure the field is found, and consider it OK for now if it is */ -return find_event_field (fmt, call) !=NULL ; +/* Make sure the field is found */ + field =find_event_field (fmt, call); +if (!field) +return false; + +/* Test this field's string before printing the event */ + call->flags |=TRACE_EVENT_FL_TEST_STR ; + field->needs_test =1 ; + +return true; }/*
@@ -2564,7 +2576,7 @@ event_define_fields(struct trace_event_call *call) ret =trace_define_field_ext (call, field->type, field->name, offset, field->size, field->is_signed, field->filter_type, - field->len); + field->len, field->needs_test);if (WARN_ON_ONCE (ret)) {pr_err ("error code is %d\n" , ret);break ;
kernel/trace/trace_output.c +5 -1
@@ -317,10 +317,14 @@ EXPORT_SYMBOL(trace_raw_output_prep);void trace_event_printf (struct trace_iterator *iter,const char *fmt, ...) { +struct trace_seq *s = &iter->seq;va_list ap; +if (ignore_event (iter)) +return ; +va_start (ap, fmt); -trace_check_vprintf (iter,trace_event_format (iter, fmt), ap); +trace_seq_vprintf (s,trace_event_format (iter, fmt), ap);va_end (ap); }EXPORT_SYMBOL (trace_event_printf);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 127/222 RDMA/bnxt_re: Allow MSN table capability check
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Selvin Xavier <[email protected]>
[ Upstream commit 8d310ba845827a38fcd463d86bfe3b730ce7ab8f ]
FW reports the HW capability to use PSN table or MSN table and driver/library need to select it based on this capability. Use the new capability instead of the older capability check for HW retransmission while handling the MSN/PSN table. FW report zero (PSN table) for older adapters to maintain backward compatibility.
Also, Updated the FW interface structures to handle the new fields.
Stable-dep-of: eb867d797d29 ("RDMA/bnxt_re: Remove always true dattr validity check")
--- drivers/infiniband/hw/bnxt_re/qplib_fp.c | 12 ++++----- drivers/infiniband/hw/bnxt_re/qplib_fp.h | 2 +- drivers/infiniband/hw/bnxt_re/qplib_res.h | 6 +++++ drivers/infiniband/hw/bnxt_re/qplib_sp.c | 1 + drivers/infiniband/hw/bnxt_re/qplib_sp.h | 1 + drivers/infiniband/hw/bnxt_re/roce_hsi.h | 30 ++++++++++++++++++++++- 6 files changed, 44 insertions(+), 8 deletions(-)
drivers/infiniband/hw/bnxt_re/qplib_fp.c +6 -6
@@ -981,7 +981,7 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)u16 nsge;if (res->dattr) - qp->dev_cap_flags = res->dattr->dev_cap_flags; + qp->is_host_msn_tbl =_is_host_msn_table (res->dattr->dev_cap_flags2); sq->dbinfo.flags =0 ; bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req,
@@ -999,7 +999,7 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) sizeof(struct sq_psn_search_ext) :sizeof (struct sq_psn_search ); -if (BNXT_RE_HW_RETX (qp->dev_cap_flags)) { +if (qp->is_host_msn_tbl) { psn_sz =sizeof (struct sq_msn_search ); qp->msn =0 ; }
@@ -1013,7 +1013,7 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) hwq_attr.aux_depth = psn_sz ?bnxt_qplib_set_sq_size (sq, qp->wqe_mode) :0 ;/* Update msn tbl size */ -if (BNXT_RE_HW_RETX (qp->dev_cap_flags) && psn_sz) { +if (qp->is_host_msn_tbl && psn_sz) { hwq_attr.aux_depth =roundup_pow_of_two (bnxt_qplib_set_sq_size (sq, qp->wqe_mode)); qp->msn_tbl_sz = hwq_attr.aux_depth; qp->msn =0 ;
@@ -1638,7 +1638,7 @@ static void bnxt_qplib_fill_psn_search(struct bnxt_qplib_qp *qp,if (!swq->psn_search)return ;/* Handle MSN differently on cap flags */ -if (BNXT_RE_HW_RETX (qp->dev_cap_flags)) { +if (qp->is_host_msn_tbl) {bnxt_qplib_fill_msn_search (qp, wqe, swq);return ; }
@@ -1820,7 +1820,7 @@ int bnxt_qplib_post_send(struct bnxt_qplib_qp *qp, } swq =bnxt_qplib_get_swqe (sq, &wqe_idx); -bnxt_qplib_pull_psn_buff (qp, sq, swq,BNXT_RE_HW_RETX (qp->dev_cap_flags)); +bnxt_qplib_pull_psn_buff (qp, sq, swq, qp->is_host_msn_tbl); idx =0 ; swq->slot_idx = hwq->prod;
@@ -2010,7 +2010,7 @@ int bnxt_qplib_post_send(struct bnxt_qplib_qp *qp, rc = -EINVAL ; goto done; } -if (!BNXT_RE_HW_RETX (qp->dev_cap_flags) || msn_update) { +if (!qp->is_host_msn_tbl || msn_update) { swq->next_psn = sq->psn &BTH_PSN_MASK ;bnxt_qplib_fill_psn_search (qp, wqe, swq); }
drivers/infiniband/hw/bnxt_re/qplib_fp.h +1 -1
@@ -340,7 +340,7 @@ struct bnxt_qplib_qp {struct list_head rq_flush;u32 msn;u32 msn_tbl_sz; -u16 dev_cap_flags; +bool is_host_msn_tbl; };#define BNXT_QPLIB_MAX_CQE_ENTRY_SIZE sizeof(struct cq_base)
drivers/infiniband/hw/bnxt_re/qplib_res.h +6 -0
@@ -523,6 +523,12 @@ static inline bool _is_hw_retx_supported(u16 dev_cap_flags)#define BNXT_RE_HW_RETX (a) _is_hw_retx_supported((a)) +static inline bool _is_host_msn_table (u16 dev_cap_ext_flags2) +{ +return (dev_cap_ext_flags2 &CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_MASK ) == +CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_HOST_MSN_TABLE ; +} +static inline u8 bnxt_qplib_dbr_pacing_en (struct bnxt_qplib_chip_ctx *cctx) {return cctx->modes.dbr_pacing;
drivers/infiniband/hw/bnxt_re/qplib_sp.c +1 -0
@@ -165,6 +165,7 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw, attr->max_sgid =le32_to_cpu (sb->max_gid); attr->max_sgid =min_t (u32,BNXT_QPLIB_NUM_GIDS_SUPPORTED ,2 * attr->max_sgid); attr->dev_cap_flags =le16_to_cpu (sb->dev_cap_flags); + attr->dev_cap_flags2 =le16_to_cpu (sb->dev_cap_ext_flags_2);bnxt_qplib_query_version (rcfw, attr->fw_ver);
drivers/infiniband/hw/bnxt_re/qplib_sp.h +1 -0
@@ -73,6 +73,7 @@ struct bnxt_qplib_dev_attr {u8 tqm_alloc_reqs[MAX_TQM_ALLOC_REQ ];bool is_atomic;u16 dev_cap_flags; +u16 dev_cap_flags2;u32 max_dpi; };
drivers/infiniband/hw/bnxt_re/roce_hsi.h +29 -1
@@ -2157,8 +2157,36 @@ struct creq_query_func_resp_sb {__le32 tqm_alloc_reqs[12 ];__le32 max_dpi;u8 max_sge_var_wqe; -u8 reserved_8; +u8 dev_cap_ext_flags; +#define CREQ_QUERY_FUNC_RESP_SB_ATOMIC_OPS_NOT_SUPPORTED 0x1UL +#define CREQ_QUERY_FUNC_RESP_SB_DRV_VERSION_RGTR_SUPPORTED 0x2UL +#define CREQ_QUERY_FUNC_RESP_SB_CREATE_QP_BATCH_SUPPORTED 0x4UL +#define CREQ_QUERY_FUNC_RESP_SB_DESTROY_QP_BATCH_SUPPORTED 0x8UL +#define CREQ_QUERY_FUNC_RESP_SB_ROCE_STATS_EXT_CTX_SUPPORTED 0x10UL +#define CREQ_QUERY_FUNC_RESP_SB_CREATE_SRQ_SGE_SUPPORTED 0x20UL +#define CREQ_QUERY_FUNC_RESP_SB_FIXED_SIZE_WQE_DISABLED 0x40UL +#define CREQ_QUERY_FUNC_RESP_SB_DCN_SUPPORTED 0x80UL__le16 max_inline_data_var_wqe; +__le32 start_qid; +u8 max_msn_table_size; +u8 reserved8_1; +__le16 dev_cap_ext_flags_2; +#define CREQ_QUERY_FUNC_RESP_SB_OPTIMIZE_MODIFY_QP_SUPPORTED 0x1UL +#define CREQ_QUERY_FUNC_RESP_SB_CHANGE_UDP_SRC_PORT_WQE_SUPPORTED 0x2UL +#define CREQ_QUERY_FUNC_RESP_SB_CQ_COALESCING_SUPPORTED 0x4UL +#define CREQ_QUERY_FUNC_RESP_SB_MEMORY_REGION_RO_SUPPORTED 0x8UL +#define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_MASK 0x30UL +#define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_SFT 4 +#define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_HOST_PSN_TABLE (0x0UL << 4) +#define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_HOST_MSN_TABLE (0x1UL << 4) +#define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_IQM_MSN_TABLE (0x2UL << 4) +#define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_LAST \ + CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_IQM_MSN_TABLE +__le16 max_xp_qp_size; +__le16 create_qp_batch_size; +__le16 destroy_qp_batch_size; +__le16 reserved16; +__le64 reserved64; };/* cmdq_set_func_resources (size:448b/56B) */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 128/222 RDMA/bnxt_re: Remove always true dattr validity check
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leon Romanovsky <[email protected]>
[ Upstream commit eb867d797d294a00a092b5027d08439da68940b2 ]
res->dattr is always valid at this point as it was initialized during device addition in bnxt_re_add_device().
This change is fixing the following smatch error:drivers/infiniband/hw/bnxt_re/qplib_fp.c:1090 bnxt_qplib_create_qp()
error: we previously assumed 'res->dattr' could be null (see line 985)
--- drivers/infiniband/hw/bnxt_re/qplib_fp.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/infiniband/hw/bnxt_re/qplib_fp.c +1 -3
@@ -980,9 +980,7 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)u32 tbl_indx;u16 nsge; -if (res->dattr) - qp->is_host_msn_tbl =_is_host_msn_table (res->dattr->dev_cap_flags2); - + qp->is_host_msn_tbl =_is_host_msn_table (res->dattr->dev_cap_flags2); sq->dbinfo.flags =0 ; bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, CMDQ_BASE_OPCODE_CREATE_QP,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 129/222 RDMA/mlx5: Enforce same type port association for multiport RoCE
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Patrisious Haddad <[email protected]>
[ Upstream commit e05feab22fd7dabcd6d272c4e2401ec1acdfdb9b ]
Different core device types such as PFs and VFs shouldn't be affiliated together since they have different capabilities, fix that by enforcing type check before doing the affiliation.
--- drivers/infiniband/hw/mlx5/main.c | 6 ++++-- include/linux/mlx5/driver.h | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-)
drivers/infiniband/hw/mlx5/main.c +4 -2
@@ -3372,7 +3372,8 @@ static int mlx5_ib_init_multiport_master(struct mlx5_ib_dev *dev)list_for_each_entry (mpi, &mlx5_ib_unaffiliated_port_list, list) {if (dev->sys_image_guid == mpi->sys_image_guid && - (mlx5_core_native_port_num (mpi->mdev) -1 ) == i) { + (mlx5_core_native_port_num (mpi->mdev) -1 ) == i && +mlx5_core_same_coredev_type (dev->mdev, mpi->mdev)) { bound =mlx5_ib_bind_slave_port (dev, mpi); }
@@ -4406,7 +4407,8 @@ static int mlx5r_mp_probe(struct auxiliary_device *adev,mutex_lock (&mlx5_ib_multiport_mutex);list_for_each_entry (dev, &mlx5_ib_dev_list, ib_dev_list) { -if (dev->sys_image_guid == mpi->sys_image_guid) +if (dev->sys_image_guid == mpi->sys_image_guid && +mlx5_core_same_coredev_type (dev->mdev, mpi->mdev)) bound =mlx5_ib_bind_slave_port (dev, mpi);if (bound) {
include/linux/mlx5/driver.h +6 -0
@@ -1225,6 +1225,12 @@ static inline bool mlx5_core_is_vf(const struct mlx5_core_dev *dev)return dev->coredev_type ==MLX5_COREDEV_VF ; } +static inline bool mlx5_core_same_coredev_type (const struct mlx5_core_dev *dev1, +const struct mlx5_core_dev *dev2) +{ +return dev1->coredev_type == dev2->coredev_type; +} +static inline bool mlx5_core_is_ecpf (const struct mlx5_core_dev *dev) {return dev->caps.embedded_cpu;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 130/222 RDMA/bnxt_re: Avoid initializing the software queue for user queues
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Selvin Xavier <[email protected]>
[ Upstream commit 5effcacc8a8f3eb2a9f069d7e81a9ac793598dfb ]
Software Queues to hold the WRs needs to be created for only kernel queues. Avoid allocating the unnecessary memory for user Queues.
--- drivers/infiniband/hw/bnxt_re/qplib_fp.c | 42 +++++++++++++----------- 1 file changed, 23 insertions(+), 19 deletions(-)
drivers/infiniband/hw/bnxt_re/qplib_fp.c +23 -19
@@ -639,13 +639,6 @@ int bnxt_qplib_create_srq(struct bnxt_qplib_res *res, rc =bnxt_qplib_alloc_init_hwq (&srq->hwq, &hwq_attr);if (rc)return rc; - - srq->swq =kcalloc (srq->hwq.max_elements,sizeof (*srq->swq), -GFP_KERNEL ); -if (!srq->swq) { - rc = -ENOMEM ; - goto fail; - } srq->dbinfo.flags =0 ; bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, CMDQ_BASE_OPCODE_CREATE_SRQ,
@@ -674,9 +667,17 @@ int bnxt_qplib_create_srq(struct bnxt_qplib_res *res,spin_lock_init (&srq->lock); srq->start_idx =0 ; srq->last_idx = srq->hwq.max_elements -1 ; -for (idx =0 ; idx < srq->hwq.max_elements; idx++) - srq->swq[idx].next_idx = idx +1 ; - srq->swq[srq->last_idx].next_idx =-1 ; +if (!srq->hwq.is_user) { + srq->swq =kcalloc (srq->hwq.max_elements,sizeof (*srq->swq), +GFP_KERNEL ); +if (!srq->swq) { + rc = -ENOMEM ; + goto fail; + } +for (idx =0 ; idx < srq->hwq.max_elements; idx++) + srq->swq[idx].next_idx = idx +1 ; + srq->swq[srq->last_idx].next_idx =-1 ; + } srq->id =le32_to_cpu (resp.xid); srq->dbinfo.hwq = &srq->hwq;
@@ -1022,13 +1023,14 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)if (rc)return rc; - rc =bnxt_qplib_alloc_init_swq (sq); -if (rc) - goto fail_sq; - -if (psn_sz) -bnxt_qplib_init_psn_ptr (qp, psn_sz); +if (!sq->hwq.is_user) { + rc =bnxt_qplib_alloc_init_swq (sq); +if (rc) + goto fail_sq; +if (psn_sz) +bnxt_qplib_init_psn_ptr (qp, psn_sz); + } req.sq_size =cpu_to_le32 (bnxt_qplib_set_sq_size (sq, qp->wqe_mode)); pbl = &sq->hwq.pbl[PBL_LVL_0 ]; req.sq_pbl =cpu_to_le64 (pbl->pg_map_arr[0 ]);
@@ -1054,9 +1056,11 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) rc =bnxt_qplib_alloc_init_hwq (&rq->hwq, &hwq_attr);if (rc) goto sq_swq; - rc =bnxt_qplib_alloc_init_swq (rq); -if (rc) - goto fail_rq; +if (!rq->hwq.is_user) { + rc =bnxt_qplib_alloc_init_swq (rq); +if (rc) + goto fail_rq; + } req.rq_size =cpu_to_le32 (rq->max_wqe); pbl = &rq->hwq.pbl[PBL_LVL_0 ];
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 131/222 RDMA/bnxt_re: Avoid sending the modify QP workaround for latest adapters
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kashyap Desai <[email protected]>
[ Upstream commit 064c22408a73b9e945139b64614c534cbbefb591 ]
The workaround to modify the UD QP from RTS to RTS is required only for older adapters. Issuing this for latest adapters can caus some unexpected behavior. Fix it
--- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/infiniband/hw/bnxt_re/ib_verbs.c +4 -2
@@ -2710,7 +2710,8 @@ static int bnxt_re_post_send_shadow_qp(struct bnxt_re_dev *rdev, wr = wr->next; }bnxt_qplib_post_send_db (&qp->qplib_qp); -bnxt_ud_qp_hw_stall_workaround (qp); +if (!bnxt_qplib_is_chip_gen_p5_p7 (qp->rdev->chip_ctx)) +bnxt_ud_qp_hw_stall_workaround (qp);spin_unlock_irqrestore (&qp->sq_lock, flags);return rc; }
@@ -2822,7 +2823,8 @@ int bnxt_re_post_send(struct ib_qp *ib_qp, const struct ib_send_wr *wr, wr = wr->next; }bnxt_qplib_post_send_db (&qp->qplib_qp); -bnxt_ud_qp_hw_stall_workaround (qp); +if (!bnxt_qplib_is_chip_gen_p5_p7 (qp->rdev->chip_ctx)) +bnxt_ud_qp_hw_stall_workaround (qp);spin_unlock_irqrestore (&qp->sq_lock, flags);return rc;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 132/222 nvme-pci: 512 byte aligned dma pool segment quirk
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robert Beckett <[email protected]>
[ Upstream commit ebefac5647968679f6ef5803e5d35a71997d20fa ]
We initially introduced a quick fix limiting the queue depth to 1 as experimentation showed that it fixed data corruption on 64GB steamdecks.
Further experimentation revealed corruption only happens when the last PRP data element aligns to the end of the page boundary. The device appears to treat this as a PRP chain to a new list instead of the data element that it actually is. This implementation is in violation of the spec. Encountering this errata with the Linux driver requires the host request a 128k transfer and coincidently be handed the last small pool dma buffer within a page.
The QD1 quirk effectly works around this because the last data PRP always was at a 248 byte offset from the page start, so it never appeared at the end of the page, but comes at the expense of throttling IO and wasting the remainder of the PRP page beyond 256 bytes. Also to note, the MDTS on these devices is small enough that the "large" prp pool can hold enough PRP elements to never reach the end, so that pool is not a problem either.
Introduce a new quirk to ensure the small pool is always aligned such that the last PRP element can't appear a the end of the page. This comes at the expense of wasting 256 bytes per small pool page allocated.
--- drivers/nvme/host/nvme.h | 5 +++++ drivers/nvme/host/pci.c | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-)
drivers/nvme/host/nvme.h +5 -0
@@ -172,6 +172,11 @@ enum nvme_quirks {* MSI (but not MSI-X) interrupts are broken and never fire. */ NVME_QUIRK_BROKEN_MSI = (1 <<21 ), + +/* +* Align dma pool segment size to 512 bytes +*/ + NVME_QUIRK_DMAPOOL_ALIGN_512 = (1 << 22), };/*
drivers/nvme/host/pci.c +7 -2
@@ -2653,15 +2653,20 @@ static int nvme_disable_prepare_reset(struct nvme_dev *dev, bool shutdown)static int nvme_setup_prp_pools (struct nvme_dev *dev) { +size_t small_align =256 ; + dev->prp_page_pool =dma_pool_create ("prp list page" , dev->dev,NVME_CTRL_PAGE_SIZE ,NVME_CTRL_PAGE_SIZE ,0 );if (!dev->prp_page_pool)return -ENOMEM ; +if (dev->ctrl.quirks &NVME_QUIRK_DMAPOOL_ALIGN_512 ) + small_align =512 ; +/* Optimisation for I/Os between 4k and 128k */ dev->prp_small_pool =dma_pool_create ("prp list 256" , dev->dev, -256 ,256 ,0 ); +256 , small_align,0 );if (!dev->prp_small_pool) {dma_pool_destroy (dev->prp_page_pool);return -ENOMEM ;
@@ -3403,7 +3408,7 @@ static const struct pci_device_id nvme_id_table[] = { { PCI_VDEVICE(REDHAT, 0x0010), /* Qemu emulated controller */ .driver_data = NVME_QUIRK_BOGUS_NID, }, { PCI_DEVICE(0x1217, 0x8760), /* O2 Micro 64GB Steam Deck */ - .driver_data = NVME_QUIRK_QDEPTH_ONE }, + .driver_data = NVME_QUIRK_DMAPOOL_ALIGN_512, }, { PCI_DEVICE(0x126f, 0x2262), /* Silicon Motion generic */ .driver_data = NVME_QUIRK_NO_DEEPEST_PS | NVME_QUIRK_BOGUS_NID, },
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 133/222 RDMA/bnxt_re: Fix the check for 9060 condition
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kalesh AP <[email protected]>
[ Upstream commit 38651476e46e088598354510502c383e932e2297 ]
The check for 9060 condition should only be made for legacy chips.
--- drivers/infiniband/hw/bnxt_re/qplib_fp.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/infiniband/hw/bnxt_re/qplib_fp.c +6 -4
@@ -2536,10 +2536,12 @@ static int bnxt_qplib_cq_process_req(struct bnxt_qplib_cq *cq,bnxt_qplib_add_flush_qp (qp); }else {/* Before we complete, do WA 9060 */ -if (do_wa9060 (qp, cq, cq_cons, sq->swq_last, - cqe_sq_cons)) { - *lib_qp = qp; - goto out; +if (!bnxt_qplib_is_chip_gen_p5_p7 (qp->cctx)) { +if (do_wa9060 (qp, cq, cq_cons, sq->swq_last, + cqe_sq_cons)) { + *lib_qp = qp; + goto out; + } }if (swq->flags &SQ_SEND_FLAGS_SIGNAL_COMP ) { cqe->status =CQ_REQ_STATUS_OK ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 134/222 RDMA/bnxt_re: Add check for path mtu in modify_qp
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Saravanan Vajravel <[email protected]>
[ Upstream commit 798653a0ee30d3cd495099282751c0f248614ae7 ]
When RDMA app configures path MTU, add a check in modify_qp verb to make sure that it doesn't go beyond interface MTU. If this check fails, driver will fail the modify_qp verb.
--- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 26 +++++++++++++----------- 1 file changed, 14 insertions(+), 12 deletions(-)
drivers/infiniband/hw/bnxt_re/ib_verbs.c +14 -12
@@ -2055,18 +2055,20 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr, } } -if (qp_attr_mask &IB_QP_PATH_MTU ) { - qp->qplib_qp.modify_flags |= -CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU ; - qp->qplib_qp.path_mtu =__from_ib_mtu (qp_attr->path_mtu); - qp->qplib_qp.mtu =ib_mtu_enum_to_int (qp_attr->path_mtu); - }else if (qp_attr->qp_state ==IB_QPS_RTR ) { - qp->qplib_qp.modify_flags |= -CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU ; - qp->qplib_qp.path_mtu = -__from_ib_mtu (iboe_get_mtu (rdev->netdev->mtu)); - qp->qplib_qp.mtu = -ib_mtu_enum_to_int (iboe_get_mtu (rdev->netdev->mtu)); +if (qp_attr->qp_state ==IB_QPS_RTR ) { +enum ib_mtu qpmtu; + + qpmtu =iboe_get_mtu (rdev->netdev->mtu); +if (qp_attr_mask &IB_QP_PATH_MTU ) { +if (ib_mtu_enum_to_int (qp_attr->path_mtu) > +ib_mtu_enum_to_int (qpmtu)) +return -EINVAL ; + qpmtu = qp_attr->path_mtu; + } + + qp->qplib_qp.modify_flags |=CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU ; + qp->qplib_qp.path_mtu =__from_ib_mtu (qpmtu); + qp->qplib_qp.mtu =ib_mtu_enum_to_int (qpmtu); }if (qp_attr_mask &IB_QP_TIMEOUT ) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 135/222 RDMA/bnxt_re: Fix reporting hw_ver in query_device
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kalesh AP <[email protected]>
[ Upstream commit 7179fe0074a3c962e43a9e51169304c4911989ed ]
Driver currently populates subsystem_device id in the "hw_ver" field of ib_attr structure in query_device.
Updated to populate PCI revision ID.
--- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/bnxt_re/ib_verbs.c +1 -1
@@ -147,7 +147,7 @@ int bnxt_re_query_device(struct ib_device *ibdev, ib_attr->vendor_id = rdev->en_dev->pdev->vendor; ib_attr->vendor_part_id = rdev->en_dev->pdev->device; - ib_attr->hw_ver = rdev->en_dev->pdev->subsystem_device; + ib_attr->hw_ver = rdev->en_dev->pdev->revision; ib_attr->max_qp = dev_attr->max_qp; ib_attr->max_qp_wr = dev_attr->max_qp_wqes; ib_attr->device_cap_flags =
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 136/222 RDMA/bnxt_re: Fix max_qp_wrs reported
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Selvin Xavier <[email protected]>
[ Upstream commit 40be32303ec829ea12f9883e499bfd3fe9e52baf ]
While creating qps, driver adds one extra entry to the sq size passed by the ULPs in order to avoid queue full condition. When ULPs creates QPs with max_qp_wr reported, driver creates QP with 1 more than the max_wqes supported by HW. Create QP fails in this case. To avoid this error, reduce 1 entry in max_qp_wqes and report it to the stack.
--- drivers/infiniband/hw/bnxt_re/qplib_sp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/bnxt_re/qplib_sp.c +1 -1
@@ -127,7 +127,7 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw, attr->max_qp_init_rd_atom = sb->max_qp_init_rd_atom >BNXT_QPLIB_MAX_OUT_RD_ATOM ?BNXT_QPLIB_MAX_OUT_RD_ATOM : sb->max_qp_init_rd_atom; - attr->max_qp_wqes =le16_to_cpu (sb->max_qp_wr); + attr->max_qp_wqes =le16_to_cpu (sb->max_qp_wr) -1 ;/* * 128 WQEs needs to be reserved for the HW (8916). Prevent * reporting the max number
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 137/222 RDMA/bnxt_re: Add support for Variable WQE in Genp7 adapters
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Selvin Xavier <[email protected]>
[ Upstream commit de1d364c3815f9360a0945097ca2731950e914fa ]
Variable size WQE means that each send Work Queue Entry to HW can use different WQE sizes as opposed to the static WQE size on the current devices. Set variable WQE mode for Gen P7 devices. Depth of the Queue will be a multiple of slot which is 16 bytes. The number of slots should be a multiple of 256 as per the HW requirement.
Initialize the Software shadow queue to hold requests equal to the number of slots. Also, do not expose the variable size WQE capability until the last patch in the series.
Stable-dep-of: d5a38bf2f359 ("RDMA/bnxt_re: Disable use of reserved wqes")
--- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 8 +++++--- drivers/infiniband/hw/bnxt_re/main.c | 21 +++++++++++---------- drivers/infiniband/hw/bnxt_re/qplib_fp.c | 18 +++++++++--------- drivers/infiniband/hw/bnxt_re/qplib_fp.h | 14 +++++++++++--- drivers/infiniband/hw/bnxt_re/qplib_sp.c | 7 +++++-- drivers/infiniband/hw/bnxt_re/qplib_sp.h | 6 ++++++ 6 files changed, 47 insertions(+), 27 deletions(-)
drivers/infiniband/hw/bnxt_re/ib_verbs.c +5 -3
@@ -1154,6 +1154,7 @@ static struct bnxt_re_qp *bnxt_re_create_shadow_qp/* Shadow QP SQ depth should be same as QP1 RQ depth */ qp->qplib_qp.sq.wqe_size =bnxt_re_get_wqe_size (0 ,6 ); qp->qplib_qp.sq.max_wqe = qp1_qp->rq.max_wqe; + qp->qplib_qp.sq.max_sw_wqe = qp1_qp->rq.max_wqe; qp->qplib_qp.sq.max_sge =2 ;/* Q full delta can be 1 since it is internal QP */ qp->qplib_qp.sq.q_full_delta =1 ;
@@ -1165,6 +1166,7 @@ static struct bnxt_re_qp *bnxt_re_create_shadow_qp qp->qplib_qp.rq.wqe_size =bnxt_re_get_rwqe_size (6 ); qp->qplib_qp.rq.max_wqe = qp1_qp->rq.max_wqe; + qp->qplib_qp.rq.max_sw_wqe = qp1_qp->rq.max_wqe; qp->qplib_qp.rq.max_sge = qp1_qp->rq.max_sge;/* Q full delta can be 1 since it is internal QP */ qp->qplib_qp.rq.q_full_delta =1 ;
@@ -1226,6 +1228,7 @@ static int bnxt_re_init_rq_attr(struct bnxt_re_qp *qp,*/ entries =bnxt_re_init_depth (init_attr->cap.max_recv_wr +1 , uctx); rq->max_wqe =min_t (u32, entries, dev_attr->max_qp_wqes +1 ); + rq->max_sw_wqe = rq->max_wqe; rq->q_full_delta =0 ; rq->sg_info.pgsize =PAGE_SIZE ; rq->sg_info.pgshft =PAGE_SHIFT ;
@@ -1285,6 +1288,7 @@ static int bnxt_re_init_sq_attr(struct bnxt_re_qp *qp, 0 : BNXT_QPLIB_RESERVED_QP_WRS; entries =bnxt_re_init_depth (entries + diff +1 , uctx); sq->max_wqe =min_t (u32, entries, dev_attr->max_qp_wqes + diff +1 ); + sq->max_sw_wqe =bnxt_qplib_get_depth (sq, qplqp->wqe_mode, true); sq->q_full_delta = diff +1 ;/* * Reserving one slot for Phantom WQE. Application can
@@ -2155,6 +2159,7 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr, entries =bnxt_re_init_depth (qp_attr->cap.max_recv_wr, uctx); qp->qplib_qp.rq.max_wqe =min_t (u32, entries, dev_attr->max_qp_wqes +1 ); + qp->qplib_qp.rq.max_sw_wqe = qp->qplib_qp.rq.max_wqe; qp->qplib_qp.rq.q_full_delta = qp->qplib_qp.rq.max_wqe - qp_attr->cap.max_recv_wr; qp->qplib_qp.rq.max_sge = qp_attr->cap.max_recv_sge;
@@ -4171,9 +4176,6 @@ int bnxt_re_alloc_ucontext(struct ib_ucontext *ctx, struct ib_udata *udata) resp.cqe_sz =sizeof (struct cq_base ); resp.max_cqd = dev_attr->max_cq_wqes; - resp.comp_mask |=BNXT_RE_UCNTX_CMASK_HAVE_MODE ; - resp.mode = rdev->chip_ctx->modes.wqe_mode; -if (rdev->chip_ctx->modes.db_push) resp.comp_mask |=BNXT_RE_UCNTX_CMASK_WC_DPI_ENABLED ;
drivers/infiniband/hw/bnxt_re/main.c +11 -10
@@ -128,13 +128,13 @@ static void bnxt_re_set_db_offset(struct bnxt_re_dev *rdev) } } -static void bnxt_re_set_drv_mode (struct bnxt_re_dev *rdev,u8 mode) +static void bnxt_re_set_drv_mode (struct bnxt_re_dev *rdev) {struct bnxt_qplib_chip_ctx *cctx; cctx = rdev->chip_ctx; - cctx->modes.wqe_mode =bnxt_qplib_is_chip_gen_p5_p7 (rdev->chip_ctx) ? - mode :BNXT_QPLIB_WQE_MODE_STATIC ; + cctx->modes.wqe_mode =bnxt_qplib_is_chip_gen_p7 (rdev->chip_ctx) ? +BNXT_QPLIB_WQE_MODE_VARIABLE :BNXT_QPLIB_WQE_MODE_STATIC ;if (bnxt_re_hwrm_qcaps (rdev))dev_err (rdev_to_dev (rdev),"Failed to query hwrm qcaps\n" );
@@ -155,7 +155,7 @@ static void bnxt_re_destroy_chip_ctx(struct bnxt_re_dev *rdev)kfree (chip_ctx); } -static int bnxt_re_setup_chip_ctx (struct bnxt_re_dev *rdev,u8 wqe_mode) +static int bnxt_re_setup_chip_ctx (struct bnxt_re_dev *rdev) {struct bnxt_qplib_chip_ctx *chip_ctx;struct bnxt_en_dev *en_dev;
@@ -177,7 +177,7 @@ static int bnxt_re_setup_chip_ctx(struct bnxt_re_dev *rdev, u8 wqe_mode) rdev->qplib_res.dattr = &rdev->dev_attr; rdev->qplib_res.is_vf =BNXT_EN_VF (en_dev); -bnxt_re_set_drv_mode (rdev, wqe_mode); +bnxt_re_set_drv_mode (rdev);bnxt_re_set_db_offset (rdev); rc =bnxt_qplib_map_db_bar (&rdev->qplib_res);
@@ -1440,7 +1440,7 @@ static void bnxt_re_worker(struct work_struct *work)schedule_delayed_work (&rdev->worker,msecs_to_jiffies (30000 )); } -static int bnxt_re_dev_init (struct bnxt_re_dev *rdev,u8 wqe_mode) +static int bnxt_re_dev_init (struct bnxt_re_dev *rdev) {struct bnxt_re_ring_attr rattr = {};struct bnxt_qplib_creq_ctx *creq;
@@ -1458,7 +1458,7 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 wqe_mode) }set_bit (BNXT_RE_FLAG_NETDEV_REGISTERED , &rdev->flags); - rc =bnxt_re_setup_chip_ctx (rdev, wqe_mode); + rc =bnxt_re_setup_chip_ctx (rdev);if (rc) {bnxt_unregister_dev (rdev->en_dev);clear_bit (BNXT_RE_FLAG_NETDEV_REGISTERED , &rdev->flags);
@@ -1609,7 +1609,7 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 wqe_mode)return rc; } -static int bnxt_re_add_device (struct auxiliary_device *adev,u8 wqe_mode) +static int bnxt_re_add_device (struct auxiliary_device *adev) {struct bnxt_aux_priv *aux_priv = container_of(adev, struct bnxt_aux_priv, aux_dev);
@@ -1626,7 +1626,7 @@ static int bnxt_re_add_device(struct auxiliary_device *adev, u8 wqe_mode) goto exit; } - rc =bnxt_re_dev_init (rdev, wqe_mode); + rc =bnxt_re_dev_init (rdev);if (rc) goto re_dev_dealloc;
@@ -1756,7 +1756,8 @@ static int bnxt_re_probe(struct auxiliary_device *adev,int rc;mutex_lock (&bnxt_re_mutex); - rc =bnxt_re_add_device (adev,BNXT_QPLIB_WQE_MODE_STATIC ); + + rc =bnxt_re_add_device (adev);if (rc) {mutex_unlock (&bnxt_re_mutex);return rc;
drivers/infiniband/hw/bnxt_re/qplib_fp.c +9 -9
@@ -807,13 +807,13 @@ static int bnxt_qplib_alloc_init_swq(struct bnxt_qplib_q *que) {int indx; - que->swq =kcalloc (que->max_wqe,sizeof (*que->swq),GFP_KERNEL ); + que->swq =kcalloc (que->max_sw_wqe,sizeof (*que->swq),GFP_KERNEL );if (!que->swq)return -ENOMEM ; que->swq_start =0 ; - que->swq_last = que->max_wqe -1 ; -for (indx =0 ; indx < que->max_wqe; indx++) + que->swq_last = que->max_sw_wqe -1 ; +for (indx =0 ; indx < que->max_sw_wqe; indx++) que->swq[indx].next_idx = indx +1 ; que->swq[que->swq_last].next_idx =0 ;/* Make it circular */ que->swq_last =0 ;
@@ -849,7 +849,7 @@ int bnxt_qplib_create_qp1(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) hwq_attr.res = res; hwq_attr.sginfo = &sq->sg_info; hwq_attr.stride =sizeof (struct sq_sge ); - hwq_attr.depth =bnxt_qplib_get_depth (sq); + hwq_attr.depth =bnxt_qplib_get_depth (sq, qp->wqe_mode, false); hwq_attr.type =HWQ_TYPE_QUEUE ; rc =bnxt_qplib_alloc_init_hwq (&sq->hwq, &hwq_attr);if (rc)
@@ -877,7 +877,7 @@ int bnxt_qplib_create_qp1(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) hwq_attr.res = res; hwq_attr.sginfo = &rq->sg_info; hwq_attr.stride =sizeof (struct sq_sge ); - hwq_attr.depth =bnxt_qplib_get_depth (rq); + hwq_attr.depth =bnxt_qplib_get_depth (rq, qp->wqe_mode, false); hwq_attr.type =HWQ_TYPE_QUEUE ; rc =bnxt_qplib_alloc_init_hwq (&rq->hwq, &hwq_attr);if (rc)
@@ -1007,7 +1007,7 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) hwq_attr.res = res; hwq_attr.sginfo = &sq->sg_info; hwq_attr.stride =sizeof (struct sq_sge ); - hwq_attr.depth =bnxt_qplib_get_depth (sq); + hwq_attr.depth =bnxt_qplib_get_depth (sq, qp->wqe_mode, true); hwq_attr.aux_stride = psn_sz; hwq_attr.aux_depth = psn_sz ?bnxt_qplib_set_sq_size (sq, qp->wqe_mode) :0 ;
@@ -1049,7 +1049,7 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) hwq_attr.res = res; hwq_attr.sginfo = &rq->sg_info; hwq_attr.stride =sizeof (struct sq_sge ); - hwq_attr.depth =bnxt_qplib_get_depth (rq); + hwq_attr.depth =bnxt_qplib_get_depth (rq, qp->wqe_mode, false); hwq_attr.aux_stride =0 ; hwq_attr.aux_depth =0 ; hwq_attr.type =HWQ_TYPE_QUEUE ;
@@ -2493,7 +2493,7 @@ static int bnxt_qplib_cq_process_req(struct bnxt_qplib_cq *cq, } sq = &qp->sq; - cqe_sq_cons =le16_to_cpu (hwcqe->sq_cons_idx) % sq->max_wqe; + cqe_sq_cons =le16_to_cpu (hwcqe->sq_cons_idx) % sq->max_sw_wqe;if (qp->sq.flushed) {dev_dbg (&cq->hwq.pdev->dev,"%s: QP in Flush QP = %p\n" , __func__, qp);
@@ -2885,7 +2885,7 @@ static int bnxt_qplib_cq_process_terminal(struct bnxt_qplib_cq *cq, cqe_cons =le16_to_cpu (hwcqe->sq_cons_idx);if (cqe_cons ==0xFFFF ) goto do_rq; - cqe_cons %= sq->max_wqe; + cqe_cons %= sq->max_sw_wqe;if (qp->sq.flushed) { dev_dbg(&cq->hwq.pdev->dev,
drivers/infiniband/hw/bnxt_re/qplib_fp.h +11 -3
@@ -251,6 +251,7 @@ struct bnxt_qplib_q {struct bnxt_qplib_db_info dbinfo;struct bnxt_qplib_sg_info sg_info;u32 max_wqe; +u32 max_sw_wqe;u16 wqe_size;u16 q_full_delta;u16 max_sge;
@@ -585,15 +586,22 @@ static inline void bnxt_qplib_swq_mod_start(struct bnxt_qplib_q *que, u32 idx) que->swq_start = que->swq[idx].next_idx; } -static inline u32 bnxt_qplib_get_depth (struct bnxt_qplib_q *que) +static inline u32 bnxt_qplib_get_depth (struct bnxt_qplib_q *que,u8 wqe_mode,bool is_sq) { -return (que->wqe_size * que->max_wqe) /sizeof (struct sq_sge ); +u32 slots; + +/* Queue depth is the number of slots. */ + slots = (que->wqe_size * que->max_wqe) /sizeof (struct sq_sge ); +/* For variable WQE mode, need to align the slots to 256 */ +if (wqe_mode ==BNXT_QPLIB_WQE_MODE_VARIABLE && is_sq) + slots =ALIGN (slots,BNXT_VAR_MAX_SLOT_ALIGN ); +return slots; }static inline u32 bnxt_qplib_set_sq_size (struct bnxt_qplib_q *que,u8 wqe_mode) {return (wqe_mode ==BNXT_QPLIB_WQE_MODE_STATIC ) ? - que->max_wqe :bnxt_qplib_get_depth (que); + que->max_wqe :bnxt_qplib_get_depth (que, wqe_mode, true); }static inline u32 bnxt_qplib_set_sq_max_slot (u8 wqe_mode)
drivers/infiniband/hw/bnxt_re/qplib_sp.c +5 -2
@@ -95,11 +95,13 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw,struct bnxt_qplib_cmdqmsg msg = {};struct creq_query_func_resp_sb *sb;struct bnxt_qplib_rcfw_sbuf sbuf; +struct bnxt_qplib_chip_ctx *cctx;struct cmdq_query_func req = {};u8 *tqm_alloc;int i, rc;u32 temp; + cctx = rcfw->res->cctx;bnxt_qplib_rcfw_cmd_prep ((struct cmdq_base *)&req,CMDQ_BASE_OPCODE_QUERY_FUNC ,sizeof (req));
@@ -133,8 +135,9 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw,* reporting the max number */ attr->max_qp_wqes -=BNXT_QPLIB_RESERVED_QP_WRS +1 ; - attr->max_qp_sges =bnxt_qplib_is_chip_gen_p5_p7 (rcfw->res->cctx) ? -6 : sb->max_sge; + + attr->max_qp_sges = cctx->modes.wqe_mode ==BNXT_QPLIB_WQE_MODE_VARIABLE ? +min_t (u32, sb->max_sge_var_wqe,BNXT_VAR_MAX_SGE ) :6 ; attr->max_cq =le32_to_cpu (sb->max_cq); attr->max_cq_wqes =le32_to_cpu (sb->max_cqe);if (!bnxt_qplib_is_chip_gen_p7 (rcfw->res->cctx))
drivers/infiniband/hw/bnxt_re/qplib_sp.h +6 -0
@@ -40,6 +40,7 @@#ifndef __BNXT_QPLIB_SP_H__#define __BNXT_QPLIB_SP_H__ +#include <rdma/bnxt_re-abi.h> #define BNXT_QPLIB_RESERVED_QP_WRS 128 struct bnxt_qplib_dev_attr {
@@ -352,4 +353,9 @@ int bnxt_qplib_qext_stat(struct bnxt_qplib_rcfw *rcfw, u32 fid,int bnxt_qplib_modify_cc (struct bnxt_qplib_res *res,struct bnxt_qplib_cc_param *cc_param); +#define BNXT_VAR_MAX_WQE 4352 +#define BNXT_VAR_MAX_SLOT_ALIGN 256 +#define BNXT_VAR_MAX_SGE 13 +#define BNXT_RE_MAX_RQ_WQES 65536 +#endif /* __BNXT_QPLIB_SP_H__*/
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 138/222 RDMA/bnxt_re: Disable use of reserved wqes
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kalesh AP <[email protected]>
[ Upstream commit d5a38bf2f35979537c526acbc56bc435ed40685f ]
Disabling the reserved wqes logic for Gen P5/P7 devices because this workaround is required only for legacy devices.
--- drivers/infiniband/hw/bnxt_re/qplib_sp.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/infiniband/hw/bnxt_re/qplib_sp.c +7 -5
@@ -130,11 +130,13 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw, sb->max_qp_init_rd_atom >BNXT_QPLIB_MAX_OUT_RD_ATOM ?BNXT_QPLIB_MAX_OUT_RD_ATOM : sb->max_qp_init_rd_atom; attr->max_qp_wqes =le16_to_cpu (sb->max_qp_wr) -1 ; -/* -* 128 WQEs needs to be reserved for the HW (8916). Prevent -* reporting the max number -*/ - attr->max_qp_wqes -=BNXT_QPLIB_RESERVED_QP_WRS +1 ; +if (!bnxt_qplib_is_chip_gen_p5_p7 (rcfw->res->cctx)) { +/* +* 128 WQEs needs to be reserved for the HW (8916). Prevent +* reporting the max number on legacy devices +*/ + attr->max_qp_wqes -=BNXT_QPLIB_RESERVED_QP_WRS +1 ; + } attr->max_qp_sges = cctx->modes.wqe_mode ==BNXT_QPLIB_WQE_MODE_VARIABLE ?min_t (u32, sb->max_sge_var_wqe,BNXT_VAR_MAX_SGE ) :6 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 139/222 RDMA/bnxt_re: Add send queue size check for variable wqe
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Damodharam Ammepalli <[email protected]>
[ Upstream commit d13be54dc18baee7a3e44349b80755a8c8205d3f ]
For the fixed WQE case, HW supports 0xFFFF WQEs. For variable Size WQEs, HW treats this number as the 16 bytes slots. The maximum supported WQEs needs to be adjusted based on the number of slots. Set a maximum WQE limit for variable WQE scenario.
--- drivers/infiniband/hw/bnxt_re/qplib_sp.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/infiniband/hw/bnxt_re/qplib_sp.c +4 -0
@@ -138,6 +138,10 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw, attr->max_qp_wqes -=BNXT_QPLIB_RESERVED_QP_WRS +1 ; } +/* Adjust for max_qp_wqes for variable wqe */ +if (cctx->modes.wqe_mode ==BNXT_QPLIB_WQE_MODE_VARIABLE ) + attr->max_qp_wqes =BNXT_VAR_MAX_WQE -1 ; + attr->max_qp_sges = cctx->modes.wqe_mode ==BNXT_QPLIB_WQE_MODE_VARIABLE ?min_t (u32, sb->max_sge_var_wqe,BNXT_VAR_MAX_SGE ) :6 ; attr->max_cq =le32_to_cpu (sb->max_cq);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 140/222 RDMA/bnxt_re: Fix MSN table size for variable wqe mode
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Damodharam Ammepalli <[email protected]>
[ Upstream commit bb839f3ace0fee532a0487b692cc4d868fccb7cf ]
For variable size wqe mode, the MSN table size should be half the size of the SQ depth. Fixing this to avoid wrap around problems in the retransmission path.
--- drivers/infiniband/hw/bnxt_re/qplib_fp.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/infiniband/hw/bnxt_re/qplib_fp.c +6 -1
@@ -1013,7 +1013,12 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) : 0;/* Update msn tbl size */ if (qp->is_host_msn_tbl && psn_sz) { - hwq_attr.aux_depth =roundup_pow_of_two (bnxt_qplib_set_sq_size (sq, qp->wqe_mode)); +if (qp->wqe_mode ==BNXT_QPLIB_WQE_MODE_STATIC ) + hwq_attr.aux_depth = +roundup_pow_of_two (bnxt_qplib_set_sq_size (sq, qp->wqe_mode)); +else + hwq_attr.aux_depth = +roundup_pow_of_two (bnxt_qplib_set_sq_size (sq, qp->wqe_mode)) /2 ; qp->msn_tbl_sz = hwq_attr.aux_depth; qp->msn =0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 141/222 RDMA/bnxt_re: Fix the locking while accessing the QP table
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Selvin Xavier <[email protected]>
[ Upstream commit 9272cba0ded71b5a2084da3004ec7806b8cb7fd2 ]
QP table handling is synchronized with destroy QP and Async event from the HW. The same needs to be synchronized during create_qp also. Use the same lock in create_qp also.
--- drivers/infiniband/hw/bnxt_re/qplib_fp.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/infiniband/hw/bnxt_re/qplib_fp.c +2 -0
@@ -1161,9 +1161,11 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) rq->dbinfo.db = qp->dpi->dbr; rq->dbinfo.max_slot =bnxt_qplib_set_rq_max_slot (rq->wqe_size); } +spin_lock_bh (&rcfw->tbl_lock); tbl_indx =map_qp_id_to_tbl_indx (qp->id, rcfw); rcfw->qp_tbl[tbl_indx].qp_id = qp->id; rcfw->qp_tbl[tbl_indx].qp_handle = (void *)qp; +spin_unlock_bh (&rcfw->tbl_lock);return 0 ; fail:
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 142/222 drm/bridge: adv7511_audio: Update Audio InfoFrame properly
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Ekenberg <[email protected]>
[ Upstream commit 902806baf3c1e8383c1fe3ff0b6042b8cb5c2707 ]
AUDIO_UPDATE bit (Bit 5 of MAIN register 0x4A) needs to be set to 1 while updating Audio InfoFrame information and then set to 0 when done. Otherwise partially updated Audio InfoFrames could be sent out. Two cases where this rule were not followed are fixed:
- In adv7511_hdmi_hw_params() make sure AUDIO_UPDATE bit is updated before/after setting ADV7511_REG_AUDIO_INFOFRAME.
- In audio_startup() use the correct register for clearing AUDIO_UPDATE bit.
The problem with corrupted audio infoframes were discovered by letting a HDMI logic analyser check the output of ADV7535.
Note that this patchs replaces writing REG_GC(1) with REG_INFOFRAME_UPDATE. Bit 5 of REG_GC(1) is positioned within field GC_PP[3:0] and that field doesn't control audio infoframe and is read- only. My conclusion therefore was that the author if this code meant to clear bit 5 of REG_INFOFRAME_UPDATE from the very beginning.
--- drivers/gpu/drm/bridge/adv7511/adv7511_audio.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/gpu/drm/bridge/adv7511/adv7511_audio.c +12 -2
@@ -153,7 +153,16 @@ static int adv7511_hdmi_hw_params(struct device *dev, void *data, ADV7511_AUDIO_CFG3_LEN_MASK, len);regmap_update_bits (adv7511->regmap,ADV7511_REG_I2C_FREQ_ID_CFG ,ADV7511_I2C_FREQ_ID_CFG_RATE_MASK , rate <<4 ); -regmap_write (adv7511->regmap,0x73 ,0x1 ); + +/* send current Audio infoframe values while updating */ +regmap_update_bits (adv7511->regmap,ADV7511_REG_INFOFRAME_UPDATE , +BIT (5 ),BIT (5 )); + +regmap_write (adv7511->regmap,ADV7511_REG_AUDIO_INFOFRAME (0 ),0x1 ); + +/* use Audio infoframe updated info */ +regmap_update_bits (adv7511->regmap,ADV7511_REG_INFOFRAME_UPDATE , +BIT (5 ),0 );return 0 ; }
@@ -184,8 +193,9 @@ static int audio_startup(struct device *dev, void *data)regmap_update_bits (adv7511->regmap,ADV7511_REG_GC (0 ),BIT (7 ) |BIT (6 ),BIT (7 ));/* use Audio infoframe updated info */ -regmap_update_bits (adv7511->regmap,ADV7511_REG_GC (1 ), +regmap_update_bits (adv7511->regmap,ADV7511_REG_INFOFRAME_UPDATE ,BIT (5 ),0 ); +/* enable SPDIF receiver */ if (adv7511->audio_source ==ADV7511_AUDIO_SOURCE_SPDIF ) regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 143/222 net: dsa: microchip: Fix KSZ9477 set_ageing_time function
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tristram Ha <[email protected]>
[ Upstream commit 262bfba8ab820641c8cfbbf03b86d6c00242c078 ]
The aging count is not a simple 11-bit value but comprises a 3-bit multiplier and an 8-bit second count. The code tries to use the original multiplier which is 4 as the second count is still 300 seconds by default.
--- drivers/net/dsa/microchip/ksz9477.c | 47 +++++++++++++++++++------ drivers/net/dsa/microchip/ksz9477_reg.h | 4 +-- 2 files changed, 37 insertions(+), 14 deletions(-)
drivers/net/dsa/microchip/ksz9477.c +36 -11
@@ -2,7 +2,7 @@/* * Microchip KSZ9477 switch driver main logic * -* Copyright (C) 2017-2019 Microchip Technology Inc. +* Copyright (C) 2017-2024 Microchip Technology Inc. */ #include <linux/kernel.h>
@@ -916,26 +916,51 @@ void ksz9477_get_caps(struct ksz_device *dev, int port,int ksz9477_set_ageing_time (struct ksz_device *dev,unsigned int msecs) {u32 secs = msecs /1000 ; -u8 value; -u8 data; +u8 data, mult, value; +u32 max_val;int ret; - value =FIELD_GET (SW_AGE_PERIOD_7_0_M , secs); +#define MAX_TIMER_VAL ((1 << 8) - 1) - ret =ksz_write8 (dev,REG_SW_LUE_CTRL_3 , value); -if (ret <0 ) -return ret; +/* The aging timer comprises a 3-bit multiplier and an 8-bit second +* value. Either of them cannot be zero. The maximum timer is then +* 7 * 255 = 1785 seconds. +*/ +if (!secs) + secs =1 ; - data =FIELD_GET (SW_AGE_PERIOD_10_8_M , secs); +/* Return error if too large. */ +else if (secs >7 *MAX_TIMER_VAL ) +return -EINVAL ; ret =ksz_read8 (dev,REG_SW_LUE_CTRL_0 , &value);if (ret <0 )return ret; - value &= ~SW_AGE_CNT_M ; - value |=FIELD_PREP (SW_AGE_CNT_M , data); +/* Check whether there is need to update the multiplier. */ + mult =FIELD_GET (SW_AGE_CNT_M , value); + max_val =MAX_TIMER_VAL ; +if (mult >0 ) { +/* Try to use the same multiplier already in the register as +* the hardware default uses multiplier 4 and 75 seconds for +* 300 seconds. +*/ + max_val =DIV_ROUND_UP (secs, mult); +if (max_val >MAX_TIMER_VAL || max_val * mult != secs) + max_val =MAX_TIMER_VAL ; + } + + data =DIV_ROUND_UP (secs, max_val); +if (mult != data) { + value &= ~SW_AGE_CNT_M ; + value |=FIELD_PREP (SW_AGE_CNT_M , data); + ret =ksz_write8 (dev,REG_SW_LUE_CTRL_0 , value); +if (ret <0 ) +return ret; + } -return ksz_write8 (dev,REG_SW_LUE_CTRL_0 , value); + value =DIV_ROUND_UP (secs, data); +return ksz_write8 (dev,REG_SW_LUE_CTRL_3 , value); }void ksz9477_port_queue_split (struct ksz_device *dev,int port)
drivers/net/dsa/microchip/ksz9477_reg.h +1 -3
@@ -2,7 +2,7 @@/* * Microchip KSZ9477 register definitions * -* Copyright (C) 2017-2018 Microchip Technology Inc. +* Copyright (C) 2017-2024 Microchip Technology Inc. */ #ifndef __KSZ9477_REGS_H
@@ -190,8 +190,6 @@#define SW_VLAN_ENABLE BIT(7)#define SW_DROP_INVALID_VID BIT(6)#define SW_AGE_CNT_M GENMASK(5, 3) -#define SW_AGE_CNT_S 3 -#define SW_AGE_PERIOD_10_8_M GENMASK(10, 8)#define SW_RESV_MCAST_ENABLE BIT(2)#define SW_HASH_OPTION_M 0x03#define SW_HASH_OPTION_CRC 1
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 144/222 net: dsa: microchip: Fix LAN937X set_ageing_time function
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tristram Ha <[email protected]>
[ Upstream commit bb9869043438af5b94230f94fb4c39206525d758 ]
The aging count is not a simple 20-bit value but comprises a 3-bit multiplier and a 20-bit second time. The code tries to use the original multiplier which is 4 as the second count is still 300 seconds by default.
As the 20-bit number is now too large for practical use there is an option to interpret it as microseconds instead of seconds.
--- drivers/net/dsa/microchip/lan937x_main.c | 62 ++++++++++++++++++++++-- drivers/net/dsa/microchip/lan937x_reg.h | 9 ++-- 2 files changed, 65 insertions(+), 6 deletions(-)
drivers/net/dsa/microchip/lan937x_main.c +59 -3
@@ -1,6 +1,6 @@// SPDX-License-Identifier: GPL-2.0 /* Microchip LAN937X switch driver main logic -* Copyright (C) 2019-2022 Microchip Technology Inc. +* Copyright (C) 2019-2024 Microchip Technology Inc. */ #include <linux/kernel.h> #include <linux/module.h>
@@ -257,10 +257,66 @@ int lan937x_change_mtu(struct ksz_device *dev, int port, int new_mtu)int lan937x_set_ageing_time (struct ksz_device *dev,unsigned int msecs) { -u32 secs = msecs /1000 ; -u32 value; +u8 data, mult, value8; +bool in_msec = false; +u32 max_val, value; +u32 secs = msecs;int ret; +#define MAX_TIMER_VAL ((1 << 20) - 1) + +/* The aging timer comprises a 3-bit multiplier and a 20-bit second +* value. Either of them cannot be zero. The maximum timer is then +* 7 * 1048575 = 7340025 seconds. As this value is too large for +* practical use it can be interpreted as microseconds, making the +* maximum timer 7340 seconds with finer control. This allows for +* maximum 122 minutes compared to 29 minutes in KSZ9477 switch. +*/ +if (msecs %1000 ) + in_msec = true; +else + secs /=1000 ; +if (!secs) + secs =1 ; + +/* Return error if too large. */ +else if (secs >7 *MAX_TIMER_VAL ) +return -EINVAL ; + +/* Configure how to interpret the number value. */ + ret =ksz_rmw8 (dev,REG_SW_LUE_CTRL_2 ,SW_AGE_CNT_IN_MICROSEC , + in_msec ?SW_AGE_CNT_IN_MICROSEC :0 ); +if (ret <0 ) +return ret; + + ret =ksz_read8 (dev,REG_SW_LUE_CTRL_0 , &value8); +if (ret <0 ) +return ret; + +/* Check whether there is need to update the multiplier. */ + mult =FIELD_GET (SW_AGE_CNT_M , value8); + max_val =MAX_TIMER_VAL ; +if (mult >0 ) { +/* Try to use the same multiplier already in the register as +* the hardware default uses multiplier 4 and 75 seconds for +* 300 seconds. +*/ + max_val =DIV_ROUND_UP (secs, mult); +if (max_val >MAX_TIMER_VAL || max_val * mult != secs) + max_val =MAX_TIMER_VAL ; + } + + data =DIV_ROUND_UP (secs, max_val); +if (mult != data) { + value8 &= ~SW_AGE_CNT_M ; + value8 |=FIELD_PREP (SW_AGE_CNT_M , data); + ret =ksz_write8 (dev,REG_SW_LUE_CTRL_0 , value8); +if (ret <0 ) +return ret; + } + + secs =DIV_ROUND_UP (secs, data); + value =FIELD_GET (SW_AGE_PERIOD_7_0_M , secs); ret =ksz_write8 (dev,REG_SW_AGE_PERIOD__1 , value);
drivers/net/dsa/microchip/lan937x_reg.h +6 -3
@@ -1,6 +1,6 @@/* SPDX-License-Identifier: GPL-2.0 */ /* Microchip LAN937X switch register definitions -* Copyright (C) 2019-2021 Microchip Technology Inc. +* Copyright (C) 2019-2024 Microchip Technology Inc. */ #ifndef __LAN937X_REG_H#define __LAN937X_REG_H
@@ -48,8 +48,7 @@#define SW_VLAN_ENABLE BIT(7)#define SW_DROP_INVALID_VID BIT(6) -#define SW_AGE_CNT_M 0x7 -#define SW_AGE_CNT_S 3 +#define SW_AGE_CNT_M GENMASK(5, 3)#define SW_RESV_MCAST_ENABLE BIT(2)#define REG_SW_LUE_CTRL_1 0x0311
@@ -62,6 +61,10 @@#define SW_FAST_AGING BIT(1)#define SW_LINK_AUTO_AGING BIT(0) +#define REG_SW_LUE_CTRL_2 0x0312 + +#define SW_AGE_CNT_IN_MICROSEC BIT(7) +#define REG_SW_AGE_PERIOD__1 0x0313#define SW_AGE_PERIOD_7_0_M GENMASK(7, 0)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 145/222 RDMA/hns: Refactor mtr find
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengchang Tang <[email protected]>
[ Upstream commit a4ca341080758d847db155b97887bff6f84016a4 ]
hns_roce_mtr_find() is a collection of multiple functions, and the return value is also difficult to understand, which is not conducive to modification and maintenance.
Separate the function of obtaining MTR root BA from this function. And some adjustments has been made to improve readability.
Stable-dep-of: 8673a6c2d9e4 ("RDMA/hns: Fix mapping error of zero-hop WQE buffer")
--- drivers/infiniband/hw/hns/hns_roce_cq.c | 11 +-- drivers/infiniband/hw/hns/hns_roce_device.h | 7 +- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 102 ++++++++++---------- drivers/infiniband/hw/hns/hns_roce_mr.c | 86 +++++++++++------ 4 files changed, 121 insertions(+), 85 deletions(-)
drivers/infiniband/hw/hns/hns_roce_cq.c +5 -6
@@ -133,14 +133,12 @@ static int alloc_cqc(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq)struct hns_roce_cq_table *cq_table = &hr_dev->cq_table;struct ib_device *ibdev = &hr_dev->ib_dev;u64 mtts[MTT_MIN_COUNT ] = {}; -dma_addr_t dma_handle;int ret; - ret =hns_roce_mtr_find (hr_dev, &hr_cq->mtr,0 , mtts,ARRAY_SIZE (mtts), - &dma_handle); -if (!ret) { + ret =hns_roce_mtr_find (hr_dev, &hr_cq->mtr,0 , mtts,ARRAY_SIZE (mtts)); +if (ret) {ibdev_err (ibdev,"failed to find CQ mtr, ret = %d.\n" , ret); -return -EINVAL ; +return ret; }/* Get CQC memory HEM(Hardware Entry Memory) table */
@@ -157,7 +155,8 @@ static int alloc_cqc(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq) goto err_put; } - ret =hns_roce_create_cqc (hr_dev, hr_cq, mtts, dma_handle); + ret =hns_roce_create_cqc (hr_dev, hr_cq, mtts, +hns_roce_get_mtr_ba (&hr_cq->mtr));if (ret) goto err_xa;
drivers/infiniband/hw/hns/hns_roce_device.h +6 -1
@@ -1129,8 +1129,13 @@ void hns_roce_cmd_use_polling(struct hns_roce_dev *hr_dev);/* hns roce hw need current block and next block addr from mtt */ #define MTT_MIN_COUNT 2 +static inline dma_addr_t hns_roce_get_mtr_ba (struct hns_roce_mtr *mtr) +{ +return mtr->hem_cfg.root_ba; +} +int hns_roce_mtr_find (struct hns_roce_dev *hr_dev,struct hns_roce_mtr *mtr, -u32 offset,u64 *mtt_buf,int mtt_max,u64 *base_addr); +u32 offset,u64 *mtt_buf,int mtt_max); int hns_roce_mtr_create(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr, struct hns_roce_buf_attr *buf_attr, unsigned int page_shift, struct ib_udata *udata,
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +53 -49
190 lines not on this page · raw message
drivers/infiniband/hw/hns/hns_roce_mr.c +57 -29
115 lines not on this page · raw message
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 146/222 RDMA/hns: Remove unused parameters and variables
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengchang Tang <[email protected]>
[ Upstream commit f4caa864af84f801a5821ea2ba6c1cc46f8252c1 ]
Remove unused parameters and variables.
Stable-dep-of: 8673a6c2d9e4 ("RDMA/hns: Fix mapping error of zero-hop WQE buffer")
--- drivers/infiniband/hw/hns/hns_roce_alloc.c | 3 +-- drivers/infiniband/hw/hns/hns_roce_device.h | 5 ++--- drivers/infiniband/hw/hns/hns_roce_hem.c | 13 +++++-------- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 20 +++++++------------- drivers/infiniband/hw/hns/hns_roce_mr.c | 4 ++-- drivers/infiniband/hw/hns/hns_roce_qp.c | 4 +--- drivers/infiniband/hw/hns/hns_roce_srq.c | 4 ++-- 7 files changed, 20 insertions(+), 33 deletions(-)
drivers/infiniband/hw/hns/hns_roce_alloc.c +1 -2
@@ -153,8 +153,7 @@ int hns_roce_get_kmem_bufs(struct hns_roce_dev *hr_dev, dma_addr_t *bufs,return total; } -int hns_roce_get_umem_bufs (struct hns_roce_dev *hr_dev,dma_addr_t *bufs, -int buf_cnt,struct ib_umem *umem, +int hns_roce_get_umem_bufs (dma_addr_t *bufs,int buf_cnt,struct ib_umem *umem,unsigned int page_shift) {struct ib_block_iter biter;
drivers/infiniband/hw/hns/hns_roce_device.h +2 -3
@@ -892,8 +892,7 @@ struct hns_roce_hw {int (*rereg_write_mtpt)(struct hns_roce_dev *hr_dev,struct hns_roce_mr *mr,int flags,void *mb_buf); -int (*frmr_write_mtpt)(struct hns_roce_dev *hr_dev,void *mb_buf, -struct hns_roce_mr *mr); +int (*frmr_write_mtpt)(void *mb_buf,struct hns_roce_mr *mr);int (*mw_write_mtpt)(void *mb_buf,struct hns_roce_mw *mw); void (*write_cqc)(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq, void *mb_buf, u64 *mtts,
@@ -1193,7 +1192,7 @@ struct hns_roce_buf *hns_roce_buf_alloc(struct hns_roce_dev *hr_dev, u32 size,int hns_roce_get_kmem_bufs (struct hns_roce_dev *hr_dev,dma_addr_t *bufs,int buf_cnt,struct hns_roce_buf *buf,unsigned int page_shift); -int hns_roce_get_umem_bufs (struct hns_roce_dev *hr_dev,dma_addr_t *bufs, +int hns_roce_get_umem_bufs (dma_addr_t *bufs,int buf_cnt,struct ib_umem *umem,unsigned int page_shift);
drivers/infiniband/hw/hns/hns_roce_hem.c +5 -8
@@ -1043,15 +1043,13 @@ static void hem_list_free_all(struct hns_roce_dev *hr_dev, } } -static void hem_list_link_bt (struct hns_roce_dev *hr_dev,void *base_addr, -u64 table_addr) +static void hem_list_link_bt (void *base_addr,u64 table_addr) { *(u64 *)(base_addr) = table_addr; }/* assign L0 table address to hem from root bt */ -static void hem_list_assign_bt (struct hns_roce_dev *hr_dev, -struct hns_roce_hem_item *hem,void *cpu_addr, +static void hem_list_assign_bt (struct hns_roce_hem_item *hem,void *cpu_addr,u64 phy_addr) { hem->addr = cpu_addr;
@@ -1222,8 +1220,7 @@ static int hem_list_alloc_mid_bt(struct hns_roce_dev *hr_dev,if (level >1 ) { pre = hem_ptrs[level -1 ]; step = (cur->start - pre->start) / step *BA_BYTE_LEN ; -hem_list_link_bt (hr_dev, pre->addr + step, - cur->dma_addr); +hem_list_link_bt (pre->addr + step, cur->dma_addr); } }
@@ -1281,7 +1278,7 @@ static int alloc_fake_root_bt(struct hns_roce_dev *hr_dev, void *cpu_base,if (!hem)return -ENOMEM ; -hem_list_assign_bt (hr_dev, hem, cpu_base, phy_base); +hem_list_assign_bt (hem, cpu_base, phy_base);list_add (&hem->list, branch_head);list_add (&hem->sibling, leaf_head);
@@ -1304,7 +1301,7 @@ static int setup_middle_bt(struct hns_roce_dev *hr_dev, void *cpu_base,/* if exist mid bt, link L1 to L0 */ list_for_each_entry_safe (hem, temp_hem, branch_head, list) { offset = (hem->start - r->offset) / step *BA_BYTE_LEN ; -hem_list_link_bt (hr_dev, cpu_base + offset, hem->dma_addr); +hem_list_link_bt (cpu_base + offset, hem->dma_addr); total++; }
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +7 -13
@@ -3292,8 +3292,7 @@ static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev,return ret; } -static int hns_roce_v2_frmr_write_mtpt (struct hns_roce_dev *hr_dev, -void *mb_buf,struct hns_roce_mr *mr) +static int hns_roce_v2_frmr_write_mtpt (void *mb_buf,struct hns_roce_mr *mr) {dma_addr_t pbl_ba =hns_roce_get_mtr_ba (&mr->pbl_mtr);struct hns_roce_v2_mpt_entry *mpt_entry;
@@ -4208,8 +4207,7 @@ static void set_access_flags(struct hns_roce_qp *hr_qp, }static void set_qpc_wqe_cnt (struct hns_roce_qp *hr_qp, -struct hns_roce_v2_qp_context *context, -struct hns_roce_v2_qp_context *qpc_mask) +struct hns_roce_v2_qp_context *context) { hr_reg_write(context, QPC_SGE_SHIFT, to_hr_hem_entries_shift(hr_qp->sge.sge_cnt,
@@ -4231,7 +4229,6 @@ static inline int get_pdn(struct ib_pd *ib_pd) }static void modify_qp_reset_to_init (struct ib_qp *ibqp, -const struct ib_qp_attr *attr,struct hns_roce_v2_qp_context *context,struct hns_roce_v2_qp_context *qpc_mask) {
@@ -4250,7 +4247,7 @@ static void modify_qp_reset_to_init(struct ib_qp *ibqp,hr_reg_write (context,QPC_RQWS ,ilog2 (hr_qp->rq.max_gs)); -set_qpc_wqe_cnt (hr_qp, context, qpc_mask); +set_qpc_wqe_cnt (hr_qp, context);/* No VLAN need to set 0xFFF */ hr_reg_write (context,QPC_VLAN_ID ,0xfff );
@@ -4291,7 +4288,6 @@ static void modify_qp_reset_to_init(struct ib_qp *ibqp, }static void modify_qp_init_to_init (struct ib_qp *ibqp, -const struct ib_qp_attr *attr,struct hns_roce_v2_qp_context *context,struct hns_roce_v2_qp_context *qpc_mask) {
@@ -4612,8 +4608,7 @@ static int modify_qp_init_to_rtr(struct ib_qp *ibqp,return 0 ; } -static int modify_qp_rtr_to_rts (struct ib_qp *ibqp, -const struct ib_qp_attr *attr,int attr_mask, +static int modify_qp_rtr_to_rts (struct ib_qp *ibqp,int attr_mask,struct hns_roce_v2_qp_context *context,struct hns_roce_v2_qp_context *qpc_mask) {
@@ -4982,15 +4977,14 @@ static int hns_roce_v2_set_abs_fields(struct ib_qp *ibqp,if (cur_state ==IB_QPS_RESET && new_state ==IB_QPS_INIT ) {memset (qpc_mask,0 , hr_dev->caps.qpc_sz); -modify_qp_reset_to_init (ibqp, attr, context, qpc_mask); +modify_qp_reset_to_init (ibqp, context, qpc_mask); }else if (cur_state ==IB_QPS_INIT && new_state ==IB_QPS_INIT ) { -modify_qp_init_to_init (ibqp, attr, context, qpc_mask); +modify_qp_init_to_init (ibqp, context, qpc_mask); }else if (cur_state ==IB_QPS_INIT && new_state ==IB_QPS_RTR ) { ret =modify_qp_init_to_rtr (ibqp, attr, attr_mask, context, qpc_mask, udata); }else if (cur_state ==IB_QPS_RTR && new_state ==IB_QPS_RTS ) { - ret =modify_qp_rtr_to_rts (ibqp, attr, attr_mask, context, - qpc_mask); + ret =modify_qp_rtr_to_rts (ibqp, attr_mask, context, qpc_mask); }return ret;
drivers/infiniband/hw/hns/hns_roce_mr.c +2 -2
@@ -154,7 +154,7 @@ static int hns_roce_mr_enable(struct hns_roce_dev *hr_dev,if (mr->type !=MR_TYPE_FRMR ) ret = hr_dev->hw->write_mtpt (hr_dev, mailbox->buf, mr);else - ret = hr_dev->hw->frmr_write_mtpt (hr_dev, mailbox->buf, mr); + ret = hr_dev->hw->frmr_write_mtpt (mailbox->buf, mr);if (ret) {dev_err (dev,"failed to write mtpt, ret = %d.\n" , ret); goto err_page;
@@ -714,7 +714,7 @@ static int mtr_map_bufs(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,return -ENOMEM ;if (mtr->umem) - npage =hns_roce_get_umem_bufs (hr_dev, pages, page_count, + npage =hns_roce_get_umem_bufs (pages, page_count, mtr->umem, page_shift);else npage = hns_roce_get_kmem_bufs(hr_dev, pages, page_count,
drivers/infiniband/hw/hns/hns_roce_qp.c +1 -3
@@ -1075,7 +1075,6 @@ static int set_qp_param(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp, }static int hns_roce_create_qp_common (struct hns_roce_dev *hr_dev, -struct ib_pd *ib_pd,struct ib_qp_init_attr *init_attr,struct ib_udata *udata,struct hns_roce_qp *hr_qp)
@@ -1229,7 +1228,6 @@ int hns_roce_create_qp(struct ib_qp *qp, struct ib_qp_init_attr *init_attr,struct ib_device *ibdev = qp->device;struct hns_roce_dev *hr_dev =to_hr_dev (ibdev);struct hns_roce_qp *hr_qp =to_hr_qp (qp); -struct ib_pd *pd = qp->pd;int ret; ret =check_qp_type (hr_dev, init_attr->qp_type, !!udata);
@@ -1244,7 +1242,7 @@ int hns_roce_create_qp(struct ib_qp *qp, struct ib_qp_init_attr *init_attr, hr_qp->phy_port = hr_dev->iboe.phy_port[hr_qp->port]; } - ret =hns_roce_create_qp_common (hr_dev, pd, init_attr, udata, hr_qp); + ret =hns_roce_create_qp_common (hr_dev, init_attr, udata, hr_qp);if (ret)ibdev_err (ibdev,"create QP type 0x%x failed(%d)\n" , init_attr->qp_type, ret);
drivers/infiniband/hw/hns/hns_roce_srq.c +2 -2
@@ -249,7 +249,7 @@ static void free_srq_wqe_buf(struct hns_roce_dev *hr_dev,hns_roce_mtr_destroy (hr_dev, &srq->buf_mtr); } -static int alloc_srq_wrid (struct hns_roce_dev *hr_dev,struct hns_roce_srq *srq) +static int alloc_srq_wrid (struct hns_roce_srq *srq) { srq->wrid =kvmalloc_array (srq->wqe_cnt,sizeof (u64),GFP_KERNEL );if (!srq->wrid)
@@ -365,7 +365,7 @@ static int alloc_srq_buf(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq, goto err_idx;if (!udata) { - ret =alloc_srq_wrid (hr_dev, srq); + ret =alloc_srq_wrid (srq);if (ret) goto err_wqe_buf; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 147/222 RDMA/hns: Fix mapping error of zero-hop WQE buffer
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: wenglianfa <[email protected]>
[ Upstream commit 8673a6c2d9e483dfeeef83a1f06f59e05636f4d1 ]
Due to HW limitation, the three region of WQE buffer must be mapped and set to HW in a fixed order: SQ buffer, SGE buffer, and RQ buffer.
Currently when one region is zero-hop while the other two are not, the zero-hop region will not be mapped. This violate the limitation above and leads to address error.
--- drivers/infiniband/hw/hns/hns_roce_hem.c | 43 ++++++++++++++++-------- drivers/infiniband/hw/hns/hns_roce_mr.c | 5 --- 2 files changed, 29 insertions(+), 19 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hem.c +29 -14
@@ -986,6 +986,7 @@ struct hns_roce_hem_item {size_t count;/* max ba numbers */ int start;/* start buf offset in this hem */ int end;/* end buf offset in this hem */ +bool exist_bt; };/* All HEM items are linked in a tree structure */
@@ -1014,6 +1015,7 @@ hem_list_alloc_item(struct hns_roce_dev *hr_dev, int start, int end, int count, } } + hem->exist_bt = exist_bt; hem->count = count; hem->start = start; hem->end = end;
@@ -1024,22 +1026,22 @@ hem_list_alloc_item(struct hns_roce_dev *hr_dev, int start, int end, int count, }static void hem_list_free_item (struct hns_roce_dev *hr_dev, -struct hns_roce_hem_item *hem,bool exist_bt) +struct hns_roce_hem_item *hem) { -if (exist_bt) +if (hem->exist_bt)dma_free_coherent (hr_dev->dev, hem->count *BA_BYTE_LEN , hem->addr, hem->dma_addr);kfree (hem); }static void hem_list_free_all (struct hns_roce_dev *hr_dev, -struct list_head *head,bool exist_bt) +struct list_head *head) {struct hns_roce_hem_item *hem, *temp_hem;list_for_each_entry_safe (hem, temp_hem, head, list) {list_del (&hem->list); -hem_list_free_item (hr_dev, hem, exist_bt); +hem_list_free_item (hr_dev, hem); } }
@@ -1139,6 +1141,10 @@ int hns_roce_hem_list_calc_root_ba(const struct hns_roce_buf_region *regions,for (i =0 ; i < region_cnt; i++) { r = (struct hns_roce_buf_region *)®ions[i]; +/* when r->hopnum = 0, the region should not occupy root_ba. */ +if (!r->hopnum) +continue ; +if (r->hopnum >1 ) { step =hem_list_calc_ba_range (r->hopnum,1 , unit);if (step >0 )
@@ -1232,7 +1238,7 @@ static int hem_list_alloc_mid_bt(struct hns_roce_dev *hr_dev, err_exit:for (level =1 ; level < hopnum; level++) -hem_list_free_all (hr_dev, &temp_list[level], true); +hem_list_free_all (hr_dev, &temp_list[level]);return ret; }
@@ -1273,16 +1279,26 @@ static int alloc_fake_root_bt(struct hns_roce_dev *hr_dev, void *cpu_base, {struct hns_roce_hem_item *hem; +/* This is on the has_mtt branch, if r->hopnum +* is 0, there is no root_ba to reuse for the +* region's fake hem, so a dma_alloc request is +* necessary here. +*/ hem =hem_list_alloc_item (hr_dev, r->offset, r->offset + r->count -1 , - r->count, false); + r->count, !r->hopnum);if (!hem)return -ENOMEM ; -hem_list_assign_bt (hem, cpu_base, phy_base); +/* The root_ba can be reused only when r->hopnum > 0. */ +if (r->hopnum) +hem_list_assign_bt (hem, cpu_base, phy_base);list_add (&hem->list, branch_head);list_add (&hem->sibling, leaf_head); -return r->count; +/* If r->hopnum == 0, 0 is returned, +* so that the root_bt entry is not occupied. +*/ +return r->hopnum ? r->count :0 ; } static int setup_middle_bt(struct hns_roce_dev *hr_dev, void *cpu_base,
@@ -1326,7 +1342,7 @@ setup_root_hem(struct hns_roce_dev *hr_dev, struct hns_roce_hem_list *hem_list,return -ENOMEM ; total =0 ; -for (i =0 ; i < region_cnt && total < max_ba_num; i++) { +for (i =0 ; i < region_cnt && total <= max_ba_num; i++) { r = ®ions[i];if (!r->count)continue ;
@@ -1392,9 +1408,9 @@ static int hem_list_alloc_root_bt(struct hns_roce_dev *hr_dev, region_cnt);if (ret) {for (i =0 ; i < region_cnt; i++) -hem_list_free_all (hr_dev, &head.branch[i], false); +hem_list_free_all (hr_dev, &head.branch[i]); -hem_list_free_all (hr_dev, &head.root, true); +hem_list_free_all (hr_dev, &head.root); }return ret;
@@ -1457,10 +1473,9 @@ void hns_roce_hem_list_release(struct hns_roce_dev *hr_dev,for (i =0 ; i <HNS_ROCE_MAX_BT_REGION ; i++)for (j =0 ; j <HNS_ROCE_MAX_BT_LEVEL ; j++) -hem_list_free_all (hr_dev, &hem_list->mid_bt[i][j], - j !=0 ); +hem_list_free_all (hr_dev, &hem_list->mid_bt[i][j]); -hem_list_free_all (hr_dev, &hem_list->root_bt, true); +hem_list_free_all (hr_dev, &hem_list->root_bt);INIT_LIST_HEAD (&hem_list->btm_bt); hem_list->root_ba =0 ; }
drivers/infiniband/hw/hns/hns_roce_mr.c +0 -5
@@ -767,11 +767,6 @@ int hns_roce_mtr_map(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,for (i =0 , mapped_cnt =0 ; i < mtr->hem_cfg.region_count && mapped_cnt < page_cnt; i++) { r = &mtr->hem_cfg.region[i]; -/* if hopnum is 0, no need to map pages in this region */ -if (!r->hopnum) { - mapped_cnt += r->count; -continue ; - }if (r->offset + r->count > page_cnt) { ret = -EINVAL ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 148/222 RDMA/hns: Fix warning storm caused by invalid input in IO path
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengchang Tang <[email protected]>
[ Upstream commit fa5c4ba8cdbfd2c2d6422e001311c8213283ebbf ]
WARN_ON() is called in the IO path. And it could lead to a warning storm. Use WARN_ON_ONCE() instead of WARN_ON().
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +2 -2
@@ -471,7 +471,7 @@ static inline int set_ud_wqe(struct hns_roce_qp *qp, valid_num_sge =calc_wr_sge_num (wr, &msg_len); ret =set_ud_opcode (ud_sq_wqe, wr); -if (WARN_ON (ret)) +if (WARN_ON_ONCE (ret))return ret; ud_sq_wqe->msg_len =cpu_to_le32 (msg_len);
@@ -575,7 +575,7 @@ static inline int set_rc_wqe(struct hns_roce_qp *qp, rc_sq_wqe->msg_len =cpu_to_le32 (msg_len); ret =set_rc_opcode (hr_dev, rc_sq_wqe, wr); -if (WARN_ON (ret)) +if (WARN_ON_ONCE (ret))return ret; hr_reg_write(rc_sq_wqe, RC_SEND_WQE_SO,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 149/222 RDMA/hns: Fix missing flush CQE for DWQE
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengchang Tang <[email protected]>
[ Upstream commit e3debdd48423d3d75b9d366399228d7225d902cd ]
Flush CQE handler has not been called if QP state gets into errored mode in DWQE path. So, the new added outstanding WQEs will never be flushed.
It leads to a hung task timeout when using NFS over RDMA:
__switch_to+0x7c/0xd0
__schedule+0x350/0x750
schedule+0x50/0xf0
schedule_timeout+0x2c8/0x340
wait_for_common+0xf4/0x2b0
wait_for_completion+0x20/0x40
__ib_drain_sq+0x140/0x1d0 [ib_core]
ib_drain_sq+0x98/0xb0 [ib_core]
rpcrdma_xprt_disconnect+0x68/0x270 [rpcrdma]
xprt_rdma_close+0x20/0x60 [rpcrdma]
xprt_autoclose+0x64/0x1cc [sunrpc]
process_one_work+0x1d8/0x4e0
worker_thread+0x154/0x420
kthread+0x108/0x150
ret_from_fork+0x10/0x18--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +4 -0
@@ -673,6 +673,10 @@ static void write_dwqe(struct hns_roce_dev *hr_dev, struct hns_roce_qp *qp,#define HNS_ROCE_SL_SHIFT 2struct hns_roce_v2_rc_send_wqe *rc_sq_wqe = wqe; +if (unlikely (qp->state ==IB_QPS_ERR )) { +flush_cqe (hr_dev, qp); +return ; + }/* All kinds of DirectWQE have the same header field layout */ hr_reg_enable (rc_sq_wqe,RC_SEND_WQE_FLAG );hr_reg_write (rc_sq_wqe,RC_SEND_WQE_DB_SL_L , qp->sl);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 150/222 net: stmmac: dont create a MDIO bus if unnecessary
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Halaney <[email protected]>
[ Upstream commit f3c2caacee824ce4a331cdafb0b8dc8e987f105e ]
Currently a MDIO bus is created if the devicetree description is either:
1. Not fixed-link
2. fixed-link but contains a MDIO bus as well
The "1" case above isn't always accurate. If there's a phy-handle, it could be referencing a phy on another MDIO controller's bus[1]. In this case, where the MDIO bus is not described at all, currently stmmac will make a MDIO bus and scan its address space to discover phys (of which there are none). This process takes time scanning a bus that is known to be empty, delaying time to complete probe.
There are also a lot of upstream devicetrees[2] that expect a MDIO bus to be created, scanned for phys, and the first one found connected to the MAC. This case can be inferred from the platform description by not having a phy-handle && not being fixed-link. This hits case "1" in the current driver's logic, and must be handled in any logic change here since it is a valid legacy dt-binding.
Let's improve the logic to create a MDIO bus if either:
- Devicetree contains a MDIO bus
- !fixed-link && !phy-handle (legacy handling)
This way the case where no MDIO bus should be made is handled, as well as retaining backwards compatibility with the valid cases.
Below devicetree snippets can be found that explain some of the cases above more concretely.
Here's[0] a devicetree example where the MAC is both fixed-link and driving a switch on MDIO (case "2" above). This needs a MDIO bus to be created:
&fec1 {
phy-mode = "rmii";
fixed-link {
speed = <100>;
full-duplex;
};
mdio1: mdio {
switch0: switch0@0 {
compatible = "marvell,mv88e6190";
pinctrl-0 = <&pinctrl_gpio_switch0>;
};
};
};Here's[1] an example where there is no MDIO bus or fixed-link for the ethernet1 MAC, so no MDIO bus should be created since ethernet0 is the MDIO master for ethernet1's phy:
ðernet0 {
phy-mode = "sgmii";
phy-handle = <&sgmii_phy0>;
mdio {
compatible = "snps,dwmac-mdio";
sgmii_phy0: phy@8 {
compatible = "ethernet-phy-id0141.0dd4";
reg = <0x8>;
device_type = "ethernet-phy";
};
sgmii_phy1: phy@a {
compatible = "ethernet-phy-id0141.0dd4";
reg = <0xa>;
device_type = "ethernet-phy";
};
};
};
ðernet1 {
phy-mode = "sgmii";
phy-handle = <&sgmii_phy1>;
};Finally there's descriptions like this[2] which don't describe the MDIO bus but expect it to be created and the whole address space scanned for a phy since there's no phy-handle or fixed-link described:
&gmac {
phy-supply = <&vcc_lan>;
phy-mode = "rmii";
snps,reset-gpio = <&gpio3 RK_PB4 GPIO_ACTIVE_HIGH>;
snps,reset-active-low;
snps,reset-delays-us = <0 10000 1000000>;
};[0] https://elixir.bootlin.com/linux/v6.5-rc5/source/arch/arm/boot/dts/nxp/vf/vf610-zii-ssmb-dtu.dts
[1] https://elixir.bootlin.com/linux/v6.6-rc5/source/arch/arm64/boot/dts/qcom/sa8775p-ride.dts
[2] https://elixir.bootlin.com/linux/v6.6-rc5/source/arch/arm64/boot/dts/rockchip/rk3368-r88.dts#L164
Stable-dep-of: 2b6ffcd7873b ("net: stmmac: restructure the error path of stmmac_probe_config_dt()")
--- .../ethernet/stmicro/stmmac/stmmac_platform.c | 91 +++++++++++-------- 1 file changed, 54 insertions(+), 37 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +54 -37
@@ -296,62 +296,80 @@ static int stmmac_mtl_setup(struct platform_device *pdev, }/** -* stmmac_dt_phy - parse device-tree driver parameters to allocate PHY resources -* @plat: driver data platform structure -* @np: device tree node -* @dev: device pointer -* Description: -* The mdio bus will be allocated in case of a phy transceiver is on board; -* it will be NULL if the fixed-link is configured. -* If there is the "snps,dwmac-mdio" sub-node the mdio will be allocated -* in any case (for DSA, mdio must be registered even if fixed-link). -* The table below sums the supported configurations: -* ------------------------------- -* snps,phy-addr | Y -* ------------------------------- -* phy-handle | Y -* ------------------------------- -* fixed-link | N -* ------------------------------- -* snps,dwmac-mdio | -* even if | Y -* fixed-link | -* ------------------------------- +* stmmac_of_get_mdio() - Gets the MDIO bus from the devicetree. +* @np: devicetree node * -* It returns 0 in case of success otherwise -ENODEV. +* The MDIO bus will be searched for in the following ways: +* 1. The compatible is "snps,dwc-qos-ethernet-4.10" && a "mdio" named +* child node exists +* 2. A child node with the "snps,dwmac-mdio" compatible is present +* +* Return: The MDIO node if present otherwise NULL */ -static int stmmac_dt_phy (struct plat_stmmacenet_data *plat, -struct device_node *np,struct device *dev) +static struct device_node *stmmac_of_get_mdio (struct device_node *np) { -bool mdio = !of_phy_is_fixed_link (np);static const struct of_device_id need_mdio_ids[] = { { .compatible ="snps,dwc-qos-ethernet-4.10" }, {}, }; +struct device_node *mdio_node =NULL ;if (of_match_node (need_mdio_ids, np)) { - plat->mdio_node =of_get_child_by_name (np,"mdio" ); + mdio_node =of_get_child_by_name (np,"mdio" ); }else {/** * If snps,dwmac-mdio is passed from DT, always register * the MDIO */ -for_each_child_of_node (np, plat->mdio_node) { -if (of_device_is_compatible (plat->mdio_node, +for_each_child_of_node (np, mdio_node) { +if (of_device_is_compatible (mdio_node,"snps,dwmac-mdio" ))break ; } } -if (plat->mdio_node) { +return mdio_node; +} + +/** +* stmmac_mdio_setup() - Populate platform related MDIO structures. +* @plat: driver data platform structure +* @np: devicetree node +* @dev: device pointer +* +* This searches for MDIO information from the devicetree. +* If an MDIO node is found, it's assigned to plat->mdio_node and +* plat->mdio_bus_data is allocated. +* If no connection can be determined, just plat->mdio_bus_data is allocated +* to indicate a bus should be created and scanned for a phy. +* If it's determined there's no MDIO bus needed, both are left NULL. +* +* This expects that plat->phy_node has already been searched for. +* +* Return: 0 on success, errno otherwise. +*/ +static int stmmac_mdio_setup (struct plat_stmmacenet_data *plat, +struct device_node *np,struct device *dev) +{ +bool legacy_mdio; + + plat->mdio_node =stmmac_of_get_mdio (np); +if (plat->mdio_node)dev_dbg (dev,"Found MDIO subnode\n" ); - mdio = true; - } -if (mdio) { - plat->mdio_bus_data = -devm_kzalloc (dev,sizeof (struct stmmac_mdio_bus_data ), -GFP_KERNEL ); +/* Legacy devicetrees allowed for no MDIO bus description and expect +* the bus to be scanned for devices. If there's no phy or fixed-link +* described assume this is the case since there must be something +* connected to the MAC. +*/ + legacy_mdio = !of_phy_is_fixed_link (np) && !plat->phy_node; +if (legacy_mdio) +dev_info (dev,"Deprecated MDIO bus assumption used\n" ); + +if (plat->mdio_node || legacy_mdio) { + plat->mdio_bus_data =devm_kzalloc (dev, +sizeof (*plat->mdio_bus_data), +GFP_KERNEL );if (!plat->mdio_bus_data)return -ENOMEM ;
@@ -455,8 +473,7 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)if (of_property_read_u32 (np,"snps,phy-addr" , &plat->phy_addr) ==0 )dev_warn (&pdev->dev,"snps,phy-addr property is deprecated\n" ); -/* To Configure PHY by using all device-tree supported properties */ - rc =stmmac_dt_phy (plat, np, &pdev->dev); + rc =stmmac_mdio_setup (plat, np, &pdev->dev);if (rc)return ERR_PTR (rc);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 151/222 net: stmmac: restructure the error path of stmmac_probe_config_dt()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joe Hattori <[email protected]>
[ Upstream commit 2b6ffcd7873b7e8a62c3e15a6f305bfc747c466b ]
Current implementation of stmmac_probe_config_dt() does not release the OF node reference obtained by of_parse_phandle() in some error paths. The problem is that some error paths call stmmac_remove_config_dt() to clean up but others use and unwind ladder. These two types of error handling have not kept in sync and have been a recurring source of bugs. Re-write the error handling in stmmac_probe_config_dt() to use an unwind ladder. Consequently, stmmac_remove_config_dt() is not needed anymore, thus remove it.
This bug was found by an experimental verification tool that I am developing.
--- .../ethernet/stmicro/stmmac/stmmac_platform.c | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +17 -10
@@ -474,8 +474,10 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)dev_warn (&pdev->dev,"snps,phy-addr property is deprecated\n" ); rc =stmmac_mdio_setup (plat, np, &pdev->dev); -if (rc) -return ERR_PTR (rc); +if (rc) { + ret =ERR_PTR (rc); + goto error_put_phy; + }of_property_read_u32 (np,"tx-fifo-depth" , &plat->tx_fifo_size);
@@ -564,8 +566,8 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac) dma_cfg =devm_kzalloc (&pdev->dev,sizeof (*dma_cfg),GFP_KERNEL );if (!dma_cfg) { -stmmac_remove_config_dt (pdev, plat); -return ERR_PTR (-ENOMEM ); + ret =ERR_PTR (-ENOMEM ); + goto error_put_mdio; } plat->dma_cfg = dma_cfg;
@@ -593,8 +595,8 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac) rc =stmmac_mtl_setup (pdev, plat);if (rc) { -stmmac_remove_config_dt (pdev, plat); -return ERR_PTR (rc); + ret =ERR_PTR (rc); + goto error_put_mdio; }/* clock setup */
@@ -646,6 +648,10 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)clk_disable_unprepare (plat->pclk); error_pclk_get:clk_disable_unprepare (plat->stmmac_clk); +error_put_mdio: +of_node_put (plat->mdio_node); +error_put_phy: +of_node_put (plat->phy_node);return ret; }
@@ -654,16 +660,17 @@ static void devm_stmmac_remove_config_dt(void *data) {struct plat_stmmacenet_data *plat = data; -/* Platform data argument is unused */ -stmmac_remove_config_dt (NULL , plat); +clk_disable_unprepare (plat->stmmac_clk); +clk_disable_unprepare (plat->pclk); +of_node_put (plat->mdio_node); +of_node_put (plat->phy_node); }/** * devm_stmmac_probe_config_dt * @pdev: platform_device structure * @mac: MAC address to use -* Description: Devres variant of stmmac_probe_config_dt(). Does not require -* the user to call stmmac_remove_config_dt() at driver detach. +* Description: Devres variant of stmmac_probe_config_dt(). */ struct plat_stmmacenet_data *devm_stmmac_probe_config_dt (struct platform_device *pdev,u8 *mac)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 152/222 net: fix memory leak in tcp_conn_request()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wang Liang <[email protected]>
[ Upstream commit 4f4aa4aa28142d53f8b06585c478476cfe325cfc ]
If inet_csk_reqsk_queue_hash_add() return false, tcp_conn_request() will return without free the dst memory, which allocated in af_ops->route_req.
Here is the kmemleak stack:
unreferenced object 0xffff8881198631c0 (size 240):
comm "softirq", pid 0, jiffies 4299266571 (age 1802.392s) hex dump (first 32 bytes):
00 10 9b 03 81 88 ff ff 80 98 da bc ff ff ff ff ................
81 55 18 bb ff ff ff ff 00 00 00 00 00 00 00 00 .U..............
backtrace:
[<ffffffffb93e8d4c>] kmem_cache_alloc+0x60c/0xa80
[<ffffffffba11b4c5>] dst_alloc+0x55/0x250
[<ffffffffba227bf6>] rt_dst_alloc+0x46/0x1d0
[<ffffffffba23050a>] __mkroute_output+0x29a/0xa50
[<ffffffffba23456b>] ip_route_output_key_hash+0x10b/0x240
[<ffffffffba2346bd>] ip_route_output_flow+0x1d/0x90
[<ffffffffba254855>] inet_csk_route_req+0x2c5/0x500
[<ffffffffba26b331>] tcp_conn_request+0x691/0x12c0
[<ffffffffba27bd08>] tcp_rcv_state_process+0x3c8/0x11b0
[<ffffffffba2965c6>] tcp_v4_do_rcv+0x156/0x3b0
[<ffffffffba299c98>] tcp_v4_rcv+0x1cf8/0x1d80
[<ffffffffba239656>] ip_protocol_deliver_rcu+0xf6/0x360
[<ffffffffba2399a6>] ip_local_deliver_finish+0xe6/0x1e0
[<ffffffffba239b8e>] ip_local_deliver+0xee/0x360
[<ffffffffba239ead>] ip_rcv+0xad/0x2f0
[<ffffffffba110943>] __netif_receive_skb_one_core+0x123/0x140Call dst_release() to free the dst memory when inet_csk_reqsk_queue_hash_add() return false in tcp_conn_request().
--- net/ipv4/tcp_input.c | 1 + 1 file changed, 1 insertion(+)
net/ipv4/tcp_input.c +1 -0
@@ -7192,6 +7192,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,if (unlikely (!inet_csk_reqsk_queue_hash_add (sk, req, req->timeout))) {reqsk_free (req); +dst_release (dst);return 0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 153/222 ip_tunnel: annotate data-races around t->parms.link
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit f694eee9e1c00d6ca06c5e59c04e3b6ff7d64aa9 ]
t->parms.link is read locklessly, annotate these reads and opposite writes accordingly.
Stable-dep-of: b5a7b661a073 ("net: Fix netns for ip_tunnel_init_flow()")
--- net/ipv4/ip_tunnel.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-)
net/ipv4/ip_tunnel.c +13 -14
@@ -102,10 +102,9 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,if (!ip_tunnel_key_match (&t->parms, flags, key))continue ; -if (t->parms.link == link) +if (READ_ONCE (t->parms.link) == link)return t; -else - cand = t; + cand = t; }hlist_for_each_entry_rcu (t, head, hash_node) {
@@ -117,9 +116,9 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,if (!ip_tunnel_key_match (&t->parms, flags, key))continue ; -if (t->parms.link == link) +if (READ_ONCE (t->parms.link) == link)return t; -else if (!cand) +if (!cand) cand = t; }
@@ -137,9 +136,9 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,if (!ip_tunnel_key_match (&t->parms, flags, key))continue ; -if (t->parms.link == link) +if (READ_ONCE (t->parms.link) == link)return t; -else if (!cand) +if (!cand) cand = t; }
@@ -150,9 +149,9 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn, !(t->dev->flags & IFF_UP))continue ; -if (t->parms.link == link) +if (READ_ONCE (t->parms.link) == link)return t; -else if (!cand) +if (!cand) cand = t; }
@@ -221,7 +220,7 @@ static struct ip_tunnel *ip_tunnel_find(struct ip_tunnel_net *itn,hlist_for_each_entry_rcu (t, head, hash_node) {if (local == t->parms.iph.saddr && remote == t->parms.iph.daddr && - link == t->parms.link && + link ==READ_ONCE (t->parms.link) && type == t->dev->type &&ip_tunnel_key_match (&t->parms, flags, key))break ;
@@ -774,7 +773,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,ip_tunnel_init_flow (&fl4, protocol, dst, tnl_params->saddr, tunnel->parms.o_key,RT_TOS (tos), -dev_net (dev), tunnel->parms.link, +dev_net (dev),READ_ONCE (tunnel->parms.link), tunnel->fwmark,skb_get_hash (skb),0 );if (ip_tunnel_encap (skb, &tunnel->encap, &protocol, &fl4) <0 )
@@ -894,7 +893,7 @@ static void ip_tunnel_update(struct ip_tunnel_net *itn,if (t->parms.link != p->link || t->fwmark != fwmark) {int mtu; - t->parms.link = p->link; +WRITE_ONCE (t->parms.link, p->link); t->fwmark = fwmark; mtu =ip_tunnel_bind_dev (dev);if (set_mtu)
@@ -1084,9 +1083,9 @@ EXPORT_SYMBOL(ip_tunnel_get_link_net);int ip_tunnel_get_iflink (const struct net_device *dev) { -struct ip_tunnel *tunnel =netdev_priv (dev); +const struct ip_tunnel *tunnel =netdev_priv (dev); -return tunnel->parms.link; +return READ_ONCE (tunnel->parms.link); }EXPORT_SYMBOL (ip_tunnel_get_iflink);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 154/222 ipv4: ip_tunnel: Unmask upper DSCP bits in ip_tunnel_bind_dev()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit e7191e517a03d025405c7df730b400ad4118474e ]
Unmask the upper DSCP bits when initializing an IPv4 flow key via ip_tunnel_init_flow() before passing it to ip_route_output_key() so that in the future we could perform the FIB lookup according to the full DSCP value.
Stable-dep-of: b5a7b661a073 ("net: Fix netns for ip_tunnel_init_flow()")
--- net/ipv4/ip_tunnel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/ip_tunnel.c +1 -1
@@ -293,7 +293,7 @@ static int ip_tunnel_bind_dev(struct net_device *dev)ip_tunnel_init_flow (&fl4, iph->protocol, iph->daddr, iph->saddr, tunnel->parms.o_key, -RT_TOS (iph->tos),dev_net (dev), + iph->tos &INET_DSCP_MASK ,dev_net (dev), tunnel->parms.link, tunnel->fwmark,0 ,0 ); rt =ip_route_output_key (tunnel->net, &fl4);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 155/222 ipv4: ip_tunnel: Unmask upper DSCP bits in ip_md_tunnel_xmit()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit c34cfe72bb260fc49660d9e6a9ba95ba01669ae2 ]
Unmask the upper DSCP bits when initializing an IPv4 flow key via ip_tunnel_init_flow() before passing it to ip_route_output_key() so that in the future we could perform the FIB lookup according to the full DSCP value.
Note that the 'tos' variable includes the full DS field. Either the one specified via the tunnel key or the one inherited from the inner packet.
Stable-dep-of: b5a7b661a073 ("net: Fix netns for ip_tunnel_init_flow()")
--- net/ipv4/ip_tunnel.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/ipv4/ip_tunnel.c +4 -3
@@ -43,6 +43,7 @@#include <net/rtnetlink.h> #include <net/udp.h> #include <net/dst_metadata.h> +#include <net/inet_dscp.h> #if IS_ENABLED (CONFIG_IPV6 )#include <net/ipv6.h>
@@ -609,9 +610,9 @@ void ip_md_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, tos =ipv6_get_dsfield ((const struct ipv6hdr *)inner_iph); }ip_tunnel_init_flow (&fl4, proto, key->u.ipv4.dst, key->u.ipv4.src, -tunnel_id_to_key32 (key->tun_id),RT_TOS (tos), -dev_net (dev),0 , skb->mark,skb_get_hash (skb), - key->flow_flags); +tunnel_id_to_key32 (key->tun_id), + tos &INET_DSCP_MASK ,dev_net (dev),0 , skb->mark, +skb_get_hash (skb), key->flow_flags);if (!tunnel_hlen) tunnel_hlen =ip_encap_hlen (&tun_info->encap);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 156/222 ipv4: ip_tunnel: Unmask upper DSCP bits in ip_tunnel_xmit()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit c2b639f9f3b7a058ca9c7349b096f355773f2cd8 ]
Unmask the upper DSCP bits when initializing an IPv4 flow key via ip_tunnel_init_flow() before passing it to ip_route_output_key() so that in the future we could perform the FIB lookup according to the full DSCP value.
Note that the 'tos' variable includes the full DS field. Either the one specified as part of the tunnel parameters or the one inherited from the inner packet.
Stable-dep-of: b5a7b661a073 ("net: Fix netns for ip_tunnel_init_flow()")
--- net/ipv4/ip_tunnel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/ip_tunnel.c +1 -1
@@ -773,7 +773,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, }ip_tunnel_init_flow (&fl4, protocol, dst, tnl_params->saddr, - tunnel->parms.o_key,RT_TOS (tos), + tunnel->parms.o_key, tos &INET_DSCP_MASK ,dev_net (dev),READ_ONCE (tunnel->parms.link), tunnel->fwmark,skb_get_hash (skb),0 );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 157/222 net: Fix netns for ip_tunnel_init_flow()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiao Liang <[email protected]>
[ Upstream commit b5a7b661a073727219fedc35f5619f62418ffe72 ]
The device denoted by tunnel->parms.link resides in the underlay net namespace. Therefore pass tunnel->net to ip_tunnel_init_flow().
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c | 3 +-- net/ipv4/ip_tunnel.c | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c +1 -2
@@ -423,8 +423,7 @@ mlxsw_sp_span_gretap4_route(const struct net_device *to_dev, parms =mlxsw_sp_ipip_netdev_parms4 (to_dev);ip_tunnel_init_flow (&fl4, parms.iph.protocol, *daddrp, *saddrp, -0 ,0 ,dev_net (to_dev), parms.link, tun->fwmark,0 , -0 ); +0 ,0 , tun->net, parms.link, tun->fwmark,0 ,0 ); rt =ip_route_output_key (tun->net, &fl4);if (IS_ERR (rt))
net/ipv4/ip_tunnel.c +3 -3
@@ -294,7 +294,7 @@ static int ip_tunnel_bind_dev(struct net_device *dev)ip_tunnel_init_flow (&fl4, iph->protocol, iph->daddr, iph->saddr, tunnel->parms.o_key, - iph->tos &INET_DSCP_MASK ,dev_net (dev), + iph->tos &INET_DSCP_MASK , tunnel->net, tunnel->parms.link, tunnel->fwmark,0 ,0 ); rt =ip_route_output_key (tunnel->net, &fl4);
@@ -611,7 +611,7 @@ void ip_md_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, }ip_tunnel_init_flow (&fl4, proto, key->u.ipv4.dst, key->u.ipv4.src,tunnel_id_to_key32 (key->tun_id), - tos &INET_DSCP_MASK ,dev_net (dev),0 , skb->mark, + tos &INET_DSCP_MASK , tunnel->net,0 , skb->mark,skb_get_hash (skb), key->flow_flags);if (!tunnel_hlen)
@@ -774,7 +774,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,ip_tunnel_init_flow (&fl4, protocol, dst, tnl_params->saddr, tunnel->parms.o_key, tos &INET_DSCP_MASK , -dev_net (dev),READ_ONCE (tunnel->parms.link), + tunnel->net,READ_ONCE (tunnel->parms.link), tunnel->fwmark,skb_get_hash (skb),0 );if (ip_tunnel_encap (skb, &tunnel->encap, &protocol, &fl4) <0 )
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 158/222 netrom: check buffer length before accessing it
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilya Shchipletsov <[email protected]>
[ Upstream commit a4fd163aed2edd967a244499754dec991d8b4c7d ]
Syzkaller reports an uninit value read from ax25cmp when sending raw message through ieee802154 implementation.
=====================================================
BUG: KMSAN: uninit-value in ax25cmp+0x3a5/0x460 net/ax25/ax25_addr.c:119 ax25cmp+0x3a5/0x460 net/ax25/ax25_addr.c:119 nr_dev_get+0x20e/0x450 net/netrom/nr_route.c:601 nr_route_frame+0x1a2/0xfc0 net/netrom/nr_route.c:774 nr_xmit+0x5a/0x1c0 net/netrom/nr_dev.c:144 __netdev_start_xmit include/linux/netdevice.h:4940 [inline] netdev_start_xmit include/linux/netdevice.h:4954 [inline] xmit_one net/core/dev.c:3548 [inline] dev_hard_start_xmit+0x247/0xa10 net/core/dev.c:3564 __dev_queue_xmit+0x33b8/0x5130 net/core/dev.c:4349 dev_queue_xmit include/linux/netdevice.h:3134 [inline] raw_sendmsg+0x654/0xc10 net/ieee802154/socket.c:299 ieee802154_sock_sendmsg+0x91/0xc0 net/ieee802154/socket.c:96 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg net/socket.c:745 [inline] ____sys_sendmsg+0x9c2/0xd60 net/socket.c:2584 ___sys_sendmsg+0x28d/0x3c0 net/socket.c:2638 __sys_sendmsg net/socket.c:2667 [inline] __do_sys_sendmsg net/socket.c:2676 [inline] __se_sys_sendmsg net/socket.c:2674 [inline] __x64_sys_sendmsg+0x307/0x490 net/socket.c:2674 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0x44/0x110 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b
Uninit was created at:
slab_post_alloc_hook+0x129/0xa70 mm/slab.h:768 slab_alloc_node mm/slub.c:3478 [inline] kmem_cache_alloc_node+0x5e9/0xb10 mm/slub.c:3523 kmalloc_reserve+0x13d/0x4a0 net/core/skbuff.c:560 __alloc_skb+0x318/0x740 net/core/skbuff.c:651 alloc_skb include/linux/skbuff.h:1286 [inline] alloc_skb_with_frags+0xc8/0xbd0 net/core/skbuff.c:6334 sock_alloc_send_pskb+0xa80/0xbf0 net/core/sock.c:2780 sock_alloc_send_skb include/net/sock.h:1884 [inline] raw_sendmsg+0x36d/0xc10 net/ieee802154/socket.c:282 ieee802154_sock_sendmsg+0x91/0xc0 net/ieee802154/socket.c:96 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg net/socket.c:745 [inline] ____sys_sendmsg+0x9c2/0xd60 net/socket.c:2584 ___sys_sendmsg+0x28d/0x3c0 net/socket.c:2638 __sys_sendmsg net/socket.c:2667 [inline] __do_sys_sendmsg net/socket.c:2676 [inline] __se_sys_sendmsg net/socket.c:2674 [inline] __x64_sys_sendmsg+0x307/0x490 net/socket.c:2674 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0x44/0x110 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b CPU: 0 PID: 5037 Comm: syz-executor166 Not tainted 6.7.0-rc7-syzkaller-00003-gfbafc3e621c3 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 11/17/2023 =====================================================
This issue occurs because the skb buffer is too small, and it's actual allocation is aligned. This hides an actual issue, which is that nr_route_frame does not validate the buffer size before using it.
Fix this issue by checking skb->len before accessing any fields in skb->data.
Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
--- net/netrom/nr_route.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/netrom/nr_route.c +6 -0
@@ -754,6 +754,12 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)int ret;struct sk_buff *skbn; +/* +* Reject malformed packets early. Check that it contains at least 2 +* addresses and 1 byte more for Time-To-Live +*/ +if (skb->len <2 *sizeof (ax25_address) +1 ) +return 0 ; nr_src = (ax25_address *)(skb->data +0 ); nr_dest = (ax25_address *)(skb->data +7 );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 159/222 net/mlx5: DR, select MSIX vector 0 for completion queue creation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shahar Shitrit <[email protected]>
[ Upstream commit 050a4c011b0dfeb91664a5d7bd3647ff38db08ce ]
When creating a software steering completion queue (CQ), an arbitrary MSIX vector n is selected. This results in the CQ sharing the same Ethernet traffic channel n associated with the chosen vector. However, the value of n is often unpredictable, which can introduce complications for interrupt monitoring and verification tools.
Moreover, SW steering uses polling rather than event-driven interrupts. Therefore, there is no need to select any MSIX vector other than the existing vector 0 for CQ creation.
In light of these factors, and to enhance predictability, we modify the code to consistently select MSIX vector 0 for CQ creation.
--- drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c +1 -3
@@ -1067,7 +1067,6 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev,int inlen, err, eqn;void *cqc, *in;__be64 *pas; -int vector;u32 i; cq =kzalloc (sizeof (*cq),GFP_KERNEL );
@@ -1096,8 +1095,7 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev,if (!in) goto err_cqwq; - vector =raw_smp_processor_id () %mlx5_comp_vectors_max (mdev); - err =mlx5_comp_eqn_get (mdev, vector, &eqn); + err =mlx5_comp_eqn_get (mdev,0 , &eqn);if (err) {kvfree (in); goto err_cqwq;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 160/222 net/mlx5e: macsec: Maintain TX SA from encoding_sa
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dragos Tatulea <[email protected]>
[ Upstream commit 8c6254479b3d5bd788d2b5fefaa48fb194331ed0 ]
In MACsec, it is possible to create multiple active TX SAs on a SC, but only one such SA can be used at a time for transmission. This SA is selected through the encoding_sa link parameter.
When there are 2 or more active TX SAs configured (encoding_sa=0):
ip macsec add macsec0 tx sa 0 pn 1 on key 00 <KEY1> ip macsec add macsec0 tx sa 1 pn 1 on key 00 <KEY2>
... the traffic should be still sent via TX SA 0 as the encoding_sa was not changed. However, the driver ignores the encoding_sa and overrides it to SA 1 by installing the flow steering id of the newly created TX SA into the SCI -> flow steering id hash map. The future packet tx descriptors will point to the incorrect flow steering rule (SA 1).
This patch fixes the issue by avoiding the creation of the flow steering rule for an active TX SA that is not the encoding_sa. The driver side tx_sa object and the FW side macsec object are still created. When the encoding_sa link parameter is changed to another active TX SA, only the new flow steering rule will be created in the mlx5e_macsec_upd_txsa() handler.
--- drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c +4 -0
@@ -339,9 +339,13 @@ static int mlx5e_macsec_init_sa_fs(struct macsec_context *ctx, {struct mlx5e_priv *priv =macsec_netdev_priv (ctx->netdev);struct mlx5_macsec_fs *macsec_fs = priv->mdev->macsec_fs; +const struct macsec_tx_sc *tx_sc = &ctx->secy->tx_sc;struct mlx5_macsec_rule_attrs rule_attrs;union mlx5_macsec_rule *macsec_rule; +if (is_tx && tx_sc->encoding_sa != sa->assoc_num) +return 0 ; + rule_attrs.macsec_obj_id = sa->macsec_obj_id; rule_attrs.sci = sa->sci; rule_attrs.assoc_num = sa->assoc_num;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 161/222 net/mlx5e: Skip restore TC rules for vport rep without loaded flag
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jianbo Liu <[email protected]>
[ Upstream commit 5a03b368562a7ff5f5f1f63b5adf8309cbdbd5be ]
During driver unload, unregister_netdev is called after unloading vport rep. So, the mlx5e_rep_priv is already freed while trying to get rpriv->netdev, or walk rpriv->tc_ht, which results in use-after-free. So add the checking to make sure access the data of vport rep which is still loaded.
--- drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.c | 6 +++--- drivers/net/ethernet/mellanox/mlx5/core/eswitch.h | 3 +++ drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 3 --- 3 files changed, 6 insertions(+), 6 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.c +3 -3
@@ -150,11 +150,11 @@ void mlx5_esw_ipsec_restore_dest_uplink(struct mlx5_core_dev *mdev)unsigned long i;int err; -xa_for_each (&esw->offloads.vport_reps, i, rep) { - rpriv = rep->rep_data[REP_ETH ].priv; -if (!rpriv || !rpriv->netdev) +mlx5_esw_for_each_rep (esw, i, rep) { +if (atomic_read (&rep->rep_data[REP_ETH ].state) !=REP_LOADED )continue ; + rpriv = rep->rep_data[REP_ETH ].priv;rhashtable_walk_enter (&rpriv->tc_ht, &iter);rhashtable_walk_start (&iter);while ((flow =rhashtable_walk_next (&iter)) !=NULL ) {
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h +3 -0
@@ -713,6 +713,9 @@ void mlx5e_tc_clean_fdb_peer_flows(struct mlx5_eswitch *esw); MLX5_CAP_GEN_2((esw->dev), ec_vf_vport_base) +\ (last) - 1) +#define mlx5_esw_for_each_rep (esw, i, rep) \ + xa_for_each(&((esw)->offloads.vport_reps), i, rep) +struct mlx5_eswitch *__must_check mlx5_devlink_eswitch_get (struct devlink *devlink);
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +0 -3
@@ -52,9 +52,6 @@#include "lag/lag.h" #include "en/tc/post_meter.h" -#define mlx5_esw_for_each_rep (esw, i, rep) \ - xa_for_each(&((esw)->offloads.vport_reps), i, rep) -/* There are two match-all miss flows, one for unicast dst mac and * one for multicast. */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 162/222 drm/i915/dg1: Fix power gate sequence.
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rodrigo Vivi <[email protected]>
[ Upstream commit 20e7c5313ffbf11c34a46395345677adbe890bee ]
sub-pipe PG is not present on DG1. Setting these bits can disable other power gates and cause GPU hangs on video playbacks.
VLK: 16314, 4304
--- drivers/gpu/drm/i915/gt/intel_rc6.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/i915/gt/intel_rc6.c +1 -1
@@ -133,7 +133,7 @@ static void gen11_rc6_enable(struct intel_rc6 *rc6)GEN9_MEDIA_PG_ENABLE |GEN11_MEDIA_SAMPLER_PG_ENABLE ; -if (GRAPHICS_VER (gt->i915) >=12 ) { +if (GRAPHICS_VER (gt->i915) >=12 && !IS_DG1 (gt->i915)) {for (i =0 ; i <I915_MAX_VCS ; i++)if (HAS_ENGINE (gt,_VCS (i))) pg_enable |= (VDN_HCP_POWERGATE_ENABLE(i) |
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 163/222 netfilter: nft_set_hash: unaligned atomic read on struct nft_set_ext
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 542ed8145e6f9392e3d0a86a0e9027d2ffd183e4 ]
Access to genmask field in struct nft_set_ext results in unaligned atomic read:
[ 72.130109] Unable to handle kernel paging request at virtual address ffff0000c2bb708c [ 72.131036] Mem abort info: [ 72.131213] ESR = 0x0000000096000021 [ 72.131446] EC = 0x25: DABT (current EL), IL = 32 bits [ 72.132209] SET = 0, FnV = 0 [ 72.133216] EA = 0, S1PTW = 0 [ 72.134080] FSC = 0x21: alignment fault [ 72.135593] Data abort info: [ 72.137194] ISV = 0, ISS = 0x00000021, ISS2 = 0x00000000 [ 72.142351] CM = 0, WnR = 0, TnD = 0, TagAccess = 0 [ 72.145989] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 [ 72.150115] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000237d27000 [ 72.154893] [ffff0000c2bb708c] pgd=0000000000000000, p4d=180000023ffff403, pud=180000023f84b403, pmd=180000023f835403, +pte=0068000102bb7707 [ 72.163021] Internal error: Oops: 0000000096000021 [#1] SMP [...] [ 72.170041] CPU: 7 UID: 0 PID: 54 Comm: kworker/7:0 Tainted: G E 6.13.0-rc3+ #2 [ 72.170509] Tainted: [E]=UNSIGNED_MODULE [ 72.170720] Hardware name: QEMU QEMU Virtual Machine, BIOS edk2-stable202302-for-qemu 03/01/2023 [ 72.171192] Workqueue: events_power_efficient nft_rhash_gc [nf_tables] [ 72.171552] pstate: 21400005 (nzCv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--) [ 72.171915] pc : nft_rhash_gc+0x200/0x2d8 [nf_tables] [ 72.172166] lr : nft_rhash_gc+0x128/0x2d8 [nf_tables] [ 72.172546] sp : ffff800081f2bce0 [ 72.172724] x29: ffff800081f2bd40 x28: ffff0000c2bb708c x27: 0000000000000038 [ 72.173078] x26: ffff0000c6780ef0 x25: ffff0000c643df00 x24: ffff0000c6778f78 [ 72.173431] x23: 000000000000001a x22: ffff0000c4b1f000 x21: ffff0000c6780f78 [ 72.173782] x20: ffff0000c2bb70dc x19: ffff0000c2bb7080 x18: 0000000000000000 [ 72.174135] x17: ffff0000c0a4e1c0 x16: 0000000000003000 x15: 0000ac26d173b978 [ 72.174485] x14: ffffffffffffffff x13: 0000000000000030 x12: ffff0000c6780ef0 [ 72.174841] x11: 0000000000000000 x10: ffff800081f2bcf8 x9 : ffff0000c3000000 [ 72.175193] x8 : 00000000000004be x7 : 0000000000000000 x6 : 0000000000000000 [ 72.175544] x5 : 0000000000000040 x4 : ffff0000c3000010 x3 : 0000000000000000 [ 72.175871] x2 : 0000000000003a98 x1 : ffff0000c2bb708c x0 : 0000000000000004 [ 72.176207] Call trace: [ 72.176316] nft_rhash_gc+0x200/0x2d8 [nf_tables] (P) [ 72.176653] process_one_work+0x178/0x3d0 [ 72.176831] worker_thread+0x200/0x3f0 [ 72.176995] kthread+0xe8/0xf8 [ 72.177130] ret_from_fork+0x10/0x20 [ 72.177289] Code: 54fff984 d503201f d2800080 91003261 (f820303f) [ 72.177557] ---[ end trace 0000000000000000 ]---
Align struct nft_set_ext to word size to address this and documentation it.
pahole reports that this increases the size of elements for rhash and pipapo in 8 bytes on x86_64.
--- include/net/netfilter/nf_tables.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
include/net/netfilter/nf_tables.h +5 -2
@@ -721,15 +721,18 @@ struct nft_set_ext_tmpl {/** * struct nft_set_ext - set extensions * -* @genmask: generation mask +* @genmask: generation mask, but also flags (see NFT_SET_ELEM_DEAD_BIT) * @offset: offsets of individual extension types * @data: beginning of extension data +* +* This structure must be aligned to word size, otherwise atomic bitops +* on genmask field can cause alignment failure on some archs. */ struct nft_set_ext {u8 genmask;u8 offset[NFT_SET_EXT_NUM ];char data[]; -}; +}__aligned(BITS_PER_LONG / 8) ;static inline void nft_set_ext_prepare (struct nft_set_ext_tmpl *tmpl) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 164/222 net: llc: reset skb->transport_header
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antonio Pastor <[email protected]>
[ Upstream commit a024e377efed31ecfb39210bed562932321345b3 ]
802.2+LLC+SNAP frames received by napi_complete_done with GRO and DSA have skb->transport_header set two bytes short, or pointing 2 bytes before network_header & skb->data. As snap_rcv expects transport_header to point to SNAP header (OID:PID) after LLC processing advances offset over LLC header (llc_rcv & llc_fixup_skb), code doesn't find a match and packet is dropped.
Between napi_complete_done and snap_rcv, transport_header is not used until __netif_receive_skb_core, where originally it was being reset. Commit fda55eca5a33 ("net: introduce skb_transport_header_was_set()") only does so if not set, on the assumption the value was set correctly by GRO (and also on assumption that "network stacks usually reset the transport header anyway"). Afterwards it is moved forward by llc_fixup_skb.
Locally generated traffic shows up at __netif_receive_skb_core with no transport_header set and is processed without issue. On a setup with GRO but no DSA, transport_header and network_header are both set to point to skb->data which is also correct.
As issue is LLC specific, to avoid impacting non-LLC traffic, and to follow up on original assumption made on previous code change, llc_fixup_skb to reset the offset after skb pull. llc_fixup_skb assumes the LLC header is at skb->data, and by definition SNAP header immediately follows.
--- net/llc/llc_input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/llc/llc_input.c +1 -1
@@ -124,8 +124,8 @@ static inline int llc_fixup_skb(struct sk_buff *skb)if (unlikely (!pskb_may_pull (skb, llc_len)))return 0 ; - skb->transport_header += llc_len;skb_pull (skb, llc_len); +skb_reset_transport_header (skb);if (skb->protocol ==htons (ETH_P_802_2 )) {__be16 pdulen;s32 data_size;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 165/222 ALSA: usb-audio: US16x08: Initialize array before use
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tanya Agarwal <[email protected]>
[ Upstream commit b06a6187ef983f501e93faa56209169752d3bde3 ]
Initialize meter_urb array before use in mixer_us16x08.c.
CID 1410197: (#1 of 1): Uninitialized scalar variable (UNINIT)uninit_use_in_call: Using uninitialized value *meter_urb when calling get_meter_levels_from_urb.
Coverity Link:
https://scan7.scan.coverity.com/#/project-view/52849/11354?selectedIssue=1410197
--- sound/usb/mixer_us16x08.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/usb/mixer_us16x08.c +1 -1
@@ -687,7 +687,7 @@ static int snd_us16x08_meter_get(struct snd_kcontrol *kcontrol,struct usb_mixer_elem_info *elem = kcontrol->private_data;struct snd_usb_audio *chip = elem->head.mixer->chip;struct snd_us16x08_meter_store *store = elem->private_data; -u8 meter_urb[64 ]; +u8 meter_urb[64 ] = {0 };switch (kcontrol->private_value) {case 0 : {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 166/222 eth: bcmsysport: fix call balance of priv->clk handling routines
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vitalii Mordan <[email protected]>
[ Upstream commit b255ef45fcc2141c1bf98456796abb956d843a27 ]
Check the return value of clk_prepare_enable to ensure that priv->clk has been successfully enabled.
If priv->clk was not enabled during bcm_sysport_probe, bcm_sysport_resume, or bcm_sysport_open, it must not be disabled in any subsequent execution paths.
--- drivers/net/ethernet/broadcom/bcmsysport.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-)
drivers/net/ethernet/broadcom/bcmsysport.c +18 -3
@@ -1967,7 +1967,11 @@ static int bcm_sysport_open(struct net_device *dev)unsigned int i;int ret; -clk_prepare_enable (priv->clk); + ret =clk_prepare_enable (priv->clk); +if (ret) { +netdev_err (dev,"could not enable priv clock\n" ); +return ret; + }/* Reset UniMAC */ umac_reset (priv);
@@ -2625,7 +2629,11 @@ static int bcm_sysport_probe(struct platform_device *pdev) goto err_deregister_notifier; } -clk_prepare_enable (priv->clk); + ret =clk_prepare_enable (priv->clk); +if (ret) { +dev_err (&pdev->dev,"could not enable priv clock\n" ); + goto err_deregister_netdev; + } priv->rev =topctrl_readl (priv,REV_CNTL ) &REV_MASK ; dev_info(&pdev->dev,
@@ -2639,6 +2647,8 @@ static int bcm_sysport_probe(struct platform_device *pdev)return 0 ; +err_deregister_netdev: +unregister_netdev (dev); err_deregister_notifier:unregister_netdevice_notifier (&priv->netdev_notifier); err_deregister_fixed_link:
@@ -2810,7 +2820,12 @@ static int __maybe_unused bcm_sysport_resume(struct device *d)if (!netif_running (dev))return 0 ; -clk_prepare_enable (priv->clk); + ret =clk_prepare_enable (priv->clk); +if (ret) { +netdev_err (dev,"could not enable priv clock\n" ); +return ret; + } +if (priv->wolopts)clk_disable_unprepare (priv->wol_clk);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 167/222 net: mv643xx_eth: fix an OF node reference leak
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joe Hattori <[email protected]>
[ Upstream commit ad5c318086e2e23b577eca33559c5ebf89bc7eb9 ]
Current implementation of mv643xx_eth_shared_of_add_port() calls of_parse_phandle(), but does not release the refcount on error. Call of_node_put() in the error path and in mv643xx_eth_shared_of_remove().
This bug was found by an experimental verification tool that I am developing.
--- drivers/net/ethernet/marvell/mv643xx_eth.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/net/ethernet/marvell/mv643xx_eth.c +12 -2
@@ -2708,9 +2708,15 @@ static struct platform_device *port_platdev[3];static void mv643xx_eth_shared_of_remove (void ) { +struct mv643xx_eth_platform_data *pd;int n;for (n =0 ; n <3 ; n++) { +if (!port_platdev[n]) +continue ; + pd =dev_get_platdata (&port_platdev[n]->dev); +if (pd) +of_node_put (pd->phy_node);platform_device_del (port_platdev[n]); port_platdev[n] =NULL ; }
@@ -2773,8 +2779,10 @@ static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev, } ppdev =platform_device_alloc (MV643XX_ETH_NAME , dev_num); -if (!ppdev) -return -ENOMEM ; +if (!ppdev) { + ret = -ENOMEM ; + goto put_err; + } ppdev->dev.coherent_dma_mask =DMA_BIT_MASK (32 ); ppdev->dev.of_node = pnp;
@@ -2796,6 +2804,8 @@ static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev, port_err:platform_device_put (ppdev); +put_err: +of_node_put (ppd.phy_node);return ret; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 168/222 net: wwan: t7xx: Fix FSM command timeout issue
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjian Song <[email protected]>
[ Upstream commit 4f619d518db9cd1a933c3a095a5f95d0c1584ae8 ]
When driver processes the internal state change command, it use an asynchronous thread to process the command operation. If the main thread detects that the task has timed out, the asynchronous thread will panic when executing the completion notification because the main thread completion object has been released.
BUG: unable to handle page fault for address: fffffffffffffff8 PGD 1f283a067 P4D 1f283a067 PUD 1f283c067 PMD 0 Oops: 0000 [#1] PREEMPT SMP NOPTI RIP: 0010:complete_all+0x3e/0xa0 [...] Call Trace: <TASK> ? __die_body+0x68/0xb0 ? page_fault_oops+0x379/0x3e0 ? exc_page_fault+0x69/0xa0 ? asm_exc_page_fault+0x22/0x30 ? complete_all+0x3e/0xa0 fsm_main_thread+0xa3/0x9c0 [mtk_t7xx (HASH:1400 5)] ? __pfx_autoremove_wake_function+0x10/0x10 kthread+0xd8/0x110 ? __pfx_fsm_main_thread+0x10/0x10 [mtk_t7xx (HASH:1400 5)] ? __pfx_kthread+0x10/0x10 ret_from_fork+0x38/0x50 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1b/0x30 </TASK> [...] CR2: fffffffffffffff8 ---[ end trace 0000000000000000 ]---
Use the reference counter to ensure safe release as Sergey suggests:
https://lore.kernel.org/all/[email protected]/
--- drivers/net/wwan/t7xx/t7xx_state_monitor.c | 26 ++++++++++++++-------- drivers/net/wwan/t7xx/t7xx_state_monitor.h | 5 +++-- 2 files changed, 20 insertions(+), 11 deletions(-)
drivers/net/wwan/t7xx/t7xx_state_monitor.c +17 -9
@@ -97,14 +97,21 @@ void t7xx_fsm_broadcast_state(struct t7xx_fsm_ctl *ctl, enum md_state state)fsm_state_notify (ctl->md, state); } +static void fsm_release_command (struct kref *ref) +{ +struct t7xx_fsm_command *cmd =container_of (ref,typeof (*cmd), refcnt); + +kfree (cmd); +} +static void fsm_finish_command (struct t7xx_fsm_ctl *ctl,struct t7xx_fsm_command *cmd,int result) {if (cmd->flag &FSM_CMD_FLAG_WAIT_FOR_COMPLETION ) { - *cmd->ret = result; -complete_all (cmd->done); + cmd->result = result; +complete_all (&cmd->done); } -kfree (cmd); +kref_put (&cmd->refcnt, fsm_release_command); }static void fsm_del_kf_event (struct t7xx_fsm_event *event)
@@ -396,7 +403,6 @@ static int fsm_main_thread(void *data)int t7xx_fsm_append_cmd (struct t7xx_fsm_ctl *ctl,enum t7xx_fsm_cmd_state cmd_id,unsigned int flag) { -DECLARE_COMPLETION_ONSTACK (done);struct t7xx_fsm_command *cmd;unsigned long flags;int ret;
@@ -408,11 +414,13 @@ int t7xx_fsm_append_cmd(struct t7xx_fsm_ctl *ctl, enum t7xx_fsm_cmd_state cmd_idINIT_LIST_HEAD (&cmd->entry); cmd->cmd_id = cmd_id; cmd->flag = flag; +kref_init (&cmd->refcnt);if (flag &FSM_CMD_FLAG_WAIT_FOR_COMPLETION ) { - cmd->done = &done; - cmd->ret = &ret; +init_completion (&cmd->done); +kref_get (&cmd->refcnt); } +kref_get (&cmd->refcnt);spin_lock_irqsave (&ctl->command_lock, flags);list_add_tail (&cmd->entry, &ctl->command_queue);spin_unlock_irqrestore (&ctl->command_lock, flags);
@@ -422,11 +430,11 @@ int t7xx_fsm_append_cmd(struct t7xx_fsm_ctl *ctl, enum t7xx_fsm_cmd_state cmd_idif (flag &FSM_CMD_FLAG_WAIT_FOR_COMPLETION ) {unsigned long wait_ret; - wait_ret =wait_for_completion_timeout (&done, + wait_ret =wait_for_completion_timeout (&cmd->done,msecs_to_jiffies (FSM_CMD_TIMEOUT_MS )); -if (!wait_ret) -return -ETIMEDOUT ; + ret = wait_ret ? cmd->result : -ETIMEDOUT ; +kref_put (&cmd->refcnt, fsm_release_command);return ret; }
drivers/net/wwan/t7xx/t7xx_state_monitor.h +3 -2
@@ -109,8 +109,9 @@ struct t7xx_fsm_command {struct list_head entry;enum t7xx_fsm_cmd_state cmd_id;unsigned int flag; -struct completion *done; -int *ret; +struct completion done; +int result; +struct kref refcnt; };struct t7xx_fsm_notifier {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 169/222 RDMA/rtrs: Ensure ib_sge list is accessible
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Zhijian <[email protected]>
[ Upstream commit fb514b31395946022f13a08e06a435f53cf9e8b3 ]
Move the declaration of the 'ib_sge list' variable outside the 'always_invalidate' block to ensure it remains accessible for use throughout the function.
Previously, 'ib_sge list' was declared within the 'always_invalidate' block, limiting its accessibility, then caused a
'BUG: kernel NULL pointer dereference'[1].
? __die_body.cold+0x19/0x27 ? page_fault_oops+0x15a/0x2d0 ? search_module_extables+0x19/0x60 ? search_bpf_extables+0x5f/0x80 ? exc_page_fault+0x7e/0x180 ? asm_exc_page_fault+0x26/0x30 ? memcpy_orig+0xd5/0x140 rxe_mr_copy+0x1c3/0x200 [rdma_rxe] ? rxe_pool_get_index+0x4b/0x80 [rdma_rxe] copy_data+0xa5/0x230 [rdma_rxe] rxe_requester+0xd9b/0xf70 [rdma_rxe] ? finish_task_switch.isra.0+0x99/0x2e0 rxe_sender+0x13/0x40 [rdma_rxe] do_task+0x68/0x1e0 [rdma_rxe] process_one_work+0x177/0x330 worker_thread+0x252/0x390 ? __pfx_worker_thread+0x10/0x10
This change ensures the variable is available for subsequent operations that require it.
[1] https://lore.kernel.org/linux-rdma/[email protected]/
--- drivers/infiniband/ulp/rtrs/rtrs-srv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/ulp/rtrs/rtrs-srv.c +1 -1
@@ -346,6 +346,7 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id,struct rtrs_srv_mr *srv_mr;bool need_inval = false;enum ib_send_flags flags; +struct ib_sge list;u32 imm;int err;
@@ -398,7 +399,6 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id, imm =rtrs_to_io_rsp_imm (id->msg_id, errno, need_inval); imm_wr.wr.next =NULL ;if (always_invalidate) { -struct ib_sge list;struct rtrs_msg_rkey_rsp *msg; srv_mr = &srv_path->mrs[id->msg_id];
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 170/222 net: sfc: Correct key_len for efx_tc_ct_zone_ht_params
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liang Jie <[email protected]>
[ Upstream commit a8620de72e5676993ec3a3b975f7c10908f5f60f ]
In efx_tc_ct_zone_ht_params, the key_len was previously set to offsetof(struct efx_tc_ct_zone, linkage). This calculation is incorrect because it includes any padding between the zone field and the linkage field due to structure alignment, which can vary between systems.
This patch updates key_len to use sizeof_field(struct efx_tc_ct_zone, zone) , ensuring that the hash table correctly uses the zone as the key. This fix prevents potential hash lookup errors and improves connection tracking reliability.
--- drivers/net/ethernet/sfc/tc_conntrack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/sfc/tc_conntrack.c +1 -1
@@ -16,7 +16,7 @@ static int efx_tc_flow_block(enum tc_setup_type type, void *type_data, void *cb_priv);static const struct rhashtable_params efx_tc_ct_zone_ht_params = { - .key_len = offsetof(struct efx_tc_ct_zone , linkage), + .key_len = sizeof_field(struct efx_tc_ct_zone, zone), .key_offset =0 , .head_offset = offsetof(struct efx_tc_ct_zone , linkage), };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 171/222 net: reenable NETIF_F_IPV6_CSUM offload for BIG TCP packets
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Willem de Bruijn <[email protected]>
[ Upstream commit 68e068cabd2c6c533ef934c2e5151609cf6ecc6d ]
The blamed commit disabled hardware offoad of IPv6 packets with extension headers on devices that advertise NETIF_F_IPV6_CSUM, based on the definition of that feature in skbuff.h:
* * - %NETIF_F_IPV6_CSUM
* - Driver (device) is only able to checksum plain
* TCP or UDP packets over IPv6. These are specifically * unencapsulated packets of the form IPv6|TCP or * IPv6|UDP where the Next Header field in the IPv6 * header is either TCP or UDP. IPv6 extension headers * are not supported with this feature. This feature * cannot be set in features for a device with * NETIF_F_HW_CSUM also set. This feature is being * DEPRECATED (see below).
The change causes skb_warn_bad_offload to fire for BIG TCP packets.
[ 496.310233] WARNING: CPU: 13 PID: 23472 at net/core/dev.c:3129 skb_warn_bad_offload+0xc4/0xe0
[ 496.310297] ? skb_warn_bad_offload+0xc4/0xe0 [ 496.310300] skb_checksum_help+0x129/0x1f0 [ 496.310303] skb_csum_hwoffload_help+0x150/0x1b0 [ 496.310306] validate_xmit_skb+0x159/0x270 [ 496.310309] validate_xmit_skb_list+0x41/0x70 [ 496.310312] sch_direct_xmit+0x5c/0x250 [ 496.310317] __qdisc_run+0x388/0x620
BIG TCP introduced an IPV6_TLV_JUMBO IPv6 extension header to communicate packet length, as this is an IPv6 jumbogram. But, the feature is only enabled on devices that support BIG TCP TSO. The header is only present for PF_PACKET taps like tcpdump, and not transmitted by physical devices.
For this specific case of extension headers that are not transmitted, return to the situation before the blamed commit and support hardware offload.
ipv6_has_hopopt_jumbo() tests not only whether this header is present, but also that it is the only extension header before a terminal (L4) header.
--- net/core/dev.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/core/dev.c +3 -1
@@ -3628,8 +3628,10 @@ int skb_csum_hwoffload_help(struct sk_buff *skb,if (features & (NETIF_F_IP_CSUM |NETIF_F_IPV6_CSUM )) {if (vlan_get_protocol (skb) ==htons (ETH_P_IPV6 ) && -skb_network_header_len (skb) !=sizeof (struct ipv6hdr )) +skb_network_header_len (skb) !=sizeof (struct ipv6hdr ) && + !ipv6_has_hopopt_jumbo (skb)) goto sw_checksum; +switch (skb->csum_offset) {case offsetof(struct tcphdr , check):case offsetof(struct udphdr , check):
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 172/222 net: restrict SO_REUSEPORT to inet sockets
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 5b0af621c3f6ef9261cf6067812f2fd9943acb4b ]
After blamed commit, crypto sockets could accidentally be destroyed from RCU call back, as spotted by zyzbot [1].
Trying to acquire a mutex in RCU callback is not allowed.
Restrict SO_REUSEPORT socket option to inet sockets.
v1 of this patch supported TCP, UDP and SCTP sockets, but fcnal-test.sh test needed RAW and ICMP support.
[1]
BUG: sleeping function called from invalid context at kernel/locking/mutex.c:562
in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 24, name: ksoftirqd/1preempt_count: 100, expected: 0
RCU nest depth: 0, expected: 0
1 lock held by ksoftirqd/1/24:
#0: ffffffff8e937ba0 (rcu_callback){....}-{0:0}, at: rcu_lock_acquire include/linux/rcupdate.h:337 [inline] #0: ffffffff8e937ba0 (rcu_callback){....}-{0:0}, at: rcu_do_batch kernel/rcu/tree.c:2561 [inline] #0: ffffffff8e937ba0 (rcu_callback){....}-{0:0}, at: rcu_core+0xa37/0x17a0 kernel/rcu/tree.c:2823
Preemption disabled at:
[<ffffffff8161c8c8>] softirq_handle_begin kernel/softirq.c:402 [inline] [<ffffffff8161c8c8>] handle_softirqs+0x128/0x9b0 kernel/softirq.c:537 CPU: 1 UID: 0 PID: 24 Comm: ksoftirqd/1 Not tainted 6.13.0-rc3-syzkaller-00174-ga024e377efed #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024 Call Trace: <TASK> __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x241/0x360 lib/dump_stack.c:120 __might_resched+0x5d4/0x780 kernel/sched/core.c:8758 __mutex_lock_common kernel/locking/mutex.c:562 [inline] __mutex_lock+0x131/0xee0 kernel/locking/mutex.c:735 crypto_put_default_null_skcipher+0x18/0x70 crypto/crypto_null.c:179 aead_release+0x3d/0x50 crypto/algif_aead.c:489 alg_do_release crypto/af_alg.c:118 [inline] alg_sock_destruct+0x86/0xc0 crypto/af_alg.c:502 __sk_destruct+0x58/0x5f0 net/core/sock.c:2260 rcu_do_batch kernel/rcu/tree.c:2567 [inline] rcu_core+0xaaa/0x17a0 kernel/rcu/tree.c:2823 handle_softirqs+0x2d4/0x9b0 kernel/softirq.c:561 run_ksoftirqd+0xca/0x130 kernel/softirq.c:950 smpboot_thread_fn+0x544/0xa30 kernel/smpboot.c:164 kthread+0x2f0/0x390 kernel/kthread.c:389 ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244 </TASK>
--- net/core/sock.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/core/sock.c +4 -1
@@ -1133,7 +1133,10 @@ int sk_setsockopt(struct sock *sk, int level, int optname, sk->sk_reuse = (valbool ?SK_CAN_REUSE :SK_NO_REUSE );break ;case SO_REUSEPORT : - sk->sk_reuseport = valbool; +if (valbool && !sk_is_inet (sk)) + ret = -EOPNOTSUPP ; +else + sk->sk_reuseport = valbool;break ;case SO_TYPE :case SO_PROTOCOL :
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 173/222 net: wwan: iosm: Properly check for valid exec stage in ipc_mmio_init()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej S. Szmigiero <[email protected]>
[ Upstream commit a7af435df0e04cfb4a4004136d597c42639a2ae7 ]
ipc_mmio_init() used the post-decrement operator in its loop continuing condition of "retries" counter being "> 0", which meant that when this condition caused loop exit "retries" counter reached -1.
But the later valid exec stage failure check only tests for "retries" counter being exactly zero, so it didn't trigger in this case (but would wrongly trigger if the code reaches a valid exec stage in the very last loop iteration).
Fix this by using the pre-decrement operator instead, so the loop counter is exactly zero on valid exec stage failure.
--- drivers/net/wwan/iosm/iosm_ipc_mmio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wwan/iosm/iosm_ipc_mmio.c +1 -1
@@ -104,7 +104,7 @@ struct iosm_mmio *ipc_mmio_init(void __iomem *mmio, struct device *dev)break ;msleep (20 ); - }while (retries-- >0 ); + }while (--retries >0 );if (!retries) {dev_err (ipc_mmio->dev,"invalid exec stage %X" , stage);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 174/222 af_packet: fix vlan_get_tci() vs MSG_PEEK
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 77ee7a6d16b6ec07b5c3ae2b6b60a24c1afbed09 ]
Blamed commit forgot MSG_PEEK case, allowing a crash [1] as found by syzbot.
Rework vlan_get_tci() to not touch skb at all, so that it can be used from many cpus on the same skb.
Add a const qualifier to skb argument.
[1]
skbuff: skb_under_panic: text:ffffffff8a8da482 len:32 put:14 head:ffff88807a1d5800 data:ffff88807a1d5810 tail:0x14 end:0x140 dev:<NULL>
------------[ cut here ]------------ kernel BUG at net/core/skbuff.c:206 ! Oops: invalid opcode: 0000 [#1] PREEMPT SMP KASAN PTI CPU: 0 UID: 0 PID: 5880 Comm: syz-executor172 Not tainted 6.13.0-rc3-syzkaller-00762-g9268abe611b0 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024 RIP: 0010:skb_panic net/core/skbuff.c:206 [inline] RIP: 0010:skb_under_panic+0x14b/0x150 net/core/skbuff.c:216 Code: 0b 8d 48 c7 c6 9e 6c 26 8e 48 8b 54 24 08 8b 0c 24 44 8b 44 24 04 4d 89 e9 50 41 54 41 57 41 56 e8 3a 5a 79 f7 48 83 c4 20 90 <0f> 0b 0f 1f 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 f3 RSP: 0018:ffffc90003baf5b8 EFLAGS: 00010286 RAX: 0000000000000087 RBX: dffffc0000000000 RCX: 8565c1eec37aa000 RDX: 0000000000000000 RSI: 0000000080000000 RDI: 0000000000000000 RBP: ffff88802616fb50 R08: ffffffff817f0a4c R09: 1ffff92000775e50 R10: dffffc0000000000 R11: fffff52000775e51 R12: 0000000000000140 R13: ffff88807a1d5800 R14: ffff88807a1d5810 R15: 0000000000000014 FS: 00007fa03261f6c0(0000) GS:ffff8880b8600000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007ffd65753000 CR3: 0000000031720000 CR4: 00000000003526f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> skb_push+0xe5/0x100 net/core/skbuff.c:2636 vlan_get_tci+0x272/0x550 net/packet/af_packet.c:565 packet_recvmsg+0x13c9/0x1ef0 net/packet/af_packet.c:3616 sock_recvmsg_nosec net/socket.c:1044 [inline] sock_recvmsg+0x22f/0x280 net/socket.c:1066 ____sys_recvmsg+0x1c6/0x480 net/socket.c:2814 ___sys_recvmsg net/socket.c:2856 [inline] do_recvmmsg+0x426/0xab0 net/socket.c:2951 __sys_recvmmsg net/socket.c:3025 [inline] __do_sys_recvmmsg net/socket.c:3048 [inline] __se_sys_recvmmsg net/socket.c:3041 [inline] __x64_sys_recvmmsg+0x199/0x250 net/socket.c:3041 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83
--- net/packet/af_packet.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-)
net/packet/af_packet.c +3 -9
@@ -538,10 +538,8 @@ static void *packet_current_frame(struct packet_sock *po,return packet_lookup_frame (po, rb, rb->head, status); } -static u16 vlan_get_tci (struct sk_buff *skb,struct net_device *dev) +static u16 vlan_get_tci (const struct sk_buff *skb,struct net_device *dev) { -u8 *skb_orig_data = skb->data; -int skb_orig_len = skb->len;struct vlan_hdr vhdr, *vh;unsigned int header_len;
@@ -562,12 +560,8 @@ static u16 vlan_get_tci(struct sk_buff *skb, struct net_device *dev)else return 0 ; -skb_push (skb, skb->data -skb_mac_header (skb)); - vh =skb_header_pointer (skb, header_len,sizeof (vhdr), &vhdr); -if (skb_orig_data != skb->data) { - skb->data = skb_orig_data; - skb->len = skb_orig_len; - } + vh =skb_header_pointer (skb,skb_mac_offset (skb) + header_len, +sizeof (vhdr), &vhdr);if (unlikely (!vh))return 0 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 175/222 af_packet: fix vlan_get_protocol_dgram() vs MSG_PEEK
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit f91a5b8089389eb408501af2762f168c3aaa7b79 ]
Blamed commit forgot MSG_PEEK case, allowing a crash [1] as found by syzbot.
Rework vlan_get_protocol_dgram() to not touch skb at all, so that it can be used from many cpus on the same skb.
Add a const qualifier to skb argument.
[1]
skbuff: skb_under_panic: text:ffffffff8a8ccd05 len:29 put:14 head:ffff88807fc8e400 data:ffff88807fc8e3f4 tail:0x11 end:0x140 dev:<NULL>
------------[ cut here ]------------ kernel BUG at net/core/skbuff.c:206 ! Oops: invalid opcode: 0000 [#1] PREEMPT SMP KASAN PTI CPU: 1 UID: 0 PID: 5892 Comm: syz-executor883 Not tainted 6.13.0-rc4-syzkaller-00054-gd6ef8b40d075 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024 RIP: 0010:skb_panic net/core/skbuff.c:206 [inline] RIP: 0010:skb_under_panic+0x14b/0x150 net/core/skbuff.c:216 Code: 0b 8d 48 c7 c6 86 d5 25 8e 48 8b 54 24 08 8b 0c 24 44 8b 44 24 04 4d 89 e9 50 41 54 41 57 41 56 e8 5a 69 79 f7 48 83 c4 20 90 <0f> 0b 0f 1f 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 f3 RSP: 0018:ffffc900038d7638 EFLAGS: 00010282 RAX: 0000000000000087 RBX: dffffc0000000000 RCX: 609ffd18ea660600 RDX: 0000000000000000 RSI: 0000000080000000 RDI: 0000000000000000 RBP: ffff88802483c8d0 R08: ffffffff817f0a8c R09: 1ffff9200071ae60 R10: dffffc0000000000 R11: fffff5200071ae61 R12: 0000000000000140 R13: ffff88807fc8e400 R14: ffff88807fc8e3f4 R15: 0000000000000011 FS: 00007fbac5e006c0(0000) GS:ffff8880b8700000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007fbac5e00d58 CR3: 000000001238e000 CR4: 00000000003526f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> skb_push+0xe5/0x100 net/core/skbuff.c:2636 vlan_get_protocol_dgram+0x165/0x290 net/packet/af_packet.c:585 packet_recvmsg+0x948/0x1ef0 net/packet/af_packet.c:3552 sock_recvmsg_nosec net/socket.c:1033 [inline] sock_recvmsg+0x22f/0x280 net/socket.c:1055 ____sys_recvmsg+0x1c6/0x480 net/socket.c:2803 ___sys_recvmsg net/socket.c:2845 [inline] do_recvmmsg+0x426/0xab0 net/socket.c:2940 __sys_recvmmsg net/socket.c:3014 [inline] __do_sys_recvmmsg net/socket.c:3037 [inline] __se_sys_recvmmsg net/socket.c:3030 [inline] __x64_sys_recvmmsg+0x199/0x250 net/socket.c:3030 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f
--- include/linux/if_vlan.h | 16 +++++++++++++--- net/packet/af_packet.c | 16 ++++------------ 2 files changed, 17 insertions(+), 15 deletions(-)
include/linux/if_vlan.h +13 -3
@@ -585,13 +585,16 @@ static inline int vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci)* vlan_get_protocol - get protocol EtherType. * @skb: skbuff to query * @type: first vlan protocol +* @mac_offset: MAC offset * @depth: buffer to store length of eth and vlan tags in bytes * * Returns the EtherType of the packet, regardless of whether it is * vlan encapsulated (normal or hardware accelerated) or not. */ -static inline __be16 __vlan_get_protocol (const struct sk_buff *skb,__be16 type, -int *depth) +static inline __be16 __vlan_get_protocol_offset (const struct sk_buff *skb, +__be16 type, +int mac_offset, +int *depth) {unsigned int vlan_depth = skb->mac_len, parse_depth =VLAN_MAX_DEPTH ;
@@ -610,7 +613,8 @@ static inline __be16 __vlan_get_protocol(const struct sk_buff *skb, __be16 type, do { struct vlan_hdr vhdr, *vh; - vh = skb_header_pointer(skb, vlan_depth, sizeof(vhdr), &vhdr); + vh = skb_header_pointer(skb, mac_offset + vlan_depth, + sizeof(vhdr), &vhdr); if (unlikely(!vh || !--parse_depth)) return 0;
@@ -625,6 +629,12 @@ static inline __be16 __vlan_get_protocol(const struct sk_buff *skb, __be16 type,return type; } +static inline __be16 __vlan_get_protocol (const struct sk_buff *skb,__be16 type, +int *depth) +{ +return __vlan_get_protocol_offset (skb, type,0 , depth); +} +/** * vlan_get_protocol - get protocol EtherType. * @skb: skbuff to query
net/packet/af_packet.c +4 -12
@@ -568,21 +568,13 @@ static u16 vlan_get_tci(const struct sk_buff *skb, struct net_device *dev)return ntohs (vh->h_vlan_TCI); } -static __be16 vlan_get_protocol_dgram (struct sk_buff *skb) +static __be16 vlan_get_protocol_dgram (const struct sk_buff *skb) {__be16 proto = skb->protocol; -if (unlikely (eth_type_vlan (proto))) { -u8 *skb_orig_data = skb->data; -int skb_orig_len = skb->len; - -skb_push (skb, skb->data -skb_mac_header (skb)); - proto =__vlan_get_protocol (skb, proto,NULL ); -if (skb_orig_data != skb->data) { - skb->data = skb_orig_data; - skb->len = skb_orig_len; - } - } +if (unlikely (eth_type_vlan (proto))) + proto =__vlan_get_protocol_offset (skb, proto, +skb_mac_offset (skb),NULL );return proto; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 176/222 ila: serialize calls to nf_register_net_hooks()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 260466b576bca0081a7d4acecc8e93687aa22d0e ]
syzbot found a race in ila_add_mapping() [1]
commit 031ae72825ce ("ila: call nf_unregister_net_hooks() sooner") attempted to fix a similar issue.
Looking at the syzbot repro, we have concurrent ILA_CMD_ADD commands.
Add a mutex to make sure at most one thread is calling nf_register_net_hooks().
[1]
BUG: KASAN: slab-use-after-free in rht_key_hashfn include/linux/rhashtable.h:159 [inline] BUG: KASAN: slab-use-after-free in __rhashtable_lookup.constprop.0+0x426/0x550 include/linux/rhashtable.h:604 Read of size 4 at addr ffff888028f40008 by task dhcpcd/5501 CPU: 1 UID: 0 PID: 5501 Comm: dhcpcd Not tainted 6.13.0-rc4-syzkaller-00054-gd6ef8b40d075 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024 Call Trace: <IRQ> __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:378 [inline] print_report+0xc3/0x620 mm/kasan/report.c:489 kasan_report+0xd9/0x110 mm/kasan/report.c:602 rht_key_hashfn include/linux/rhashtable.h:159 [inline] __rhashtable_lookup.constprop.0+0x426/0x550 include/linux/rhashtable.h:604 rhashtable_lookup include/linux/rhashtable.h:646 [inline] rhashtable_lookup_fast include/linux/rhashtable.h:672 [inline] ila_lookup_wildcards net/ipv6/ila/ila_xlat.c:127 [inline] ila_xlat_addr net/ipv6/ila/ila_xlat.c:652 [inline] ila_nf_input+0x1ee/0x620 net/ipv6/ila/ila_xlat.c:185 nf_hook_entry_hookfn include/linux/netfilter.h:154 [inline] nf_hook_slow+0xbb/0x200 net/netfilter/core.c:626 nf_hook.constprop.0+0x42e/0x750 include/linux/netfilter.h:269 NF_HOOK include/linux/netfilter.h:312 [inline] ipv6_rcv+0xa4/0x680 net/ipv6/ip6_input.c:309 __netif_receive_skb_one_core+0x12e/0x1e0 net/core/dev.c:5672 __netif_receive_skb+0x1d/0x160 net/core/dev.c:5785 process_backlog+0x443/0x15f0 net/core/dev.c:6117 __napi_poll.constprop.0+0xb7/0x550 net/core/dev.c:6883 napi_poll net/core/dev.c:6952 [inline] net_rx_action+0xa94/0x1010 net/core/dev.c:7074 handle_softirqs+0x213/0x8f0 kernel/softirq.c:561 __do_softirq kernel/softirq.c:595 [inline] invoke_softirq kernel/softirq.c:435 [inline] __irq_exit_rcu+0x109/0x170 kernel/softirq.c:662 irq_exit_rcu+0x9/0x30 kernel/softirq.c:678 instr_sysvec_apic_timer_interrupt arch/x86/kernel/apic/apic.c:1049 [inline] sysvec_apic_timer_interrupt+0xa4/0xc0 arch/x86/kernel/apic/apic.c:1049
--- net/ipv6/ila/ila_xlat.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
net/ipv6/ila/ila_xlat.c +11 -5
@@ -200,6 +200,8 @@ static const struct nf_hook_ops ila_nf_hook_ops[] = { }, }; +static DEFINE_MUTEX (ila_mutex); +static int ila_add_mapping (struct net *net,struct ila_xlat_params *xp) {struct ila_net *ilan =net_generic (net, ila_net_id);
@@ -207,16 +209,20 @@ static int ila_add_mapping(struct net *net, struct ila_xlat_params *xp)spinlock_t *lock =ila_get_lock (ilan, xp->ip.locator_match);int err =0 , order; -if (!ilan->xlat.hooks_registered) { +if (!READ_ONCE (ilan->xlat.hooks_registered)) {/* We defer registering net hooks in the namespace until the * first mapping is added. */ - err =nf_register_net_hooks (net, ila_nf_hook_ops, -ARRAY_SIZE (ila_nf_hook_ops)); +mutex_lock (&ila_mutex); +if (!ilan->xlat.hooks_registered) { + err =nf_register_net_hooks (net, ila_nf_hook_ops, +ARRAY_SIZE (ila_nf_hook_ops)); +if (!err) +WRITE_ONCE (ilan->xlat.hooks_registered, true); + } +mutex_unlock (&ila_mutex);if (err)return err; - - ilan->xlat.hooks_registered = true; } ila =kzalloc (sizeof (*ila),GFP_KERNEL );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 177/222 net: ti: icssg-prueth: Fix clearing of IEP_CMP_CFG registers during iep_init
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Meghana Malladi <[email protected]>
[ Upstream commit 9b115361248dc6cce182a2dc030c1c70b0a9639e ]
When ICSSG interfaces are brought down and brought up again, the pru cores are shut down and booted again, flushing out all the memories and start again in a clean state. Hence it is expected that the IEP_CMP_CFG register needs to be flushed during iep_init() to ensure that the existing residual configuration doesn't cause any unusual behavior. If the register is not cleared, existing IEP_CMP_CFG set for CMP1 will result in SYNC0_OUT signal based on the SYNC_OUT register values.
After bringing the interface up, calling PPS enable doesn't work as the driver believes PPS is already enabled, (iep->pps_enabled is not cleared during interface bring down) and driver will just return true even though there is no signal. Fix this by disabling pps and perout.
--- drivers/net/ethernet/ti/icssg/icss_iep.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/net/ethernet/ti/icssg/icss_iep.c +8 -0
@@ -290,6 +290,9 @@ static void icss_iep_enable_shadow_mode(struct icss_iep *iep)for (cmp =IEP_MIN_CMP ; cmp <IEP_MAX_CMP ; cmp++) {regmap_update_bits (iep->map,ICSS_IEP_CMP_STAT_REG ,IEP_CMP_STATUS (cmp),IEP_CMP_STATUS (cmp)); + +regmap_update_bits (iep->map,ICSS_IEP_CMP_CFG_REG , +IEP_CMP_CFG_CMP_EN (cmp),0 ); }/* enable reset counter on CMP0 event */
@@ -808,6 +811,11 @@ int icss_iep_exit(struct icss_iep *iep) }icss_iep_disable (iep); +if (iep->pps_enabled) +icss_iep_pps_enable (iep, false); +else if (iep->perout_enabled) +icss_iep_perout_enable (iep,NULL , false); +return 0 ; }EXPORT_SYMBOL_GPL (icss_iep_exit);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 178/222 wifi: mac80211: fix mbss changed flags corruption on 32 bit systems
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Issam Hamdi <[email protected]>
[ Upstream commit 49dba1ded8dd5a6a12748631403240b2ab245c34 ]
On 32-bit systems, the size of an unsigned long is 4 bytes, while a u64 is 8 bytes. Therefore, when using or_each_set_bit(bit, &bits, sizeof(changed) * BITS_PER_BYTE), the code is incorrectly searching for a bit in a 32-bit variable that is expected to be 64 bits in size, leading to incorrect bit finding.
Solution: Ensure that the size of the bits variable is correctly adjusted for each architecture.
Call Trace: ? show_regs+0x54/0x58 ? __warn+0x6b/0xd4 ? ieee80211_link_info_change_notify+0xcc/0xd4 [mac80211] ? report_bug+0x113/0x150 ? exc_overflow+0x30/0x30 ? handle_bug+0x27/0x44 ? exc_invalid_op+0x18/0x50 ? handle_exception+0xf6/0xf6 ? exc_overflow+0x30/0x30 ? ieee80211_link_info_change_notify+0xcc/0xd4 [mac80211] ? exc_overflow+0x30/0x30 ? ieee80211_link_info_change_notify+0xcc/0xd4 [mac80211] ? ieee80211_mesh_work+0xff/0x260 [mac80211] ? cfg80211_wiphy_work+0x72/0x98 [cfg80211] ? process_one_work+0xf1/0x1fc ? worker_thread+0x2c0/0x3b4 ? kthread+0xc7/0xf0 ? mod_delayed_work_on+0x4c/0x4c ? kthread_complete_and_exit+0x14/0x14 ? ret_from_fork+0x24/0x38 ? kthread_complete_and_exit+0x14/0x14 ? ret_from_fork_asm+0xf/0x14 ? entry_INT80_32+0xf0/0xf0
--- net/mac80211/mesh.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/mac80211/mesh.c +3 -3
@@ -1173,14 +1173,14 @@ void ieee80211_mbss_info_change_notify(struct ieee80211_sub_if_data *sdata, u64 changed) {struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; -unsigned long bits = changed; +unsigned long bits[] = {BITMAP_FROM_U64 (changed) };u32 bit; -if (!bits) +if (!changed)return ;/* if we race with running work, worst case this work becomes a noop */ -for_each_set_bit (bit, &bits,sizeof (changed) *BITS_PER_BYTE ) +for_each_set_bit (bit, bits,sizeof (changed) *BITS_PER_BYTE )set_bit (bit, ifmsh->mbss_changed);set_bit (MESH_WORK_MBSS_CHANGED , &ifmsh->wrkq_flags);wiphy_work_queue (sdata->local->hw.wiphy, &sdata->work);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 179/222 wifi: mac80211: wake the queues in case of failure in resume
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emmanuel Grumbach <[email protected]>
[ Upstream commit 220bf000530f9b1114fa2a1022a871c7ce8a0b38 ]
In case we fail to resume, we'll WARN with
"Hardware became unavailable during restart." and we'll wait until user space does something. It'll typically bring the interface down and up to recover. This won't work though because the queues are still stopped on IEEE80211_QUEUE_STOP_REASON_SUSPEND reason.
Make sure we clear that reason so that we give a chance to the recovery to succeed.
--- net/mac80211/util.c | 3 +++ 1 file changed, 3 insertions(+)
net/mac80211/util.c +3 -0
@@ -2586,6 +2586,9 @@ int ieee80211_reconfig(struct ieee80211_local *local)WARN (1 ,"Hardware became unavailable upon resume. This could be a software issue prior to suspend or a hardware issue.\n" ); else WARN(1, "Hardware became unavailable during restart.\n"); +ieee80211_wake_queues_by_reason (hw,IEEE80211_MAX_QUEUE_MAP , +IEEE80211_QUEUE_STOP_REASON_SUSPEND , + false);ieee80211_handle_reconfig_failure (local);return res; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 180/222 drm/amdkfd: Correct the migration DMA map direction
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Prike Liang <[email protected]>
[ Upstream commit 5c3de6b02d38eb9386edf50490e050bb44398e40 ]
The SVM DMA device map direction should be set the same as the DMA unmap setting, otherwise the DMA core will report the following warning.
Before finialize this solution, there're some discussion on the DMA mapping type(stream-based or coherent) in this KFD migration case, followed by https://lore.kernel.org/all/04d4ab32
[email protected]/T/.
As there's no dma_sync_single_for_*() in the DMA buffer accessed that because this migration operation should be sync properly and automatically. Give that there's might not be a performance problem in various cache sync policy of DMA sync. Therefore, in order to simplify the DMA direction setting alignment, let's set the DMA map direction as BIDIRECTIONAL.
[ 150.834218] WARNING: CPU: 8 PID: 1812 at kernel/dma/debug.c:1028 check_unmap+0x1cc/0x930 [ 150.834225] Modules linked in: amdgpu(OE) amdxcp drm_exec(OE) gpu_sched drm_buddy(OE) drm_ttm_helper(OE) ttm(OE) drm_suballoc_helper(OE) drm_display_helper(OE) drm_kms_helper(OE) i2c_algo_bit rpcsec_gss_krb5 auth_rpcgss nfsv4 nfs lockd grace netfs xt_conntrack xt_MASQUERADE nf_conntrack_netlink xfrm_user xfrm_algo iptable_nat xt_addrtype iptable_filter br_netfilter nvme_fabrics overlay nfnetlink_cttimeout nfnetlink openvswitch nsh nf_conncount nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 libcrc32c bridge stp llc sch_fq_codel intel_rapl_msr amd_atl intel_rapl_common snd_hda_codec_realtek snd_hda_codec_generic snd_hda_scodec_component snd_hda_codec_hdmi snd_hda_intel snd_intel_dspcfg edac_mce_amd snd_pci_acp6x snd_hda_codec snd_acp_config snd_hda_core snd_hwdep snd_soc_acpi kvm_amd sunrpc snd_pcm kvm binfmt_misc snd_seq_midi crct10dif_pclmul snd_seq_midi_event ghash_clmulni_intel sha512_ssse3 snd_rawmidi nls_iso8859_1 sha256_ssse3 sha1_ssse3 snd_seq aesni_intel snd_seq_device crypto_simd snd_timer cryptd input_leds [ 150.834310] wmi_bmof serio_raw k10temp rapl snd sp5100_tco ipmi_devintf soundcore ccp ipmi_msghandler cm32181 industrialio mac_hid msr parport_pc ppdev lp parport efi_pstore drm(OE) ip_tables x_tables pci_stub crc32_pclmul nvme ahci libahci i2c_piix4 r8169 nvme_core i2c_designware_pci realtek i2c_ccgx_ucsi video wmi hid_generic cdc_ether usbnet usbhid hid r8152 mii [ 150.834354] CPU: 8 PID: 1812 Comm: rocrtst64 Tainted: G OE 6.10.0-custom #492 [ 150.834358] Hardware name: AMD Majolica-RN/Majolica-RN, BIOS RMJ1009A 06/13/2021 [ 150.834360] RIP: 0010:check_unmap+0x1cc/0x930 [ 150.834363] Code: c0 4c 89 4d c8 e8 34 bf 86 00 4c 8b 4d c8 4c 8b 45 c0 48 8b 4d b8 48 89 c6 41 57 4c 89 ea 48 c7 c7 80 49 b4 84 e8 b4 81 f3 ff <0f> 0b 48 c7 c7 04 83 ac 84 e8 76 ba fc ff 41 8b 76 4c 49 8d 7e 50 [ 150.834365] RSP: 0018:ffffaac5023739e0 EFLAGS: 00010086 [ 150.834368] RAX: 0000000000000000 RBX: ffffffff8566a2e0 RCX: 0000000000000027 [ 150.834370] RDX: ffff8f6a8f621688 RSI: 0000000000000001 RDI: ffff8f6a8f621680 [ 150.834372] RBP: ffffaac502373a30 R08: 00000000000000c9 R09: ffffaac502373850 [ 150.834373] R10: ffffaac502373848 R11: ffffffff84f46328 R12: ffffaac502373a40 [ 150.834375] R13: ffff8f6741045330 R14: ffff8f6741a77700 R15: ffffffff84ac831b [ 150.834377] FS: 00007faf0fc94c00(0000) GS:ffff8f6a8f600000(0000) knlGS:0000000000000000 [ 150.834379] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 150.834381] CR2: 00007faf0b600020 CR3: 000000010a52e000 CR4: 0000000000350ef0 [ 150.834383] Call Trace: [ 150.834385] <TASK> [ 150.834387] ? show_regs+0x6d/0x80 [ 150.834393] ? __warn+0x8c/0x140 [ 150.834397] ? check_unmap+0x1cc/0x930 [ 150.834400] ? report_bug+0x193/0x1a0 [ 150.834406] ? handle_bug+0x46/0x80 [ 150.834410] ? exc_invalid_op+0x1d/0x80 [ 150.834413] ? asm_exc_invalid_op+0x1f/0x30 [ 150.834420] ? check_unmap+0x1cc/0x930 [ 150.834425] debug_dma_unmap_page+0x86/0x90 [ 150.834431] ? srso_return_thunk+0x5/0x5f [ 150.834435] ? rmap_walk+0x28/0x50 [ 150.834438] ? srso_return_thunk+0x5/0x5f [ 150.834441] ? remove_migration_ptes+0x79/0x80 [ 150.834445] ? srso_return_thunk+0x5/0x5f [ 150.834448] dma_unmap_page_attrs+0xfa/0x1d0 [ 150.834453] svm_range_dma_unmap_dev+0x8a/0xf0 [amdgpu] [ 150.834710] svm_migrate_ram_to_vram+0x361/0x740 [amdgpu] [ 150.834914] svm_migrate_to_vram+0xa8/0xe0 [amdgpu] [ 150.835111] svm_range_set_attr+0xff2/0x1450 [amdgpu] [ 150.835311] svm_ioctl+0x4a/0x50 [amdgpu] [ 150.835510] kfd_ioctl_svm+0x54/0x90 [amdgpu] [ 150.835701] kfd_ioctl+0x3c2/0x530 [amdgpu] [ 150.835888] ? __pfx_kfd_ioctl_svm+0x10/0x10 [amdgpu] [ 150.836075] ? srso_return_thunk+0x5/0x5f [ 150.836080] ? tomoyo_file_ioctl+0x20/0x30 [ 150.836086] __x64_sys_ioctl+0x9c/0xd0 [ 150.836091] x64_sys_call+0x1219/0x20d0 [ 150.836095] do_syscall_64+0x51/0x120 [ 150.836098] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 150.836102] RIP: 0033:0x7faf0f11a94f [ 150.836105] Code: 00 48 89 44 24 18 31 c0 48 8d 44 24 60 c7 04 24 10 00 00 00 48 89 44 24 08 48 8d 44 24 20 48 89 44 24 10 b8 10 00 00 00 0f 05 <41> 89 c0 3d 00 f0 ff ff 77 1f 48 8b 44 24 18 64 48 2b 04 25 28 00 [ 150.836107] RSP: 002b:00007ffeced26bc0 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 [ 150.836110] RAX: ffffffffffffffda RBX: 000055c683528fb0 RCX: 00007faf0f11a94f [ 150.836112] RDX: 00007ffeced26c60 RSI: 00000000c0484b20 RDI: 0000000000000003 [ 150.836114] RBP: 00007ffeced26c50 R08: 0000000000000000 R09: 0000000000000001 [ 150.836115] R10: 0000000000000032 R11: 0000000000000246 R12: 000055c683528bd0 [ 150.836117] R13: 0000000000000000 R14: 0000000000000021 R15: 0000000000000000 [ 150.836122] </TASK> [ 150.836124] ---[ end trace 0000000000000000 ]---
--- drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_migrate.c +2 -2
@@ -319,7 +319,7 @@ svm_migrate_copy_to_vram(struct kfd_node *node, struct svm_range *prange, spage =migrate_pfn_to_page (migrate->src[i]);if (spage && !is_zone_device_page (spage)) { src[i] =dma_map_page (dev, spage,0 ,PAGE_SIZE , -DMA_TO_DEVICE ); +DMA_BIDIRECTIONAL ); r =dma_mapping_error (dev, src[i]);if (r) { dev_err(dev, "%s: fail %d dma_map_page\n",
@@ -634,7 +634,7 @@ svm_migrate_copy_to_ram(struct amdgpu_device *adev, struct svm_range *prange, goto out_oom; } - dst[i] =dma_map_page (dev, dpage,0 ,PAGE_SIZE ,DMA_FROM_DEVICE ); + dst[i] =dma_map_page (dev, dpage,0 ,PAGE_SIZE ,DMA_BIDIRECTIONAL ); r =dma_mapping_error (dev, dst[i]);if (r) {dev_err (adev->dev,"%s: fail %d dma_map_page\n" , __func__, r);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 181/222 btrfs: flush delalloc workers queue before stopping cleaner kthread during unmount
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
[ Upstream commit f10bef73fb355e3fc85e63a50386798be68ff486 ]
During the unmount path, at close_ctree(), we first stop the cleaner kthread, using kthread_stop() which frees the associated task_struct, and then stop and destroy all the work queues. However after we stopped the cleaner we may still have a worker from the delalloc_workers queue running inode.c:submit_compressed_extents(), which calls btrfs_add_delayed_iput(), which in turn tries to wake up the cleaner kthread - which was already destroyed before, resulting in a use-after-free on the task_struct.
Syzbot reported this with the following stack traces:
BUG: KASAN: slab-use-after-free in __lock_acquire+0x78/0x2100 kernel/locking/lockdep.c:5089
Read of size 8 at addr ffff8880259d2818 by task kworker/u8:3/52
CPU: 1 UID: 0 PID: 52 Comm: kworker/u8:3 Not tainted 6.13.0-rc1-syzkaller-00002-gcdd30ebb1b9f #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024
Workqueue: btrfs-delalloc btrfs_work_helper
Call Trace:
<TASK>
__dump_stack lib/dump_stack.c:94 [inline]
dump_stack_lvl+0x241/0x360 lib/dump_stack.c:120
print_address_description mm/kasan/report.c:378 [inline]
print_report+0x169/0x550 mm/kasan/report.c:489
kasan_report+0x143/0x180 mm/kasan/report.c:602
__lock_acquire+0x78/0x2100 kernel/locking/lockdep.c:5089
lock_acquire+0x1ed/0x550 kernel/locking/lockdep.c:5849
__raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline]
_raw_spin_lock_irqsave+0xd5/0x120 kernel/locking/spinlock.c:162
class_raw_spinlock_irqsave_constructor include/linux/spinlock.h:551 [inline]
try_to_wake_up+0xc2/0x1470 kernel/sched/core.c:4205
submit_compressed_extents+0xdf/0x16e0 fs/btrfs/inode.c:1615
run_ordered_work fs/btrfs/async-thread.c:288 [inline]
btrfs_work_helper+0x96f/0xc40 fs/btrfs/async-thread.c:324
process_one_work kernel/workqueue.c:3229 [inline]
process_scheduled_works+0xa66/0x1840 kernel/workqueue.c:3310
worker_thread+0x870/0xd30 kernel/workqueue.c:3391
kthread+0x2f0/0x390 kernel/kthread.c:389
ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244
</TASK>
Allocated by task 2:
kasan_save_stack mm/kasan/common.c:47 [inline]
kasan_save_track+0x3f/0x80 mm/kasan/common.c:68
unpoison_slab_object mm/kasan/common.c:319 [inline]
__kasan_slab_alloc+0x66/0x80 mm/kasan/common.c:345
kasan_slab_alloc include/linux/kasan.h:250 [inline]
slab_post_alloc_hook mm/slub.c:4104 [inline]
slab_alloc_node mm/slub.c:4153 [inline]
kmem_cache_alloc_node_noprof+0x1d9/0x380 mm/slub.c:4205
alloc_task_struct_node kernel/fork.c:180 [inline]
dup_task_struct+0x57/0x8c0 kernel/fork.c:1113
copy_process+0x5d1/0x3d50 kernel/fork.c:2225
kernel_clone+0x223/0x870 kernel/fork.c:2807
kernel_thread+0x1bc/0x240 kernel/fork.c:2869
create_kthread kernel/kthread.c:412 [inline]
kthreadd+0x60d/0x810 kernel/kthread.c:767
ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244
Freed by task 24:
kasan_save_stack mm/kasan/common.c:47 [inline]
kasan_save_track+0x3f/0x80 mm/kasan/common.c:68
kasan_save_free_info+0x40/0x50 mm/kasan/generic.c:582
poison_slab_object mm/kasan/common.c:247 [inline]
__kasan_slab_free+0x59/0x70 mm/kasan/common.c:264
kasan_slab_free include/linux/kasan.h:233 [inline]
slab_free_hook mm/slub.c:2338 [inline]
slab_free mm/slub.c:4598 [inline]
kmem_cache_free+0x195/0x410 mm/slub.c:4700
put_task_struct include/linux/sched/task.h:144 [inline]
delayed_put_task_struct+0x125/0x300 kernel/exit.c:227
rcu_do_batch kernel/rcu/tree.c:2567 [inline]
rcu_core+0xaaa/0x17a0 kernel/rcu/tree.c:2823
handle_softirqs+0x2d4/0x9b0 kernel/softirq.c:554
run_ksoftirqd+0xca/0x130 kernel/softirq.c:943
smpboot_thread_fn+0x544/0xa30 kernel/smpboot.c:164
kthread+0x2f0/0x390 kernel/kthread.c:389
ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244
Last potentially related work creation:
kasan_save_stack+0x3f/0x60 mm/kasan/common.c:47
__kasan_record_aux_stack+0xac/0xc0 mm/kasan/generic.c:544
__call_rcu_common kernel/rcu/tree.c:3086 [inline]
call_rcu+0x167/0xa70 kernel/rcu/tree.c:3190
context_switch kernel/sched/core.c:5372 [inline]
__schedule+0x1803/0x4be0 kernel/sched/core.c:6756
__schedule_loop kernel/sched/core.c:6833 [inline]
schedule+0x14b/0x320 kernel/sched/core.c:6848
schedule_timeout+0xb0/0x290 kernel/time/sleep_timeout.c:75
do_wait_for_common kernel/sched/completion.c:95 [inline]
__wait_for_common kernel/sched/completion.c:116 [inline]
wait_for_common kernel/sched/completion.c:127 [inline]
wait_for_completion+0x355/0x620 kernel/sched/completion.c:148
kthread_stop+0x19e/0x640 kernel/kthread.c:712
close_ctree+0x524/0xd60 fs/btrfs/disk-io.c:4328
generic_shutdown_super+0x139/0x2d0 fs/super.c:642
kill_anon_super+0x3b/0x70 fs/super.c:1237
btrfs_kill_super+0x41/0x50 fs/btrfs/super.c:2112
deactivate_locked_super+0xc4/0x130 fs/super.c:473
cleanup_mnt+0x41f/0x4b0 fs/namespace.c:1373
task_work_run+0x24f/0x310 kernel/task_work.c:239
ptrace_notify+0x2d2/0x380 kernel/signal.c:2503
ptrace_report_syscall include/linux/ptrace.h:415 [inline]
ptrace_report_syscall_exit include/linux/ptrace.h:477 [inline]
syscall_exit_work+0xc7/0x1d0 kernel/entry/common.c:173
syscall_exit_to_user_mode_prepare kernel/entry/common.c:200 [inline]
__syscall_exit_to_user_mode_work kernel/entry/common.c:205 [inline]
syscall_exit_to_user_mode+0x24a/0x340 kernel/entry/common.c:218
do_syscall_64+0x100/0x230 arch/x86/entry/common.c:89
entry_SYSCALL_64_after_hwframe+0x77/0x7f
The buggy address belongs to the object at ffff8880259d1e00
which belongs to the cache task_struct of size 7424
The buggy address is located 2584 bytes inside of
freed 7424-byte region [ffff8880259d1e00, ffff8880259d3b00)
The buggy address belongs to the physical page:
page: refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x259d0
head: order:3 mapcount:0 entire_mapcount:0 nr_pages_mapped:0 pincount:0
memcg:ffff88802f4b56c1
flags: 0xfff00000000040(head|node=0|zone=1|lastcpupid=0x7ff)
page_type: f5(slab)
raw: 00fff00000000040 ffff88801bafe500 dead000000000100 dead000000000122
raw: 0000000000000000 0000000000040004 00000001f5000000 ffff88802f4b56c1
head: 00fff00000000040 ffff88801bafe500 dead000000000100 dead000000000122
head: 0000000000000000 0000000000040004 00000001f5000000 ffff88802f4b56c1
head: 00fff00000000003 ffffea0000967401 ffffffffffffffff 0000000000000000
head: 0000000000000008 0000000000000000 00000000ffffffff 0000000000000000
page dumped because: kasan: bad access detected
page_owner tracks the page as allocated
page last allocated via order 3, migratetype Unmovable, gfp_mask 0xd20c0(__GFP_IO|__GFP_FS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC), pid 12, tgid 12 (kworker/u8:1), ts 7328037942, free_ts 0
set_page_owner include/linux/page_owner.h:32 [inline]
post_alloc_hook+0x1f3/0x230 mm/page_alloc.c:1556
prep_new_page mm/page_alloc.c:1564 [inline]
get_page_from_freelist+0x3651/0x37a0 mm/page_alloc.c:3474
__alloc_pages_noprof+0x292/0x710 mm/page_alloc.c:4751
alloc_pages_mpol_noprof+0x3e8/0x680 mm/mempolicy.c:2265
alloc_slab_page+0x6a/0x140 mm/slub.c:2408
allocate_slab+0x5a/0x2f0 mm/slub.c:2574
new_slab mm/slub.c:2627 [inline]
___slab_alloc+0xcd1/0x14b0 mm/slub.c:3815
__slab_alloc+0x58/0xa0 mm/slub.c:3905
__slab_alloc_node mm/slub.c:3980 [inline]
slab_alloc_node mm/slub.c:4141 [inline]
kmem_cache_alloc_node_noprof+0x269/0x380 mm/slub.c:4205
alloc_task_struct_node kernel/fork.c:180 [inline]
dup_task_struct+0x57/0x8c0 kernel/fork.c:1113
copy_process+0x5d1/0x3d50 kernel/fork.c:2225
kernel_clone+0x223/0x870 kernel/fork.c:2807
user_mode_thread+0x132/0x1a0 kernel/fork.c:2885
call_usermodehelper_exec_work+0x5c/0x230 kernel/umh.c:171
process_one_work kernel/workqueue.c:3229 [inline]
process_scheduled_works+0xa66/0x1840 kernel/workqueue.c:3310
worker_thread+0x870/0xd30 kernel/workqueue.c:3391
page_owner free stack trace missing
Memory state around the buggy address:
ffff8880259d2700: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff8880259d2780: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
>ffff8880259d2800: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff8880259d2880: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff8880259d2900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
==================================================================Fix this by flushing the delalloc workers queue before stopping the cleaner kthread.
--- fs/btrfs/disk-io.c | 9 +++++++++ 1 file changed, 9 insertions(+)
fs/btrfs/disk-io.c +9 -0
@@ -4323,6 +4323,15 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info)* already the cleaner, but below we run all pending delayed iputs. */ btrfs_flush_workqueue (fs_info->fixup_workers); +/* +* Similar case here, we have to wait for delalloc workers before we +* proceed below and stop the cleaner kthread, otherwise we trigger a +* use-after-tree on the cleaner kthread task_struct when a delalloc +* worker running submit_compressed_extents() adds a delayed iput, which +* does a wake up on the cleaner kthread, which was already freed below +* when we call kthread_stop(). +*/ +btrfs_flush_workqueue (fs_info->delalloc_workers);/* * After we parked the cleaner kthread, ordered extents may have
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 182/222 ALSA: hda/ca0132: Use standard HD-audio quirk matching helpers
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 7c005292e20ac53dfa601bf2a7375fd4815511ad ]
CA0132 used the PCI SSID lookup helper that doesn't support the model string matching or quirk aliasing.
Replace it with the standard HD-audio quirk helpers for supporting those, and add the definition of the model strings for supported quirks, too. There should be no visible change to the outside for the working system, but the driver will parse the model option and apply the quirk based on it from now on.
--- sound/pci/hda/patch_ca0132.c | 37 ++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-)
sound/pci/hda/patch_ca0132.c +21 -16
@@ -1134,7 +1134,6 @@ struct ca0132_spec {struct hda_codec *codec;struct delayed_work unsol_hp_work; -int quirk;#ifdef ENABLE_TUNING_CONTROLS long cur_ctl_vals[TUNING_CTLS_COUNT ];
@@ -1166,7 +1165,6 @@ struct ca0132_spec {* CA0132 quirks table */ enum { -QUIRK_NONE ,QUIRK_ALIENWARE ,QUIRK_ALIENWARE_M17XR4 ,QUIRK_SBZ ,
@@ -1176,10 +1174,11 @@ enum {QUIRK_R3D ,QUIRK_AE5 ,QUIRK_AE7 , + QUIRK_NONE = HDA_FIXUP_ID_NOT_SET, };#ifdef CONFIG_PCI -#define ca0132_quirk (spec) ((spec)->quirk) +#define ca0132_quirk (spec) ((spec)->codec->fixup_id)#define ca0132_use_pci_mmio (spec) ((spec)->use_pci_mmio)#define ca0132_use_alt_functions (spec) ((spec)->use_alt_functions)#define ca0132_use_alt_controls (spec) ((spec)->use_alt_controls)
@@ -1293,7 +1292,7 @@ static const struct hda_pintbl ae7_pincfgs[] = { {} }; -static const struct snd_pci_quirk ca0132_quirks[] = { +static const struct hda_quirk ca0132_quirks[] = {SND_PCI_QUIRK (0x1028 ,0x057b ,"Alienware M17x R4" ,QUIRK_ALIENWARE_M17XR4 ),SND_PCI_QUIRK (0x1028 ,0x0685 ,"Alienware 15 2015" ,QUIRK_ALIENWARE ),SND_PCI_QUIRK (0x1028 ,0x0688 ,"Alienware 17 2015" ,QUIRK_ALIENWARE ),
@@ -1316,6 +1315,19 @@ static const struct snd_pci_quirk ca0132_quirks[] = { {} }; +static const struct hda_model_fixup ca0132_quirk_models[] = { + { .id =QUIRK_ALIENWARE , .name ="alienware" }, + { .id =QUIRK_ALIENWARE_M17XR4 , .name ="alienware-m17xr4" }, + { .id =QUIRK_SBZ , .name ="sbz" }, + { .id =QUIRK_ZXR , .name ="zxr" }, + { .id =QUIRK_ZXR_DBPRO , .name ="zxr-dbpro" }, + { .id =QUIRK_R3DI , .name ="r3di" }, + { .id =QUIRK_R3D , .name ="r3d" }, + { .id =QUIRK_AE5 , .name ="ae5" }, + { .id =QUIRK_AE7 , .name ="ae7" }, + {} +}; +/* Output selection quirk info structures. */ #define MAX_QUIRK_MMIO_GPIO_SET_VALS 3#define MAX_QUIRK_SCP_SET_VALS 2
@@ -9962,17 +9974,15 @@ static int ca0132_prepare_verbs(struct hda_codec *codec)*/ static void sbz_detect_quirk (struct hda_codec *codec) { -struct ca0132_spec *spec = codec->spec; -switch (codec->core.subsystem_id) {case 0x11020033 : - spec->quirk =QUIRK_ZXR ; + codec->fixup_id =QUIRK_ZXR ;break ;case 0x1102003f : - spec->quirk =QUIRK_ZXR_DBPRO ; + codec->fixup_id =QUIRK_ZXR_DBPRO ;break ;default : - spec->quirk =QUIRK_SBZ ; + codec->fixup_id =QUIRK_SBZ ;break ; } }
@@ -9981,7 +9991,6 @@ static int patch_ca0132(struct hda_codec *codec) {struct ca0132_spec *spec;int err; -const struct snd_pci_quirk *quirk;codec_dbg (codec,"patch_ca0132\n" );
@@ -9992,11 +10001,7 @@ static int patch_ca0132(struct hda_codec *codec) spec->codec = codec;/* Detect codec quirk */ - quirk =snd_pci_quirk_lookup (codec->bus->pci, ca0132_quirks); -if (quirk) - spec->quirk = quirk->value; -else - spec->quirk =QUIRK_NONE ; +snd_hda_pick_fixup (codec, ca0132_quirk_models, ca0132_quirks,NULL );if (ca0132_quirk (spec) ==QUIRK_SBZ )sbz_detect_quirk (codec);
@@ -10073,7 +10078,7 @@ static int patch_ca0132(struct hda_codec *codec) spec->mem_base =pci_iomap (codec->bus->pci,2 ,0xC20 );if (spec->mem_base ==NULL ) {codec_warn (codec,"pci_iomap failed! Setting quirk to QUIRK_NONE." ); - spec->quirk =QUIRK_NONE ; + codec->fixup_id =QUIRK_NONE ; } }#endif
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 183/222 ALSA: hda/realtek: Add new alc2xx-fixup-headset-mic model
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vasiliy Kovalev <[email protected]>
[ Upstream commit 50db91fccea0da5c669bc68e2429e8de303758d3 ]
Introduces the alc2xx-fixup-headset-mic model to simplify enabling headset microphones on ALC2XX codecs.
Many recent configurations, as well as older systems that lacked this fix for a long time, leave headset microphones inactive by default. This addition provides a flexible workaround using the existing ALC2XX_FIXUP_HEADSET_MIC quirk.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -10631,6 +10631,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = { {.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"}, {.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"}, {.id = ALC236_FIXUP_LENOVO_INV_DMIC, .name = "alc236-fixup-lenovo-inv-mic"}, + {.id = ALC2XX_FIXUP_HEADSET_MIC, .name = "alc2xx-fixup-headset-mic"}, {} };#define ALC225_STANDARD_PINS \
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 184/222 sound: usb: enable DSD output for ddHiFi TC44C
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Ratiu <[email protected]>
[ Upstream commit c84bd6c810d1880194fea2229c7086e4b73fddc1 ]
This is a UAC 2 DAC capable of raw DSD on intf 2 alt 4:
Bus 007 Device 004: ID 262a:9302 SAVITECH Corp. TC44C Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 239 Miscellaneous Device
bDeviceSubClass 2 [unknown]
bDeviceProtocol 1 Interface Association
bMaxPacketSize0 64
idVendor 0x262a SAVITECH Corp.
idProduct 0x9302 TC44C
bcdDevice 0.01
iManufacturer 1 DDHIFI iProduct 2 TC44C iSerial 6 5000000001
.......
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 4
bNumEndpoints 2
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 32
iInterface 0
AudioStreaming Interface Descriptor:
bLength 16
bDescriptorType 36
bDescriptorSubtype 1 (AS_GENERAL)
bTerminalLink 3
bmControls 0x00
bFormatType 1
bmFormats 0x80000000
bNrChannels 2
bmChannelConfig 0x00000000
iChannelNames 0
.......
--- sound/usb/quirks.c | 2 ++ 1 file changed, 2 insertions(+)
sound/usb/quirks.c +2 -0
@@ -2225,6 +2225,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { QUIRK_FLAG_DSD_RAW),DEVICE_FLG (0x2522 ,0x0007 ,/* LH Labs Geek Out HD Audio 1V5 */ QUIRK_FLAG_SET_IFACE_FIRST ), +DEVICE_FLG (0x262a ,0x9302 ,/* ddHiFi TC44C */ +QUIRK_FLAG_DSD_RAW ),DEVICE_FLG (0x2708 ,0x0002 ,/* Audient iD14 */ QUIRK_FLAG_IGNORE_CTL_ERROR ), DEVICE_FLG(0x2912, 0x30c8, /* Audioengine D1 */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 185/222 sound: usb: format: dont warn that raw DSD is unsupported
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Ratiu <[email protected]>
[ Upstream commit b50a3e98442b8d72f061617c7f7a71f7dba19484 ]
UAC 2 & 3 DAC's set bit 31 of the format to signal support for a RAW_DATA type, typically used for DSD playback.
This is correctly tested by (format & UAC*_FORMAT_TYPE_I_RAW_DATA), fp->dsd_raw = true; and call snd_usb_interface_dsd_format_quirks(), however a confusing and unnecessary message gets printed because the bit is not properly tested in the last "unsupported" if test:
if (format & ~0x3F) { ... }
For example the output:
usb 7-1: new high-speed USB device number 5 using xhci_hcd
usb 7-1: New USB device found, idVendor=262a, idProduct=9302, bcdDevice=0.01
usb 7-1: New USB device strings: Mfr=1, Product=2, SerialNumber=6
usb 7-1: Product: TC44C
usb 7-1: Manufacturer: TC44C
usb 7-1: SerialNumber: 5000000001
hid-generic 0003:262A:9302.001E: No inputs registered, leaving
hid-generic 0003:262A:9302.001E: hidraw6: USB HID v1.00 Device [DDHIFI TC44C] on usb-0000:08:00.3-1/input0 usb 7-1: 2:4 : unsupported format bits 0x100000000
This last "unsupported format" is actually wrong: we know the format is a RAW_DATA which we assume is DSD, so there is no need to print the confusing message.
This we unset bit 31 of the format after recognizing it, to avoid the message.
--- sound/usb/format.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
sound/usb/format.c +6 -1
@@ -60,6 +60,8 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip, pcm_formats |=SNDRV_PCM_FMTBIT_SPECIAL ;/* flag potentially raw DSD capable altsettings */ fp->dsd_raw = true; +/* clear special format bit to avoid "unsupported format" msg below */ + format &= ~UAC2_FORMAT_TYPE_I_RAW_DATA ; } format <<=1 ;
@@ -71,8 +73,11 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip, sample_width = as->bBitResolution; sample_bytes = as->bSubslotSize; -if (format &UAC3_FORMAT_TYPE_I_RAW_DATA ) +if (format &UAC3_FORMAT_TYPE_I_RAW_DATA ) { pcm_formats |=SNDRV_PCM_FMTBIT_SPECIAL ; +/* clear special format bit to avoid "unsupported format" msg below */ + format &= ~UAC3_FORMAT_TYPE_I_RAW_DATA ; + } format <<=1 ;break ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 186/222 bpf: fix potential error return
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anton Protopopov <[email protected]>
[ Upstream commit c4441ca86afe4814039ee1b32c39d833c1a16bbc ]
The bpf_remove_insns() function returns WARN_ON_ONCE(error), where error is a result of bpf_adj_branches(), and thus should be always 0 However, if for any reason it is not 0, then it will be converted to boolean by WARN_ON_ONCE and returned to user space as 1, not an actual error value. Fix this by returning the original err after the WARN check.
--- kernel/bpf/core.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
kernel/bpf/core.c +5 -1
@@ -529,6 +529,8 @@ struct bpf_prog *bpf_patch_insn_single(struct bpf_prog *prog, u32 off,int bpf_remove_insns (struct bpf_prog *prog,u32 off,u32 cnt) { +int err; +/* Branch offsets can't overflow when program is shrinking, no need * to call bpf_adj_branches(..., true) here */
@@ -536,7 +538,9 @@ int bpf_remove_insns(struct bpf_prog *prog, u32 off, u32 cnt) sizeof(struct bpf_insn) * (prog->len - off - cnt)); prog->len -= cnt; -return WARN_ON_ONCE (bpf_adj_branches (prog, off, off + cnt, off, false)); + err =bpf_adj_branches (prog, off, off + cnt, off, false); +WARN_ON_ONCE (err); +return err; }static void bpf_prog_kallsyms_del_subprogs (struct bpf_prog *fp)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 187/222 ksmbd: retry iterate_dir in smb2_query_dir
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hobin Woo <[email protected]>
[ Upstream commit 2b904d61a97e8ba79e3bc216ba290fd7e1d85028 ]
Some file systems do not ensure that the single call of iterate_dir reaches the end of the directory. For example, FUSE fetches entries from a daemon using 4KB buffer and stops fetching if entries exceed the buffer. And then an actor of caller, KSMBD, is used to fill the entries from the buffer.
Thus, pattern searching on FUSE, files located after the 4KB could not be found and STATUS_NO_SUCH_FILE was returned.
--- fs/smb/server/smb2pdu.c | 12 +++++++++++- fs/smb/server/vfs.h | 1 + 2 files changed, 12 insertions(+), 1 deletion(-)
fs/smb/server/smb2pdu.c +11 -1
@@ -4225,6 +4225,7 @@ static bool __query_dir(struct dir_context *ctx, const char *name, int namlen,/* dot and dotdot entries are already reserved */ if (!strcmp ("." , name) || !strcmp (".." , name))return true; + d_info->num_scan++;if (ksmbd_share_veto_filename (priv->work->tcon->share_conf, name))return true;if (!match_pattern (name, namlen, priv->search_pattern))
@@ -4385,8 +4386,17 @@ int smb2_query_dir(struct ksmbd_work *work) query_dir_private.info_level = req->FileInformationClass; dir_fp->readdir_data.private = &query_dir_private;set_ctx_actor (&dir_fp->readdir_data.ctx, __query_dir); - +again: + d_info.num_scan =0 ; rc =iterate_dir (dir_fp->filp, &dir_fp->readdir_data.ctx); +/* +* num_entry can be 0 if the directory iteration stops before reaching +* the end of the directory and no file is matched with the search +* pattern. +*/ +if (rc >=0 && !d_info.num_entry && d_info.num_scan && + d_info.out_buf_len >0 ) + goto again;/* * req->OutputBufferLength is too small to contain even one entry. * In this case, it immediately returns OutputBufferLength 0 to client.
fs/smb/server/vfs.h +1 -0
@@ -43,6 +43,7 @@ struct ksmbd_dir_info {char *rptr;int name_len;int out_buf_len; +int num_scan;int num_entry;int data_count;int last_entry_offset;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 188/222 ksmbd: set ATTR_CTIME flags when setting mtime
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namjae Jeon <[email protected]>
[ Upstream commit 21e46a79bbe6c4e1aa73b3ed998130f2ff07b128 ]
David reported that the new warning from setattr_copy_mgtime is coming like the following.
[ 113.215316] ------------[ cut here ]------------ [ 113.215974] WARNING: CPU: 1 PID: 31 at fs/attr.c:300 setattr_copy+0x1ee/0x200 [ 113.219192] CPU: 1 UID: 0 PID: 31 Comm: kworker/1:1 Not tainted 6.13.0-rc1+ #234 [ 113.220127] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.2-3-gd478f380-rebuilt.opensuse.org 04/01/2014 [ 113.221530] Workqueue: ksmbd-io handle_ksmbd_work [ksmbd] [ 113.222220] RIP: 0010:setattr_copy+0x1ee/0x200 [ 113.222833] Code: 24 28 49 8b 44 24 30 48 89 53 58 89 43 6c 5b 41 5c 41 5d 41 5e 41 5f 5d c3 cc cc cc cc 48 89 df e8 77 d6 ff ff e9 cd fe ff ff <0f> 0b e9 be fe ff ff 66 0 [ 113.225110] RSP: 0018:ffffaf218010fb68 EFLAGS: 00010202 [ 113.225765] RAX: 0000000000000120 RBX: ffffa446815f8568 RCX: 0000000000000003 [ 113.226667] RDX: ffffaf218010fd38 RSI: ffffa446815f8568 RDI: ffffffff94eb03a0 [ 113.227531] RBP: ffffaf218010fb90 R08: 0000001a251e217d R09: 00000000675259fa [ 113.228426] R10: 0000000002ba8a6d R11: ffffa4468196c7a8 R12: ffffaf218010fd38 [ 113.229304] R13: 0000000000000120 R14: ffffffff94eb03a0 R15: 0000000000000000 [ 113.230210] FS: 0000000000000000(0000) GS:ffffa44739d00000(0000) knlGS:0000000000000000 [ 113.231215] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 113.232055] CR2: 00007efe0053d27e CR3: 000000000331a000 CR4: 00000000000006b0 [ 113.232926] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 113.233812] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 113.234797] Call Trace: [ 113.235116] <TASK> [ 113.235393] ? __warn+0x73/0xd0 [ 113.235802] ? setattr_copy+0x1ee/0x200 [ 113.236299] ? report_bug+0xf3/0x1e0 [ 113.236757] ? handle_bug+0x4d/0x90 [ 113.237202] ? exc_invalid_op+0x13/0x60 [ 113.237689] ? asm_exc_invalid_op+0x16/0x20 [ 113.238185] ? setattr_copy+0x1ee/0x200 [ 113.238692] btrfs_setattr+0x80/0x820 [btrfs] [ 113.239285] ? get_stack_info_noinstr+0x12/0xf0 [ 113.239857] ? __module_address+0x22/0xa0 [ 113.240368] ? handle_ksmbd_work+0x6e/0x460 [ksmbd] [ 113.240993] ? __module_text_address+0x9/0x50 [ 113.241545] ? __module_address+0x22/0xa0 [ 113.242033] ? unwind_next_frame+0x10e/0x920 [ 113.242600] ? __pfx_stack_trace_consume_entry+0x10/0x10 [ 113.243268] notify_change+0x2c2/0x4e0 [ 113.243746] ? stack_depot_save_flags+0x27/0x730 [ 113.244339] ? set_file_basic_info+0x130/0x2b0 [ksmbd] [ 113.244993] set_file_basic_info+0x130/0x2b0 [ksmbd] [ 113.245613] ? process_scheduled_works+0xbe/0x310 [ 113.246181] ? worker_thread+0x100/0x240 [ 113.246696] ? kthread+0xc8/0x100 [ 113.247126] ? ret_from_fork+0x2b/0x40 [ 113.247606] ? ret_from_fork_asm+0x1a/0x30 [ 113.248132] smb2_set_info+0x63f/0xa70 [ksmbd]
ksmbd is trying to set the atime and mtime via notify_change without also setting the ctime. so This patch add ATTR_CTIME flags when setting mtime to avoid a warning.
--- fs/smb/server/smb2pdu.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
fs/smb/server/smb2pdu.c +3 -7
@@ -6017,15 +6017,13 @@ static int set_file_basic_info(struct ksmbd_file *fp, attrs.ia_valid |= (ATTR_ATIME |ATTR_ATIME_SET ); } - attrs.ia_valid |=ATTR_CTIME ;if (file_info->ChangeTime) - attrs.ia_ctime =ksmbd_NTtimeToUnix (file_info->ChangeTime); -else - attrs.ia_ctime =inode_get_ctime (inode); +inode_set_ctime_to_ts (inode, +ksmbd_NTtimeToUnix (file_info->ChangeTime));if (file_info->LastWriteTime) { attrs.ia_mtime =ksmbd_NTtimeToUnix (file_info->LastWriteTime); - attrs.ia_valid |= (ATTR_MTIME |ATTR_MTIME_SET ); + attrs.ia_valid |= (ATTR_MTIME |ATTR_MTIME_SET |ATTR_CTIME ); }if (file_info->Attributes) {
@@ -6067,8 +6065,6 @@ static int set_file_basic_info(struct ksmbd_file *fp,return -EACCES ;inode_lock (inode); -inode_set_ctime_to_ts (inode, attrs.ia_ctime); - attrs.ia_valid &= ~ATTR_CTIME ; rc =notify_change (idmap, dentry, &attrs,NULL );inode_unlock (inode); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 189/222 smb: client: destroy cfid_put_wq on module exit
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Enzo Matsumiya <[email protected]>
[ Upstream commit 633609c48a358134d3f8ef8241dff24841577f58 ]
Fix potential problem in rmmod
--- fs/smb/client/cifsfs.c | 1 + 1 file changed, 1 insertion(+)
fs/smb/client/cifsfs.c +1 -0
@@ -2015,6 +2015,7 @@ exit_cifs(void)destroy_workqueue (decrypt_wq);destroy_workqueue (fileinfo_put_wq);destroy_workqueue (serverclose_wq); +destroy_workqueue (cfid_put_wq);destroy_workqueue (cifsiod_wq);cifs_proc_clean (); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 190/222 net: usb: qmi_wwan: add Telit FE910C04 compositions
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniele Palmas <[email protected]>
[ Upstream commit 3b58b53a26598209a7ad8259a5114ce71f7c3d64 ]
Add the following Telit FE910C04 compositions:
0x10c0: rmnet + tty (AT/NMEA) + tty (AT) + tty (diag)
T: Bus=02 Lev=01 Prnt=03 Port=06 Cnt=01 Dev#= 13 Spd=480 MxCh= 0 D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=1bc7 ProdID=10c0 Rev=05.15 S: Manufacturer=Telit Cinterion S: Product=FE910 S: SerialNumber=f71b8b32 C: #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=500mA I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=50 Driver=qmi_wwan E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=82(I) Atr=03(Int.) MxPS= 8 Ivl=32ms I: If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=60 Driver=option E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=84(I) Atr=03(Int.) MxPS= 10 Ivl=32ms I: If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=86(I) Atr=03(Int.) MxPS= 10 Ivl=32ms I: If#= 3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option E: Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
0x10c4: rmnet + tty (AT) + tty (AT) + tty (diag)
T: Bus=02 Lev=01 Prnt=03 Port=06 Cnt=01 Dev#= 14 Spd=480 MxCh= 0 D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=1bc7 ProdID=10c4 Rev=05.15 S: Manufacturer=Telit Cinterion S: Product=FE910 S: SerialNumber=f71b8b32 C: #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=500mA I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=50 Driver=qmi_wwan E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=82(I) Atr=03(Int.) MxPS= 8 Ivl=32ms I: If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=84(I) Atr=03(Int.) MxPS= 10 Ivl=32ms I: If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=86(I) Atr=03(Int.) MxPS= 10 Ivl=32ms I: If#= 3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option E: Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
0x10c8: rmnet + tty (AT) + tty (diag) + DPL (data packet logging) + adb
T: Bus=02 Lev=01 Prnt=03 Port=06 Cnt=01 Dev#= 17 Spd=480 MxCh= 0 D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=1bc7 ProdID=10c8 Rev=05.15 S: Manufacturer=Telit Cinterion S: Product=FE910 S: SerialNumber=f71b8b32 C: #Ifs= 5 Cfg#= 1 Atr=e0 MxPwr=500mA I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=50 Driver=qmi_wwan E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=82(I) Atr=03(Int.) MxPS= 8 Ivl=32ms I: If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=84(I) Atr=03(Int.) MxPS= 10 Ivl=32ms I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms I: If#= 3 Alt= 0 #EPs= 1 Cls=ff(vend.) Sub=ff Prot=80 Driver=(none) E: Ad=86(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms I: If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=(none) E: Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
--- drivers/net/usb/qmi_wwan.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/usb/qmi_wwan.c +3 -0
@@ -1373,6 +1373,9 @@ static const struct usb_device_id products[] = { {QMI_QUIRK_SET_DTR(0x1bc7, 0x10a0, 0)}, /* Telit FN920C04 */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x10a4, 0)}, /* Telit FN920C04 */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x10a9, 0)}, /* Telit FN920C04 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x10c0, 0)}, /* Telit FE910C04 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x10c4, 0)}, /* Telit FE910C04 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x10c8, 0)}, /* Telit FE910C04 */ {QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */ {QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */ {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 191/222 Bluetooth: hci_core: Fix sleeping function called from invalid context
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit 4d94f05558271654670d18c26c912da0c1c15549 ]
This reworks hci_cb_list to not use mutex hci_cb_list_lock to avoid bugs like the bellow:
BUG: sleeping function called from invalid context at kernel/locking/mutex.c:585
in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 5070, name: kworker/u9:2preempt_count: 0, expected: 0
RCU nest depth: 1, expected: 0
4 locks held by kworker/u9:2/5070:
#0: ffff888015be3948 ((wq_completion)hci0#2){+.+.}-{0:0}, at: process_one_work kernel/workqueue.c:3229 [inline] #0: ffff888015be3948 ((wq_completion)hci0#2){+.+.}-{0:0}, at: process_scheduled_works+0x8e0/0x1770 kernel/workqueue.c:3335 #1: ffffc90003b6fd00 ((work_completion)(&hdev->rx_work)){+.+.}-{0:0}, at: process_one_work kernel/workqueue.c:3230 [inline] #1: ffffc90003b6fd00 ((work_completion)(&hdev->rx_work)){+.+.}-{0:0}, at: process_scheduled_works+0x91b/0x1770 kernel/workqueue.c:3335 #2: ffff8880665d0078 (&hdev->lock){+.+.}-{3:3}, at: hci_le_create_big_complete_evt+0xcf/0xae0 net/bluetooth/hci_event.c:6914 #3: ffffffff8e132020 (rcu_read_lock){....}-{1:2}, at: rcu_lock_acquire include/linux/rcupdate.h:298 [inline]
#3: ffffffff8e132020 (rcu_read_lock){....}-{1:2}, at: rcu_read_lock include/linux/rcupdate.h:750 [inline]
#3: ffffffff8e132020 (rcu_read_lock){....}-{1:2}, at: hci_le_create_big_complete_evt+0xdb/0xae0 net/bluetooth/hci_event.c:6915
CPU: 0 PID: 5070 Comm: kworker/u9:2 Not tainted 6.8.0-syzkaller-08073-g480e035fc4c7 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/27/2024 Workqueue: hci0 hci_rx_work Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x241/0x360 lib/dump_stack.c:114 __might_resched+0x5d4/0x780 kernel/sched/core.c:10187 __mutex_lock_common kernel/locking/mutex.c:585 [inline] __mutex_lock+0xc1/0xd70 kernel/locking/mutex.c:752 hci_connect_cfm include/net/bluetooth/hci_core.h:2004 [inline] hci_le_create_big_complete_evt+0x3d9/0xae0 net/bluetooth/hci_event.c:6939 hci_event_func net/bluetooth/hci_event.c:7514 [inline] hci_event_packet+0xa53/0x1540 net/bluetooth/hci_event.c:7569 hci_rx_work+0x3e8/0xca0 net/bluetooth/hci_core.c:4171 process_one_work kernel/workqueue.c:3254 [inline] process_scheduled_works+0xa00/0x1770 kernel/workqueue.c:3335 worker_thread+0x86d/0xd70 kernel/workqueue.c:3416 kthread+0x2f0/0x390 kernel/kthread.c:388 ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:243 </TASK>
--- include/net/bluetooth/hci_core.h | 108 ++++++++++++++++++++----------- net/bluetooth/hci_core.c | 10 +-- net/bluetooth/iso.c | 6 ++ net/bluetooth/l2cap_core.c | 12 ++-- net/bluetooth/rfcomm/core.c | 6 ++ net/bluetooth/sco.c | 12 ++-- 6 files changed, 97 insertions(+), 57 deletions(-)
include/net/bluetooth/hci_core.h +70 -38
@@ -800,7 +800,6 @@ struct hci_conn_params {extern struct list_head hci_dev_list;extern struct list_head hci_cb_list;extern rwlock_t hci_dev_list_lock; -extern struct mutex hci_cb_list_lock;#define hci_dev_set_flag (hdev, nr) set_bit((nr), (hdev)->dev_flags)#define hci_dev_clear_flag (hdev, nr) clear_bit((nr), (hdev)->dev_flags)
@@ -1949,24 +1948,47 @@ struct hci_cb {char *name; +bool (*match) (struct hci_conn *conn);void (*connect_cfm) (struct hci_conn *conn,__u8 status);void (*disconn_cfm) (struct hci_conn *conn,__u8 status);void (*security_cfm) (struct hci_conn *conn,__u8 status, -__u8 encrypt); +__u8 encrypt);void (*key_change_cfm) (struct hci_conn *conn,__u8 status);void (*role_switch_cfm) (struct hci_conn *conn,__u8 status,__u8 role); }; +static inline void hci_cb_lookup (struct hci_conn *conn,struct list_head *list) +{ +struct hci_cb *cb, *cpy; + +rcu_read_lock (); +list_for_each_entry_rcu (cb, &hci_cb_list, list) { +if (cb->match && cb->match (conn)) { + cpy =kmalloc (sizeof (*cpy),GFP_ATOMIC ); +if (!cpy) +break ; + + *cpy = *cb; +INIT_LIST_HEAD (&cpy->list); +list_add_rcu (&cpy->list, list); + } + } +rcu_read_unlock (); +} +static inline void hci_connect_cfm (struct hci_conn *conn,__u8 status) { -struct hci_cb *cb; +struct list_head list; +struct hci_cb *cb, *tmp; + +INIT_LIST_HEAD (&list); +hci_cb_lookup (conn, &list); -mutex_lock (&hci_cb_list_lock); -list_for_each_entry (cb, &hci_cb_list, list) { +list_for_each_entry_safe (cb, tmp, &list, list) {if (cb->connect_cfm) cb->connect_cfm (conn, status); +kfree (cb); } -mutex_unlock (&hci_cb_list_lock);if (conn->connect_cfm_cb) conn->connect_cfm_cb (conn, status);
@@ -1974,43 +1996,55 @@ static inline void hci_connect_cfm(struct hci_conn *conn, __u8 status)static inline void hci_disconn_cfm (struct hci_conn *conn,__u8 reason) { -struct hci_cb *cb; +struct list_head list; +struct hci_cb *cb, *tmp; + +INIT_LIST_HEAD (&list); +hci_cb_lookup (conn, &list); -mutex_lock (&hci_cb_list_lock); -list_for_each_entry (cb, &hci_cb_list, list) { +list_for_each_entry_safe (cb, tmp, &list, list) {if (cb->disconn_cfm) cb->disconn_cfm (conn, reason); +kfree (cb); } -mutex_unlock (&hci_cb_list_lock);if (conn->disconn_cfm_cb) conn->disconn_cfm_cb (conn, reason); } -static inline void hci_auth_cfm (struct hci_conn *conn,__u8 status) +static inline void hci_security_cfm (struct hci_conn *conn,__u8 status, +__u8 encrypt) { -struct hci_cb *cb; -__u8 encrypt; - -if (test_bit (HCI_CONN_ENCRYPT_PEND , &conn->flags)) -return ; +struct list_head list; +struct hci_cb *cb, *tmp; - encrypt =test_bit (HCI_CONN_ENCRYPT , &conn->flags) ?0x01 :0x00 ; +INIT_LIST_HEAD (&list); +hci_cb_lookup (conn, &list); -mutex_lock (&hci_cb_list_lock); -list_for_each_entry (cb, &hci_cb_list, list) { +list_for_each_entry_safe (cb, tmp, &list, list) {if (cb->security_cfm) cb->security_cfm (conn, status, encrypt); +kfree (cb); } -mutex_unlock (&hci_cb_list_lock);if (conn->security_cfm_cb) conn->security_cfm_cb (conn, status); } +static inline void hci_auth_cfm (struct hci_conn *conn,__u8 status) +{ +__u8 encrypt; + +if (test_bit (HCI_CONN_ENCRYPT_PEND , &conn->flags)) +return ; + + encrypt =test_bit (HCI_CONN_ENCRYPT , &conn->flags) ?0x01 :0x00 ; + +hci_security_cfm (conn, status, encrypt); +} +static inline void hci_encrypt_cfm (struct hci_conn *conn,__u8 status) { -struct hci_cb *cb;__u8 encrypt;if (conn->state ==BT_CONFIG ) {
@@ -2037,40 +2071,38 @@ static inline void hci_encrypt_cfm(struct hci_conn *conn, __u8 status) conn->sec_level = conn->pending_sec_level; } -mutex_lock (&hci_cb_list_lock); -list_for_each_entry (cb, &hci_cb_list, list) { -if (cb->security_cfm) - cb->security_cfm (conn, status, encrypt); - } -mutex_unlock (&hci_cb_list_lock); - -if (conn->security_cfm_cb) - conn->security_cfm_cb (conn, status); +hci_security_cfm (conn, status, encrypt); }static inline void hci_key_change_cfm (struct hci_conn *conn,__u8 status) { -struct hci_cb *cb; +struct list_head list; +struct hci_cb *cb, *tmp; + +INIT_LIST_HEAD (&list); +hci_cb_lookup (conn, &list); -mutex_lock (&hci_cb_list_lock); -list_for_each_entry (cb, &hci_cb_list, list) { +list_for_each_entry_safe (cb, tmp, &list, list) {if (cb->key_change_cfm) cb->key_change_cfm (conn, status); +kfree (cb); } -mutex_unlock (&hci_cb_list_lock); }static inline void hci_role_switch_cfm (struct hci_conn *conn,__u8 status,__u8 role) { -struct hci_cb *cb; +struct list_head list; +struct hci_cb *cb, *tmp; + +INIT_LIST_HEAD (&list); +hci_cb_lookup (conn, &list); -mutex_lock (&hci_cb_list_lock); -list_for_each_entry (cb, &hci_cb_list, list) { +list_for_each_entry_safe (cb, tmp, &list, list) {if (cb->role_switch_cfm) cb->role_switch_cfm (conn, status, role); +kfree (cb); } -mutex_unlock (&hci_cb_list_lock); }static inline bool hci_bdaddr_is_rpa (bdaddr_t *bdaddr,u8 addr_type)
net/bluetooth/hci_core.c +3 -7
@@ -58,7 +58,6 @@ DEFINE_RWLOCK(hci_dev_list_lock);/* HCI callback list */ LIST_HEAD (hci_cb_list); -DEFINE_MUTEX (hci_cb_list_lock);/* HCI ID Numbering */ static DEFINE_IDA (hci_index_ida);
@@ -2957,9 +2956,7 @@ int hci_register_cb(struct hci_cb *cb) {BT_DBG ("%p name %s" , cb, cb->name); -mutex_lock (&hci_cb_list_lock); -list_add_tail (&cb->list, &hci_cb_list); -mutex_unlock (&hci_cb_list_lock); +list_add_tail_rcu (&cb->list, &hci_cb_list);return 0 ; }
@@ -2969,9 +2966,8 @@ int hci_unregister_cb(struct hci_cb *cb) {BT_DBG ("%p name %s" , cb, cb->name); -mutex_lock (&hci_cb_list_lock); -list_del (&cb->list); -mutex_unlock (&hci_cb_list_lock); +list_del_rcu (&cb->list); +synchronize_rcu ();return 0 ; }
net/bluetooth/iso.c +6 -0
@@ -1929,6 +1929,11 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)return lm; } +static bool iso_match (struct hci_conn *hcon) +{ +return hcon->type ==ISO_LINK || hcon->type ==LE_LINK ; +} +static void iso_connect_cfm (struct hci_conn *hcon,__u8 status) {if (hcon->type !=ISO_LINK ) {
@@ -2110,6 +2115,7 @@ void iso_recv(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)static struct hci_cb iso_cb = { .name ="ISO" , + .match = iso_match, .connect_cfm = iso_connect_cfm, .disconn_cfm = iso_disconn_cfm, };
net/bluetooth/l2cap_core.c +6 -6
@@ -7223,6 +7223,11 @@ static struct l2cap_chan *l2cap_global_fixed_chan(struct l2cap_chan *c,return NULL ; } +static bool l2cap_match (struct hci_conn *hcon) +{ +return hcon->type ==ACL_LINK || hcon->type ==LE_LINK ; +} +static void l2cap_connect_cfm (struct hci_conn *hcon,u8 status) {struct hci_dev *hdev = hcon->hdev;
@@ -7230,9 +7235,6 @@ static void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)struct l2cap_chan *pchan;u8 dst_type; -if (hcon->type !=ACL_LINK && hcon->type !=LE_LINK ) -return ; -BT_DBG ("hcon %p bdaddr %pMR status %d" , hcon, &hcon->dst, status);if (status) {
@@ -7297,9 +7299,6 @@ int l2cap_disconn_ind(struct hci_conn *hcon)static void l2cap_disconn_cfm (struct hci_conn *hcon,u8 reason) { -if (hcon->type !=ACL_LINK && hcon->type !=LE_LINK ) -return ; -BT_DBG ("hcon %p reason %d" , hcon, reason);l2cap_conn_del (hcon,bt_to_errno (reason));
@@ -7578,6 +7577,7 @@ void l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)static struct hci_cb l2cap_cb = { .name ="L2CAP" , + .match = l2cap_match, .connect_cfm = l2cap_connect_cfm, .disconn_cfm = l2cap_disconn_cfm, .security_cfm = l2cap_security_cfm,
net/bluetooth/rfcomm/core.c +6 -0
@@ -2134,6 +2134,11 @@ static int rfcomm_run(void *unused)return 0 ; } +static bool rfcomm_match (struct hci_conn *hcon) +{ +return hcon->type ==ACL_LINK ; +} +static void rfcomm_security_cfm (struct hci_conn *conn,u8 status,u8 encrypt) {struct rfcomm_session *s;
@@ -2180,6 +2185,7 @@ static void rfcomm_security_cfm(struct hci_conn *conn, u8 status, u8 encrypt)static struct hci_cb rfcomm_cb = { .name ="RFCOMM" , + .match = rfcomm_match, .security_cfm = rfcomm_security_cfm };
net/bluetooth/sco.c +6 -6
@@ -1353,11 +1353,13 @@ int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)return lm; } -static void sco_connect_cfm (struct hci_conn *hcon,__u8 status) +static bool sco_match (struct hci_conn *hcon) { -if (hcon->type !=SCO_LINK && hcon->type !=ESCO_LINK ) -return ; +return hcon->type ==SCO_LINK || hcon->type ==ESCO_LINK ; +} +static void sco_connect_cfm (struct hci_conn *hcon,__u8 status) +{BT_DBG ("hcon %p bdaddr %pMR status %u" , hcon, &hcon->dst, status);if (!status) {
@@ -1372,9 +1374,6 @@ static void sco_connect_cfm(struct hci_conn *hcon, __u8 status)static void sco_disconn_cfm (struct hci_conn *hcon,__u8 reason) { -if (hcon->type !=SCO_LINK && hcon->type !=ESCO_LINK ) -return ; -BT_DBG ("hcon %p reason %d" , hcon, reason);sco_conn_del (hcon,bt_to_errno (reason));
@@ -1400,6 +1399,7 @@ void sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb)static struct hci_cb sco_cb = { .name ="SCO" , + .match = sco_match, .connect_cfm = sco_connect_cfm, .disconn_cfm = sco_disconn_cfm, };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 192/222 irqchip/gic: Correct declaration of *percpu_base pointer in union gic_base
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uros Bizjak <[email protected]>
[ Upstream commit a1855f1b7c33642c9f7a01991fb763342a312e9b ]
percpu_base is used in various percpu functions that expect variable in __percpu address space. Correct the declaration of percpu_base to
void __iomem * __percpu *percpu_base;
to declare the variable as __percpu pointer.
The patch fixes several sparse warnings:
irq-gic.c:1172:44: warning: incorrect type in assignment (different address spaces)
irq-gic.c:1172:44: expected void [noderef] __percpu *[noderef] __iomem *percpu_base
irq-gic.c:1172:44: got void [noderef] __iomem *[noderef] __percpu *
...
irq-gic.c:1231:43: warning: incorrect type in argument 1 (different address spaces)
irq-gic.c:1231:43: expected void [noderef] __percpu *__pdata
irq-gic.c:1231:43: got void [noderef] __percpu *[noderef] __iomem *percpu_base
There were no changes in the resulting object files.
--- drivers/irqchip/irq-gic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/irqchip/irq-gic.c +1 -1
@@ -64,7 +64,7 @@ static void gic_check_cpu_features(void)union gic_base {void __iomem *common_base; -void __percpu *__iomem *percpu_base; +void __iomem *__percpu *percpu_base; };struct gic_chip_data {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 193/222 ARC: build: Try to guess GCC variant of cross compiler
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leon Romanovsky <[email protected]>
[ Upstream commit 824927e88456331c7a999fdf5d9d27923b619590 ]
ARC GCC compiler is packaged starting from Fedora 39i and the GCC variant of cross compile tools has arc-linux-gnu- prefix and not arc-linux-. This is causing that CROSS_COMPILE variable is left unset.
This change allows builds without need to supply CROSS_COMPILE argument if distro package is used.
Before this change:
$ make -j 128 ARCH=arc W=1 drivers/infiniband/hw/mlx4/ gcc: warning: ‘-mcpu=’ is deprecated; use ‘-mtune=’ or ‘-march=’ instead gcc: error: unrecognized command-line option ‘-mmedium-calls’ gcc: error: unrecognized command-line option ‘-mlock’ gcc: error: unrecognized command-line option ‘-munaligned-access’
[1] https://packages.fedoraproject.org/pkgs/cross-gcc/gcc-arc-linux-gnu/index.html
--- arch/arc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arc/Makefile +1 -1
@@ -6,7 +6,7 @@ KBUILD_DEFCONFIG := haps_hs_smp_defconfig ifeq ($(CROSS_COMPILE),) -CROSS_COMPILE := $(call cc-cross-prefix, arc-linux- arceb-linux-) +CROSS_COMPILE := $(call cc-cross-prefix, arc-linux- arceb-linux- arc-linux-gnu-) endif cflags-y += -fno-common -pipe -fno-builtin -mmedium-calls -D__linux__
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 194/222 seq_buf: Make DECLARE_SEQ_BUF() usable
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nathan Lynch <[email protected]>
[ Upstream commit 7a8e9cdf9405819105ae7405cd91e482bf574b01 ]
Using the address operator on the array doesn't work:
./include/linux/seq_buf.h:27:27: error: initialization of ‘char *’
from incompatible pointer type ‘char (*)[128]’ [-Werror=incompatible-pointer-types]
27 | .buffer = &__ ## NAME ## _buffer, \
| ^
Apart from fixing that, we can improve DECLARE_SEQ_BUF() by using a compound literal to define the buffer array without attaching a name to it. This makes the macro a single statement, allowing constructs such as:
static DECLARE_SEQ_BUF(my_seq_buf, MYSB_SIZE);
to work as intended.
--- include/linux/seq_buf.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
include/linux/seq_buf.h +1 -2
@@ -22,9 +22,8 @@ struct seq_buf { };#define DECLARE_SEQ_BUF (NAME ,SIZE ) \ - char __ ## NAME ## _buffer[SIZE] = ""; \ struct seq_buf NAME = { \ - .buffer = &__ ## NAME ## _buffer, \ + .buffer = (char[SIZE]) { 0 }, \ .size = SIZE, \ }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 195/222 RDMA/bnxt_re: Fix the max WQE size for static WQE support
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Selvin Xavier <[email protected]>
[ Upstream commit 227f51743b61fe3f6fc481f0fb8086bf8c49b8c9 ]
When variable size WQE is supported, max_qp_sges reported is more than 6. For devices that supports variable size WQE, the Send WQE size calculation is wrong when an an older library that doesn't support variable size WQE is used.
Set the WQE size to 128 when static WQE is supported.
--- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 21 ++++++++++----------- drivers/infiniband/hw/bnxt_re/qplib_sp.h | 2 ++ 2 files changed, 12 insertions(+), 11 deletions(-)
drivers/infiniband/hw/bnxt_re/ib_verbs.c +10 -11
@@ -992,23 +992,22 @@ static int bnxt_re_setup_swqe_size(struct bnxt_re_qp *qp, align =sizeof (struct sq_send_hdr ); ilsize =ALIGN (init_attr->cap.max_inline_data, align); - sq->wqe_size =bnxt_re_get_wqe_size (ilsize, sq->max_sge); -if (sq->wqe_size >bnxt_re_get_swqe_size (dev_attr->max_qp_sges)) -return -EINVAL ; -/* For gen p4 and gen p5 backward compatibility mode -* wqe size is fixed to 128 bytes +/* For gen p4 and gen p5 fixed wqe compatibility mode +* wqe size is fixed to 128 bytes - ie 6 SGEs */ -if (sq->wqe_size <bnxt_re_get_swqe_size (dev_attr->max_qp_sges) && - qplqp->wqe_mode ==BNXT_QPLIB_WQE_MODE_STATIC ) - sq->wqe_size =bnxt_re_get_swqe_size (dev_attr->max_qp_sges); +if (qplqp->wqe_mode ==BNXT_QPLIB_WQE_MODE_STATIC ) { + sq->wqe_size =bnxt_re_get_swqe_size (BNXT_STATIC_MAX_SGE ); + sq->max_sge =BNXT_STATIC_MAX_SGE ; + }else { + sq->wqe_size =bnxt_re_get_wqe_size (ilsize, sq->max_sge); +if (sq->wqe_size >bnxt_re_get_swqe_size (dev_attr->max_qp_sges)) +return -EINVAL ; + }if (init_attr->cap.max_inline_data) { qplqp->max_inline_data = sq->wqe_size -sizeof (struct sq_send_hdr ); init_attr->cap.max_inline_data = qplqp->max_inline_data; -if (qplqp->wqe_mode ==BNXT_QPLIB_WQE_MODE_STATIC ) - sq->max_sge = qplqp->max_inline_data / -sizeof (struct sq_sge ); }return 0 ;
drivers/infiniband/hw/bnxt_re/qplib_sp.h +2 -0
@@ -358,4 +358,6 @@ int bnxt_qplib_modify_cc(struct bnxt_qplib_res *res,#define BNXT_VAR_MAX_SGE 13#define BNXT_RE_MAX_RQ_WQES 65536 +#define BNXT_STATIC_MAX_SGE 6 +#endif /* __BNXT_QPLIB_SP_H__*/
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 196/222 modpost: fix input MODULE_DEVICE_TABLE() built for 64-bit on 32-bit host
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
[ Upstream commit 77dc55a978e69625f9718460012e5ef0172dc4de ]
When building a 64-bit kernel on a 32-bit build host, incorrect input MODULE_ALIAS() entries may be generated.
For example, when compiling a 64-bit kernel with CONFIG_INPUT_MOUSEDEV=m on a 64-bit build machine, you will get the correct output:
$ grep MODULE_ALIAS drivers/input/mousedev.mod.c
MODULE_ALIAS("input:b*v*p*e*-e*1,*2,*k*110,*r*0,*1,*a*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*1,*2,*k*r*8,*a*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*1,*3,*k*14A,*r*a*0,*1,*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*1,*3,*k*145,*r*a*0,*1,*18,*1C,*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*1,*3,*k*110,*r*a*0,*1,*m*l*s*f*w*");However, building the same kernel on a 32-bit machine results in incorrect output:
$ grep MODULE_ALIAS drivers/input/mousedev.mod.c
MODULE_ALIAS("input:b*v*p*e*-e*1,*2,*k*110,*130,*r*0,*1,*a*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*1,*2,*k*r*8,*a*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*1,*3,*k*14A,*16A,*r*a*0,*1,*20,*21,*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*1,*3,*k*145,*165,*r*a*0,*1,*18,*1C,*20,*21,*38,*3C,*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*1,*3,*k*110,*130,*r*a*0,*1,*20,*21,*m*l*s*f*w*");A similar issue occurs with CONFIG_INPUT_JOYDEV=m. On a 64-bit build machine, the output is:
$ grep MODULE_ALIAS drivers/input/joydev.mod.c
MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*0,*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*2,*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*8,*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*6,*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*1,*k*120,*r*a*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*1,*k*130,*r*a*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*1,*k*2C0,*r*a*m*l*s*f*w*");However, on a 32-bit machine, the output is incorrect:
$ grep MODULE_ALIAS drivers/input/joydev.mod.c
MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*0,*20,*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*2,*22,*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*8,*28,*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*6,*26,*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*1,*k*11F,*13F,*r*a*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*1,*k*11F,*13F,*r*a*m*l*s*f*w*");
MODULE_ALIAS("input:b*v*p*e*-e*1,*k*2C0,*2E0,*r*a*m*l*s*f*w*");When building a 64-bit kernel, BITS_PER_LONG is defined as 64. However, on a 32-bit build machine, the constant 1L is a signed 32-bit value. Left-shifting it beyond 32 bits causes wraparound, and shifting by 31 or 63 bits makes it a negative value.
The fix in commit e0e92632715f ("[PATCH] PATCH: 1 line 2.6.18 bugfix:
modpost-64bit-fix.patch") is incorrect; it only addresses cases where a 64-bit kernel is built on a 64-bit build machine, overlooking cases on a 32-bit build machine.
Using 1ULL ensures a 64-bit width on both 32-bit and 64-bit machines, avoiding the wraparound issue.
Stable-dep-of: bf36b4bf1b9a ("modpost: fix the missed iteration for the max bit in do_input()")
--- scripts/mod/file2alias.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/mod/file2alias.c +1 -1
@@ -743,7 +743,7 @@ static void do_input(char *alias,for (i = min /BITS_PER_LONG ; i < max /BITS_PER_LONG +1 ; i++) arr[i] =TO_NATIVE (arr[i]);for (i = min; i < max; i++) -if (arr[i /BITS_PER_LONG ] & (1L << (i%BITS_PER_LONG ))) +if (arr[i /BITS_PER_LONG ] & (1ULL << (i%BITS_PER_LONG )))sprintf (alias +strlen (alias),"%X,*" , i); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 197/222 modpost: fix the missed iteration for the max bit in do_input()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
[ Upstream commit bf36b4bf1b9a7a0015610e2f038ee84ddb085de2 ]
This loop should iterate over the range from 'min' to 'max' inclusively. The last interation is missed.
--- scripts/mod/file2alias.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/mod/file2alias.c +1 -1
@@ -742,7 +742,7 @@ static void do_input(char *alias,for (i = min /BITS_PER_LONG ; i < max /BITS_PER_LONG +1 ; i++) arr[i] =TO_NATIVE (arr[i]); -for (i = min; i < max; i++) +for (i = min; i <= max; i++)if (arr[i /BITS_PER_LONG ] & (1ULL << (i%BITS_PER_LONG )))sprintf (alias +strlen (alias),"%X,*" , i); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 198/222 Revert "bpf: support non-r10 register spill/fill to/from stack in precision tracking"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shung-Hsi Yu <[email protected]>
Revert commit ecc2aeeaa08a355d84d3ca9c3d2512399a194f29 which is commit 41f6f64e6999a837048b1bd13a2f8742964eca6b upstream.
Levi reported that commit ecc2aeeaa08a ("bpf: support non-r10 register spill/fill to/from stack in precision tracking") cause eBPF program that previously loads successfully in stable 6.6 now fails to load, when the same program also loads successfully in v6.13-rc5.
Revert ecc2aeeaa08a until the problem has been probably figured out and resolved.
--- include/linux/bpf_verifier.h | 31 - kernel/bpf/verifier.c | 175 ++++------ tools/testing/selftests/bpf/progs/verifier_subprog_precision.c | 23 - tools/testing/selftests/bpf/verifier/precise.c | 38 -- 4 files changed, 98 insertions(+), 169 deletions(-)
include/linux/bpf_verifier.h +4 -27
@@ -319,34 +319,12 @@ struct bpf_func_state {struct bpf_stack_state *stack; }; -#define MAX_CALL_FRAMES 8 - -/* instruction history flags, used in bpf_jmp_history_entry.flags field */ -enum { -/* instruction references stack slot through PTR_TO_STACK register; -* we also store stack's frame number in lower 3 bits (MAX_CALL_FRAMES is 8) -* and accessed stack slot's index in next 6 bits (MAX_BPF_STACK is 512, -* 8 bytes per slot, so slot index (spi) is [0, 63]) -*/ -INSN_F_FRAMENO_MASK =0x7 ,/* 3 bits */ - -INSN_F_SPI_MASK =0x3f ,/* 6 bits */ -INSN_F_SPI_SHIFT =3 ,/* shifted 3 bits to the left */ - -INSN_F_STACK_ACCESS =BIT (9 ),/* we need 10 bits total */ -}; - -static_assert (INSN_F_FRAMENO_MASK +1 >=MAX_CALL_FRAMES ); -static_assert (INSN_F_SPI_MASK +1 >=MAX_BPF_STACK /8 ); - -struct bpf_jmp_history_entry { +struct bpf_idx_pair { +u32 prev_idx;u32 idx; -/* insn idx can't be bigger than 1 million */ -u32 prev_idx :22 ; -/* special flags, e.g., whether insn is doing register stack spill/load */ -u32 flags :10 ; }; +#define MAX_CALL_FRAMES 8/* Maximum number of register states that can exist at once */ #define BPF_ID_MAP_SIZE ((MAX_BPF_REG + MAX_BPF_STACK / BPF_REG_SIZE) * MAX_CALL_FRAMES)struct bpf_verifier_state {
@@ -429,7 +407,7 @@ struct bpf_verifier_state {* For most states jmp_history_cnt is [0-3]. * For loops can go up to ~40. */ -struct bpf_jmp_history_entry *jmp_history; +struct bpf_idx_pair *jmp_history;u32 jmp_history_cnt;u32 dfs_depth;u32 callback_unroll_depth;
@@ -662,7 +640,6 @@ struct bpf_verifier_env {int cur_stack; } cfg;struct backtrack_state bt; -struct bpf_jmp_history_entry *cur_hist_ent;u32 pass_cnt;/* number of times do_check() was called */ u32 subprog_cnt;/* number of instructions analyzed by the verifier */
kernel/bpf/verifier.c +73 -102
348 lines not on this page · raw message
tools/testing/selftests/bpf/progs/verifier_subprog_precision.c +5 -18
@@ -541,24 +541,11 @@ static __u64 subprog_spill_reg_precise(v SEC("?raw_tp") __success __log_level(2) -__msg("10: (0f) r1 += r7") -__msg("mark_precise: frame0: last_idx 10 first_idx 7 subseq_idx -1") -__msg("mark_precise: frame0: regs=r7 stack= before 9: (bf) r1 = r8") -__msg("mark_precise: frame0: regs=r7 stack= before 8: (27) r7 *= 4") -__msg("mark_precise: frame0: regs=r7 stack= before 7: (79) r7 = *(u64 *)(r10 -8)") -__msg("mark_precise: frame0: parent state regs= stack=-8: R0_w=2 R6_w=1 R8_rw=map_value(map=.data.vals,ks=4,vs=16) R10=fp0 fp-8_rw=P1") -__msg("mark_precise: frame0: last_idx 18 first_idx 0 subseq_idx 7") -__msg("mark_precise: frame0: regs= stack=-8 before 18: (95) exit") -__msg("mark_precise: frame1: regs= stack= before 17: (0f) r0 += r2") -__msg("mark_precise: frame1: regs= stack= before 16: (79) r2 = *(u64 *)(r1 +0)") -__msg("mark_precise: frame1: regs= stack= before 15: (79) r0 = *(u64 *)(r10 -16)") -__msg("mark_precise: frame1: regs= stack= before 14: (7b) *(u64 *)(r10 -16) = r2") -__msg("mark_precise: frame1: regs= stack= before 13: (7b) *(u64 *)(r1 +0) = r2") -__msg("mark_precise: frame1: regs=r2 stack= before 6: (85) call pc+6") -__msg("mark_precise: frame0: regs=r2 stack= before 5: (bf) r2 = r6") -__msg("mark_precise: frame0: regs=r6 stack= before 4: (07) r1 += -8") -__msg("mark_precise: frame0: regs=r6 stack= before 3: (bf) r1 = r10") -__msg("mark_precise: frame0: regs=r6 stack= before 2: (b7) r6 = 1") +/* precision backtracking can't currently handle stack access not through r10, +* so we won't be able to mark stack slot fp-8 as precise, and so will +* fallback to forcing all as precise +*/ +__msg("mark_precise: frame0: falling back to forcing all scalars precise")__naked int subprog_spill_into_parent_stack_slot_precise (void ) { asm volatile (
tools/testing/selftests/bpf/verifier/precise.c +16 -22
@@ -140,11 +140,10 @@ .result = REJECT, }, { - "precise: ST zero to stack insn is supported", + "precise: ST insn causing spi > allocated_stack", .insns = {BPF_MOV64_REG (BPF_REG_3 ,BPF_REG_10 ),BPF_JMP_IMM (BPF_JNE ,BPF_REG_3 ,123 ,0 ), -/* not a register spill, so we stop precision propagation for R4 here */ BPF_ST_MEM (BPF_DW ,BPF_REG_3 ,-8 ,0 ),BPF_LDX_MEM (BPF_DW ,BPF_REG_4 ,BPF_REG_10 ,-8 ), BPF_MOV64_IMM(BPF_REG_0, -1),
@@ -158,11 +157,11 @@ mark_precise: frame0: last_idx 4 first_idx 2\ mark_precise: frame0: regs=r4 stack= before 4\ mark_precise: frame0: regs=r4 stack= before 3\ + mark_precise: frame0: regs= stack=-8 before 2\ + mark_precise: frame0: falling back to forcing all scalars precise\ + force_precise: frame0: forcing r0 to be precise\ mark_precise: frame0: last_idx 5 first_idx 5\ - mark_precise: frame0: parent state regs=r0 stack=:\ - mark_precise: frame0: last_idx 4 first_idx 2\ - mark_precise: frame0: regs=r0 stack= before 4\ - 5: R0=-1 R4=0", + mark_precise: frame0: parent state regs= stack=:", .result = VERBOSE_ACCEPT, .retval = -1, },
@@ -170,8 +169,6 @@ "precise: STX insn causing spi > allocated_stack", .insns = {BPF_RAW_INSN (BPF_JMP |BPF_CALL ,0 ,0 ,0 , BPF_FUNC_get_prandom_u32), -/* make later reg spill more interesting by having somewhat known scalar */ -BPF_ALU64_IMM (BPF_AND ,BPF_REG_0 ,0xff ),BPF_MOV64_REG (BPF_REG_3 ,BPF_REG_10 ),BPF_JMP_IMM (BPF_JNE ,BPF_REG_3 ,123 ,0 ), BPF_STX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, -8),
@@ -182,21 +179,18 @@ }, .prog_type = BPF_PROG_TYPE_XDP, .flags = BPF_F_TEST_STATE_FREQ, - .errstr ="mark_precise: frame0: last_idx 7 first_idx 7\ + .errstr ="mark_precise: frame0: last_idx 6 first_idx 6\ mark_precise: frame0: parent state regs=r4 stack=:\ -mark_precise: frame0: last_idx 6 first_idx 4\ -mark_precise: frame0: regs=r4 stack= before 6: (b7) r0 = -1\ -mark_precise: frame0: regs=r4 stack= before 5: (79) r4 = *(u64 *)(r10 -8)\ -mark_precise: frame0: regs= stack=-8 before 4: (7b) *(u64 *)(r3 -8) = r0\ -mark_precise: frame0: parent state regs=r0 stack=:\ -mark_precise: frame0: last_idx 3 first_idx 3\ -mark_precise: frame0: regs=r0 stack= before 3: (55) if r3 != 0x7b goto pc+0\ -mark_precise: frame0: regs=r0 stack= before 2: (bf) r3 = r10\ -mark_precise: frame0: regs=r0 stack= before 1: (57) r0 &= 255\ -mark_precise: frame0: parent state regs=r0 stack=:\ -mark_precise: frame0: last_idx 0 first_idx 0\ -mark_precise: frame0: regs=r0 stack= before 0: (85) call bpf_get_prandom_u32#7\ -mark_precise: frame0: last_idx 7 first_idx 7\ +mark_precise: frame0: last_idx 5 first_idx 3\ +mark_precise: frame0: regs=r4 stack= before 5\ +mark_precise: frame0: regs=r4 stack= before 4\ +mark_precise: frame0: regs= stack=-8 before 3\ +mark_precise: frame0: falling back to forcing all scalars precise\ +force_precise: frame0: forcing r0 to be precise\ +force_precise: frame0: forcing r0 to be precise\ +force_precise: frame0: forcing r0 to be precise\ +force_precise: frame0: forcing r0 to be precise\ +mark_precise: frame0: last_idx 6 first_idx 6\ mark_precise: frame0: parent state regs= stack=:", .result = VERBOSE_ACCEPT, .retval = -1,
Greg Kroah-Hartman
maintainerPATCH 199/222 ALSA: seq: Check UMP support for midi_version change
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 8765429279e7d3d68d39ace5f84af2815174bb1e upstream.
When the kernel is built without UMP support but a user-space app requires the midi_version > 0, the kernel should return an error. Otherwise user-space assumes as if it were possible to deal, eventually hitting serious errors later.
--- sound/core/seq/seq_clientmgr.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
sound/core/seq/seq_clientmgr.c +10 -4
@@ -1280,10 +1280,16 @@ static int snd_seq_ioctl_set_client_infoif (client->type != client_info->type)return -EINVAL ; -/* check validity of midi_version field */ -if (client->user_pversion >=SNDRV_PROTOCOL_VERSION (1 ,0 ,3 ) && - client_info->midi_version >SNDRV_SEQ_CLIENT_UMP_MIDI_2_0 ) -return -EINVAL ; +if (client->user_pversion >=SNDRV_PROTOCOL_VERSION (1 ,0 ,3 )) { +/* check validity of midi_version field */ +if (client_info->midi_version >SNDRV_SEQ_CLIENT_UMP_MIDI_2_0 ) +return -EINVAL ; + +/* check if UMP is supported in kernel */ +if (!IS_ENABLED (CONFIG_SND_SEQ_UMP ) && + client_info->midi_version >0 ) +return -EINVAL ; + }/* fill the info fields */ if (client_info->name[0 ])
Greg Kroah-Hartman
maintainerPATCH 200/222 ALSA hda/realtek: Add quirk for Framework F111:000C
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Schaefer <[email protected]>
commit 7b509910b3ad6d7aacead24c8744de10daf8715d upstream.
Similar to commit eb91c456f371
("ALSA: hda/realtek: Add Framework Laptop 13 (Intel Core Ultra) to quirks") and previous quirks for Framework systems with
Realtek codecs.
000C is a new platform that will also have an ALC285 codec and needs the same quirk.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -10443,6 +10443,7 @@ static const struct hda_quirk alc269_fixSND_PCI_QUIRK (0xf111 ,0x0001 ,"Framework Laptop" ,ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0xf111 ,0x0006 ,"Framework Laptop" ,ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0xf111 ,0x0009 ,"Framework Laptop" ,ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE ), +SND_PCI_QUIRK (0xf111 ,0x000c ,"Framework Laptop" ,ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE ), #if 0/* Below is a quirk table taken from the old code.
Greg Kroah-Hartman
maintainerPATCH 201/222 ALSA: seq: oss: Fix races at processing SysEx messages
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 0179488ca992d79908b8e26b9213f1554fc5bacc upstream.
OSS sequencer handles the SysEx messages split in 6 bytes packets, and ALSA sequencer OSS layer tries to combine those. It stores the data in the internal buffer and this access is racy as of now, which may lead to the out-of-bounds access.
As a temporary band-aid fix, introduce a mutex for serializing the process of the SysEx message packets.
--- sound/core/seq/oss/seq_oss_synth.c | 2 ++ 1 file changed, 2 insertions(+)
sound/core/seq/oss/seq_oss_synth.c +2 -0
@@ -66,6 +66,7 @@ static struct seq_oss_synth midi_synth_d };static DEFINE_SPINLOCK (register_lock); +static DEFINE_MUTEX (sysex_mutex);/* * prototypes
@@ -497,6 +498,7 @@ snd_seq_oss_synth_sysex(struct seq_oss_dif (!info)return -ENXIO ; +guard (mutex)(&sysex_mutex); sysex = info->sysex;if (sysex ==NULL ) { sysex =kzalloc (sizeof (*sysex),GFP_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 202/222 ocfs2: fix slab-use-after-free due to dangling pointer dqi_priv
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dennis Lam <[email protected]>
commit 5f3fd772d152229d94602bca243fbb658068a597 upstream.
When mounting ocfs2 and then remounting it as read-only, a slab-use-after-free occurs after the user uses a syscall to quota_getnextquota. Specifically, sb_dqinfo(sb, type)->dqi_priv is the dangling pointer.
During the remounting process, the pointer dqi_priv is freed but is never set as null leaving it to be accessed. Additionally, the read-only option for remounting sets the DQUOT_SUSPENDED flag instead of setting the DQUOT_USAGE_ENABLED flags. Moreover, later in the process of getting the next quota, the function ocfs2_get_next_id is called and only checks the quota usage flags and not the quota suspended flags.
To fix this, I set dqi_priv to null when it is freed after remounting with read-only and put a check for DQUOT_SUSPENDED in ocfs2_get_next_id.
--- fs/ocfs2/quota_global.c | 2 +- fs/ocfs2/quota_local.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-)
fs/ocfs2/quota_global.c +1 -1
@@ -881,7 +881,7 @@ static int ocfs2_get_next_id(struct supeint status =0 ;trace_ocfs2_get_next_id (from_kqid (&init_user_ns, *qid), type); -if (!sb_has_quota_loaded (sb, type)) { +if (!sb_has_quota_active (sb, type)) { status = -ESRCH ; goto out; }
fs/ocfs2/quota_local.c +1 -0
@@ -864,6 +864,7 @@ out:brelse (oinfo->dqi_libh);brelse (oinfo->dqi_lqi_bh);kfree (oinfo); + info->dqi_priv =NULL ;return status; }
Greg Kroah-Hartman
maintainerPATCH 203/222 kcov: mark in_softirq_really() as __always_inline
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit cb0ca08b326aa03f87fe94bb91872ce8d2ef1ed8 upstream.
If gcc decides not to inline in_softirq_really(), objtool warns about a function call with UACCESS enabled:
kernel/kcov.o: warning: objtool: __sanitizer_cov_trace_pc+0x1e: call to in_softirq_really() with UACCESS enabled kernel/kcov.o: warning: objtool: check_kcov_mode+0x11: call to in_softirq_really() with UACCESS enabled
Mark this as __always_inline to avoid the problem.
--- kernel/kcov.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/kcov.c +1 -1
@@ -165,7 +165,7 @@ static void kcov_remote_area_put(struct* Unlike in_serving_softirq(), this function returns false when called during * a hardirq or an NMI that happened in the softirq context. */ -static inline bool in_softirq_really (void ) +static __always_inline bool in_softirq_really(void) {return in_serving_softirq () && !in_hardirq () && !in_nmi (); }
Greg Kroah-Hartman
maintainerPATCH 204/222 scripts/sorttable: fix orc_sort_cmp() to maintain symmetry and transitivity
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuan-Wei Chiu <[email protected]>
commit 0210d251162f4033350a94a43f95b1c39ec84a90 upstream.
The orc_sort_cmp() function, used with qsort(), previously violated the symmetry and transitivity rules required by the C standard. Specifically, when both entries are ORC_TYPE_UNDEFINED, it could result in both a < b and b < a, which breaks the required symmetry and transitivity. This can lead to undefined behavior and incorrect sorting results, potentially causing memory corruption in glibc implementations [1].
Symmetry: If x < y, then y > x.
Transitivity: If x < y and y < z, then x < z.
Fix the comparison logic to return 0 when both entries are ORC_TYPE_UNDEFINED, ensuring compliance with qsort() requirements.
--- scripts/sorttable.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
scripts/sorttable.h +4 -1
@@ -110,7 +110,7 @@ static inline unsigned long orc_ip(conststatic int orc_sort_cmp (const void *_a,const void *_b) { -struct orc_entry *orc_a; +struct orc_entry *orc_a, *orc_b;const int *a = g_orc_ip_table + *(int *)_a;const int *b = g_orc_ip_table + *(int *)_b;unsigned long a_val =orc_ip (a);
@@ -128,6 +128,9 @@ static int orc_sort_cmp(const void *_a,* whitelisted .o files which didn't get objtool generation. */ orc_a = g_orc_table + (a - g_orc_ip_table); + orc_b = g_orc_table + (b - g_orc_ip_table); +if (orc_a->type ==ORC_TYPE_UNDEFINED && orc_b->type ==ORC_TYPE_UNDEFINED ) +return 0 ;return orc_a->type ==ORC_TYPE_UNDEFINED ?-1 :1 ; }
Greg Kroah-Hartman
maintainerPATCH 205/222 RDMA/uverbs: Prevent integer overflow issue
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit d0257e089d1bbd35c69b6c97ff73e3690ab149a9 upstream.
In the expression "cmd.wqe_size * cmd.wr_count", both variables are u32 values that come from the user so the multiplication can lead to integer wrapping. Then we pass the result to uverbs_request_next_ptr() which also could potentially wrap. The "cmd.sge_count * sizeof(struct ib_uverbs_sge)" multiplication can also overflow on 32bit systems although it's fine on 64bit systems.
This patch does two things. First, I've re-arranged the condition in uverbs_request_next_ptr() so that the use controlled variable "len" is on one side of the comparison by itself without any math. Then I've modified all the callers to use size_mul() for the multiplications.
--- drivers/infiniband/core/uverbs_cmd.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
drivers/infiniband/core/uverbs_cmd.c +9 -7
@@ -161,7 +161,7 @@ static const void __user *uverbs_request {const void __user *res = iter->cur; -if (iter->cur + len > iter->end) +if (len > iter->end - iter->cur)return (void __force __user *)ERR_PTR (-ENOSPC ); iter->cur += len;return res;
@@ -2009,11 +2009,13 @@ static int ib_uverbs_post_send(struct uv ret =uverbs_request_start (attrs, &iter, &cmd,sizeof (cmd));if (ret)return ret; - wqes =uverbs_request_next_ptr (&iter, cmd.wqe_size * cmd.wr_count); + wqes =uverbs_request_next_ptr (&iter,size_mul (cmd.wqe_size, + cmd.wr_count));if (IS_ERR (wqes))return PTR_ERR (wqes); - sgls =uverbs_request_next_ptr ( - &iter, cmd.sge_count *sizeof (struct ib_uverbs_sge )); + sgls =uverbs_request_next_ptr (&iter, +size_mul (cmd.sge_count, +sizeof (struct ib_uverbs_sge )));if (IS_ERR (sgls))return PTR_ERR (sgls); ret =uverbs_request_finish (&iter);
@@ -2199,11 +2201,11 @@ ib_uverbs_unmarshall_recv(struct uverbs_if (wqe_size <sizeof (struct ib_uverbs_recv_wr ))return ERR_PTR (-EINVAL ); - wqes =uverbs_request_next_ptr (iter, wqe_size * wr_count); + wqes =uverbs_request_next_ptr (iter,size_mul (wqe_size, wr_count));if (IS_ERR (wqes))return ERR_CAST (wqes); - sgls =uverbs_request_next_ptr ( - iter, sge_count *sizeof (struct ib_uverbs_sge )); + sgls =uverbs_request_next_ptr (iter,size_mul (sge_count, +sizeof (struct ib_uverbs_sge )));if (IS_ERR (sgls))return ERR_CAST (sgls); ret =uverbs_request_finish (iter);
Greg Kroah-Hartman
maintainerPATCH 206/222 pinctrl: mcp23s08: Fix sleeping in atomic context due to regmap locking
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Evgenii Shatokhin <[email protected]>
commit a37eecb705f33726f1fb7cd2a67e514a15dfe693 upstream.
If a device uses MCP23xxx IO expander to receive IRQs, the following bug can happen:
BUG: sleeping function called from invalid context
at kernel/locking/mutex.c:283
in_atomic(): 1, irqs_disabled(): 1, non_block: 0, ...
preempt_count: 1, expected: 0
...
Call Trace:
...
__might_resched+0x104/0x10e
__might_sleep+0x3e/0x62
mutex_lock+0x20/0x4c
regmap_lock_mutex+0x10/0x18
regmap_update_bits_base+0x2c/0x66
mcp23s08_irq_set_type+0x1ae/0x1d6
__irq_set_trigger+0x56/0x172
__setup_irq+0x1e6/0x646
request_threaded_irq+0xb6/0x160
...We observed the problem while experimenting with a touchscreen driver which used MCP23017 IO expander (I2C).
The regmap in the pinctrl-mcp23s08 driver uses a mutex for protection from concurrent accesses, which is the default for regmaps without .fast_io, .disable_locking, etc.
mcp23s08_irq_set_type() calls regmap_update_bits_base(), and the latter locks the mutex.
However, __setup_irq() locks desc->lock spinlock before calling these functions. As a result, the system tries to lock the mutex whole holding the spinlock.
It seems, the internal regmap locks are not needed in this driver at all. mcp->lock seems to protect the regmap from concurrent accesses already, except, probably, in mcp_pinconf_get/set.
mcp23s08_irq_set_type() and mcp23s08_irq_mask/unmask() are called under chip_bus_lock(), which calls mcp23s08_irq_bus_lock(). The latter takes mcp->lock and enables regmap caching, so that the potentially slow I2C accesses are deferred until chip_bus_unlock().
The accesses to the regmap from mcp23s08_probe_one() do not need additional locking.
In all remaining places where the regmap is accessed, except mcp_pinconf_get/set(), the driver already takes mcp->lock.
This patch adds locking in mcp_pinconf_get/set() and disables internal locking in the regmap config. Among other things, it fixes the sleeping in atomic context described above.
--- drivers/pinctrl/pinctrl-mcp23s08.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/pinctrl/pinctrl-mcp23s08.c +6 -0
@@ -86,6 +86,7 @@ const struct regmap_config mcp23x08_regm .num_reg_defaults = ARRAY_SIZE(mcp23x08_defaults), .cache_type = REGCACHE_FLAT, .max_register = MCP_OLAT, + .disable_locking = true, /* mcp->lock protects the regmap */ };EXPORT_SYMBOL_GPL (mcp23x08_regmap);
@@ -132,6 +133,7 @@ const struct regmap_config mcp23x17_regm .num_reg_defaults = ARRAY_SIZE(mcp23x17_defaults), .cache_type = REGCACHE_FLAT, .val_format_endian = REGMAP_ENDIAN_LITTLE, + .disable_locking = true, /* mcp->lock protects the regmap */ };EXPORT_SYMBOL_GPL (mcp23x17_regmap);
@@ -228,7 +230,9 @@ static int mcp_pinconf_get(struct pinctrswitch (param) {case PIN_CONFIG_BIAS_PULL_UP : +mutex_lock (&mcp->lock); ret =mcp_read (mcp,MCP_GPPU , &data); +mutex_unlock (&mcp->lock);if (ret <0 )return ret; status = (data &BIT (pin)) ?1 :0 ;
@@ -257,7 +261,9 @@ static int mcp_pinconf_set(struct pinctrswitch (param) {case PIN_CONFIG_BIAS_PULL_UP : +mutex_lock (&mcp->lock); ret =mcp_set_bit (mcp,MCP_GPPU , pin, arg); +mutex_unlock (&mcp->lock);break ;default :dev_dbg (mcp->dev,"Invalid config param %04x\n" , param);
Greg Kroah-Hartman
maintainerPATCH 207/222 sky2: Add device ID 11ab:4373 for Marvell 88E8075
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pascal Hambourg <[email protected]>
commit 03c8d0af2e409e15c16130b185e12b5efba0a6b9 upstream.
A Marvell 88E8075 ethernet controller has this device ID instead of 11ab:4370 and works fine with the sky2 driver.
--- drivers/net/ethernet/marvell/sky2.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/marvell/sky2.c +1 -0
@@ -129,6 +129,7 @@ static const struct pci_device_id sky2_i { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436C) }, /* 88E8072 */ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436D) }, /* 88E8055 */ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4370) }, /* 88E8075 */ + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4373) }, /* 88E8075 */ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4380) }, /* 88E8057 */ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4381) }, /* 88E8059 */ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4382) }, /* 88E8079 */
Greg Kroah-Hartman
maintainerPATCH 208/222 net/sctp: Prevent autoclose integer overflow in sctp_association_init()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikolay Kuratov <[email protected]>
commit 4e86729d1ff329815a6e8a920cb554a1d4cb5b8d upstream.
While by default max_autoclose equals to INT_MAX / HZ, one may set net.sctp.max_autoclose to UINT_MAX. There is code in sctp_association_init() that can consequently trigger overflow.
--- net/sctp/associola.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/sctp/associola.c +2 -1
@@ -137,7 +137,8 @@ static struct sctp_association *sctp_ass = 5 * asoc->rto_max; asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK ] = asoc->sackdelay; - asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE ] = sp->autoclose *HZ ; + asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE ] = + (unsigned long )sp->autoclose *HZ ;/* Initializes the timers */ for (i =SCTP_EVENT_TIMEOUT_NONE ; i <SCTP_NUM_TIMEOUT_TYPES ; ++i)
Greg Kroah-Hartman
maintainerPATCH 209/222 drm: adv7511: Drop dsi single lane support
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Biju Das <[email protected]>
commit 79d67c499c3f886202a40c5cb27e747e4fa4d738 upstream.
As per [1] and [2], ADV7535/7533 supports only 2-, 3-, or 4-lane. Drop unsupported 1-lane.
[1] https://www.analog.com/media/en/technical-documentation/data-sheets/ADV7535.pdf
[2] https://www.analog.com/media/en/technical-documentation/data-sheets/ADV7533.pdf
--- drivers/gpu/drm/bridge/adv7511/adv7533.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/bridge/adv7511/adv7533.c +1 -1
@@ -175,7 +175,7 @@ int adv7533_parse_dt(struct device_nodeof_property_read_u32 (np,"adi,dsi-lanes" , &num_lanes); -if (num_lanes <1 || num_lanes >4 ) +if (num_lanes <2 || num_lanes >4 )return -EINVAL ; adv->num_dsi_lanes = num_lanes;
Greg Kroah-Hartman
maintainerPATCH 210/222 dt-bindings: display: adi,adv7533: Drop single lane support
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Biju Das <[email protected]>
commit ee8f9ed57a397605434caeef351bafa3ec4dfdd4 upstream.
As per [1] and [2], ADV7535/7533 supports only 2-, 3-, or 4-lane. Drop unsupported 1-lane from bindings.
[1] https://www.analog.com/media/en/technical-documentation/data-sheets/ADV7535.pdf
[2] https://www.analog.com/media/en/technical-documentation/data-sheets/ADV7533.pdf
--- Documentation/devicetree/bindings/display/bridge/adi,adv7533.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/devicetree/bindings/display/bridge/adi,adv7533.yaml +1 -1
@@ -87,7 +87,7 @@ properties: adi,dsi-lanes: description: Number of DSI data lanes connected to the DSI host. $ref: /schemas/types.yaml#/definitions/uint32 - enum: [ 1, 2, 3, 4 ] + enum: [ 2, 3, 4 ] ports: description:
Greg Kroah-Hartman
maintainerPATCH 211/222 drm: adv7511: Fix use-after-free in adv7533_attach_dsi()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Biju Das <[email protected]>
commit 81adbd3ff21c1182e06aa02c6be0bfd9ea02d8e8 upstream.
The host_node pointer was assigned and freed in adv7533_parse_dt(), and later, adv7533_attach_dsi() uses the same. Fix this use-after-free issue by dropping of_node_put() in adv7533_parse_dt() and calling of_node_put() in error path of probe() and also in the remove().
--- drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 10 ++++++++-- drivers/gpu/drm/bridge/adv7511/adv7533.c | 2 -- 2 files changed, 8 insertions(+), 4 deletions(-)
drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +8 -2
@@ -1225,8 +1225,10 @@ static int adv7511_probe(struct i2c_cliereturn ret; ret =adv7511_init_regulators (adv7511); -if (ret) -return dev_err_probe (dev, ret,"failed to init regulators\n" ); +if (ret) { +dev_err_probe (dev, ret,"failed to init regulators\n" ); + goto err_of_node_put; + }/* * The power down GPIO is optional. If present, toggle it from active to
@@ -1346,6 +1348,8 @@ err_i2c_unregister_edid:i2c_unregister_device (adv7511->i2c_edid); uninit_regulators:adv7511_uninit_regulators (adv7511); +err_of_node_put: +of_node_put (adv7511->host_node);return ret; }
@@ -1354,6 +1358,8 @@ static void adv7511_remove(struct i2c_cl {struct adv7511 *adv7511 =i2c_get_clientdata (i2c); +of_node_put (adv7511->host_node); +adv7511_uninit_regulators (adv7511);drm_bridge_remove (&adv7511->bridge);
drivers/gpu/drm/bridge/adv7511/adv7533.c +0 -2
@@ -184,8 +184,6 @@ int adv7533_parse_dt(struct device_nodeif (!adv->host_node)return -ENODEV ; -of_node_put (adv->host_node); - adv->use_timing_gen = !of_property_read_bool (np,"adi,disable-timing-generator" );
Greg Kroah-Hartman
maintainerPATCH 212/222 fs/proc/task_mmu: fix pagemap flags with PMD THP entries on 32bit
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Hildenbrand <[email protected]>
commit 3754137d263f52f4b507cf9ae913f8f0497d1b0e upstream.
Entries (including flags) are u64, even on 32bit. So right now we are cutting of the flags on 32bit. This way, for example the cow selftest complains about:
# ./cow ... Bail Out! read and ioctl return unmatched results for populated: 0 1
--- fs/proc/task_mmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/proc/task_mmu.c +1 -1
@@ -1516,7 +1516,7 @@ static int pagemap_pmd_range(pmd_t *pmdp flags |=PM_FILE ;for (; addr != end; addr +=PAGE_SIZE , idx++) { -unsigned long cur_flags = flags; +u64 cur_flags = flags;pagemap_entry_t pme; if (page && (flags & PM_PRESENT) &&
Greg Kroah-Hartman
maintainerPATCH 213/222 gve: guard XSK operations on the existence of queues
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joshua Washington <[email protected]>
commit 40338d7987d810fcaa95c500b1068a52b08eec9b upstream.
This patch predicates the enabling and disabling of XSK pools on the existence of queues. As it stands, if the interface is down, disabling or enabling XSK pools would result in a crash, as the RX queue pointer would be NULL. XSK pool registration will occur as part of the next interface up.
Similarly, xsk_wakeup needs be guarded against queues disappearing while the function is executing, so a check against the GVE_PRIV_FLAGS_NAPI_ENABLED flag is added to synchronize with the disabling of the bit and the synchronize_net() in gve_turndown.
--- drivers/net/ethernet/google/gve/gve_main.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-)
drivers/net/ethernet/google/gve/gve_main.c +10 -12
@@ -1528,8 +1528,8 @@ static int gve_xsk_pool_enable(struct neif (err)return err; -/* If XDP prog is not installed, return */ -if (!priv->xdp_prog) +/* If XDP prog is not installed or interface is down, return. */ +if (!priv->xdp_prog || !netif_running (dev))return 0 ; rx = &priv->rx[qid];
@@ -1574,21 +1574,16 @@ static int gve_xsk_pool_disable(struct nif (qid >= priv->rx_cfg.num_queues)return -EINVAL ; -/* If XDP prog is not installed, unmap DMA and return */ -if (!priv->xdp_prog) +/* If XDP prog is not installed or interface is down, unmap DMA and +* return. +*/ +if (!priv->xdp_prog || !netif_running (dev)) goto done; - tx_qid =gve_xdp_tx_queue_id (priv, qid); -if (!netif_running (dev)) { - priv->rx[qid].xsk_pool =NULL ; -xdp_rxq_info_unreg (&priv->rx[qid].xsk_rxq); - priv->tx[tx_qid].xsk_pool =NULL ; - goto done; - } - napi_rx = &priv->ntfy_blocks[priv->rx[qid].ntfy_id].napi;napi_disable (napi_rx);/* make sure current rx poll is done */ + tx_qid =gve_xdp_tx_queue_id (priv, qid); napi_tx = &priv->ntfy_blocks[priv->tx[tx_qid].ntfy_id].napi;napi_disable (napi_tx);/* make sure current tx poll is done */
@@ -1616,6 +1611,9 @@ static int gve_xsk_wakeup(struct net_devstruct gve_priv *priv =netdev_priv (dev);int tx_queue_id =gve_xdp_tx_queue_id (priv, queue_id); +if (!gve_get_napi_enabled (priv)) +return -ENETDOWN ; +if (queue_id >= priv->rx_cfg.num_queues || !priv->xdp_prog)return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 214/222 gve: guard XDP xmit NDO on existence of xdp queues
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joshua Washington <[email protected]>
commit ff7c2dea9dd1a436fc79d6273adffdcc4a7ffea3 upstream.
In GVE, dedicated XDP queues only exist when an XDP program is installed and the interface is up. As such, the NDO XDP XMIT callback should return early if either of these conditions are false.
In the case of no loaded XDP program, priv->num_xdp_queues=0 which can cause a divide-by-zero error, and in the case of interface down, num_xdp_queues remains untouched to persist XDP queue count for the next interface up, but the TX pointer itself would be NULL.
The XDP xmit callback also needs to synchronize with a device transitioning from open to close. This synchronization will happen via the GVE_PRIV_FLAGS_NAPI_ENABLED bit along with a synchronize_net() call, which waits for any RCU critical sections at call-time to complete.
--- drivers/net/ethernet/google/gve/gve_main.c | 3 +++ drivers/net/ethernet/google/gve/gve_tx.c | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-)
drivers/net/ethernet/google/gve/gve_main.c +3 -0
@@ -1755,6 +1755,9 @@ static void gve_turndown(struct gve_privgve_clear_napi_enabled (priv);gve_clear_report_stats (priv); + +/* Make sure that all traffic is finished processing. */ +synchronize_net (); }static void gve_turnup (struct gve_priv *priv)
drivers/net/ethernet/google/gve/gve_tx.c +4 -1
@@ -777,9 +777,12 @@ int gve_xdp_xmit(struct net_device *dev,struct gve_tx_ring *tx;int i, err =0 , qid; -if (unlikely (flags & ~XDP_XMIT_FLAGS_MASK )) +if (unlikely (flags & ~XDP_XMIT_FLAGS_MASK ) || !priv->xdp_prog)return -EINVAL ; +if (!gve_get_napi_enabled (priv)) +return -ENETDOWN ; + qid =gve_xdp_tx_queue_id (priv,smp_processor_id () % priv->num_xdp_queues);
Greg Kroah-Hartman
maintainerPATCH 215/222 mm/readahead: fix large folio support in async readahead
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yafang Shao <[email protected]>
commit 158cdce87c8c172787063998ad5dd3e2f658b963 upstream.
When testing large folio support with XFS on our servers, we observed that only a few large folios are mapped when reading large files via mmap. After a thorough analysis, I identified it was caused by the /sys/block/*/queue/read_ahead_kb setting. On our test servers, this parameter is set to 128KB. After I tune it to 2MB, the large folio can work as expected. However, I believe the large folio behavior should not be dependent on the value of read_ahead_kb. It would be more robust if the kernel can automatically adopt to it.
With /sys/block/*/queue/read_ahead_kb set to 128KB and performing a sequential read on a 1GB file using MADV_HUGEPAGE, the differences in /proc/meminfo are as follows:
- before this patch
FileHugePages: 18432 kB
FilePmdMapped: 4096 kB
- after this patch
FileHugePages: 1067008 kB
FilePmdMapped: 1048576 kB
This shows that after applying the patch, the entire 1GB file is mapped to huge pages. The stable list is CCed, as without this patch, large folios don't function optimally in the readahead path.
It's worth noting that if read_ahead_kb is set to a larger value that isn't aligned with huge page sizes (e.g., 4MB + 128KB), it may still fail to map to hugepages.
--- mm/readahead.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
mm/readahead.c +5 -1
@@ -580,7 +580,11 @@ static void ondemand_readahead(struct re 1UL << order);if (index == expected || index == (ra->start + ra->size)) { ra->start += ra->size; - ra->size =get_next_ra_size (ra, max_pages); +/* +* In the case of MADV_HUGEPAGE, the actual size might exceed +* the readahead window. +*/ + ra->size =max (ra->size,get_next_ra_size (ra, max_pages)); ra->async_size = ra->size; goto readit; }
Greg Kroah-Hartman
maintainerPATCH 216/222 mm/kmemleak: fix sleeping function called from invalid context at print message
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alessandro Carminati <[email protected]>
commit cddc76b165161a02ff14c4d84d0f5266d9d32b9e upstream.
Address a bug in the kernel that triggers a "sleeping function called from invalid context" warning when /sys/kernel/debug/kmemleak is printed under specific conditions:
- CONFIG_PREEMPT_RT=y
- Set SELinux as the LSM for the system
- Set kptr_restrict to 1
- kmemleak buffer contains at least one item
BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48
in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 136, name: catpreempt_count: 1, expected: 0
RCU nest depth: 2, expected: 2
6 locks held by cat/136:
#0: ffff32e64bcbf950 (&p->lock){+.+.}-{3:3}, at: seq_read_iter+0xb8/0xe30 #1: ffffafe6aaa9dea0 (scan_mutex){+.+.}-{3:3}, at: kmemleak_seq_start+0x34/0x128 #3: ffff32e6546b1cd0 (&object->lock){....}-{2:2}, at: kmemleak_seq_show+0x3c/0x1e0 #4: ffffafe6aa8d8560 (rcu_read_lock){....}-{1:2}, at: has_ns_capability_noaudit+0x8/0x1b0 #5: ffffafe6aabbc0f8 (notif_lock){+.+.}-{2:2}, at: avc_compute_av+0xc4/0x3d0
irq event stamp: 136660 hardirqs last enabled at (136659): [<ffffafe6a80fd7a0>] _raw_spin_unlock_irqrestore+0xa8/0xd8 hardirqs last disabled at (136660): [<ffffafe6a80fd85c>] _raw_spin_lock_irqsave+0x8c/0xb0 softirqs last enabled at (0): [<ffffafe6a5d50b28>] copy_process+0x11d8/0x3df8 softirqs last disabled at (0): [<0000000000000000>] 0x0 Preemption disabled at: [<ffffafe6a6598a4c>] kmemleak_seq_show+0x3c/0x1e0 CPU: 1 UID: 0 PID: 136 Comm: cat Tainted: G E 6.11.0-rt7+ #34 Tainted: [E]=UNSIGNED_MODULE Hardware name: linux,dummy-virt (DT) Call trace: dump_backtrace+0xa0/0x128 show_stack+0x1c/0x30 dump_stack_lvl+0xe8/0x198 dump_stack+0x18/0x20 rt_spin_lock+0x8c/0x1a8 avc_perm_nonode+0xa0/0x150 cred_has_capability.isra.0+0x118/0x218 selinux_capable+0x50/0x80 security_capable+0x7c/0xd0 has_ns_capability_noaudit+0x94/0x1b0 has_capability_noaudit+0x20/0x30 restricted_pointer+0x21c/0x4b0 pointer+0x298/0x760 vsnprintf+0x330/0xf70 seq_printf+0x178/0x218 print_unreferenced+0x1a4/0x2d0 kmemleak_seq_show+0xd0/0x1e0 seq_read_iter+0x354/0xe30 seq_read+0x250/0x378 full_proxy_read+0xd8/0x148 vfs_read+0x190/0x918 ksys_read+0xf0/0x1e0 __arm64_sys_read+0x70/0xa8 invoke_syscall.constprop.0+0xd4/0x1d8 el0_svc+0x50/0x158 el0t_64_sync+0x17c/0x180
%pS and %pK, in the same back trace line, are redundant, and %pS can void %pK service in certain contexts.
%pS alone already provides the necessary information, and if it cannot resolve the symbol, it falls back to printing the raw address voiding the original intent behind the %pK.
Additionally, %pK requires a privilege check CAP_SYSLOG enforced through the LSM, which can trigger a "sleeping function called from invalid context" warning under RT_PREEMPT kernels when the check occurs in an atomic context. This issue may also affect other LSMs.
This change avoids the unnecessary privilege check and resolves the sleeping function warning without any loss of information.
--- mm/kmemleak.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/kmemleak.c +1 -1
@@ -368,7 +368,7 @@ static void print_unreferenced(struct sefor (i =0 ; i < nr_entries; i++) {void *ptr = (void *)entries[i]; -warn_or_seq_printf (seq," [<%pK>] %pS\n" , ptr, ptr); +warn_or_seq_printf (seq," %pS\n" , ptr); } }
Greg Kroah-Hartman
maintainerPATCH 217/222 mm: vmscan: account for free pages to prevent infinite Loop in throttle_direct_reclaim()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Seiji Nishikawa <[email protected]>
commit 6aaced5abd32e2a57cd94fd64f824514d0361da8 upstream.
The task sometimes continues looping in throttle_direct_reclaim() because allow_direct_reclaim(pgdat) keeps returning false.
#0 [ffff80002cb6f8d0] __switch_to at ffff8000080095ac #1 [ffff80002cb6f900] __schedule at ffff800008abbd1c #2 [ffff80002cb6f990] schedule at ffff800008abc50c
#3 [ffff80002cb6f9b0] throttle_direct_reclaim at ffff800008273550 #4 [ffff80002cb6fa20] try_to_free_pages at ffff800008277b68 #5 [ffff80002cb6fae0] __alloc_pages_nodemask at ffff8000082c4660 #6 [ffff80002cb6fc50] alloc_pages_vma at ffff8000082e4a98 #7 [ffff80002cb6fca0] do_anonymous_page at ffff80000829f5a8 #8 [ffff80002cb6fce0] __handle_mm_fault at ffff8000082a5974 #9 [ffff80002cb6fd90] handle_mm_fault at ffff8000082a5bd4
At this point, the pgdat contains the following two zones:
NODE: 4 ZONE: 0 ADDR: ffff00817fffe540 NAME: "DMA32"
SIZE: 20480 MIN/LOW/HIGH: 11/28/45
VM_STAT:
NR_FREE_PAGES: 359
NR_ZONE_INACTIVE_ANON: 18813
NR_ZONE_ACTIVE_ANON: 0
NR_ZONE_INACTIVE_FILE: 50
NR_ZONE_ACTIVE_FILE: 0
NR_ZONE_UNEVICTABLE: 0
NR_ZONE_WRITE_PENDING: 0
NR_MLOCK: 0
NR_BOUNCE: 0
NR_ZSPAGES: 0
NR_FREE_CMA_PAGES: 0
NODE: 4 ZONE: 1 ADDR: ffff00817fffec00 NAME: "Normal"
SIZE: 8454144 PRESENT: 98304 MIN/LOW/HIGH: 68/166/264
VM_STAT:
NR_FREE_PAGES: 146
NR_ZONE_INACTIVE_ANON: 94668
NR_ZONE_ACTIVE_ANON: 3
NR_ZONE_INACTIVE_FILE: 735
NR_ZONE_ACTIVE_FILE: 78
NR_ZONE_UNEVICTABLE: 0
NR_ZONE_WRITE_PENDING: 0
NR_MLOCK: 0
NR_BOUNCE: 0
NR_ZSPAGES: 0
NR_FREE_CMA_PAGES: 0In allow_direct_reclaim(), while processing ZONE_DMA32, the sum of inactive/active file-backed pages calculated in zone_reclaimable_pages() based on the result of zone_page_state_snapshot() is zero.
Additionally, since this system lacks swap, the calculation of inactive/ active anonymous pages is skipped.
crash> p nr_swap_pages
nr_swap_pages = $1937 = {
counter = 0
}
As a result, ZONE_DMA32 is deemed unreclaimable and skipped, moving on to the processing of the next zone, ZONE_NORMAL, despite ZONE_DMA32 having free pages significantly exceeding the high watermark.
The problem is that the pgdat->kswapd_failures hasn't been incremented.
crash> px ((struct pglist_data *) 0xffff00817fffe540)->kswapd_failures
$1935 = 0x0This is because the node deemed balanced. The node balancing logic in balance_pgdat() evaluates all zones collectively. If one or more zones (e.g., ZONE_DMA32) have enough free pages to meet their watermarks, the entire node is deemed balanced. This causes balance_pgdat() to exit early before incrementing the kswapd_failures, as it considers the overall memory state acceptable, even though some zones (like ZONE_NORMAL) remain under significant pressure.
The patch ensures that zone_reclaimable_pages() includes free pages (NR_FREE_PAGES) in its calculation when no other reclaimable pages are available (e.g., file-backed or anonymous pages). This change prevents zones like ZONE_DMA32, which have sufficient free pages, from being mistakenly deemed unreclaimable. By doing so, the patch ensures proper node balancing, avoids masking pressure on other zones like ZONE_NORMAL, and prevents infinite loops in throttle_direct_reclaim() caused by allow_direct_reclaim(pgdat) repeatedly returning false.
The kernel hangs due to a task stuck in throttle_direct_reclaim(), caused by a node being incorrectly deemed balanced despite pressure in certain zones, such as ZONE_NORMAL. This issue arises from zone_reclaimable_pages() returning 0 for zones without reclaimable file- backed or anonymous pages, causing zones like ZONE_DMA32 with sufficient free pages to be skipped.
The lack of swap or reclaimable pages results in ZONE_DMA32 being ignored during reclaim, masking pressure in other zones. Consequently, pgdat->kswapd_failures remains 0 in balance_pgdat(), preventing fallback mechanisms in allow_direct_reclaim() from being triggered, leading to an infinite loop in throttle_direct_reclaim().
This patch modifies zone_reclaimable_pages() to account for free pages (NR_FREE_PAGES) when no other reclaimable pages exist. This ensures zones with sufficient free pages are not skipped, enabling proper balancing and reclaim behavior.
--- mm/vmscan.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
mm/vmscan.c +8 -1
@@ -641,7 +641,14 @@ unsigned long zone_reclaimable_pages(strif (can_reclaim_anon_pages (NULL ,zone_to_nid (zone),NULL )) nr +=zone_page_state_snapshot (zone,NR_ZONE_INACTIVE_ANON ) +zone_page_state_snapshot (zone,NR_ZONE_ACTIVE_ANON ); - +/* +* If there are no reclaimable file-backed or anonymous pages, +* ensure zones with sufficient free pages are not skipped. +* This prevents zones like DMA32 from being ignored in reclaim +* scenarios where they can still help alleviate memory pressure. +*/ +if (nr ==0 ) + nr =zone_page_state_snapshot (zone,NR_FREE_PAGES );return nr; }
Greg Kroah-Hartman
maintainerPATCH 218/222 mptcp: fix TCP options overflow.
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit cbb26f7d8451fe56ccac802c6db48d16240feebd upstream.
Syzbot reported the following splat:
Oops: general protection fault, probably for non-canonical address 0xdffffc0000000001: 0000 [#1] PREEMPT SMP KASAN PTI KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f] CPU: 1 UID: 0 PID: 5836 Comm: sshd Not tainted 6.13.0-rc3-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 11/25/2024 RIP: 0010:_compound_head include/linux/page-flags.h:242 [inline] RIP: 0010:put_page+0x23/0x260 include/linux/mm.h:1552 Code: 90 90 90 90 90 90 90 55 41 57 41 56 53 49 89 fe 48 bd 00 00 00 00 00 fc ff df e8 f8 5e 12 f8 49 8d 5e 08 48 89 d8 48 c1 e8 03 <80> 3c 28 00 74 08 48 89 df e8 8f c7 78 f8 48 8b 1b 48 89 de 48 83 RSP: 0000:ffffc90003916c90 EFLAGS: 00010202 RAX: 0000000000000001 RBX: 0000000000000008 RCX: ffff888030458000 RDX: 0000000000000100 RSI: 0000000000000000 RDI: 0000000000000000 RBP: dffffc0000000000 R08: ffffffff898ca81d R09: 1ffff110054414ac R10: dffffc0000000000 R11: ffffed10054414ad R12: 0000000000000007 R13: ffff88802a20a542 R14: 0000000000000000 R15: 0000000000000000 FS: 00007f34f496e800(0000) GS:ffff8880b8700000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f9d6ec9ec28 CR3: 000000004d260000 CR4: 00000000003526f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> skb_page_unref include/linux/skbuff_ref.h:43 [inline] __skb_frag_unref include/linux/skbuff_ref.h:56 [inline] skb_release_data+0x483/0x8a0 net/core/skbuff.c:1119 skb_release_all net/core/skbuff.c:1190 [inline] __kfree_skb+0x55/0x70 net/core/skbuff.c:1204 tcp_clean_rtx_queue net/ipv4/tcp_input.c:3436 [inline] tcp_ack+0x2442/0x6bc0 net/ipv4/tcp_input.c:4032 tcp_rcv_state_process+0x8eb/0x44e0 net/ipv4/tcp_input.c:6805 tcp_v4_do_rcv+0x77d/0xc70 net/ipv4/tcp_ipv4.c:1939 tcp_v4_rcv+0x2dc0/0x37f0 net/ipv4/tcp_ipv4.c:2351 ip_protocol_deliver_rcu+0x22e/0x440 net/ipv4/ip_input.c:205 ip_local_deliver_finish+0x341/0x5f0 net/ipv4/ip_input.c:233 NF_HOOK+0x3a4/0x450 include/linux/netfilter.h:314 NF_HOOK+0x3a4/0x450 include/linux/netfilter.h:314 __netif_receive_skb_one_core net/core/dev.c:5672 [inline] __netif_receive_skb+0x2bf/0x650 net/core/dev.c:5785 process_backlog+0x662/0x15b0 net/core/dev.c:6117 __napi_poll+0xcb/0x490 net/core/dev.c:6883 napi_poll net/core/dev.c:6952 [inline] net_rx_action+0x89b/0x1240 net/core/dev.c:7074 handle_softirqs+0x2d4/0x9b0 kernel/softirq.c:561 __do_softirq kernel/softirq.c:595 [inline] invoke_softirq kernel/softirq.c:435 [inline] __irq_exit_rcu+0xf7/0x220 kernel/softirq.c:662 irq_exit_rcu+0x9/0x30 kernel/softirq.c:678 instr_sysvec_apic_timer_interrupt arch/x86/kernel/apic/apic.c:1049 [inline] sysvec_apic_timer_interrupt+0x57/0xc0 arch/x86/kernel/apic/apic.c:1049 asm_sysvec_apic_timer_interrupt+0x1a/0x20 arch/x86/include/asm/idtentry.h:702 RIP: 0033:0x7f34f4519ad5 Code: 85 d2 74 0d 0f 10 02 48 8d 54 24 20 0f 11 44 24 20 64 8b 04 25 18 00 00 00 85 c0 75 27 41 b8 08 00 00 00 b8 0f 01 00 00 0f 05 <48> 3d 00 f0 ff ff 76 75 48 8b 15 24 73 0d 00 f7 d8 64 89 02 48 83 RSP: 002b:00007ffec5b32ce0 EFLAGS: 00000246 RAX: 0000000000000001 RBX: 00000000000668a0 RCX: 00007f34f4519ad5 RDX: 00007ffec5b32d00 RSI: 0000000000000004 RDI: 0000564f4bc6cae0 RBP: 0000564f4bc6b5a0 R08: 0000000000000008 R09: 0000000000000000 R10: 00007ffec5b32de8 R11: 0000000000000246 R12: 0000564f48ea8aa4 R13: 0000000000000001 R14: 0000564f48ea93e8 R15: 00007ffec5b32d68 </TASK>
Eric noted a probable shinfo->nr_frags corruption, which indeed occurs.
The root cause is a buggy MPTCP option len computation in some
circumstances: the ADD_ADDR option should be mutually exclusive with DSS since the blamed commit.
Still, mptcp_established_options_add_addr() tries to set the relevant info in mptcp_out_options, if the remaining space is large enough even when DSS is present.
Since the ADD_ADDR infos and the DSS share the same union fields, adding first corrupts the latter. In the worst-case scenario, such corruption increases the DSS binary layout, exceeding the computed length and possibly overwriting the skb shared info.
Address the issue by enforcing mutual exclusion in mptcp_established_options_add_addr(), too.
--- net/mptcp/options.c | 7 +++++++ 1 file changed, 7 insertions(+)
net/mptcp/options.c +7 -0
@@ -667,8 +667,15 @@ static bool mptcp_established_options_ad &echo, &drop_other_suboptions))return false; +/* +* Later on, mptcp_write_options() will enforce mutually exclusion with +* DSS, bail out if such option is set and we can't drop it. +*/ if (drop_other_suboptions) remaining += opt_size; +else if (opts->suboptions &OPTION_MPTCP_DSS ) +return false; + len =mptcp_add_addr_len (opts->addr.family, echo, !!opts->addr.port);if (remaining < len)return false;
Greg Kroah-Hartman
maintainerPATCH 219/222 mptcp: fix recvbuffer adjust on sleeping rcvmsg
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit 449e6912a2522af672e99992e1201a454910864e upstream.
If the recvmsg() blocks after receiving some data - i.e. due to SO_RCVLOWAT - the MPTCP code will attempt multiple times to adjust the receive buffer size, wrongly accounting every time the cumulative of received data - instead of accounting only for the delta.
Address the issue moving mptcp_rcv_space_adjust just after the data reception and passing it only the just received bytes.
This also removes an unneeded difference between the TCP and MPTCP RX code path implementation.
--- net/mptcp/protocol.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/mptcp/protocol.c +3 -3
@@ -1902,6 +1902,8 @@ do_error: goto out; } +static void mptcp_rcv_space_adjust (struct mptcp_sock *msk,int copied); + static int __mptcp_recvmsg_mskq(struct mptcp_sock *msk, struct msghdr *msg, size_t len, int flags,
@@ -1955,6 +1957,7 @@ static int __mptcp_recvmsg_mskq(struct mbreak ; } +mptcp_rcv_space_adjust (msk, copied);return copied; }
@@ -2231,7 +2234,6 @@ static int mptcp_recvmsg(struct sock *sk }pr_debug ("block timeout %ld\n" , timeo); -mptcp_rcv_space_adjust (msk, copied); err =sk_wait_data (sk, &timeo,NULL );if (err <0 ) { err = copied ? : err;
@@ -2239,8 +2241,6 @@ static int mptcp_recvmsg(struct sock *sk } } -mptcp_rcv_space_adjust (msk, copied); - out_err:if (cmsg_flags && copied >=0 ) {if (cmsg_flags &MPTCP_CMSG_TS )
Greg Kroah-Hartman
maintainerPATCH 220/222 mptcp: dont always assume copied data in mptcp_cleanup_rbuf()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit 551844f26da2a9f76c0a698baaffa631d1178645 upstream.
Under some corner cases the MPTCP protocol can end-up invoking mptcp_cleanup_rbuf() when no data has been copied, but such helper assumes the opposite condition.
Explicitly drop such assumption and performs the costly call only when strictly needed - before releasing the msk socket lock.
--- net/mptcp/protocol.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
net/mptcp/protocol.c +9 -9
@@ -528,13 +528,13 @@ static void mptcp_send_ack(struct mptcp_mptcp_subflow_send_ack (mptcp_subflow_tcp_sock (subflow)); } -static void mptcp_subflow_cleanup_rbuf (struct sock *ssk) +static void mptcp_subflow_cleanup_rbuf (struct sock *ssk,int copied) {bool slow; slow =lock_sock_fast (ssk);if (tcp_can_send_ack (ssk)) -tcp_cleanup_rbuf (ssk,1 ); +tcp_cleanup_rbuf (ssk, copied);unlock_sock_fast (ssk, slow); }
@@ -551,7 +551,7 @@ static bool mptcp_subflow_could_cleanup( (ICSK_ACK_PUSHED2 | ICSK_ACK_PUSHED))); } -static void mptcp_cleanup_rbuf (struct mptcp_sock *msk) +static void mptcp_cleanup_rbuf (struct mptcp_sock *msk,int copied) {int old_space =READ_ONCE (msk->old_wspace);struct mptcp_subflow_context *subflow;
@@ -559,14 +559,14 @@ static void mptcp_cleanup_rbuf(struct mpint space =__mptcp_space (sk);bool cleanup, rx_empty; - cleanup = (space >0 ) && (space >= (old_space <<1 )); - rx_empty = !__mptcp_rmem (sk); + cleanup = (space >0 ) && (space >= (old_space <<1 )) && copied; + rx_empty = !__mptcp_rmem (sk) && copied;mptcp_for_each_subflow (msk, subflow) {struct sock *ssk =mptcp_subflow_tcp_sock (subflow);if (cleanup ||mptcp_subflow_could_cleanup (ssk, rx_empty)) -mptcp_subflow_cleanup_rbuf (ssk); +mptcp_subflow_cleanup_rbuf (ssk, copied); } }
@@ -2183,9 +2183,6 @@ static int mptcp_recvmsg(struct sock *sk copied += bytes_read; -/* be sure to advertise window change */ -mptcp_cleanup_rbuf (msk); -if (skb_queue_empty (&msk->receive_queue) &&__mptcp_move_skbs (msk))continue ;
@@ -2234,6 +2231,7 @@ static int mptcp_recvmsg(struct sock *sk }pr_debug ("block timeout %ld\n" , timeo); +mptcp_cleanup_rbuf (msk, copied); err =sk_wait_data (sk, &timeo,NULL );if (err <0 ) { err = copied ? : err;
@@ -2241,6 +2239,8 @@ static int mptcp_recvmsg(struct sock *sk } } +mptcp_cleanup_rbuf (msk, copied); + out_err:if (cmsg_flags && copied >=0 ) {if (cmsg_flags &MPTCP_CMSG_TS )
Greg Kroah-Hartman
maintainerPATCH 221/222 RDMA/bnxt_re: Fix max SGEs for the Work Request
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kashyap Desai <[email protected]>
commit 79d330fbdffd8cee06d8bdf38d82cb62d8363a27 upstream.
Gen P7 supports up to 13 SGEs for now. WQE software structure can hold only 6 now. Since the max send sge is reported as 13, the stack can give requests up to 13 SGEs. This is causing traffic failures and system crashes.
Use the define for max SGE supported for variable size. This will work for both static and variable WQEs.
--- drivers/infiniband/hw/bnxt_re/qplib_fp.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/infiniband/hw/bnxt_re/qplib_fp.h +1 -2
@@ -113,7 +113,6 @@ struct bnxt_qplib_sge {u32 size; }; -#define BNXT_QPLIB_QP_MAX_SGL 6struct bnxt_qplib_swq {u64 wr_id;int next_idx;
@@ -153,7 +152,7 @@ struct bnxt_qplib_swqe {#define BNXT_QPLIB_SWQE_FLAGS_UC_FENCE BIT(2)#define BNXT_QPLIB_SWQE_FLAGS_SOLICIT_EVENT BIT(3)#define BNXT_QPLIB_SWQE_FLAGS_INLINE BIT(4) -struct bnxt_qplib_sge sg_list[BNXT_QPLIB_QP_MAX_SGL ]; +struct bnxt_qplib_sge sg_list[BNXT_VAR_MAX_SGE ];int num_sge;/* Max inline data is 96 bytes */ u32 inline_len;
Greg Kroah-Hartman
maintainerPATCH 222/222 scsi: hisi_sas: Remove redundant checks for automatic debugfs dump
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yihang Li <[email protected]>
commit 3f030550476566b12091687c70071d05ad433e0d upstream.
In commit 63f0733d07ce ("scsi: hisi_sas: Allocate DFX memory during dump trigger"), the memory allocation time of the DFX is changed from device initialization to dump occurs, so .debugfs_itct is not a valid address and do not need to check.
The parameter hisi_sas_debugfs_enable is enough to check whether automatic debugfs dump is triggered, so remove redunant checks.
--- drivers/scsi/hisi_sas/hisi_sas_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/hisi_sas/hisi_sas_main.c +2 -2
@@ -1579,7 +1579,7 @@ static int hisi_sas_controller_prereset(return -EPERM ; } -if (hisi_sas_debugfs_enable && hisi_hba->debugfs_itct[0 ].itct) +if (hisi_sas_debugfs_enable) hisi_hba->hw->debugfs_snapshot_regs (hisi_hba);return 0 ;
@@ -1967,7 +1967,7 @@ static bool hisi_sas_internal_abort_timestruct hisi_hba *hisi_hba =dev_to_hisi_hba (device);struct hisi_sas_internal_abort_data *timeout = data; -if (hisi_sas_debugfs_enable && hisi_hba->debugfs_itct[0 ].itct) { +if (hisi_sas_debugfs_enable) {/* * If timeout occurs in device gone scenario, to avoid * circular dependency like:
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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 Wed, 08 Jan 2025 15:11:04 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.70-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
The following build errors were noticed while building the allmodconfig builds on arm64 on the stable-rc linux-6.6.y branch.
This is first seen on 5652330123c6a64b444f3012d9c9013742a872e7.
GOOD: v6.6.69
BAD: 5652330123c6a64b444f3012d9c9013742a872e7
Build error:
============drivers/i2c/busses/i2c-xgene-slimpro.c:95: error: "PCC_SIGNATURE" redefined [-Werror]
95 | #define PCC_SIGNATURE 0x50424300
|
In file included from drivers/i2c/busses/i2c-xgene-slimpro.c:12:
include/acpi/pcc.h:23: note: this is the location of the previous definition
23 | #define PCC_SIGNATURE 0x50434300
|cc1: all warnings being treated as errors
make[6]: *** [scripts/Makefile.build:243: drivers/i2c/busses/i2c-xgene
Links:
-------
- https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.6.y/build/v6.6.69-223-g5652330123c6/testrun/26613311/suite/build/test/gcc-13-allmodconfig/log
- https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.6.y/build/v6.6.69-223-g5652330123c6/testrun/26613311/suite/build/test/gcc-13-allmodconfig/details/
- https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.6.y/build/v6.6.69-223-g5652330123c6/testrun/26613311/suite/build/test/gcc-13-allmodconfig/history/
metadata:
----
git sha: 5652330123c6a64b444f3012d9c9013742a872e7
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
kernel config:
https://storage.tuxsuite.com/public/linaro/lkft/builds/2rGGBoqD6FxSfg6IKJLK43h9cCM/config
build url: https://storage.tuxsuite.com/public/linaro/lkft/builds/2rGGBoqD6FxSfg6IKJLK43h9cCM/
toolchain: clang, gcc-13, gcc-8
arch: arm64
config: allmodconfig
--
Linaro LKFT
https://lkft.linaro.org
Greg Kroah-Hartman
maintainerQuoted 36 lines · Naresh Kamboju
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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 Wed, 08 Jan 2025 15:11:04 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.70-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
The following build errors were noticed while building the allmodconfig builds on arm64 on the stable-rc linux-6.6.y branch.
This is first seen on
5652330123c6a64b444f3012d9c9013742a872e7.
GOOD: v6.6.69
BAD:5652330123c6a64b444f3012d9c9013742a872e7Build error:
============drivers/i2c/busses/i2c-xgene-slimpro.c:95: error: "PCC_SIGNATURE" redefined [-Werror]
95 | #definePCC_SIGNATURE0x50424300
Quoted 7 lines
| In file included from drivers/i2c/busses/i2c-xgene-slimpro.c:12: include/acpi/pcc.h:23: note: this is the location of the previous definition 23 | #define PCC_SIGNATURE 0x50434300 |cc1: all warnings being treated as errors
make[6]: *** [scripts/Makefile.build:243:drivers/i2c/busses/i2c-xgene
Thanks, I've applied a patch to fix this up.
greg k-h
Quoted 8 lines · On Mon, 06 Jan 2025 16:13:24 +0100 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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 Wed, 08 Jan 2025 15:11:04 +0000. Anything received after that time might be too late.
I got (in both the two runs I did):
[ 0.022989] ------------[ cut here ]------------
[ 0.023006] Usage of MAX_NUMNODES is deprecated. Use NUMA_NO_NODE instead
[ 0.023362] WARNING: CPU: 0 PID: 0 at mm/memblock.c:1325 memblock_set_node+0xcf/0xe0
[ 0.023841] Modules linked in:
[ 0.023988] CPU: 0 PID: 0 Comm: swapper Not tainted 6.6.70-rc1-g5652330123c6 #1
[ 0.024062] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014
[ 0.024156] RIP: 0010:memblock_set_node+0xcf/0xe0
[ 0.024215] Code: 2c 07 48 83 c0 18 48 ff c9 75 f0 48 89 df e8 78 01 00 00 31 c0 eb a8 c6 05 a7 24 a6 ff 01 48 c7 c7 1e 37 7b a7 e8 71 aa 07 fe <0f> 0b e9 67 ff ff ff e8 75 f3 e3 fe 0f 1f 44 00 00 55 41 57 41 56
[ 0.024361] RSP: 0000:ffffffffa7a03eb0 EFLAGS: 00000046 ORIG_RAX: 0000000000000000
[ 0.024386] RAX: 0000000000000000 RBX: ffffffffa82a2240 RCX: ffffffffa7a52068
[ 0.024397] RDX: ffffffffa7a03daf RSI: 0000000000000082 RDI: ffffffffa7a52060
[ 0.024407] RBP: 0000000000000000 R08: ffffffffa7a52240 R09: 4f4e5f414d554e20
[ 0.024417] R10: 2045444f4e5f4f4e R11: 0a64616574736e69 R12: 0000000000000040
[ 0.024428] R13: 0000000000000000 R14: ffffffffffffffff R15: 0000000000000000
[ 0.024465] FS: 0000000000000000(0000) GS:ffffffffa81a4000(0000) knlGS:0000000000000000
[ 0.024490] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 0.024502] CR2: ffff8c88c6001000 CR3: 0000000005628000 CR4: 00000000000000b0
[ 0.024585] Call Trace:
[ 0.024778] <TASK>
[ 0.024953] ? __warn+0xc3/0x1c0
[ 0.025012] ? memblock_set_node+0xcf/0xe0
[ 0.025024] ? report_bug+0x144/0x1e0
[ 0.025042] ? early_fixup_exception+0x46/0x90
[ 0.025051] ? early_idt_handler_common+0x2f/0x40
[ 0.025065] ? memblock_set_node+0xcf/0xe0
[ 0.025074] ? acpi_numa_processor_affinity_init+0x80/0x80
[ 0.025084] ? numa_init+0x5e/0x190
[ 0.025091] ? x86_numa_init+0x15/0x40
[ 0.025099] ? setup_arch+0x4a3/0x5a0
[ 0.025105] ? start_kernel+0x5a/0x3a0
[ 0.025115] ? x86_64_start_reservations+0x20/0x20
[ 0.025122] ? x86_64_start_kernel+0xa7/0xb0
[ 0.025128] ? secondary_startup_64_no_verify+0x179/0x17b
[ 0.025156] </TASK>
[ 0.025196] ---[ end trace 0000000000000000 ]---I hope the helps!
Cheers,
Miguel
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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 Wed, 08 Jan 2025 15:11:04 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.70-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels, build tested on BMIPS_GENERIC:
Signature · 1 line
Florian
Am 06.01.2025 um 16:13 schrieb Greg Kroah-Hartman:
Quoted 4 lines
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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.
6.6.70-rc1 builds, boots and seems to work on my 2-socket Ivy Bridge Xeon E5-2697 v2 server, but I see a scary looking dmesg warning, right after booting. As it is currently running, I will try building 6.12.9-rc with it, and see how that goes. The dmesg warnings I see look similar to that already reported by Miguel Ojeda.
[ 0.012910] ACPI: Reserving ERST table memory at [mem 0x7cca41c8-0x7cca43f7] [ 0.012911] ACPI: Reserving HEST table memory at [mem 0x7cca43f8-0x7cca449f] [ 0.012912] ACPI: Reserving BERT table memory at [mem 0x7cca44a0-0x7cca44cf] [ 0.012938] ------------[ cut here ]------------ [ 0.012939] Usage of MAX_NUMNODES is deprecated. Use NUMA_NO_NODE instead [ 0.012948] WARNING: CPU: 0 PID: 0 at mm/memblock.c:1324 memblock_set_node+0x10c/0x120 [ 0.012955] Modules linked in: [ 0.012956] CPU: 0 PID: 0 Comm: swapper Not tainted 6.6.70-rc1+ #1 [ 0.012959] Hardware name: ASUSTeK COMPUTER INC. Z9PE-D16 Series/Z9PE-D16 Series, BIOS 5601 06/11/2015 [ 0.012960] RIP: 0010:memblock_set_node+0x10c/0x120 [ 0.012962] Code: 0f 87 fe c0 ca 00 41 83 e4 01 74 0b 41 bc ff ff ff ff e9 50 ff ff ff 48 c7 c7 d0 28 fa 98 c6 05 58 0a 13 02 01 e8 14 86 ce ff <0f> 0b eb de e8 fb e3 d0 00 66 66 2e 0f 1f 84 00 00 00 00 00 90 90 [ 0.012965] RSP: 0000:ffffffff99803df8 EFLAGS: 00010046 ORIG_RAX: 0000000000000000 [ 0.012967] RAX: 0000000000000000 RBX: ffffffff999fc990 RCX: 0000000000000000 [ 0.012969] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000 [ 0.012970] RBP: ffffffff99803e28 R08: 0000000000000000 R09: 0000000000000000 [ 0.012971] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000 [ 0.012972] R13: 0000000000000000 R14: ffffffffffffffff R15: 000000000008a000 [ 0.012973] FS: 0000000000000000(0000) GS:ffffffff99bb0000(0000) knlGS:0000000000000000 [ 0.012975] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 0.012976] CR2: ffff9e62eac01000 CR3: 0000000ae9e36000 CR4: 00000000000200f0 [ 0.012978] Call Trace: [ 0.012979] <TASK> [ 0.012981] ? show_regs+0x6d/0x80 [ 0.012987] ? __warn+0x89/0x160 [ 0.012990] ? memblock_set_node+0x10c/0x120 [ 0.012993] ? report_bug+0x17e/0x1b0 [ 0.012996] ? fixup_exception+0x27/0x370 [ 0.013000] ? early_fixup_exception+0x9b/0xf0 [ 0.013004] ? do_early_exception+0x25/0x80 [ 0.013008] ? early_idt_handler_common+0x2f/0x3a [ 0.013013] ? memblock_set_node+0x10c/0x120 [ 0.013015] ? memblock_set_node+0x10c/0x120 [ 0.013017] ? __pfx_x86_acpi_numa_init+0x10/0x10 [ 0.013021] numa_init+0x82/0x570 [ 0.013025] x86_numa_init+0x1f/0x60 [ 0.013028] initmem_init+0xe/0x20 [ 0.013030] setup_arch+0x98b/0xea0 [ 0.013034] start_kernel+0x6c/0xb00 [ 0.013039] ? load_ucode_intel_bsp+0x3d/0x80 [ 0.013044] x86_64_start_reservations+0x18/0x30 [ 0.013046] x86_64_start_kernel+0xbf/0x110 [ 0.013049] secondary_startup_64_no_verify+0x18f/0x19b [ 0.013056] </TASK> [ 0.013057] ---[ end trace 0000000000000000 ]--- [ 0.013063] SRAT: PXM 0 -> APIC 0x00 -> Node 0 [ 0.013065] SRAT: PXM 0 -> APIC 0x01 -> Node 0 [ 0.013066] SRAT: PXM 0 -> APIC 0x02 -> Node 0 [ 0.013066] SRAT: PXM 0 -> APIC 0x03 -> Node 0
Beste Grüße,
Peter Schneider
Signature · 8 lines
Climb the mountain not to plant your flag, but to embrace the challenge, enjoy the air and behold the view. Climb it so you can see the world, not so the world can see you. -- David McCullough Jr. OpenPGP: 0xA3828BD796CCE11A8CADE8866E3A92C92C3FF244 Download: https://www.peters-netzplatz.de/download/pschneider1968_pub.asc https://keys.mailvelope.com/pks/lookup?op=get&[email protected] https://keys.mailvelope.com/pks/lookup?op=get&[email protected]
Am 07.01.2025 um 01:36 schrieb Peter Schneider:
Quoted 7 lines
Am 06.01.2025 um 16:13 schrieb Greg Kroah-Hartman:
Quoted 4 lines
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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.
6.6.70-rc1 builds, boots and seems to work on my 2-socket Ivy Bridge Xeon E5-2697 v2 server, but I see a scary looking dmesg warning, right after booting. As it is currently running, I will try building 6.12.9-rc with it, and see how that goes. The dmesg warnings I see look similar to that already reported by Miguel Ojeda.
[...]
So running 6.6.70-rc1, despite the above mentioned initial warning message, I could build 6.12.9-rc1 just fine with it. It took the usual ~20 minutes, and no more dmesgs warning have been added.
Beste Grüße,
Peter Schneider
Signature · 8 lines
Climb the mountain not to plant your flag, but to embrace the challenge, enjoy the air and behold the view. Climb it so you can see the world, not so the world can see you. -- David McCullough Jr. OpenPGP: 0xA3828BD796CCE11A8CADE8866E3A92C92C3FF244 Download: https://www.peters-netzplatz.de/download/pschneider1968_pub.asc https://keys.mailvelope.com/pks/lookup?op=get&[email protected] https://keys.mailvelope.com/pks/lookup?op=get&[email protected]
Hello,
Quoted 7 lines · On Mon, 6 Jan 2025 16:13:24 +0100 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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 Wed, 08 Jan 2025 15:11:04 +0000. Anything received after that time might be too late.
This rc kernel passes DAMON functionality test[1] on my test machine. Attaching the test results summary below. Please note that I retrieved the kernel from linux-stable-rc tree[2].
[1] https://github.com/damonitor/damon-tests/tree/next/corr
[2] 5652330123c6 ("Linux 6.6.70-rc1")
Thanks,
SJ
[...]
---
ok 1 selftests: damon: debugfs_attrs.sh # SKIP
ok 2 selftests: damon: debugfs_schemes.sh # SKIP
ok 3 selftests: damon: debugfs_target_ids.sh # SKIP
ok 4 selftests: damon: debugfs_empty_targets.sh # SKIP
ok 5 selftests: damon: debugfs_huge_count_read_write.sh # SKIP ok 6 selftests: damon: debugfs_duplicate_context_creation.sh # SKIP ok 7 selftests: damon: debugfs_rm_non_contexts.sh # SKIP
ok 8 selftests: damon: sysfs.sh
ok 9 selftests: damon: sysfs_update_removed_scheme_dir.sh
ok 10 selftests: damon: reclaim.sh
ok 11 selftests: damon: lru_sort.sh
ok 1 selftests: damon-tests: kunit.sh
ok 2 selftests: damon-tests: huge_count_read_write.sh # SKIP
ok 3 selftests: damon-tests: buffer_overflow.sh
ok 4 selftests: damon-tests: rm_contexts.sh # SKIP
ok 5 selftests: damon-tests: record_null_deref.sh
ok 6 selftests: damon-tests: dbgfs_target_ids_read_before_terminate_race.sh ok 7 selftests: damon-tests: dbgfs_target_ids_pid_leak.sh
ok 8 selftests: damon-tests: damo_tests.sh
ok 9 selftests: damon-tests: masim-record.sh
ok 10 selftests: damon-tests: build_i386.sh
ok 11 selftests: damon-tests: build_arm64.sh # SKIP
ok 12 selftests: damon-tests: build_m68k.sh # SKIP
ok 13 selftests: damon-tests: build_i386_idle_flag.sh
ok 14 selftests: damon-tests: build_i386_highpte.sh
ok 15 selftests: damon-tests: build_nomemcg.sh
PASS
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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 Wed, 08 Jan 2025 15:11:04 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.70-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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 Wed, 08 Jan 2025 15:11:04 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.70-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
As others have reported, boot warnings on x86 have been noticed
memblock: make memblock_set_node() also warn about use of MAX_NUMNODES [ Upstream commit e0eec24e2e199873f43df99ec39773ad3af2bff7 ]
mm/memblock.c +0 -0
@@ -1321,6 +1321,10 @@ int __init_memblock
memblock_set_node(phys_addr_t base, phys_addr_t size,
int start_rgn, end_rgn;
int i, ret;
+ if (WARN_ONCE(nid == MAX_NUMNODES,
+ "Usage of MAX_NUMNODES is deprecated. Use NUMA_NO_NODE instead\n"))
+ nid = NUMA_NO_NODE;
+
ret = memblock_isolate_range(type, base, size, &start_rgn, &end_rgn); if (ret)
return ret;
Signature · 175 lines
Reported-by: Linux Kernel Functional Testing <[email protected]> ------------[ cut here ]------------ [ 0.042522] Usage of MAX_NUMNODES is deprecated. Use NUMA_NO_NODE instead [ 0.043058] WARNING: CPU: 0 PID: 0 at mm/memblock.c:1324 memblock_set_node+0xf0/0x100 [ 0.043730] Modules linked in: [ 0.043957] CPU: 0 PID: 0 Comm: swapper Not tainted 6.6.70-rc1 #1 [ 0.044026] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 [ 0.044174] RIP: 0010:memblock_set_node+0xf0/0x100 [ 0.044293] Code: 3d 81 da ef ff 00 74 0b 41 bc ff ff ff ff e9 6c ff ff ff 48 c7 c7 30 40 e3 8e 48 89 75 d0 c6 05 62 da ef ff 01 e8 20 cb 04 fe <0f> 0b 48 8b 75 d0 eb d6 e8 43 db 0e ff 0f 1f 00 90 90 90 90 90 90 [ 0.044494] RSP: 0000:ffffffff8f003e08 EFLAGS: 00010082 ORIG_RAX: 0000000000000000 [ 0.044537] RAX: 0000000000000000 RBX: ffffffff8f46da30 RCX: 0000000000000000 [ 0.044553] RDX: ffffffff8f156f08 RSI: 0000000000000082 RDI: 0000000000000001 [ 0.044588] RBP: ffffffff8f003e38 R08: 0000000000000000 R09: 4f4e5f414d554e20 [ 0.044606] R10: 2045444f4e5f4f4e R11: 0a64616574736e69 R12: 0000000000000040 [ 0.044621] R13: 0000000000000000 R14: 000000013ee00000 R15: 0000000000014750 [ 0.044673] FS: 0000000000000000(0000) GS:ffffffff8f347000(0000) knlGS:0000000000000000 [ 0.044707] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 0.044723] CR2: ffff9ab33ffff000 CR3: 0000000140c44000 CR4: 00000000000000b0 [ 0.044816] Call Trace: [ 0.045237] <TASK> [ 0.045521] ? show_regs+0x69/0x80 [ 0.045593] ? __warn+0x8d/0x150 [ 0.045611] ? memblock_set_node+0xf0/0x100 [ 0.045629] ? report_bug+0x171/0x1a0 [ 0.045648] ? fixup_exception+0x2b/0x310 [ 0.045669] ? early_fixup_exception+0xb3/0xd0 [ 0.045687] ? do_early_exception+0x1f/0x60 [ 0.045716] ? early_idt_handler_common+0x2f/0x40 [ 0.045742] ? memblock_set_node+0xf0/0x100 [ 0.045760] ? memblock_set_node+0xf0/0x100 [ 0.045792] ? __pfx_x86_acpi_numa_init+0x10/0x10 [ 0.045817] numa_init+0x8b/0x600 [ 0.045932] x86_numa_init+0x23/0x50 [ 0.045953] initmem_init+0x12/0x20 [ 0.045969] setup_arch+0x88b/0xce0 [ 0.045988] start_kernel+0x76/0x6d0 [ 0.046008] x86_64_start_reservations+0x1c/0x30 [ 0.046022] x86_64_start_kernel+0xca/0xe0 [ 0.046037] secondary_startup_64_no_verify+0x178/0x17b [ 0.046111] </TASK> [ 0.046180] ---[ end trace 0000000000000000 ]--- Links: - https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.6.y/build/v6.6.69-223-g5652330123c6/testrun/26599367/suite/log-parser-boot/tests/ - https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.6.y/build/v6.6.69-223-g5652330123c6/testrun/26599367/suite/log-parser-boot/test/exception-usage-of-max_numnodes-is-deprecated-use-numa_no_node-instead/log ## Build * kernel: 6.6.70-rc1 * git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git * git commit: 5652330123c6a64b444f3012d9c9013742a872e7 * git describe: v6.6.69-223-g5652330123c6 * test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.6.y/build/v6.6.69-223-g5652330123c6 ## Test Regressions (compared to v6.6.68-87-g159cc5fd9b13) * arm64, build - clang-19-allmodconfig - clang-19-allyesconfig - gcc-13-allmodconfig - gcc-13-allyesconfig ## Metric Regressions (compared to v6.6.68-87-g159cc5fd9b13) ## Test Fixes (compared to v6.6.68-87-g159cc5fd9b13) ## Metric Fixes (compared to v6.6.68-87-g159cc5fd9b13) ## Test result summary total: 150166, pass: 122611, fail: 4998, skip: 22391, xfail: 166 ## Build Summary * arc: 6 total, 5 passed, 1 failed * arm: 132 total, 132 passed, 0 failed * arm64: 44 total, 38 passed, 6 failed * i386: 31 total, 28 passed, 3 failed * mips: 30 total, 25 passed, 5 failed * parisc: 5 total, 5 passed, 0 failed * powerpc: 36 total, 32 passed, 4 failed * riscv: 23 total, 22 passed, 1 failed * s390: 18 total, 14 passed, 4 failed * sh: 12 total, 10 passed, 2 failed * sparc: 9 total, 8 passed, 1 failed * x86_64: 36 total, 35 passed, 1 failed ## Test suites summary * boot * commands * kselftest-arm64 * kselftest-breakpoints * kselftest-capabilities * kselftest-cgroup * kselftest-clone3 * kselftest-core * kselftest-cpu-hotplug * kselftest-cpufreq * kselftest-efivarfs * kselftest-exec * kselftest-filesystems * kselftest-filesystems-binderfs * kselftest-filesystems-epoll * kselftest-firmware * kselftest-fpu * kselftest-ftrace * kselftest-futex * kselftest-gpio * kselftest-intel_pstate * kselftest-ipc * kselftest-kcmp * kselftest-kvm * kselftest-livepatch * kselftest-membarrier * kselftest-memfd * kselftest-mincore * kselftest-mqueue * kselftest-net * kselftest-net-mptcp * kselftest-openat2 * kselftest-ptrace * kselftest-rseq * kselftest-rtc * kselftest-seccomp * kselftest-sigaltstack * kselftest-size * kselftest-tc-testing * kselftest-timers * kselftest-tmpfs * kselftest-tpm2 * kselftest-user_events * kselftest-vDSO * kselftest-x86 * kunit * kvm-unit-tests * libgpiod * libhugetlbfs * log-parser-boot * log-parser-build-clang * log-parser-build-gcc * log-parser-test * ltp-capability * ltp-commands * ltp-containers * ltp-controllers * ltp-cpuhotplug * ltp-crypto * ltp-cve * ltp-dio * ltp-fcntl-locktests * ltp-filecaps * ltp-fs * ltp-fs_bind * ltp-fs_perms_simple * ltp-hugetlb * ltp-ipc * ltp-math * ltp-mm * ltp-nptl * ltp-pty * ltp-sched * ltp-smoke * ltp-syscalls * ltp-tracing * perf * rcutorture -- Linaro LKFT https://lkft.linaro.org
Quoted 19 lines · Naresh Kamboju
Quoted 17 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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 Wed, 08 Jan 2025 15:11:04 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.70-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
Quoted 7 lines
Quoted 1 line
greg k-h
As others have reported, boot warnings on x86 have been noticed
memblock: make
memblock_set_node()also warn about use ofMAX_NUMNODES[ Upstream commite0eec24e2e199873f43df99ec39773ad3af2bff7]
There's 8043832e2a12 ("memblock: use numa_valid_node() helper to check for invalid node ID") that fixes it
Quoted 193 lines
mm/memblock.c +4
-0@@ -1321,6 +1321,10 @@ int __init_memblock memblock_set_node(phys_addr_t base, phys_addr_t size, int start_rgn, end_rgn;int i, ret; +if (WARN_ONCE (nid ==MAX_NUMNODES , +"Usage of MAX_NUMNODES is deprecated. Use NUMA_NO_NODE instead\n" )) + nid =NUMA_NO_NODE ; + ret =memblock_isolate_range (type, base, size, &start_rgn, &end_rgn);if (ret)return ret;
Signature · 175 lines
Reported-by: Linux Kernel Functional Testing <[email protected]> ------------[ cut here ]------------ [ 0.042522] Usage of MAX_NUMNODES is deprecated. Use NUMA_NO_NODE instead [ 0.043058] WARNING: CPU: 0 PID: 0 at mm/memblock.c:1324 memblock_set_node+0xf0/0x100 [ 0.043730] Modules linked in: [ 0.043957] CPU: 0 PID: 0 Comm: swapper Not tainted 6.6.70-rc1 #1 [ 0.044026] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 [ 0.044174] RIP: 0010:memblock_set_node+0xf0/0x100 [ 0.044293] Code: 3d 81 da ef ff 00 74 0b 41 bc ff ff ff ff e9 6c ff ff ff 48 c7 c7 30 40 e3 8e 48 89 75 d0 c6 05 62 da ef ff 01 e8 20 cb 04 fe <0f> 0b 48 8b 75 d0 eb d6 e8 43 db 0e ff 0f 1f 00 90 90 90 90 90 90 [ 0.044494] RSP: 0000:ffffffff8f003e08 EFLAGS: 00010082 ORIG_RAX: 0000000000000000 [ 0.044537] RAX: 0000000000000000 RBX: ffffffff8f46da30 RCX: 0000000000000000 [ 0.044553] RDX: ffffffff8f156f08 RSI: 0000000000000082 RDI: 0000000000000001 [ 0.044588] RBP: ffffffff8f003e38 R08: 0000000000000000 R09: 4f4e5f414d554e20 [ 0.044606] R10: 2045444f4e5f4f4e R11: 0a64616574736e69 R12: 0000000000000040 [ 0.044621] R13: 0000000000000000 R14: 000000013ee00000 R15: 0000000000014750 [ 0.044673] FS: 0000000000000000(0000) GS:ffffffff8f347000(0000) knlGS:0000000000000000 [ 0.044707] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 0.044723] CR2: ffff9ab33ffff000 CR3: 0000000140c44000 CR4: 00000000000000b0 [ 0.044816] Call Trace: [ 0.045237] <TASK> [ 0.045521] ? show_regs+0x69/0x80 [ 0.045593] ? __warn+0x8d/0x150 [ 0.045611] ? memblock_set_node+0xf0/0x100 [ 0.045629] ? report_bug+0x171/0x1a0 [ 0.045648] ? fixup_exception+0x2b/0x310 [ 0.045669] ? early_fixup_exception+0xb3/0xd0 [ 0.045687] ? do_early_exception+0x1f/0x60 [ 0.045716] ? early_idt_handler_common+0x2f/0x40 [ 0.045742] ? memblock_set_node+0xf0/0x100 [ 0.045760] ? memblock_set_node+0xf0/0x100 [ 0.045792] ? __pfx_x86_acpi_numa_init+0x10/0x10 [ 0.045817] numa_init+0x8b/0x600 [ 0.045932] x86_numa_init+0x23/0x50 [ 0.045953] initmem_init+0x12/0x20 [ 0.045969] setup_arch+0x88b/0xce0 [ 0.045988] start_kernel+0x76/0x6d0 [ 0.046008] x86_64_start_reservations+0x1c/0x30 [ 0.046022] x86_64_start_kernel+0xca/0xe0 [ 0.046037] secondary_startup_64_no_verify+0x178/0x17b [ 0.046111] </TASK> [ 0.046180] ---[ end trace 0000000000000000 ]--- Links: - https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.6.y/build/v6.6.69-223-g5652330123c6/testrun/26599367/suite/log-parser-boot/tests/ - https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.6.y/build/v6.6.69-223-g5652330123c6/testrun/26599367/suite/log-parser-boot/test/exception-usage-of-max_numnodes-is-deprecated-use-numa_no_node-instead/log ## Build * kernel: 6.6.70-rc1 * git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git * git commit: 5652330123c6a64b444f3012d9c9013742a872e7 * git describe: v6.6.69-223-g5652330123c6 * test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.6.y/build/v6.6.69-223-g5652330123c6 ## Test Regressions (compared to v6.6.68-87-g159cc5fd9b13) * arm64, build - clang-19-allmodconfig - clang-19-allyesconfig - gcc-13-allmodconfig - gcc-13-allyesconfig ## Metric Regressions (compared to v6.6.68-87-g159cc5fd9b13) ## Test Fixes (compared to v6.6.68-87-g159cc5fd9b13) ## Metric Fixes (compared to v6.6.68-87-g159cc5fd9b13) ## Test result summary total: 150166, pass: 122611, fail: 4998, skip: 22391, xfail: 166 ## Build Summary * arc: 6 total, 5 passed, 1 failed * arm: 132 total, 132 passed, 0 failed * arm64: 44 total, 38 passed, 6 failed * i386: 31 total, 28 passed, 3 failed * mips: 30 total, 25 passed, 5 failed * parisc: 5 total, 5 passed, 0 failed * powerpc: 36 total, 32 passed, 4 failed * riscv: 23 total, 22 passed, 1 failed * s390: 18 total, 14 passed, 4 failed * sh: 12 total, 10 passed, 2 failed * sparc: 9 total, 8 passed, 1 failed * x86_64: 36 total, 35 passed, 1 failed ## Test suites summary * boot * commands * kselftest-arm64 * kselftest-breakpoints * kselftest-capabilities * kselftest-cgroup * kselftest-clone3 * kselftest-core * kselftest-cpu-hotplug * kselftest-cpufreq * kselftest-efivarfs * kselftest-exec * kselftest-filesystems * kselftest-filesystems-binderfs * kselftest-filesystems-epoll * kselftest-firmware * kselftest-fpu * kselftest-ftrace * kselftest-futex * kselftest-gpio * kselftest-intel_pstate * kselftest-ipc * kselftest-kcmp * kselftest-kvm * kselftest-livepatch * kselftest-membarrier * kselftest-memfd * kselftest-mincore * kselftest-mqueue * kselftest-net * kselftest-net-mptcp * kselftest-openat2 * kselftest-ptrace * kselftest-rseq * kselftest-rtc * kselftest-seccomp * kselftest-sigaltstack * kselftest-size * kselftest-tc-testing * kselftest-timers * kselftest-tmpfs * kselftest-tpm2 * kselftest-user_events * kselftest-vDSO * kselftest-x86 * kunit * kvm-unit-tests * libgpiod * libhugetlbfs * log-parser-boot * log-parser-build-clang * log-parser-build-gcc * log-parser-test * ltp-capability * ltp-commands * ltp-containers * ltp-controllers * ltp-cpuhotplug * ltp-crypto * ltp-cve * ltp-dio * ltp-fcntl-locktests * ltp-filecaps * ltp-fs * ltp-fs_bind * ltp-fs_perms_simple * ltp-hugetlb * ltp-ipc * ltp-math * ltp-mm * ltp-nptl * ltp-pty * ltp-sched * ltp-smoke * ltp-syscalls * ltp-tracing * perf * rcutorture -- Linaro LKFT https://lkft.linaro.org
Signature · 2 lines
Sincerely yours, Mike.
Greg Kroah-Hartman
maintainerQuoted 23 lines · Mike Rapoport
Quoted 22 lines · Naresh Kamboju
Quoted 18 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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 Wed, 08 Jan 2025 15:11:04 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.70-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
Quoted 7 lines
Quoted 4 lines
As others have reported, boot warnings on x86 have been noticed
memblock: make
memblock_set_node()also warn about use ofMAX_NUMNODES[ Upstream commite0eec24e2e199873f43df99ec39773ad3af2bff7]There's
8043832e2a12("memblock: usenuma_valid_node()helper to check for invalid node ID") that fixes it
Thanks. I'll drop the offending commit for now and then add this, and the fix, back in for the next round of -rc releases to get testing on it.
greg k-h
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.70 release. There are 222 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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 Wed, 08 Jan 2025 15:11:04 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.70-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.6:
10 builds: 10 pass, 0 fail
26 boots: 26 pass, 0 fail
116 tests: 116 pass, 0 failLinux version: 6.6.70-rc1-g5652330123c6
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Jon
The kernel, bpf tool, amd kselftest tool builds fine for v6.6.70-rc1 on x86 and arm64 Azure VM.
Thanks,
Hardik
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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 Wed, 08 Jan 2025 15:11:04 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.70-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.70 release. There are 222 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 Wed, 08 Jan 2025 15:11:04 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.70-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.
Quoted 5 lines
thanks,
greg k-h
-------------
OVERVIEW
Builds: 38 passed, 3 failed
Boot tests: 358 passed, 0 failed
CI systems: broonie, maestro
REVISION
Commit
name: v6.6.69-223-g5652330123c6
hash: 5652330123c6a64b444f3012d9c9013742a872e7
Checked out from
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-6.6.yBUILDS
Failures
-x86_64 (cros://chromeos-6.6/x86_64/chromeos-intel-pineview.flavour.config)
Build detail: https://kcidb.kernelci.org/d/build/build?orgId=1&var-id=maestro:677c10a0423acf18d2737e91
Build error: ld: kernel/kexec_core.o: in function `__crash_kexec':
-arm64 (defconfig+allmodconfig)
Build detail: https://kcidb.kernelci.org/d/build/build?orgId=1&var-id=maestro:677c10aa423acf18d2737f1a
Build error: drivers/i2c/busses/i2c-xgene-slimpro.c:95:9: error: 'PCC_SIGNATURE' macro redefined [-Werror,-Wmacro-redefined]
-x86_64 (cros://chromeos-6.6/x86_64/chromeos-amd-stoneyridge.flavour.config)
Build detail: https://kcidb.kernelci.org/d/build/build?orgId=1&var-id=maestro:677c109b423acf18d2737e5a
Build error: ld: kernel/kexec_core.o: in function `__crash_kexec':
CI system: maestroBOOT TESTS
No failure found
See complete and up-to-date report at:
https://kcidb.kernelci.org/d/revision/revision?orgId=1&var-git_commit_hash=5652330123c6a64b444f3012d9c9013742a872e7&var-patchset_hash=
Thanks,
KernelCI team