5.10.224-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainerPATCH 310/352 tick/broadcast: Move per CPU pointer access into the atomic section
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit 6881e75237a84093d0986f56223db3724619f26e upstream.
The recent fix for making the take over of the broadcast timer more reliable retrieves a per CPU pointer in preemptible context.
This went unnoticed as compilers hoist the access into the non-preemptible region where the pointer is actually used. But of course it's valid that the compiler keeps it at the place where the code puts it which rightfully triggers:
BUG: using smp_processor_id() in preemptible [00000000] code:
caller is hotplug_cpu__broadcast_tick_pull+0x1c/0xc0Move it to the actual usage site which is in a non-preemptible region.
--- kernel/time/tick-broadcast.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
kernel/time/tick-broadcast.c +2 -1
@@ -944,7 +944,6 @@ void tick_broadcast_switch_to_oneshot(vo#ifdef CONFIG_HOTPLUG_CPU void hotplug_cpu__broadcast_tick_pull (int deadcpu) { -struct tick_device *td =this_cpu_ptr (&tick_cpu_device);struct clock_event_device *bc;unsigned long flags;
@@ -970,6 +969,8 @@ void hotplug_cpu__broadcast_tick_pull(in* device to avoid the starvation. */ if (tick_check_broadcast_expired ()) { +struct tick_device *td =this_cpu_ptr (&tick_cpu_device); +cpumask_clear_cpu (smp_processor_id (), tick_broadcast_force_mask);tick_program_event (td->evtdev->next_event,1 ); }
Greg Kroah-Hartman
maintainerPATCH 311/352 ntp: Clamp maxerror and esterror to operating range
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Stitt <[email protected]>
[ Upstream commit 87d571d6fb77ec342a985afa8744bb9bb75b3622 ]
Using syzkaller alongside the newly reintroduced signed integer overflow sanitizer spits out this report:
UBSAN: signed-integer-overflow in ../kernel/time/ntp.c:461:16 9223372036854775807 + 500 cannot be represented in type 'long' Call Trace: handle_overflow+0x171/0x1b0 second_overflow+0x2d6/0x500 accumulate_nsecs_to_secs+0x60/0x160 timekeeping_advance+0x1fe/0x890 update_wall_time+0x10/0x30
time_maxerror is unconditionally incremented and the result is checked against NTP_PHASE_LIMIT, but the increment itself can overflow, resulting in wrap-around to negative space.
Before commit eea83d896e31 ("ntp: NTP4 user space bits update") the user supplied value was sanity checked to be in the operating range. That change removed the sanity check and relied on clamping in handle_overflow() which does not work correctly when the user supplied value is in the overflow zone of the '+ 500' operation.
The operation requires CAP_SYS_TIME and the side effect of the overflow is NTP getting out of sync.
Miroslav confirmed that the input value should be clamped to the operating range and the same applies to time_esterror. The latter is not used by the kernel, but the value still should be in the operating range as it was before the sanity check got removed.
Clamp them to the operating range.
[ tglx: Changed it to clamping and included time_esterror ]
--- kernel/time/ntp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/time/ntp.c +2 -2
@@ -679,10 +679,10 @@ static inline void process_adjtimex_mode }if (txc->modes &ADJ_MAXERROR ) - time_maxerror = txc->maxerror; + time_maxerror =clamp (txc->maxerror, (long long )0 , (long long )NTP_PHASE_LIMIT );if (txc->modes &ADJ_ESTERROR ) - time_esterror = txc->esterror; + time_esterror =clamp (txc->esterror, (long long )0 , (long long )NTP_PHASE_LIMIT );if (txc->modes &ADJ_TIMECONST ) { time_constant = txc->constant;
Greg Kroah-Hartman
maintainerPATCH 312/352 driver core: Fix uevent_show() vs driver detach race
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Williams <[email protected]>
commit 15fffc6a5624b13b428bb1c6e9088e32a55eb82c upstream.
uevent_show() wants to de-reference dev->driver->name. There is no clean way for a device attribute to de-reference dev->driver unless that attribute is defined via (struct device_driver).dev_groups. Instead, the anti-pattern of taking the device_lock() in the attribute handler risks deadlocks with code paths that remove device attributes while holding the lock.
This deadlock is typically invisible to lockdep given the device_lock() is marked lockdep_set_novalidate_class(), but some subsystems allocate a local lockdep key for @dev->mutex to reveal reports of the form:
======================================================
WARNING: possible circular locking dependency detected
6.10.0-rc7+ #275 Tainted: G OE N
------------------------------------------------------
modprobe/2374 is trying to acquire lock:
ffff8c2270070de0 (kn->active#6){++++}-{0:0}, at: __kernfs_remove+0xde/0x220
but task is already holding lock:
ffff8c22016e88f8 (&cxl_root_key){+.+.}-{3:3}, at: device_release_driver_internal+0x39/0x210
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (&cxl_root_key){+.+.}-{3:3}:
__mutex_lock+0x99/0xc30
uevent_show+0xac/0x130
dev_attr_show+0x18/0x40
sysfs_kf_seq_show+0xac/0xf0
seq_read_iter+0x110/0x450
vfs_read+0x25b/0x340
ksys_read+0x67/0xf0
do_syscall_64+0x75/0x190
entry_SYSCALL_64_after_hwframe+0x76/0x7e-> #0 (kn->active#6){++++}-{0:0}:
__lock_acquire+0x121a/0x1fa0
lock_acquire+0xd6/0x2e0
kernfs_drain+0x1e9/0x200
__kernfs_remove+0xde/0x220
kernfs_remove_by_name_ns+0x5e/0xa0
device_del+0x168/0x410
device_unregister+0x13/0x60
devres_release_all+0xb8/0x110
device_unbind_cleanup+0xe/0x70
device_release_driver_internal+0x1c7/0x210
driver_detach+0x47/0x90
bus_remove_driver+0x6c/0xf0
cxl_acpi_exit+0xc/0x11 [cxl_acpi]
__do_sys_delete_module.isra.0+0x181/0x260
do_syscall_64+0x75/0x190
entry_SYSCALL_64_after_hwframe+0x76/0x7eThe observation though is that driver objects are typically much longer lived than device objects. It is reasonable to perform lockless de-reference of a @driver pointer even if it is racing detach from a device. Given the infrequency of driver unregistration, use synchronize_rcu() in module_remove_driver() to close any potential races. It is potentially overkill to suffer synchronize_rcu() just to handle the rare module removal racing uevent_show() event.
Thanks to Tetsuo Handa for the debug analysis of the syzbot report [1].
--- drivers/base/core.c | 13 ++++++++----- drivers/base/module.c | 4 ++++ 2 files changed, 12 insertions(+), 5 deletions(-)
drivers/base/core.c +8 -5
@@ -25,6 +25,7 @@#include <linux/mutex.h> #include <linux/pm_runtime.h> #include <linux/netdevice.h> +#include <linux/rcupdate.h> #include <linux/sched/signal.h> #include <linux/sched/mm.h> #include <linux/sysfs.h>
@@ -1909,6 +1910,7 @@ static int dev_uevent(struct kset *kset, struct kobj_uevent_env *env) {struct device *dev =kobj_to_dev (kobj); +struct device_driver *driver;int retval =0 ;/* add device node properties if present */
@@ -1937,8 +1939,12 @@ static int dev_uevent(struct kset *kset,if (dev->type && dev->type->name)add_uevent_var (env,"DEVTYPE=%s" , dev->type->name); -if (dev->driver) -add_uevent_var (env,"DRIVER=%s" , dev->driver->name); +/* Synchronize with module_remove_driver() */ +rcu_read_lock (); + driver =READ_ONCE (dev->driver); +if (driver) +add_uevent_var (env,"DRIVER=%s" , driver->name); +rcu_read_unlock ();/* Add common DT information about the device */ of_device_uevent (dev, env);
@@ -2008,11 +2014,8 @@ static ssize_t uevent_show(struct deviceif (!env)return -ENOMEM ; -/* Synchronize with really_probe() */ -device_lock (dev);/* let the kset specific function add its keys */ retval = kset->uevent_ops->uevent (kset, &dev->kobj, env); -device_unlock (dev);if (retval) goto out;
drivers/base/module.c +4 -0
@@ -7,6 +7,7 @@#include <linux/errno.h> #include <linux/slab.h> #include <linux/string.h> +#include <linux/rcupdate.h> #include "base.h" static char *make_driver_name (struct device_driver *drv)
@@ -77,6 +78,9 @@ void module_remove_driver(struct device_if (!drv)return ; +/* Synchronize with dev_uevent() */ +synchronize_rcu (); +sysfs_remove_link (&drv->p->kobj,"module" );if (drv->owner)
Greg Kroah-Hartman
maintainerPATCH 313/352 ntp: Safeguard against time_constant overflow
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Stitt <[email protected]>
commit 06c03c8edce333b9ad9c6b207d93d3a5ae7c10c0 upstream.
Using syzkaller with the recently reintroduced signed integer overflow sanitizer produces this UBSAN report:
UBSAN: signed-integer-overflow in ../kernel/time/ntp.c:738:18 9223372036854775806 + 4 cannot be represented in type 'long' Call Trace: handle_overflow+0x171/0x1b0 __do_adjtimex+0x1236/0x1440 do_adjtimex+0x2be/0x740
The user supplied time_constant value is incremented by four and then clamped to the operating range.
Before commit eea83d896e31 ("ntp: NTP4 user space bits update") the user supplied value was sanity checked to be in the operating range. That change removed the sanity check and relied on clamping after incrementing which does not work correctly when the user supplied value is in the overflow zone of the '+ 4' operation.
The operation requires CAP_SYS_TIME and the side effect of the overflow is NTP getting out of sync.
Similar to the fixups for time_maxerror and time_esterror, clamp the user space supplied value to the operating range.
[ tglx: Switch to clamping ]
--- kernel/time/ntp.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
kernel/time/ntp.c +2 -3
@@ -685,11 +685,10 @@ static inline void process_adjtimex_mode time_esterror =clamp (txc->esterror, (long long )0 , (long long )NTP_PHASE_LIMIT );if (txc->modes &ADJ_TIMECONST ) { - time_constant = txc->constant; + time_constant =clamp (txc->constant, (long long )0 , (long long )MAXTC );if (!(time_status &STA_NANO )) time_constant +=4 ; - time_constant =min (time_constant, (long )MAXTC ); - time_constant =max (time_constant,0l ); + time_constant =clamp (time_constant, (long )0 , (long )MAXTC ); } if (txc->modes & ADJ_TAI &&
Greg Kroah-Hartman
maintainerPATCH 314/352 scsi: mpt3sas: Remove scsi_dma_map() error messages
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sreekanth Reddy <[email protected]>
[ Upstream commit 0c25422d34b4726b2707d5f38560943155a91b80 ]
When scsi_dma_map() fails by returning a sges_left value less than zero, the amount of logging produced can be extremely high. In a recent end-user environment, 1200 messages per second were being sent to the log buffer. This eventually overwhelmed the system and it stalled.
These error messages are not needed. Remove them.
Stable-dep-of: 82dbb57ac8d0 ("scsi: mpt3sas: Avoid IOMMU page faults on REPORT ZONES")
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_base.c +3 -15
@@ -2431,12 +2431,8 @@ _base_check_pcie_native_sgl(struct MPT3SAS_ADAPTER *ioc,/* Get the SG list pointer and info. */ sges_left =scsi_dma_map (scmd); -if (sges_left <0 ) { -sdev_printk (KERN_ERR , scmd->device, -"scsi_dma_map failed: request for %d bytes!\n" , -scsi_bufflen (scmd)); +if (sges_left <0 )return 1 ; - }/* Check if we need to build a native SG list. */ if (base_is_prp_possible(ioc, pcie_device,
@@ -2543,12 +2539,8 @@ _base_build_sg_scmd(struct MPT3SAS_ADAPTER *ioc, sg_scmd =scsi_sglist (scmd); sges_left =scsi_dma_map (scmd); -if (sges_left <0 ) { -sdev_printk (KERN_ERR , scmd->device, -"scsi_dma_map failed: request for %d bytes!\n" , -scsi_bufflen (scmd)); +if (sges_left <0 )return -ENOMEM ; - } sg_local = &mpi_request->SGL; sges_in_segment = ioc->max_sges_in_main_message;
@@ -2691,12 +2683,8 @@ _base_build_sg_scmd_ieee(struct MPT3SAS_ADAPTER *ioc, sg_scmd =scsi_sglist (scmd); sges_left =scsi_dma_map (scmd); -if (sges_left <0 ) { -sdev_printk (KERN_ERR , scmd->device, -"scsi_dma_map failed: request for %d bytes!\n" , -scsi_bufflen (scmd)); +if (sges_left <0 )return -ENOMEM ; - } sg_local = &mpi_request->SGL; sges_in_segment = (ioc->request_sz -
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 315/352 scsi: mpt3sas: Avoid IOMMU page faults on REPORT ZONES
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Damien Le Moal <[email protected]>
[ Upstream commit 82dbb57ac8d06dfe8227ba9ab11a49de2b475ae5 ]
Some firmware versions of the 9600 series SAS HBA byte-swap the REPORT ZONES command reply buffer from ATA-ZAC devices by directly accessing the buffer in the host memory. This does not respect the default command DMA direction and causes IOMMU page faults on architectures with an IOMMU enforcing write-only mappings for DMA_FROM_DEVICE DMA driection (e.g. AMD hosts).
scsi 18:0:0:0: Direct-Access-ZBC ATA WDC WSH722020AL W870 PQ: 0 ANSI: 6
scsi 18:0:0:0: SATA: handle(0x0027), sas_addr(0x300062b2083e7c40), phy(0), device_name(0x5000cca29dc35e11) scsi 18:0:0:0: enclosure logical id (0x300062b208097c40), slot(0)
scsi 18:0:0:0: enclosure level(0x0000), connector name( C0.0)
scsi 18:0:0:0: atapi(n), ncq(y), asyn_notify(n), smart(y), fua(y), sw_preserve(y)
scsi 18:0:0:0: qdepth(32), tagged(1), scsi_level(7), cmd_que(1)
sd 18:0:0:0: Attached scsi generic sg2 type 20
sd 18:0:0:0: [sdc] Host-managed zoned block device
mpt3sas 0000:41:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0021 address=0xfff9b200 flags=0x0050] mpt3sas 0000:41:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0021 address=0xfff9b300 flags=0x0050]mpt3sas_cm0: mpt3sas_ctl_pre_reset_handler: Releasing the trace buffer due to adapter reset. mpt3sas_cm0 fault info from func: mpt3sas_base_make_ioc_readympt3sas_cm0: fault_state(0x2666)!mpt3sas_cm0: sending diag reset !!mpt3sas_cm0: diag reset: SUCCESS
sd 18:0:0:0: [sdc] REPORT ZONES start lba 0 failed
sd 18:0:0:0: [sdc] REPORT ZONES: Result: hostbyte=DID_RESET driverbyte=DRIVER_OK
sd 18:0:0:0: [sdc] 0 4096-byte logical blocks: (0 B/0 B)
Avoid such issue by always mapping the buffer of REPORT ZONES commands using DMA_BIDIRECTIONAL (read+write IOMMU mapping). This is done by introducing the helper function _base_scsi_dma_map() and using this helper in _base_build_sg_scmd() and _base_build_sg_scmd_ieee() instead of calling directly scsi_dma_map().
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_base.c +18 -2
@@ -2492,6 +2492,22 @@ _base_build_zero_len_sge_ieee(struct MPT3SAS_ADAPTER *ioc, void *paddr)_base_add_sg_single_ieee (paddr, sgl_flags,0 ,0 ,-1 ); } +static inline int _base_scsi_dma_map (struct scsi_cmnd *cmd) +{ +/* +* Some firmware versions byte-swap the REPORT ZONES command reply from +* ATA-ZAC devices by directly accessing in the host buffer. This does +* not respect the default command DMA direction and causes IOMMU page +* faults on some architectures with an IOMMU enforcing write mappings +* (e.g. AMD hosts). Avoid such issue by making the report zones buffer +* mapping bi-directional. +*/ +if (cmd->cmnd[0 ] ==ZBC_IN && cmd->cmnd[1 ] ==ZI_REPORT_ZONES ) + cmd->sc_data_direction =DMA_BIDIRECTIONAL ; + +return scsi_dma_map (cmd); +} +/** * _base_build_sg_scmd - main sg creation routine * pcie_device is unused here!
@@ -2538,7 +2554,7 @@ _base_build_sg_scmd(struct MPT3SAS_ADAPTER *ioc, sgl_flags = sgl_flags <<MPI2_SGE_FLAGS_SHIFT ; sg_scmd =scsi_sglist (scmd); - sges_left =scsi_dma_map (scmd); + sges_left =_base_scsi_dma_map (scmd);if (sges_left <0 )return -ENOMEM ;
@@ -2682,7 +2698,7 @@ _base_build_sg_scmd_ieee(struct MPT3SAS_ADAPTER *ioc, } sg_scmd =scsi_sglist (scmd); - sges_left =scsi_dma_map (scmd); + sges_left =_base_scsi_dma_map (scmd);if (sges_left <0 )return -ENOMEM ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 316/352 irqchip/meson-gpio: support more than 8 channels gpio irq
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qianggui Song <[email protected]>
[ Upstream commit cc311074f681443266ed9f5969a5b5a0e833c5bc ]
Current meson gpio irqchip driver only support 8 channels for gpio irq line, later chips may have more then 8 channels, so need to modify code to support more.
Stable-dep-of: f872d4af79fe ("irqchip/meson-gpio: Convert meson_gpio_irq_controller::lock to 'raw_spinlock_t'")
--- drivers/irqchip/irq-meson-gpio.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)
drivers/irqchip/irq-meson-gpio.c +12 -9
@@ -16,7 +16,7 @@#include <linux/of.h> #include <linux/of_address.h> -#define NUM_CHANNEL 8 +#define MAX_NUM_CHANNEL 64#define MAX_INPUT_MUX 256#define REG_EDGE_POL 0x00
@@ -60,6 +60,7 @@ struct irq_ctl_ops {struct meson_gpio_irq_params {unsigned int nr_hwirq; +unsigned int nr_channels;bool support_edge_both;unsigned int edge_both_offset;unsigned int edge_single_offset;
@@ -81,6 +82,7 @@ struct meson_gpio_irq_params { .edge_single_offset = 0, \ .pol_low_offset = 16, \ .pin_sel_mask = 0xff, \ + .nr_channels = 8, \#define INIT_MESON_A1_COMMON_DATA (irqs) \ INIT_MESON_COMMON(irqs, meson_a1_gpio_irq_init, \
@@ -90,6 +92,7 @@ struct meson_gpio_irq_params { .edge_single_offset = 8, \ .pol_low_offset = 0, \ .pin_sel_mask = 0x7f, \ + .nr_channels = 8, \static const struct meson_gpio_irq_params meson8_params = {INIT_MESON8_COMMON_DATA (134 )
@@ -136,8 +139,8 @@ static const struct of_device_id meson_irq_gpio_matches[] = {struct meson_gpio_irq_controller {const struct meson_gpio_irq_params *params;void __iomem *base; -u32 channel_irqs[NUM_CHANNEL ]; - DECLARE_BITMAP(channel_map, NUM_CHANNEL); +u32 channel_irqs[MAX_NUM_CHANNEL ]; + DECLARE_BITMAP(channel_map, MAX_NUM_CHANNEL);spinlock_t lock; };
@@ -207,8 +210,8 @@ meson_gpio_irq_request_channel(struct meson_gpio_irq_controller *ctl,spin_lock_irqsave (&ctl->lock, flags);/* Find a free channel */ - idx =find_first_zero_bit (ctl->channel_map,NUM_CHANNEL ); -if (idx >=NUM_CHANNEL ) { + idx =find_first_zero_bit (ctl->channel_map, ctl->params->nr_channels); +if (idx >= ctl->params->nr_channels) {spin_unlock_irqrestore (&ctl->lock, flags);pr_err ("No channel available\n" );return -ENOSPC ;
@@ -451,10 +454,10 @@ static int __init meson_gpio_irq_parse_dt(struct device_node *node, ret =of_property_read_variable_u32_array (node,"amlogic,channel-interrupts" , ctl->channel_irqs, -NUM_CHANNEL , -NUM_CHANNEL ); + ctl->params->nr_channels, + ctl->params->nr_channels);if (ret <0 ) { -pr_err ("can't get %d channel interrupts\n" ,NUM_CHANNEL ); +pr_err ("can't get %d channel interrupts\n" , ctl->params->nr_channels);return ret; }
@@ -509,7 +512,7 @@ static int __init meson_gpio_irq_of_init(struct device_node *node, }pr_info ("%d to %d gpio interrupt mux initialized\n" , - ctl->params->nr_hwirq,NUM_CHANNEL ); + ctl->params->nr_hwirq, ctl->params->nr_channels);return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 317/352 irqchip/meson-gpio: Convert meson_gpio_irq_controller::lock to raw_spinlock_t
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arseniy Krasnov <[email protected]>
[ Upstream commit f872d4af79fe8c71ae291ce8875b477e1669a6c7 ]
This lock is acquired under irq_desc::lock with interrupts disabled.
When PREEMPT_RT is enabled, 'spinlock_t' becomes preemptible, which results in invalid lock acquire context;
[ BUG: Invalid wait context ]
swapper/0/1 is trying to lock:
ffff0000008fed30 (&ctl->lock){....}-{3:3}, at: meson_gpio_irq_update_bits0 other info that might help us debug this:
context-{5:5}
3 locks held by swapper/0/1:
#0: ffff0000003cd0f8 (&dev->mutex){....}-{4:4}, at: __driver_attach+0x90c #1: ffff000004714650 (&desc->request_mutex){+.+.}-{4:4}, at: __setup_irq0 #2: ffff0000047144c8 (&irq_desc_lock_class){-.-.}-{2:2}, at: __setup_irq0
stack backtrace: CPU: 1 PID: 1 Comm: swapper/0 Not tainted 6.9.9-sdkernel #1 Call trace: _raw_spin_lock_irqsave+0x60/0x88 meson_gpio_irq_update_bits+0x34/0x70 meson8_gpio_irq_set_type+0x78/0xc4 meson_gpio_irq_set_type+0x30/0x60 __irq_set_trigger+0x60/0x180 __setup_irq+0x30c/0x6e0 request_threaded_irq+0xec/0x1a4
--- drivers/irqchip/irq-meson-gpio.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/irqchip/irq-meson-gpio.c +7 -7
@@ -141,7 +141,7 @@ struct meson_gpio_irq_controller {void __iomem *base;u32 channel_irqs[MAX_NUM_CHANNEL ];DECLARE_BITMAP (channel_map,MAX_NUM_CHANNEL ); -spinlock_t lock; +raw_spinlock_t lock; }; static void meson_gpio_irq_update_bits(struct meson_gpio_irq_controller *ctl,
@@ -150,14 +150,14 @@ static void meson_gpio_irq_update_bits(struct meson_gpio_irq_controller *ctl,unsigned long flags;u32 tmp; -spin_lock_irqsave (&ctl->lock, flags); +raw_spin_lock_irqsave (&ctl->lock, flags); tmp =readl_relaxed (ctl->base + reg); tmp &= ~mask; tmp |= val;writel_relaxed (tmp, ctl->base + reg); -spin_unlock_irqrestore (&ctl->lock, flags); +raw_spin_unlock_irqrestore (&ctl->lock, flags); }static void meson_gpio_irq_init_dummy (struct meson_gpio_irq_controller *ctl)
@@ -207,12 +207,12 @@ meson_gpio_irq_request_channel(struct meson_gpio_irq_controller *ctl,unsigned long flags;unsigned int idx; -spin_lock_irqsave (&ctl->lock, flags); +raw_spin_lock_irqsave (&ctl->lock, flags);/* Find a free channel */ idx =find_first_zero_bit (ctl->channel_map, ctl->params->nr_channels);if (idx >= ctl->params->nr_channels) { -spin_unlock_irqrestore (&ctl->lock, flags); +raw_spin_unlock_irqrestore (&ctl->lock, flags);pr_err ("No channel available\n" );return -ENOSPC ; }
@@ -220,7 +220,7 @@ meson_gpio_irq_request_channel(struct meson_gpio_irq_controller *ctl,/* Mark the channel as used */ set_bit (idx, ctl->channel_map); -spin_unlock_irqrestore (&ctl->lock, flags); +raw_spin_unlock_irqrestore (&ctl->lock, flags);/* * Setup the mux of the channel to route the signal of the pad
@@ -488,7 +488,7 @@ static int __init meson_gpio_irq_of_init(struct device_node *node,if (!ctl)return -ENOMEM ; -spin_lock_init (&ctl->lock); +raw_spin_lock_init (&ctl->lock); ctl->base =of_iomap (node,0 );if (!ctl->base) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 318/352 serial: core: check uartclk for zero to avoid divide by zero
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: George Kennedy <[email protected]>
commit 6eabce6608d6f3440f4c03aa3d3ef50a47a3d193 upstream.
Calling ioctl TIOCSSERIAL with an invalid baud_base can result in uartclk being zero, which will result in a divide by zero error in uart_get_divisor(). The check for uartclk being zero in uart_set_info() needs to be done before other settings are made as subsequent calls to ioctl TIOCSSERIAL for the same port would be impacted if the uartclk check was done where uartclk gets set.
Oops: divide error: 0000 PREEMPT SMP KASAN PTI
RIP: 0010:uart_get_divisor (drivers/tty/serial/serial_core.c:580)
Call Trace:
<TASK>
serial8250_get_divisor (drivers/tty/serial/8250/8250_port.c:2576
drivers/tty/serial/8250/8250_port.c:2589)
serial8250_do_set_termios (drivers/tty/serial/8250/8250_port.c:502
drivers/tty/serial/8250/8250_port.c:2741)
serial8250_set_termios (drivers/tty/serial/8250/8250_port.c:2862)
uart_change_line_settings (./include/linux/spinlock.h:376
./include/linux/serial_core.h:608 drivers/tty/serial/serial_core.c:222)uart_port_startup (drivers/tty/serial/serial_core.c:342) uart_startup (drivers/tty/serial/serial_core.c:368) uart_set_info (drivers/tty/serial/serial_core.c:1034) uart_set_info_user (drivers/tty/serial/serial_core.c:1059) tty_set_serial (drivers/tty/tty_io.c:2637)
tty_ioctl (drivers/tty/tty_io.c:2647 drivers/tty/tty_io.c:2791)
__x64_sys_ioctl (fs/ioctl.c:52 fs/ioctl.c:907
fs/ioctl.c:893 fs/ioctl.c:893)
do_syscall_64 (arch/x86/entry/common.c:52
(discriminator 1) arch/x86/entry/common.c:83 (discriminator 1))entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130)
Rule: add
--- drivers/tty/serial/serial_core.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/tty/serial/serial_core.c +8 -0
@@ -862,6 +862,14 @@ static int uart_set_info(struct tty_stru new_flags = (__force upf_t )new_info->flags; old_custom_divisor = uport->custom_divisor; +if (!(uport->flags &UPF_FIXED_PORT )) { +unsigned int uartclk = new_info->baud_base *16 ; +/* check needs to be done here before other settings made */ +if (uartclk ==0 ) { + retval = -EINVAL ; + goto exit; + } + }if (!capable (CAP_SYS_ADMIN )) { retval = -EPERM ; if (change_irq || change_port ||
Greg Kroah-Hartman
maintainerPATCH 319/352 irqchip/xilinx: Fix shift out of bounds
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Radhey Shyam Pandey <[email protected]>
commit d73f0f49daa84176c3beee1606e73c7ffb6af8b2 upstream.
The device tree property 'xlnx,kind-of-intr' is sanity checked that the bitmask contains only set bits which are in the range of the number of interrupts supported by the controller.
The check is done by shifting the mask right by the number of supported interrupts and checking the result for zero.
The data type of the mask is u32 and the number of supported interrupts is up to 32. In case of 32 interrupts the shift is out of bounds, resulting in a mismatch warning. The out of bounds condition is also reported by UBSAN:
UBSAN: shift-out-of-bounds in irq-xilinx-intc.c:332:22 shift exponent 32 is too large for 32-bit type 'unsigned int'
Fix it by promoting the mask to u64 for the test.
--- drivers/irqchip/irq-xilinx-intc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/irqchip/irq-xilinx-intc.c +1 -1
@@ -201,7 +201,7 @@ static int __init xilinx_intc_of_init(st irqc->intr_mask =0 ; } -if (irqc->intr_mask >> irqc->nr_irq) +if ((u64 )irqc->intr_mask >> irqc->nr_irq)pr_warn ("irq-xilinx: mismatch in kind-of-intr param\n" ); pr_info("irq-xilinx: %pOF: num_irq=%d, edge=0x%x\n",
Greg Kroah-Hartman
maintainerPATCH 320/352 genirq/irqdesc: Honor caller provided affinity in alloc_desc()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shay Drory <[email protected]>
commit edbbaae42a56f9a2b39c52ef2504dfb3fb0a7858 upstream.
Currently, whenever a caller is providing an affinity hint for an interrupt, the allocation code uses it to calculate the node and copies the cpumask into irq_desc::affinity.
If the affinity for the interrupt is not marked 'managed' then the startup of the interrupt ignores irq_desc::affinity and uses the system default affinity mask.
Prevent this by setting the IRQD_AFFINITY_SET flag for the interrupt in the allocator, which causes irq_setup_affinity() to use irq_desc::affinity on interrupt startup if the mask contains an online CPU.
[ tglx: Massaged changelog ]
--- kernel/irq/irqdesc.c | 1 + 1 file changed, 1 insertion(+)
kernel/irq/irqdesc.c +1 -0
@@ -491,6 +491,7 @@ static int alloc_descs(unsigned int star flags =IRQD_AFFINITY_MANAGED |IRQD_MANAGED_SHUTDOWN ; } + flags |=IRQD_AFFINITY_SET ; mask = &affinity->mask; node =cpu_to_node (cpumask_first (mask)); affinity++;
Greg Kroah-Hartman
maintainerPATCH 321/352 power: supply: axp288_charger: Fix constant_charge_voltage writes
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit b34ce4a59cfe9cd0d6f870e6408e8ec88a964585 upstream.
info->max_cv is in millivolts, divide the microvolt value being written to constant_charge_voltage by 1000 *before* clamping it to info->max_cv.
Before this fix the code always tried to set constant_charge_voltage to max_cv / 1000 = 4 millivolt, which ends up in setting it to 4.1V which is the lowest supported value.
--- drivers/power/supply/axp288_charger.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/power/supply/axp288_charger.c +2 -2
@@ -371,8 +371,8 @@ static int axp288_charger_usb_set_properdev_warn (&info->pdev->dev,"set charge current failed\n" );break ;case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE : - scaled_val =min (val->intval, info->max_cv); - scaled_val =DIV_ROUND_CLOSEST (scaled_val,1000 ); + scaled_val =DIV_ROUND_CLOSEST (val->intval,1000 ); + scaled_val =min (scaled_val, info->max_cv); ret =axp288_charger_set_cv (info, scaled_val);if (ret <0 )dev_warn (&info->pdev->dev,"set charge voltage failed\n" );
Greg Kroah-Hartman
maintainerPATCH 322/352 power: supply: axp288_charger: Round constant_charge_voltage writes down
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit 81af7f2342d162e24ac820c10e68684d9f927663 upstream.
Round constant_charge_voltage writes down to the first supported lower value, rather then rounding them up to the first supported higher value.
This fixes e.g. writing 4250000 resulting in a value of 4350000 which might be dangerous, instead writing 4250000 will now result in a safe 4200000 value.
--- drivers/power/supply/axp288_charger.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/power/supply/axp288_charger.c +9 -9
@@ -168,18 +168,18 @@ static inline int axp288_charger_set_cv(u8 reg_val;int ret; -if (cv <=CV_4100MV ) { - reg_val =CHRG_CCCV_CV_4100MV ; - cv =CV_4100MV ; - }else if (cv <=CV_4150MV ) { - reg_val =CHRG_CCCV_CV_4150MV ; - cv =CV_4150MV ; - }else if (cv <=CV_4200MV ) { +if (cv >=CV_4350MV ) { + reg_val =CHRG_CCCV_CV_4350MV ; + cv =CV_4350MV ; + }else if (cv >=CV_4200MV ) { reg_val =CHRG_CCCV_CV_4200MV ; cv =CV_4200MV ; + }else if (cv >=CV_4150MV ) { + reg_val =CHRG_CCCV_CV_4150MV ; + cv =CV_4150MV ; }else { - reg_val =CHRG_CCCV_CV_4350MV ; - cv =CV_4350MV ; + reg_val =CHRG_CCCV_CV_4100MV ; + cv =CV_4100MV ; } reg_val = reg_val <<CHRG_CCCV_CV_BIT_POS ;
Greg Kroah-Hartman
maintainerPATCH 323/352 tracing: Fix overflow in get_free_elt()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tze-nan Wu <[email protected]>
commit bcf86c01ca4676316557dd482c8416ece8c2e143 upstream.
"tracing_map->next_elt" in get_free_elt() is at risk of overflowing.
Once it overflows, new elements can still be inserted into the tracing_map even though the maximum number of elements (max_elts) has been reached. Continuing to insert elements after the overflow could result in the tracing_map containing "tracing_map->max_size" elements, leaving no empty entries.
If any attempt is made to insert an element into a full tracing_map using __tracing_map_insert(), it will cause an infinite loop with preemption disabled, leading to a CPU hang problem.
Fix this by preventing any further increments to "tracing_map->next_elt" once it reaches "tracing_map->max_elt".
--- kernel/trace/tracing_map.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
kernel/trace/tracing_map.c +3 -3
@@ -454,7 +454,7 @@ static struct tracing_map_elt *get_free_struct tracing_map_elt *elt =NULL ;int idx; - idx =atomic_inc_return (&map->next_elt); + idx =atomic_fetch_add_unless (&map->next_elt,1 , map->max_elts);if (idx < map->max_elts) { elt = *(TRACING_MAP_ELT (map->elts, idx));if (map->ops && map->ops->elt_init)
@@ -699,7 +699,7 @@ void tracing_map_clear(struct tracing_ma {unsigned int i; -atomic_set (&map->next_elt,-1 ); +atomic_set (&map->next_elt,0 );atomic64_set (&map->hits,0 );atomic64_set (&map->drops,0 );
@@ -783,7 +783,7 @@ struct tracing_map *tracing_map_create(u map->map_bits = map_bits; map->max_elts = (1 << map_bits); -atomic_set (&map->next_elt,-1 ); +atomic_set (&map->next_elt,0 ); map->map_size = (1 << (map_bits +1 )); map->ops = ops;
Greg Kroah-Hartman
maintainerPATCH 324/352 padata: Fix possible divide-by-0 panic in padata_mt_helper()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Waiman Long <[email protected]>
commit 6d45e1c948a8b7ed6ceddb14319af69424db730c upstream.
We are hit with a not easily reproducible divide-by-0 panic in padata.c at bootup time.
[ 10.017908] Oops: divide error: 0000 1 PREEMPT SMP NOPTI
[ 10.017908] CPU: 26 PID: 2627 Comm: kworker/u1666:1 Not tainted 6.10.0-15.el10.x86_64 #1
[ 10.017908] Hardware name: Lenovo ThinkSystem SR950 [7X12CTO1WW]/[7X12CTO1WW], BIOS [PSE140J-2.30] 07/20/2021
[ 10.017908] Workqueue: events_unbound padata_mt_helper
[ 10.017908] RIP: 0010:padata_mt_helper+0x39/0xb0
:
[ 10.017963] Call Trace:
[ 10.017968] <TASK>
[ 10.018004] ? padata_mt_helper+0x39/0xb0
[ 10.018084] process_one_work+0x174/0x330
[ 10.018093] worker_thread+0x266/0x3a0
[ 10.018111] kthread+0xcf/0x100
[ 10.018124] ret_from_fork+0x31/0x50
[ 10.018138] ret_from_fork_asm+0x1a/0x30
[ 10.018147] </TASK>Looking at the padata_mt_helper() function, the only way a divide-by-0 panic can happen is when ps->chunk_size is 0. The way that chunk_size is initialized in padata_do_multithreaded(), chunk_size can be 0 when the min_chunk in the passed-in padata_mt_job structure is 0.
Fix this divide-by-0 panic by making sure that chunk_size will be at least 1 no matter what the input parameters are.
--- kernel/padata.c | 7 +++++++ 1 file changed, 7 insertions(+)
kernel/padata.c +7 -0
@@ -521,6 +521,13 @@ void __init padata_do_multithreaded(stru ps.chunk_size =max (ps.chunk_size, job->min_chunk); ps.chunk_size =roundup (ps.chunk_size, job->align); +/* +* chunk_size can be 0 if the caller sets min_chunk to 0. So force it +* to at least 1 to prevent divide-by-0 panic in padata_mt_helper().` +*/ +if (!ps.chunk_size) + ps.chunk_size =1U ; +list_for_each_entry (pw, &works, pw_list)queue_work (system_unbound_wq, &pw->pw_work);
Greg Kroah-Hartman
maintainerPATCH 325/352 x86/mtrr: Check if fixed MTRRs exist before saving them
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andi Kleen <[email protected]>
commit 919f18f961c03d6694aa726c514184f2311a4614 upstream.
MTRRs have an obsolete fixed variant for fine grained caching control of the 640K-1MB region that uses separate MSRs. This fixed variant has a separate capability bit in the MTRR capability MSR.
So far all x86 CPUs which support MTRR have this separate bit set, so it went unnoticed that mtrr_save_state() does not check the capability bit before accessing the fixed MTRR MSRs.
Though on a CPU that does not support the fixed MTRR capability this results in a #GP. The #GP itself is harmless because the RDMSR fault is handled gracefully, but results in a WARN_ON().
Add the missing capability check to prevent this.
--- arch/x86/kernel/cpu/mtrr/mtrr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/cpu/mtrr/mtrr.c +1 -1
@@ -817,7 +817,7 @@ void mtrr_save_state(void) {int first_cpu; -if (!mtrr_enabled ()) +if (!mtrr_enabled () || !mtrr_state.have_fixed)return ; first_cpu =cpumask_first (cpu_online_mask);
Greg Kroah-Hartman
maintainerPATCH 326/352 drm/bridge: analogix_dp: properly handle zero sized AUX transactions
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lucas Stach <[email protected]>
commit e82290a2e0e8ec5e836ecad1ca025021b3855c2d upstream.
Address only transactions without any data are valid and should not be flagged as short transactions. Simply return the message size when no transaction errors occured.
--- drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c +1 -4
@@ -1115,7 +1115,6 @@ ssize_t analogix_dp_transfer(struct analu32 status_reg;u8 *buffer = msg->buffer;unsigned int i; -int num_transferred =0 ;int ret;/* Buffer size of AUX CH is 16 bytes */
@@ -1167,7 +1166,6 @@ ssize_t analogix_dp_transfer(struct anal reg = buffer[i];writel (reg, dp->reg_base +ANALOGIX_DP_BUF_DATA_0 +4 * i); - num_transferred++; } }
@@ -1215,7 +1213,6 @@ ssize_t analogix_dp_transfer(struct anal reg =readl (dp->reg_base +ANALOGIX_DP_BUF_DATA_0 +4 * i); buffer[i] = (unsigned char )reg; - num_transferred++; } }
@@ -1232,7 +1229,7 @@ ssize_t analogix_dp_transfer(struct anal (msg->request & ~DP_AUX_I2C_MOT) == DP_AUX_NATIVE_READ) msg->reply = DP_AUX_NATIVE_REPLY_ACK; -return num_transferred >0 ? num_transferred : -EBUSY ; +return msg->size; aux_error:/* if aux err happen, reset aux */
Greg Kroah-Hartman
maintainerPATCH 327/352 drm/mgag200: Set DDC timeout in milliseconds
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Zimmermann <[email protected]>
commit ecde5db1598aecab54cc392282c15114f526f05f upstream.
Compute the i2c timeout in jiffies from a value in milliseconds. The original values of 2 jiffies equals 2 milliseconds if HZ has been configured to a value of 1000. This corresponds to 2.2 milliseconds used by most other DRM drivers. Update mgag200 accordingly.
--- drivers/gpu/drm/mgag200/mgag200_i2c.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/mgag200/mgag200_i2c.c +1 -1
@@ -134,7 +134,7 @@ struct mga_i2c_chan *mgag200_i2c_create( i2c->adapter.algo_data = &i2c->bit; i2c->bit.udelay =10 ; - i2c->bit.timeout =2 ; + i2c->bit.timeout =usecs_to_jiffies (2200 ); i2c->bit.data = i2c; i2c->bit.setsda = mga_gpio_setsda; i2c->bit.setscl = mga_gpio_setscl;
Greg Kroah-Hartman
maintainerPATCH 328/352 mptcp: sched: check both directions for backup
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Matthieu Baerts (NGI0)" <[email protected]>
commit b6a66e521a2032f7fcba2af5a9bcbaeaa19b7ca3 upstream.
The 'mptcp_subflow_context' structure has two items related to the backup flags:
- 'backup': the subflow has been marked as backup by the other peer
- 'request_bkup': the backup flag has been set by the host
Before this patch, the scheduler was only looking at the 'backup' flag. That can make sense in some cases, but it looks like that's not what we wanted for the general use, because either the path-manager was setting both of them when sending an MP_PRIO, or the receiver was duplicating the 'backup' flag in the subflow request.
Note that the use of these two flags in the path-manager are going to be fixed in the next commits, but this change here is needed not to modify the behaviour.
[ Conflicts in protocol.c, because the context has changed in commit
3ce0852c86b9 ("mptcp: enforce HoL-blocking estimation") and in commit 33d41c9cd74c ("mptcp: more accurate timeout"), which are not in this version. This commit is unrelated to this modification. Note that the tracepoint is not in this version, see commit e10a98920976 ("mptcp: add tracepoint in mptcp_subflow_get_send"). ]
--- net/mptcp/protocol.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
net/mptcp/protocol.c +6 -4
@@ -1124,11 +1124,13 @@ static struct sock *mptcp_subflow_get_se send_info[i].ratio =-1 ; }mptcp_for_each_subflow (msk, subflow) { +bool backup = subflow->backup || subflow->request_bkup; + ssk =mptcp_subflow_tcp_sock (subflow);if (!mptcp_subflow_active (subflow))continue ; - nr_active += !subflow->backup; + nr_active += !backup; *sndbuf =max (tcp_sk (ssk)->snd_wnd, *sndbuf);if (!sk_stream_memory_free (subflow->tcp_sock))continue ;
@@ -1139,9 +1141,9 @@ static struct sock *mptcp_subflow_get_se ratio =div_u64 ((u64 )READ_ONCE (ssk->sk_wmem_queued) <<32 , pace); -if (ratio < send_info[subflow->backup].ratio) { - send_info[subflow->backup].ssk = ssk; - send_info[subflow->backup].ratio = ratio; +if (ratio < send_info[backup].ratio) { + send_info[backup].ssk = ssk; + send_info[backup].ratio = ratio; } }
Greg Kroah-Hartman
maintainerPATCH 329/352 mptcp: distinguish rcv vs sent backup flag in requests
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Matthieu Baerts (NGI0)" <[email protected]>
commit efd340bf3d7779a3a8ec954d8ec0fb8a10f24982 upstream.
When sending an MP_JOIN + SYN + ACK, it is possible to mark the subflow as 'backup' by setting the flag with the same name. Before this patch, the backup was set if the other peer set it in its MP_JOIN + SYN request.
It is not correct: the backup flag should be set in the MPJ+SYN+ACK only if the host asks for it, and not mirroring what was done by the other peer. It is then required to have a dedicated bit for each direction, similar to what is done in the subflow context.
[ Conflicts in subflow.c, because the context has changed in commit
4cf86ae84c71 ("mptcp: strict local address ID selection"), and in commit 967d3c27127e ("mptcp: fix data races on remote_id"), which are not in this version. These commits are unrelated to this modification.
Same in protocol.h, with commit bab6b88e0560 ("mptcp: add allow_join_id0 in mptcp_out_options"). ]
--- net/mptcp/options.c | 2 +- net/mptcp/protocol.h | 3 ++- net/mptcp/subflow.c | 1 + 3 files changed, 4 insertions(+), 2 deletions(-)
net/mptcp/options.c +1 -1
@@ -708,7 +708,7 @@ bool mptcp_synack_options(const struct rreturn true; }else if (subflow_req->mp_join) { opts->suboptions =OPTION_MPTCP_MPJ_SYNACK ; - opts->backup = subflow_req->backup; + opts->backup = subflow_req->request_bkup; opts->join_id = subflow_req->local_id; opts->thmac = subflow_req->thmac; opts->nonce = subflow_req->local_nonce;
net/mptcp/protocol.h +2 -1
@@ -261,7 +261,8 @@ struct mptcp_subflow_request_sock {struct tcp_request_sock sk; u16 mp_capable : 1, mp_join : 1, - backup : 1; + backup : 1, + request_bkup : 1;u8 local_id;u8 remote_id;u64 local_key;
net/mptcp/subflow.c +1 -0
@@ -1395,6 +1395,7 @@ static void subflow_ulp_clone(const stru new_ctx->mp_join =1 ; new_ctx->fully_established =1 ; new_ctx->backup = subflow_req->backup; + new_ctx->request_bkup = subflow_req->request_bkup; new_ctx->local_id = subflow_req->local_id; new_ctx->remote_id = subflow_req->remote_id; new_ctx->token = subflow_req->token;
Greg Kroah-Hartman
maintainerPATCH 330/352 mptcp: fix NL PM announced address accounting
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit 4b317e0eb287bd30a1b329513531157c25e8b692 upstream.
Currently the per connection announced address counter is never decreased. As a consequence, after connection establishment, if the NL PM deletes an endpoint and adds a new/different one, no additional subflow is created for the new endpoint even if the current limits allow that.
Address the issue properly updating the signaled address counter every time the NL PM removes such addresses.
[ Conflicts in pm_netlink.c, because the commit 06faa2271034 ("mptcp:
remove multi addresses and subflows in PM") is not in this version. Only the modification in mptcp_pm_remove_anno_addr() is then needed. ]
--- net/mptcp/pm_netlink.c | 1 + 1 file changed, 1 insertion(+)
net/mptcp/pm_netlink.c +1 -0
@@ -759,6 +759,7 @@ static bool mptcp_pm_remove_anno_addr(st ret =remove_anno_list_by_saddr (msk, addr);if (ret || force) {spin_lock_bh (&msk->pm.lock); + msk->pm.add_addr_signaled -= ret;mptcp_pm_remove_addr (msk, addr->id);spin_unlock_bh (&msk->pm.lock); }
Greg Kroah-Hartman
maintainerPATCH 331/352 mptcp: mib: count MPJ with backup flag
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Matthieu Baerts (NGI0)" <[email protected]>
commit 4dde0d72ccec500c60c798e036b852e013d6e124 upstream.
Without such counters, it is difficult to easily debug issues with MPJ not having the backup flags on production servers.
This is not strictly a fix, but it eases to validate the following patches without requiring to take packet traces, to query ongoing connections with Netlink with admin permissions, or to guess by looking at the behaviour of the packet scheduler. Also, the modification is self contained, isolated, well controlled, and the increments are done just after others, there from the beginning. It looks then safe, and helpful to backport this.
[ Conflicts in subflow.c because the context has changed in
commit b3ea6b272d79 ("mptcp: consolidate initial ack seq generation") and commit 5bc56388c74f ("mptcp: add port number check for MP_JOIN") which are not in this version. These commits are unrelated to this modification. ]
--- net/mptcp/mib.c | 2 ++ net/mptcp/mib.h | 2 ++ net/mptcp/subflow.c | 6 ++++++ 3 files changed, 10 insertions(+)
net/mptcp/mib.c +2 -0
@@ -16,7 +16,9 @@ static const struct snmp_mib mptcp_snmp_SNMP_MIB_ITEM ("MPTCPRetrans" ,MPTCP_MIB_RETRANSSEGS ),SNMP_MIB_ITEM ("MPJoinNoTokenFound" ,MPTCP_MIB_JOINNOTOKEN ),SNMP_MIB_ITEM ("MPJoinSynRx" ,MPTCP_MIB_JOINSYNRX ), +SNMP_MIB_ITEM ("MPJoinSynBackupRx" ,MPTCP_MIB_JOINSYNBACKUPRX ),SNMP_MIB_ITEM ("MPJoinSynAckRx" ,MPTCP_MIB_JOINSYNACKRX ), +SNMP_MIB_ITEM ("MPJoinSynAckBackupRx" ,MPTCP_MIB_JOINSYNACKBACKUPRX ),SNMP_MIB_ITEM ("MPJoinSynAckHMacFailure" ,MPTCP_MIB_JOINSYNACKMAC ),SNMP_MIB_ITEM ("MPJoinAckRx" ,MPTCP_MIB_JOINACKRX ), SNMP_MIB_ITEM("MPJoinAckHMacFailure", MPTCP_MIB_JOINACKMAC),
net/mptcp/mib.h +2 -0
@@ -9,7 +9,9 @@ enum linux_mptcp_mib_field {MPTCP_MIB_RETRANSSEGS ,/* Segments retransmitted at the MPTCP-level */ MPTCP_MIB_JOINNOTOKEN ,/* Received MP_JOIN but the token was not found */ MPTCP_MIB_JOINSYNRX ,/* Received a SYN + MP_JOIN */ +MPTCP_MIB_JOINSYNBACKUPRX ,/* Received a SYN + MP_JOIN + backup flag */ MPTCP_MIB_JOINSYNACKRX ,/* Received a SYN/ACK + MP_JOIN */ +MPTCP_MIB_JOINSYNACKBACKUPRX ,/* Received a SYN/ACK + MP_JOIN + backup flag */ MPTCP_MIB_JOINSYNACKMAC ,/* HMAC was wrong on SYN/ACK + MP_JOIN */ MPTCP_MIB_JOINACKRX ,/* Received an ACK + MP_JOIN */ MPTCP_MIB_JOINACKMAC, /* HMAC was wrong on ACK + MP_JOIN */
net/mptcp/subflow.c +6 -0
@@ -135,6 +135,9 @@ static void subflow_init_req(struct requreturn ; }else if (mp_opt.mp_join) {SUBFLOW_REQ_INC_STATS (req,MPTCP_MIB_JOINSYNRX ); + +if (mp_opt.backup) +SUBFLOW_REQ_INC_STATS (req,MPTCP_MIB_JOINSYNBACKUPRX ); }if (mp_opt.mp_capable && listener->request_mptcp) {
@@ -347,6 +350,9 @@ static void subflow_finish_connect(struc subflow->mp_join =1 ;MPTCP_INC_STATS (sock_net (sk),MPTCP_MIB_JOINSYNACKRX ); + +if (subflow->backup) +MPTCP_INC_STATS (sock_net (sk),MPTCP_MIB_JOINSYNACKBACKUPRX ); }else if (mptcp_check_fallback (sk)) { fallback:mptcp_rcv_space_init (mptcp_sk (parent), sk);
Greg Kroah-Hartman
maintainerPATCH 332/352 mptcp: export local_address
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geliang Tang <[email protected]>
commit dc886bce753cc2cf3c88ec5c7a6880a4e17d65ba upstream.
Rename local_address() with "mptcp_" prefix and export it in protocol.h.
This function will be re-used in the common PM code (pm.c) in the following commit.
Stable-dep-of: 6834097fc38c ("mptcp: pm: fix backup support in signal endpoints") [ Conflicts in pm_netlink.c and protocol.h, because the context has
changed in commit 4638de5aefe5 ("mptcp: handle local addrs announced by userspace PMs") which is not in this version. This commit is unrelated to this modification. Also some parts using 'local_address' are not in this version, that's OK, we don't need to do anything with them. ]
--- net/mptcp/pm_netlink.c | 9 ++++----- net/mptcp/protocol.h | 1 + 2 files changed, 5 insertions(+), 5 deletions(-)
net/mptcp/pm_netlink.c +4 -5
@@ -84,8 +84,7 @@ static bool address_zero(const struct mpreturn addresses_equal (addr, &zero, false); } -static void local_address (const struct sock_common *skc, -struct mptcp_addr_info *addr) +void mptcp_local_address (const struct sock_common *skc,struct mptcp_addr_info *addr) { addr->port =0 ; addr->family = skc->skc_family;
@@ -120,7 +119,7 @@ static bool lookup_subflow_by_saddr(conslist_for_each_entry (subflow, list, node) { skc = (struct sock_common *)mptcp_subflow_tcp_sock (subflow); -local_address (skc, &cur); +mptcp_local_address (skc, &cur);if (addresses_equal (&cur, saddr, false))return true; }
@@ -533,8 +532,8 @@ int mptcp_pm_nl_get_local_id(struct mptc/* The 0 ID mapping is defined by the first subflow, copied into the msk * addr */ -local_address ((struct sock_common *)msk, &msk_local); -local_address ((struct sock_common *)skc, &skc_local); +mptcp_local_address ((struct sock_common *)msk, &msk_local); +mptcp_local_address ((struct sock_common *)skc, &skc_local);if (addresses_equal (&msk_local, &skc_local, false))return 0 ;
net/mptcp/protocol.h +1 -0
@@ -372,6 +372,7 @@ void __mptcp_close_ssk(struct sock *sk,struct mptcp_subflow_context *subflow, long timeout);void mptcp_subflow_reset (struct sock *ssk); +void mptcp_local_address (const struct sock_common *skc,struct mptcp_addr_info *addr);/* called with sk socket lock held */ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
Greg Kroah-Hartman
maintainerPATCH 333/352 mptcp: pm: fix backup support in signal endpoints
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Matthieu Baerts (NGI0)" <[email protected]>
commit 6834097fc38c5416701c793da94558cea49c0a1f upstream.
There was a support for signal endpoints, but only when the endpoint's flag was changed during a connection. If an endpoint with the signal and backup was already present, the MP_JOIN reply was not containing the backup flag as expected.
That's confusing to have this inconsistent behaviour. On the other hand, the infrastructure to set the backup flag in the SYN + ACK + MP_JOIN was already there, it was just never set before. Now when requesting the local ID from the path-manager, the backup status is also requested.
Note that when the userspace PM is used, the backup flag can be set if the local address was already used before with a backup flag, e.g. if the address was announced with the 'backup' flag, or a subflow was created with the 'backup' flag.
[ Conflicts in pm_userspace.c because the context has changed in commit
1e07938e29c5 ("net: mptcp: rename netlink handlers to mptcp_pm_nl_<blah>_{doit,dumpit}") which is not in this version. This commit is unrelated to this modification.
Conflicts in protocol.h because the context has changed in commit 9ae7846c4b6b ("mptcp: dump addrs in userspace pm list") which is not in this version. This commit is unrelated to this modification. Conflicts in pm.c because the context has changed in commit f40be0db0b76 ("mptcp: unify pm get_flags_and_ifindex_by_id") and commit 71b7dec27f34 ("mptcp: less aggressive retransmission strategy") which are not in this version. These commits are unrelated to this modification.
Conflicts in subflow.c, because the commit 4cf86ae84c71 ("mptcp:
strict local address ID selection") is not in this version. It is then not needed to modify the subflow_chk_local_id() helper, which is not in this version.
Also, in this version, there is no pm_userspace.c, because this PM has been added in v5.19, which also causes conflicts in protocol.h, and pm_netlink.c. Plus the code in pm.c can be simplified, as there is no userspace PM. And the code in pm_netlink.c needs to use addresses_equal() instead of mptcp_addresses_equal(), see commit 4638de5aefe5 ("mptcp: handle local addrs announced by userspace PMs"). The code in pm_netlink.c also needs to be adapted because the pm_nl_get_pernet_from_msk() helper is not in this version, introduced later in commit c682bf536cf4 ("mptcp: add pm_nl_pernet helpers"), and also because the 'flags' are in mptcp_addr_info structure, see commit daa83ab03954 ("mptcp: move flags and ifindex out of mptcp_addr_info"). ]
--- net/mptcp/pm.c | 9 +++++++++ net/mptcp/pm_netlink.c | 20 ++++++++++++++++++++ net/mptcp/protocol.h | 2 ++ net/mptcp/subflow.c | 1 + 4 files changed, 32 insertions(+)
net/mptcp/pm.c +9 -0
@@ -225,6 +225,15 @@ int mptcp_pm_get_local_id(struct mptcp_sreturn mptcp_pm_nl_get_local_id (msk, skc); } +bool mptcp_pm_is_backup (struct mptcp_sock *msk,struct sock_common *skc) +{ +struct mptcp_addr_info skc_local; + +mptcp_local_address ((struct sock_common *)skc, &skc_local); + +return mptcp_pm_nl_is_backup (msk, &skc_local); +} +void mptcp_pm_data_init (struct mptcp_sock *msk) { msk->pm.add_addr_signaled =0 ;
net/mptcp/pm_netlink.c +20 -0
@@ -568,6 +568,26 @@ int mptcp_pm_nl_get_local_id(struct mptcreturn ret; } +bool mptcp_pm_nl_is_backup (struct mptcp_sock *msk,struct mptcp_addr_info *skc) +{ +struct mptcp_pm_addr_entry *entry; +struct pm_nl_pernet *pernet; +bool backup = false; + + pernet =net_generic (sock_net ((struct sock *)msk), pm_nl_pernet_id); + +rcu_read_lock (); +list_for_each_entry_rcu (entry, &pernet->local_addr_list, list) { +if (addresses_equal (&entry->addr, skc, entry->addr.port)) { + backup = !!(entry->addr.flags &MPTCP_PM_ADDR_FLAG_BACKUP ); +break ; + } + } +rcu_read_unlock (); + +return backup; +} +void mptcp_pm_nl_data_init (struct mptcp_sock *msk) {struct mptcp_pm_data *pm = &msk->pm;
net/mptcp/protocol.h +2 -0
@@ -481,6 +481,7 @@ bool mptcp_pm_add_addr_signal(struct mptbool mptcp_pm_rm_addr_signal (struct mptcp_sock *msk,unsigned int remaining,u8 *rm_id);int mptcp_pm_get_local_id (struct mptcp_sock *msk,struct sock_common *skc); +bool mptcp_pm_is_backup (struct mptcp_sock *msk,struct sock_common *skc);void __init mptcp_pm_nl_init (void );void mptcp_pm_nl_data_init (struct mptcp_sock *msk);
@@ -490,6 +491,7 @@ void mptcp_pm_nl_add_addr_received(strucvoid mptcp_pm_nl_rm_addr_received (struct mptcp_sock *msk);void mptcp_pm_nl_rm_subflow_received (struct mptcp_sock *msk,u8 rm_id);int mptcp_pm_nl_get_local_id (struct mptcp_sock *msk,struct sock_common *skc); +bool mptcp_pm_nl_is_backup (struct mptcp_sock *msk,struct mptcp_addr_info *skc);static inline struct mptcp_ext *mptcp_get_ext (struct sk_buff *skb) {
net/mptcp/subflow.c +1 -0
@@ -80,6 +80,7 @@ static struct mptcp_sock *subflow_token_return NULL ; } subflow_req->local_id = local_id; + subflow_req->request_bkup =mptcp_pm_is_backup (msk, (struct sock_common *)req);get_random_bytes (&subflow_req->local_nonce,sizeof (u32));
Greg Kroah-Hartman
maintainerPATCH 334/352 samples: Add fs error monitoring example
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gabriel Krisman Bertazi <[email protected]>
[ Upstream commit 5451093081db6ca1a708d149e11cfd219800bc4c ]
Introduce an example of a FAN_FS_ERROR fanotify user to track filesystem errors.
--- samples/Kconfig | 8 ++ samples/Makefile | 1 samples/fanotify/Makefile | 5 + samples/fanotify/fs-monitor.c | 142 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 156 insertions(+) create mode 100644 samples/fanotify/Makefile create mode 100644 samples/fanotify/fs-monitor.c
samples/Kconfig +8 -0
@@ -120,6 +120,14 @@ config SAMPLE_CONNECTOR with it. See also Documentation/driver-api/connector.rst +config SAMPLE_FANOTIFY_ERROR + bool "Build fanotify error monitoring sample" + depends on FANOTIFY + help + When enabled, this builds an example code that uses the + FAN_FS_ERROR fanotify mechanism to monitor filesystem + errors. + config SAMPLE_HIDRAW bool "hidraw sample" depends on CC_CAN_LINK && HEADERS_INSTALL
samples/Makefile +1 -0
@@ -5,6 +5,7 @@ subdir-$(CONFIG_SAMPLE_AUXDISPLAY) += au subdir-$(CONFIG_SAMPLE_ANDROID_BINDERFS) += binderfs obj-$(CONFIG_SAMPLE_CONFIGFS) += configfs/ obj-$(CONFIG_SAMPLE_CONNECTOR) += connector/ +obj-$(CONFIG_SAMPLE_FANOTIFY_ERROR) += fanotify/ subdir-$(CONFIG_SAMPLE_HIDRAW) += hidraw obj-$(CONFIG_SAMPLE_HW_BREAKPOINT) += hw_breakpoint/ obj-$(CONFIG_SAMPLE_KDB) += kdb/
samples/fanotify/Makefile new file +5 -0
@@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0-only +userprogs-always-y += fs-monitor + +userccflags += -I usr/include -Wall +
samples/fanotify/fs-monitor.c new file +142 -0
142 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 335/352 samples: Make fs-monitor depend on libc and headers
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gabriel Krisman Bertazi <[email protected]>
[ Upstream commit 8fc70b3a142f97f7859bf052151df896933d2586 ]
Prevent build errors when headers or libc are not available, such as on kernel build bots, like the below:
samples/fanotify/fs-monitor.c:7:10: fatal error: errno.h: No such file or directory
7 | #include <errno.h>
| ^~~~~~~~~
--- samples/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
samples/Kconfig +1 -1
@@ -122,7 +122,7 @@ config SAMPLE_CONNECTOR config SAMPLE_FANOTIFY_ERROR bool "Build fanotify error monitoring sample" - depends on FANOTIFY + depends on FANOTIFY && CC_CAN_LINK && HEADERS_INSTALL help When enabled, this builds an example code that uses the FAN_FS_ERROR fanotify mechanism to monitor filesystem
Greg Kroah-Hartman
maintainerPATCH 336/352 Add gitignore file for samples/fanotify/ subdirectory
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Torvalds <[email protected]>
[ Upstream commit c107fb9b4f8338375b3e865c3d2c1d98ccb3a95a ]
Commit 5451093081db ("samples: Add fs error monitoring example") added a new sample program, but didn't teach git to ignore the new generated files, causing unnecessary noise from 'git status' after a full build.
Add the 'fs-monitor' sample executable to the .gitignore for this subdirectory to silence it all again.
--- samples/fanotify/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 samples/fanotify/.gitignore
samples/fanotify/.gitignore new file +1 -0
@@ -0,0 +1 @@ +fs-monitor
Greg Kroah-Hartman
maintainerPATCH 337/352 Fix gcc 4.9 build issue in 5.10.y
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jari Ruusu <[email protected]>
Some older systems still compile kernels with old gcc version. These warnings and errors show up when compiling with gcc 4.9.2
error: "__GCC4_has_attribute___uninitialized__" is not defined [-Werror=undef]
Upstream won't need this because newer kernels are not compilable with gcc 4.9.
Subject: [PATCH 5.10 337/352] gcc-4.9 warning/error fix for 5.10.223-rc1
--- include/linux/compiler_attributes.h | 1 + 1 file changed, 1 insertion(+)
include/linux/compiler_attributes.h +1 -0
@@ -37,6 +37,7 @@# define __GCC4_has_attribute___nonstring__ 0# define __GCC4_has_attribute___no_sanitize_address__ (__GNUC_MINOR__ >= 8)# define __GCC4_has_attribute___no_sanitize_undefined__ (__GNUC_MINOR__ >= 9) +# define __GCC4_has_attribute___uninitialized__ 0# define __GCC4_has_attribute___fallthrough__ 0# define __GCC4_has_attribute___warning__ 1#endif
Greg Kroah-Hartman
maintainerPATCH 338/352 PCI/DPC: Fix use-after-free on concurrent DPC and hot-removal
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Wunner <[email protected]>
commit 11a1f4bc47362700fcbde717292158873fb847ed upstream.
Keith reports a use-after-free when a DPC event occurs concurrently to hot-removal of the same portion of the hierarchy:
The dpc_handler() awaits readiness of the secondary bus below the Downstream Port where the DPC event occurred. To do so, it polls the config space of the first child device on the secondary bus. If that child device is concurrently removed, accesses to its struct pci_dev cause the kernel to oops.
That's because pci_bridge_wait_for_secondary_bus() neglects to hold a reference on the child device. Before v6.3, the function was only called on resume from system sleep or on runtime resume. Holding a reference wasn't necessary back then because the pciehp IRQ thread could never run concurrently. (On resume from system sleep, IRQs are not enabled until after the resume_noirq phase. And runtime resume is always awaited before a PCI device is removed.)
However starting with v6.3, pci_bridge_wait_for_secondary_bus() is also called on a DPC event. Commit 53b54ad074de ("PCI/DPC: Await readiness of secondary bus after reset"), which introduced that, failed to appreciate that pci_bridge_wait_for_secondary_bus() now needs to hold a reference on the child device because dpc_handler() and pciehp may indeed run concurrently. The commit was backported to v5.10+ stable kernels, so that's the oldest one affected.
Add the missing reference acquisition.
Abridged stack trace:
BUG: unable to handle page fault for address: 00000000091400c0 CPU: 15 PID: 2464 Comm: irq/53-pcie-dpc 6.9.0 RIP: pci_bus_read_config_dword+0x17/0x50 pci_dev_wait() pci_bridge_wait_for_secondary_bus() dpc_reset_link() pcie_do_recovery() dpc_handler()
--- drivers/pci/pci.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
drivers/pci/pci.c +12 -7
@@ -4817,7 +4817,7 @@ int pci_bridge_wait_for_secondary_bus(st int timeout) {struct pci_dev *child; -int delay; +int delay, ret =0 ;if (pci_dev_is_disconnected (dev))return 0 ;
@@ -4845,8 +4845,8 @@ int pci_bridge_wait_for_secondary_bus(streturn 0 ; } - child = list_first_entry(&dev->subordinate->devices, struct pci_dev, - bus_list); + child =pci_dev_get (list_first_entry (&dev->subordinate->devices, + struct pci_dev, bus_list));up_read (&pci_bus_sem);/*
@@ -4856,7 +4856,7 @@ int pci_bridge_wait_for_secondary_bus(stif (!pci_is_pcie (dev)) {pci_dbg (dev,"waiting %d ms for secondary bus\n" ,1000 + delay);msleep (1000 + delay); -return 0 ; + goto put_child; }/*
@@ -4877,7 +4877,7 @@ int pci_bridge_wait_for_secondary_bus(st* until the timeout expires. */ if (!pcie_downstream_port (dev)) -return 0 ; + goto put_child;if (pcie_get_speed_cap (dev) <=PCIE_SPEED_5_0GT ) {pci_dbg (dev,"waiting %d ms for downstream link\n" , delay);
@@ -4888,11 +4888,16 @@ int pci_bridge_wait_for_secondary_bus(stif (!pcie_wait_for_link_delay (dev, true, delay)) {/* Did not train, no need to wait any further */ pci_info (dev,"Data Link Layer Link Active not set in 1000 msec\n" ); -return -ENOTTY ; + ret = -ENOTTY ; + goto put_child; } } -return pci_dev_wait (child, reset_type, timeout - delay); + ret =pci_dev_wait (child, reset_type, timeout - delay); + +put_child: +pci_dev_put (child); +return ret; }void pci_reset_secondary_bus (struct pci_dev *dev)
Greg Kroah-Hartman
maintainerPATCH 339/352 netfilter: nf_tables: set element extended ACK reporting support
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
commit b53c116642502b0c85ecef78bff4f826a7dd4145 upstream.
Report the element that causes problems via netlink extended ACK for set element commands.
--- net/netfilter/nf_tables_api.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
net/netfilter/nf_tables_api.c +9 -4
@@ -5354,8 +5354,10 @@ static int nf_tables_getsetelem(struct nnla_for_each_nested (attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS ], rem) { err =nft_get_set_elem (&ctx, set, attr); -if (err <0 ) +if (err <0 ) { +NL_SET_BAD_ATTR (extack, attr);break ; + } }return err;
@@ -5848,8 +5850,10 @@ static int nf_tables_newsetelem(struct nnla_for_each_nested (attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS ], rem) { err =nft_add_set_elem (&ctx, set, attr, nlh->nlmsg_flags); -if (err <0 ) +if (err <0 ) { +NL_SET_BAD_ATTR (extack, attr);return err; + } }if (nft_net->validate_state ==NFT_VALIDATE_DO )
@@ -6058,9 +6062,10 @@ static int nf_tables_delsetelem(struct nnla_for_each_nested (attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS ], rem) { err =nft_del_setelem (&ctx, set, attr); -if (err <0 ) +if (err <0 ) { +NL_SET_BAD_ATTR (extack, attr);break ; - + } set->ndeact++; }return err;
Greg Kroah-Hartman
maintainerPATCH 340/352 netfilter: nf_tables: use timestamp to check for set element timeout
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
commit 7395dfacfff65e9938ac0889dafa1ab01e987d15 upstream
Add a timestamp field at the beginning of the transaction, store it in the nftables per-netns area.
Update set backend .insert, .deactivate and sync gc path to use the timestamp, this avoids that an element expires while control plane transaction is still unfinished.
.lookup and .update, which are used from packet path, still use the current time to check if the element has expired. And .get path and dump also since this runs lockless under rcu read size lock. Then, there is async gc which also needs to check the current time since it runs asynchronously from a workqueue.
[ NB: rbtree GC updates has been excluded because GC is asynchronous. ]
--- include/net/netfilter/nf_tables.h | 21 +++++++++++++++++++-- net/netfilter/nf_tables_api.c | 1 + net/netfilter/nft_set_hash.c | 8 +++++++- net/netfilter/nft_set_pipapo.c | 18 +++++++++++------- net/netfilter/nft_set_rbtree.c | 6 ++++-- 5 files changed, 42 insertions(+), 12 deletions(-)
include/net/netfilter/nf_tables.h +19 -2
@@ -13,6 +13,7 @@#include <net/netfilter/nf_flow_table.h> #include <net/netlink.h> #include <net/flow_offload.h> +#include <net/netns/generic.h> #define NFT_MAX_HOOKS (NF_INET_INGRESS + 1)
@@ -686,10 +687,16 @@ static inline struct nft_expr *nft_set_ereturn nft_set_ext (ext,NFT_SET_EXT_EXPR ); } -static inline bool nft_set_elem_expired (const struct nft_set_ext *ext) +static inline bool __nft_set_elem_expired (const struct nft_set_ext *ext, +u64 tstamp) {return nft_set_ext_exists (ext,NFT_SET_EXT_EXPIRATION ) && -time_is_before_eq_jiffies64 (*nft_set_ext_expiration (ext)); +time_after_eq64 (tstamp, *nft_set_ext_expiration (ext)); +} + +static inline bool nft_set_elem_expired (const struct nft_set_ext *ext) +{ +return __nft_set_elem_expired (ext,get_jiffies_64 ()); } static inline struct nft_set_ext *nft_set_elem_ext(const struct nft_set *set,
@@ -1580,9 +1587,19 @@ struct nftables_pernet {struct list_head module_list;struct list_head notify_list;struct mutex commit_mutex; +u64 tstamp;unsigned int base_seq;u8 validate_state; unsigned int gc_seq; }; +extern unsigned int nf_tables_net_id; + +static inline u64 nft_net_tstamp (const struct net *net) +{ +struct nftables_pernet *nft_net =net_generic (net, nf_tables_net_id); + +return nft_net->tstamp; +} +#endif /* _NET_NF_TABLES_H */
net/netfilter/nf_tables_api.c +1 -0
@@ -9034,6 +9034,7 @@ static bool nf_tables_valid_genid(structbool genid_ok;mutex_lock (&nft_net->commit_mutex); + nft_net->tstamp =get_jiffies_64 (); genid_ok = genid ==0 || nft_net->base_seq == genid;if (!genid_ok)
net/netfilter/nft_set_hash.c +7 -1
@@ -38,6 +38,7 @@ struct nft_rhash_cmp_arg {const struct nft_set *set;const u32 *key;u8 genmask; +u64 tstamp; };static inline u32 nft_rhash_key (const void *data,u32 len,u32 seed)
@@ -64,7 +65,7 @@ static inline int nft_rhash_cmp(struct rreturn 1 ;if (nft_set_elem_is_dead (&he->ext))return 1 ; -if (nft_set_elem_expired (&he->ext)) +if (__nft_set_elem_expired (&he->ext, x->tstamp))return 1 ;if (!nft_set_elem_active (&he->ext, x->genmask))return 1 ;
@@ -88,6 +89,7 @@ static bool nft_rhash_lookup(const struc .genmask = nft_genmask_cur(net), .set = set, .key = key, + .tstamp = get_jiffies_64(), }; he =rhashtable_lookup (&priv->ht, &arg, nft_rhash_params);
@@ -106,6 +108,7 @@ static void *nft_rhash_get(const struct .genmask = nft_genmask_cur(net), .set = set, .key = elem->key.val.data, + .tstamp = get_jiffies_64(), }; he =rhashtable_lookup (&priv->ht, &arg, nft_rhash_params);
@@ -129,6 +132,7 @@ static bool nft_rhash_update(struct nft_ .genmask = NFT_GENMASK_ANY, .set = set, .key = key, + .tstamp = get_jiffies_64(), }; he =rhashtable_lookup (&priv->ht, &arg, nft_rhash_params);
@@ -172,6 +176,7 @@ static int nft_rhash_insert(const struct .genmask = nft_genmask_next(net), .set = set, .key = elem->key.val.data, + .tstamp = nft_net_tstamp(net), };struct nft_rhash_elem *prev;
@@ -214,6 +219,7 @@ static void *nft_rhash_deactivate(const .genmask = nft_genmask_next(net), .set = set, .key = elem->key.val.data, + .tstamp = nft_net_tstamp(net), };rcu_read_lock ();
net/netfilter/nft_set_pipapo.c +11 -7
@@ -504,6 +504,7 @@ out:* @set: nftables API set representation * @data: Key data to be matched against existing elements * @genmask: If set, check that element is active in given genmask +* @tstamp: timestamp to check for expired elements * * This is essentially the same as the lookup function, except that it matches * key data against the uncommitted copy and doesn't use preallocated maps for
@@ -513,7 +514,8 @@ out:*/ static struct nft_pipapo_elem *pipapo_get (const struct net *net,const struct nft_set *set, -const u8 *data,u8 genmask) +const u8 *data,u8 genmask, +u64 tstamp) {struct nft_pipapo_elem *ret =ERR_PTR (-ENOENT );struct nft_pipapo *priv =nft_set_priv (set);
@@ -566,7 +568,7 @@ next_match: goto out;if (last) { -if (nft_set_elem_expired (&f->mt[b].e->ext)) +if (__nft_set_elem_expired (&f->mt[b].e->ext, tstamp)) goto next_match;if ((genmask && !nft_set_elem_active (&f->mt[b].e->ext, genmask)))
@@ -603,7 +605,7 @@ static void *nft_pipapo_get(const struct const struct nft_set_elem *elem, unsigned int flags) { return pipapo_get(net, set, (const u8 *)elem->key.val.data, - nft_genmask_cur(net)); + nft_genmask_cur(net), get_jiffies_64()); }/**
@@ -1197,6 +1199,7 @@ static int nft_pipapo_insert(const strucstruct nft_pipapo *priv =nft_set_priv (set);struct nft_pipapo_match *m = priv->clone;u8 genmask =nft_genmask_next (net); +u64 tstamp =nft_net_tstamp (net);struct nft_pipapo_field *f;const u8 *start_p, *end_p;int i, bsize_max, err =0 ;
@@ -1206,7 +1209,7 @@ static int nft_pipapo_insert(const strucelse end = start; - dup =pipapo_get (net, set, start, genmask); + dup =pipapo_get (net, set, start, genmask, tstamp);if (!IS_ERR (dup)) {/* Check if we already have the same exact entry */ const struct nft_data *dup_key, *dup_end;
@@ -1228,7 +1231,7 @@ static int nft_pipapo_insert(const strucif (PTR_ERR (dup) == -ENOENT ) {/* Look for partially overlapping entries */ - dup =pipapo_get (net, set, end,nft_genmask_next (net)); + dup =pipapo_get (net, set, end,nft_genmask_next (net), tstamp); }if (PTR_ERR (dup) != -ENOENT ) {
@@ -1580,6 +1583,7 @@ static void pipapo_gc(const struct nft_sstruct nft_set *set = (struct nft_set *) _set;struct nft_pipapo *priv =nft_set_priv (set);struct net *net =read_pnet (&set->net); +u64 tstamp =nft_net_tstamp (net);int rules_f0, first_rule =0 ;struct nft_trans_gc *gc;
@@ -1613,7 +1617,7 @@ static void pipapo_gc(const struct nft_s/* synchronous gc never fails, there is no need to set on * NFT_SET_ELEM_DEAD_BIT. */ -if (nft_set_elem_expired (&e->ext)) { +if (__nft_set_elem_expired (&e->ext, tstamp)) { priv->dirty = true; gc =nft_trans_gc_queue_sync (gc,GFP_ATOMIC );
@@ -1772,7 +1776,7 @@ static void *pipapo_deactivate(const str {struct nft_pipapo_elem *e; - e =pipapo_get (net, set, data,nft_genmask_next (net)); + e =pipapo_get (net, set, data,nft_genmask_next (net),nft_net_tstamp (net));if (IS_ERR (e))return NULL ;
net/netfilter/nft_set_rbtree.c +4 -2
@@ -316,6 +316,7 @@ static int __nft_rbtree_insert(const strstruct nft_rbtree *priv =nft_set_priv (set);u8 cur_genmask =nft_genmask_cur (net);u8 genmask =nft_genmask_next (net); +u64 tstamp =nft_net_tstamp (net);int d;/* Descend the tree to search for an existing element greater than the
@@ -363,7 +364,7 @@ static int __nft_rbtree_insert(const str/* perform garbage collection to avoid bogus overlap reports * but skip new elements in this transaction. */ -if (nft_set_elem_expired (&rbe->ext) && +if (__nft_set_elem_expired (&rbe->ext, tstamp) &&nft_set_elem_active (&rbe->ext, cur_genmask)) {const struct nft_rbtree_elem *removed_end;
@@ -550,6 +551,7 @@ static void *nft_rbtree_deactivate(constconst struct rb_node *parent = priv->root.rb_node;struct nft_rbtree_elem *rbe, *this = elem->priv;u8 genmask =nft_genmask_next (net); +u64 tstamp =nft_net_tstamp (net);int d;while (parent !=NULL ) {
@@ -570,7 +572,7 @@ static void *nft_rbtree_deactivate(const nft_rbtree_interval_end(this)) { parent = parent->rb_right;continue ; - } else if (nft_set_elem_expired(&rbe->ext)) { + } else if (__nft_set_elem_expired(&rbe->ext, tstamp)) {break ; } else if (!nft_set_elem_active(&rbe->ext, genmask)) { parent = parent->rb_left;
Greg Kroah-Hartman
maintainerPATCH 341/352 netfilter: nf_tables: allow clone callbacks to sleep
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
commit fa23e0d4b756d25829e124d6b670a4c6bbd4bf7e upstream.
Sven Auhagen reports transaction failures with following error:
./main.nft:13:1-26: Error: Could not process rule: Cannot allocate memory
percpu: allocation failed, size=16 align=8 atomic=1, atomic alloc failed, no space left
This points to failing pcpu allocation with GFP_ATOMIC flag. However, transactions happen from user context and are allowed to sleep.
One case where we can call into percpu allocator with GFP_ATOMIC is nft_counter expression.
Normally this happens from control plane, so this could use GFP_KERNEL instead. But one use case, element insertion from packet path, needs to use GFP_ATOMIC allocations (nft_dynset expression).
At this time, .clone callbacks always use GFP_ATOMIC for this reason.
Add gfp_t argument to the .clone function and pass GFP_KERNEL or GFP_ATOMIC flag depending on context, this allows all clone memory allocations to sleep for the normal (transaction) case.
--- include/net/netfilter/nf_tables.h | 4 ++-- net/netfilter/nf_tables_api.c | 8 ++++---- net/netfilter/nft_connlimit.c | 2 +- net/netfilter/nft_counter.c | 4 ++-- net/netfilter/nft_dynset.c | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-)
include/net/netfilter/nf_tables.h +2 -2
@@ -786,7 +786,7 @@ struct nft_expr_ops {struct nft_regs *regs, const struct nft_pktinfo *pkt);int (*clone)(struct nft_expr *dst, -const struct nft_expr *src); +const struct nft_expr *src,gfp_t gfp);unsigned int size; int (*init)(const struct nft_ctx *ctx,
@@ -837,7 +837,7 @@ static inline void *nft_expr_priv(constreturn (void *)expr->data; } -int nft_expr_clone (struct nft_expr *dst,struct nft_expr *src); +int nft_expr_clone (struct nft_expr *dst,struct nft_expr *src,gfp_t gfp);void nft_expr_destroy (const struct nft_ctx *ctx,struct nft_expr *expr);int nft_expr_dump (struct sk_buff *skb,unsigned int attr,const struct nft_expr *expr);
net/netfilter/nf_tables_api.c +4 -4
@@ -2968,13 +2968,13 @@ err_expr_parse:return ERR_PTR (err); } -int nft_expr_clone (struct nft_expr *dst,struct nft_expr *src) +int nft_expr_clone (struct nft_expr *dst,struct nft_expr *src,gfp_t gfp) {int err;if (src->ops->clone) { dst->ops = src->ops; - err = src->ops->clone (dst, src); + err = src->ops->clone (dst, src, gfp);if (err <0 )return err; }else {
@@ -5524,7 +5524,7 @@ static int nft_set_elem_expr_setup(strucif (expr ==NULL )return 0 ; - err =nft_expr_clone (elem_expr, expr); + err =nft_expr_clone (elem_expr, expr,GFP_KERNEL );if (err <0 )return -ENOMEM ;
@@ -5632,7 +5632,7 @@ static int nft_add_set_elem(struct nft_cif (!expr)return -ENOMEM ; - err =nft_expr_clone (expr, set->expr); + err =nft_expr_clone (expr, set->expr,GFP_KERNEL );if (err <0 ) goto err_set_elem_expr; }
net/netfilter/nft_connlimit.c +1 -1
@@ -195,7 +195,7 @@ static void nft_connlimit_destroy(constnft_connlimit_do_destroy (ctx, priv); } -static int nft_connlimit_clone (struct nft_expr *dst,const struct nft_expr *src) +static int nft_connlimit_clone (struct nft_expr *dst,const struct nft_expr *src,gfp_t gfp) {struct nft_connlimit *priv_dst =nft_expr_priv (dst);struct nft_connlimit *priv_src =nft_expr_priv (src);
net/netfilter/nft_counter.c +2 -2
@@ -224,7 +224,7 @@ static void nft_counter_destroy(const stnft_counter_do_destroy (priv); } -static int nft_counter_clone (struct nft_expr *dst,const struct nft_expr *src) +static int nft_counter_clone (struct nft_expr *dst,const struct nft_expr *src,gfp_t gfp) {struct nft_counter_percpu_priv *priv =nft_expr_priv (src);struct nft_counter_percpu_priv *priv_clone =nft_expr_priv (dst);
@@ -234,7 +234,7 @@ static int nft_counter_clone(struct nft_nft_counter_fetch (priv, &total); - cpu_stats = alloc_percpu_gfp(struct nft_counter, GFP_ATOMIC); + cpu_stats = alloc_percpu_gfp(struct nft_counter, gfp);if (cpu_stats ==NULL )return -ENOMEM ;
net/netfilter/nft_dynset.c +1 -1
@@ -48,7 +48,7 @@ static void *nft_dynset_new(struct nft_s ext =nft_set_elem_ext (set, elem);if (priv->expr !=NULL && -nft_expr_clone (nft_set_ext_expr (ext), priv->expr) <0 ) +nft_expr_clone (nft_set_ext_expr (ext), priv->expr,GFP_ATOMIC ) <0 ) goto err2;return elem;
Greg Kroah-Hartman
maintainerPATCH 342/352 netfilter: nf_tables: prefer nft_chain_validate
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
commit cff3bd012a9512ac5ed858d38e6ed65f6391008c upstream.
nft_chain_validate already performs loop detection because a cycle will result in a call stack overflow (ctx->level >= NFT_JUMP_STACK_SIZE).
It also follows maps via ->validate callback in nft_lookup, so there appears no reason to iterate the maps again.
nf_tables_check_loops() and all its helper functions can be removed. This improves ruleset load time significantly, from 23s down to 12s.
This also fixes a crash bug. Old loop detection code can result in unbounded recursion:
BUG: TASK stack guard page was hit at .... Oops: stack guard page: 0000 [#1] PREEMPT SMP KASAN CPU: 4 PID: 1539 Comm: nft Not tainted 6.10.0-rc5+ #1
[..]
with a suitable ruleset during validation of register stores.
I can't see any actual reason to attempt to check for this from nft_validate_register_store(), at this point the transaction is still in progress, so we don't have a full picture of the rule graph.
For nf-next it might make sense to either remove it or make this depend on table->validate_state in case we could catch an error earlier (for improved error reporting to userspace).
--- net/netfilter/nf_tables_api.c | 127 ++++-------------------------------------- 1 file changed, 13 insertions(+), 114 deletions(-)
net/netfilter/nf_tables_api.c +13 -114
@@ -3349,6 +3349,15 @@ static void nf_tables_rule_release(constnf_tables_rule_destroy (ctx, rule); } +/** nft_chain_validate - loop detection and hook validation +* +* @ctx: context containing call depth and base chain +* @chain: chain to validate +* +* Walk through the rules of the given chain and chase all jumps/gotos +* and set lookups until either the jump limit is hit or all reachable +* chains have been validated. +*/ int nft_chain_validate (const struct nft_ctx *ctx,const struct nft_chain *chain) {struct nft_expr *expr, *last;
@@ -3367,6 +3376,9 @@ int nft_chain_validate(const struct nft_if (!expr->ops->validate)continue ; +/* This may call nft_chain_validate() recursively, +* callers that do so must increment ctx->level. +*/ err = expr->ops->validate (ctx, expr, &data);if (err <0 )return err;
@@ -9087,119 +9099,6 @@ int nft_chain_validate_hooks(const struc }EXPORT_SYMBOL_GPL (nft_chain_validate_hooks); -/* -* Loop detection - walk through the ruleset beginning at the destination chain -* of a new jump until either the source chain is reached (loop) or all -* reachable chains have been traversed. -* -* The loop check is performed whenever a new jump verdict is added to an -* expression or verdict map or a verdict map is bound to a new chain. -*/ - -static int nf_tables_check_loops (const struct nft_ctx *ctx, -const struct nft_chain *chain); - -static int nft_check_loops (const struct nft_ctx *ctx, -const struct nft_set_ext *ext) -{ -const struct nft_data *data; -int ret; - - data =nft_set_ext_data (ext); -switch (data->verdict.code) { -case NFT_JUMP : -case NFT_GOTO : - ret =nf_tables_check_loops (ctx, data->verdict.chain); -break ; -default : - ret =0 ; -break ; - } - -return ret; -} - -static int nf_tables_loop_check_setelem (const struct nft_ctx *ctx, -struct nft_set *set, -const struct nft_set_iter *iter, -struct nft_set_elem *elem) -{ -const struct nft_set_ext *ext =nft_set_elem_ext (set, elem->priv); - -if (nft_set_ext_exists (ext,NFT_SET_EXT_FLAGS ) && - *nft_set_ext_flags (ext) &NFT_SET_ELEM_INTERVAL_END ) -return 0 ; - -return nft_check_loops (ctx, ext); -} - -static int nf_tables_check_loops (const struct nft_ctx *ctx, -const struct nft_chain *chain) -{ -const struct nft_rule *rule; -const struct nft_expr *expr, *last; -struct nft_set *set; -struct nft_set_binding *binding; -struct nft_set_iter iter; - -if (ctx->chain == chain) -return -ELOOP ; - -list_for_each_entry (rule, &chain->rules, list) { -nft_rule_for_each_expr (expr, last, rule) { -struct nft_immediate_expr *priv; -const struct nft_data *data; -int err; - -if (strcmp (expr->ops->type->name,"immediate" )) -continue ; - - priv =nft_expr_priv (expr); -if (priv->dreg !=NFT_REG_VERDICT ) -continue ; - - data = &priv->data; -switch (data->verdict.code) { -case NFT_JUMP : -case NFT_GOTO : - err =nf_tables_check_loops (ctx, - data->verdict.chain); -if (err <0 ) -return err; -break ; -default : -break ; - } - } - } - -list_for_each_entry (set, &ctx->table->sets, list) { -if (!nft_is_active_next (ctx->net, set)) -continue ; -if (!(set->flags &NFT_SET_MAP ) || - set->dtype !=NFT_DATA_VERDICT ) -continue ; - -list_for_each_entry (binding, &set->bindings, list) { -if (!(binding->flags &NFT_SET_MAP ) || - binding->chain != chain) -continue ; - - iter.genmask =nft_genmask_next (ctx->net); - iter.skip =0 ; - iter.count =0 ; - iter.err =0 ; - iter.fn = nf_tables_loop_check_setelem; - - set->ops->walk (ctx, set, &iter); -if (iter.err <0 ) -return iter.err; - } - } - -return 0 ; -} -/** * nft_parse_u32_check - fetch u32 attribute and check for maximum value *
@@ -9335,7 +9234,7 @@ static int nft_validate_register_store(cif (data !=NULL && (data->verdict.code ==NFT_GOTO || data->verdict.code ==NFT_JUMP )) { - err =nf_tables_check_loops (ctx, data->verdict.chain); + err =nft_chain_validate (ctx, data->verdict.chain);if (err <0 )return err; }
Greg Kroah-Hartman
maintainerPATCH 343/352 drm/i915/gem: Fix Virtual Memory mapping boundaries calculation
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andi Shyti <[email protected]>
commit 8bdd9ef7e9b1b2a73e394712b72b22055e0e26c3 upstream.
Calculating the size of the mapped area as the lesser value between the requested size and the actual size does not consider the partial mapping offset. This can cause page fault access.
Fix the calculation of the starting and ending addresses, the total size is now deduced from the difference between the end and start addresses.
Additionally, the calculations have been rewritten in a clearer and more understandable form.
Requires: 60a2066c5005 ("drm/i915/gem: Adjust vma offset for framebuffer mmap offset")
--- drivers/gpu/drm/i915/gem/i915_gem_mman.c | 53 +++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 6 deletions(-)
drivers/gpu/drm/i915/gem/i915_gem_mman.c +47 -6
@@ -273,6 +273,41 @@ out:return i915_error_to_vmf_fault (err); } +static void set_address_limits (struct vm_area_struct *area, +struct i915_vma *vma, +unsigned long obj_offset, +unsigned long *start_vaddr, +unsigned long *end_vaddr) +{ +unsigned long vm_start, vm_end, vma_size;/* user's memory parameters */ +long start, end;/* memory boundaries */ + +/* +* Let's move into the ">> PAGE_SHIFT" +* domain to be sure not to lose bits +*/ + vm_start = area->vm_start >>PAGE_SHIFT ; + vm_end = area->vm_end >>PAGE_SHIFT ; + vma_size = vma->size >>PAGE_SHIFT ; + +/* +* Calculate the memory boundaries by considering the offset +* provided by the user during memory mapping and the offset +* provided for the partial mapping. +*/ + start = vm_start; + start -= obj_offset; + start += vma->ggtt_view.partial.offset; + end = start + vma_size; + + start =max_t (long, start, vm_start); + end =min_t (long, end, vm_end); + +/* Let's move back into the "<< PAGE_SHIFT" domain */ + *start_vaddr = (unsigned long )start <<PAGE_SHIFT ; + *end_vaddr = (unsigned long )end <<PAGE_SHIFT ; +} +static vm_fault_t vm_fault_gtt (struct vm_fault *vmf) {#define MIN_CHUNK_PAGES (SZ_1M >> PAGE_SHIFT)
@@ -285,14 +320,18 @@ static vm_fault_t vm_fault_gtt(struct vmstruct i915_ggtt *ggtt = &i915->ggtt;bool write = area->vm_flags &VM_WRITE ;struct i915_gem_ww_ctx ww; +unsigned long obj_offset; +unsigned long start, end;/* memory boundaries */ intel_wakeref_t wakeref;struct i915_vma *vma;pgoff_t page_offset; +unsigned long pfn;int srcu;int ret; -/* We don't use vmf->pgoff since that has the fake offset */ + obj_offset = area->vm_pgoff -drm_vma_node_start (&mmo->vma_node); page_offset = (vmf->address - area->vm_start) >>PAGE_SHIFT ; + page_offset += obj_offset;trace_i915_gem_object_fault (obj, page_offset, true, write);
@@ -363,12 +402,14 @@ retry:if (ret) goto err_unpin; +set_address_limits (area, vma, obj_offset, &start, &end); + + pfn = (ggtt->gmadr.start +i915_ggtt_offset (vma)) >>PAGE_SHIFT ; + pfn += (start - area->vm_start) >>PAGE_SHIFT ; + pfn += obj_offset - vma->ggtt_view.partial.offset; +/* Finally, remap it using the new GTT offset */ - ret =remap_io_mapping (area, - area->vm_start + (vma->ggtt_view.partial.offset <<PAGE_SHIFT ), - (ggtt->gmadr.start + vma->node.start) >>PAGE_SHIFT , -min_t (u64, vma->size, area->vm_end - area->vm_start), - &ggtt->iomap); + ret =remap_io_mapping (area, start, pfn, end - start, &ggtt->iomap);if (ret) goto err_fence;
Greg Kroah-Hartman
maintainerPATCH 344/352 powerpc: Avoid nmi_enter/nmi_exit in real mode interrupt.
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mahesh Salgaonkar <[email protected]>
commit 0db880fc865ffb522141ced4bfa66c12ab1fbb70 upstream.
nmi_enter()/nmi_exit() touches per cpu variables which can lead to kernel crash when invoked during real mode interrupt handling (e.g. early HMI/MCE interrupt handler) if percpu allocation comes from vmalloc area.
Early HMI/MCE handlers are called through DEFINE_INTERRUPT_HANDLER_NMI() wrapper which invokes nmi_enter/nmi_exit calls. We don't see any issue when percpu allocation is from the embedded first chunk. However with CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK enabled there are chances where percpu allocation can come from the vmalloc area.
With kernel command line "percpu_alloc=page" we can force percpu allocation to come from vmalloc area and can see kernel crash in machine_check_early:
[ 1.215714] NIP [c000000000e49eb4] rcu_nmi_enter+0x24/0x110 [ 1.215717] LR [c0000000000461a0] machine_check_early+0xf0/0x2c0 [ 1.215719] --- interrupt: 200 [ 1.215720] [c000000fffd73180] [0000000000000000] 0x0 (unreliable) [ 1.215722] [c000000fffd731b0] [0000000000000000] 0x0 [ 1.215724] [c000000fffd73210] [c000000000008364] machine_check_early_common+0x134/0x1f8
Fix this by avoiding use of nmi_enter()/nmi_exit() in real mode if percpu first chunk is not embedded.
[ Conflicts in arch/powerpc/include/asm/interrupt.h
because machine_check_early() and machine_check_exception() has been refactored. ]
--- arch/powerpc/include/asm/percpu.h | 10 ++++++++++ arch/powerpc/kernel/mce.c | 14 +++++++++++--- arch/powerpc/kernel/setup_64.c | 2 ++ arch/powerpc/kernel/traps.c | 8 +++++++- 4 files changed, 30 insertions(+), 4 deletions(-)
arch/powerpc/include/asm/percpu.h +10 -0
@@ -15,6 +15,16 @@#endif /* CONFIG_SMP */ #endif /* __powerpc64__ */ +#if defined(CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK ) && defined(CONFIG_SMP ) +#include <linux/jump_label.h> +DECLARE_STATIC_KEY_FALSE (__percpu_first_chunk_is_paged); + +#define percpu_first_chunk_is_paged \ + (static_key_enabled(&__percpu_first_chunk_is_paged.key)) +#else +#define percpu_first_chunk_is_paged false +#endif /* CONFIG_PPC64 && CONFIG_SMP */ +#include <asm-generic/percpu.h> #include <asm/paca.h>
arch/powerpc/kernel/mce.c +11 -3
@@ -594,8 +594,15 @@ long notrace machine_check_early(structu8 ftrace_enabled =this_cpu_get_ftrace_enabled ();this_cpu_set_ftrace_enabled (0 ); -/* Do not use nmi_enter/exit for pseries hpte guest */ -if (radix_enabled () || !firmware_has_feature (FW_FEATURE_LPAR )) +/* +* Do not use nmi_enter/exit for pseries hpte guest +* +* Likewise, do not use it in real mode if percpu first chunk is not +* embedded. With CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK enabled there +* are chances where percpu allocation can come from vmalloc area. +*/ +if ((radix_enabled () || !firmware_has_feature (FW_FEATURE_LPAR )) && + !percpu_first_chunk_is_paged)nmi_enter ();hv_nmi_check_nonrecoverable (regs);
@@ -606,7 +613,8 @@ long notrace machine_check_early(structif (ppc_md.machine_check_early) handled = ppc_md.machine_check_early (regs); -if (radix_enabled () || !firmware_has_feature (FW_FEATURE_LPAR )) +if ((radix_enabled () || !firmware_has_feature (FW_FEATURE_LPAR )) && + !percpu_first_chunk_is_paged)nmi_exit ();this_cpu_set_ftrace_enabled (ftrace_enabled);
arch/powerpc/kernel/setup_64.c +2 -0
@@ -824,6 +824,7 @@ static int pcpu_cpu_distance(unsigned inunsigned long __per_cpu_offset[NR_CPUS ]__read_mostly ;EXPORT_SYMBOL (__per_cpu_offset); +DEFINE_STATIC_KEY_FALSE (__percpu_first_chunk_is_paged);static void __init pcpu_populate_pte (unsigned long addr) {
@@ -903,6 +904,7 @@ void __init setup_per_cpu_areas(void)if (rc <0 )panic ("cannot initialize percpu area (err=%d)" , rc); +static_key_enable (&__percpu_first_chunk_is_paged.key); delta = (unsigned long )pcpu_base_addr - (unsigned long )__per_cpu_start;for_each_possible_cpu (cpu) { __per_cpu_offset[cpu] = delta + pcpu_unit_offsets[cpu];
arch/powerpc/kernel/traps.c +7 -1
@@ -835,8 +835,14 @@ void machine_check_exception(struct pt_r* This is silly. The BOOK3S_64 should just call a different function * rather than expecting semantics to magically change. Something * like 'non_nmi_machine_check_exception()', perhaps? +* +* Do not use nmi_enter/exit in real mode if percpu first chunk is +* not embedded. With CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK enabled +* there are chances where percpu allocation can come from +* vmalloc area. */ -const bool nmi = !IS_ENABLED (CONFIG_PPC_BOOK3S_64 ); +const bool nmi = !IS_ENABLED (CONFIG_PPC_BOOK3S_64 ) && + !percpu_first_chunk_is_paged;if (nmi)nmi_enter ();
Greg Kroah-Hartman
maintainerPATCH 345/352 arm64: cpufeature: Fix the visibility of compat hwcaps
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amit Daniel Kachhap <[email protected]>
commit 85f1506337f0c79a4955edfeee86a18628e3735f upstream.
Commit 237405ebef58 ("arm64: cpufeature: Force HWCAP to be based on the sysreg visible to user-space") forced the hwcaps to use sanitised user-space view of the id registers. However, the ID register structures used to select few compat cpufeatures (vfp, crc32, ...) are masked and hence such hwcaps do not appear in /proc/cpuinfo anymore for PER_LINUX32 personality.
Add the ID register structures explicitly and set the relevant entry as visible. As these ID registers are now of type visible so make them available in 64-bit userspace by making necessary changes in register emulation logic and documentation.
While at it, update the comment for structure ftr_generic_32bits[] which lists the ID register that use it.
--- Documentation/arm64/cpu-feature-registers.rst | 38 ++++++++++++++++++++++- arch/arm64/kernel/cpufeature.c | 42 ++++++++++++++++++++------ 2 files changed, 70 insertions(+), 10 deletions(-)
Documentation/arm64/cpu-feature-registers.rst +37 -1
@@ -92,7 +92,7 @@ operation if the source belongs to the s The infrastructure emulates only the following system register space:: - Op0=3, Op1=0, CRn=0, CRm=0,4,5,6,7 + Op0=3, Op1=0, CRn=0, CRm=0,2,3,4,5,6,7 (See Table C5-6 'System instruction encodings for non-Debug System register accesses' in ARMv8 ARM DDI 0487A.h, for the list of
@@ -291,6 +291,42 @@ infrastructure: | RPRES | [7-4] | y | +------------------------------+---------+---------+ + 10) MVFR0_EL1 - AArch32 Media and VFP Feature Register 0 + + +------------------------------+---------+---------+ + | Name | bits | visible | + +------------------------------+---------+---------+ + | FPDP | [11-8] | y | + +------------------------------+---------+---------+ + + 11) MVFR1_EL1 - AArch32 Media and VFP Feature Register 1 + + +------------------------------+---------+---------+ + | Name | bits | visible | + +------------------------------+---------+---------+ + | SIMDFMAC | [31-28] | y | + +------------------------------+---------+---------+ + | SIMDSP | [19-16] | y | + +------------------------------+---------+---------+ + | SIMDInt | [15-12] | y | + +------------------------------+---------+---------+ + | SIMDLS | [11-8] | y | + +------------------------------+---------+---------+ + + 12) ID_ISAR5_EL1 - AArch32 Instruction Set Attribute Register 5 + + +------------------------------+---------+---------+ + | Name | bits | visible | + +------------------------------+---------+---------+ + | CRC32 | [19-16] | y | + +------------------------------+---------+---------+ + | SHA2 | [15-12] | y | + +------------------------------+---------+---------+ + | SHA1 | [11-8] | y | + +------------------------------+---------+---------+ + | AES | [7-4] | y | + +------------------------------+---------+---------+ + Appendix I: Example -------------------
arch/arm64/kernel/cpufeature.c +33 -9
78 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 346/352 media: uvcvideo: Use entity get_cur in uvc_ctrl_set
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yunke Cao <[email protected]>
commit 5f36851c36b30f713f588ed2b60aa7b4512e2c76 upstream.
Entity controls should get_cur using an entity-defined function instead of via a query. Fix this in uvc_ctrl_set.
--- drivers/media/usb/uvc/uvc_ctrl.c | 83 +++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 37 deletions(-)
drivers/media/usb/uvc/uvc_ctrl.c +46 -37
@@ -992,36 +992,56 @@ static s32 __uvc_ctrl_get_value(struct ureturn value; } -static int __uvc_ctrl_get (struct uvc_video_chain *chain, -struct uvc_control *ctrl,struct uvc_control_mapping *mapping, -s32 *value) +static int __uvc_ctrl_load_cur (struct uvc_video_chain *chain, +struct uvc_control *ctrl) { +u8 *data;int ret; -if ((ctrl->info.flags &UVC_CTRL_FLAG_GET_CUR ) ==0 ) -return -EACCES ; +if (ctrl->loaded) +return 0 ; -if (!ctrl->loaded) { -if (ctrl->entity->get_cur) { - ret = ctrl->entity->get_cur (chain->dev, - ctrl->entity, - ctrl->info.selector, -uvc_ctrl_data (ctrl,UVC_CTRL_DATA_CURRENT ), - ctrl->info.size); - }else { - ret =uvc_query_ctrl (chain->dev,UVC_GET_CUR , - ctrl->entity->id, - chain->dev->intfnum, - ctrl->info.selector, -uvc_ctrl_data (ctrl,UVC_CTRL_DATA_CURRENT ), - ctrl->info.size); - } -if (ret <0 ) -return ret; + data =uvc_ctrl_data (ctrl,UVC_CTRL_DATA_CURRENT ); +if ((ctrl->info.flags &UVC_CTRL_FLAG_GET_CUR ) ==0 ) { +memset (data,0 , ctrl->info.size); ctrl->loaded =1 ; + +return 0 ; } +if (ctrl->entity->get_cur) + ret = ctrl->entity->get_cur (chain->dev, ctrl->entity, + ctrl->info.selector, data, + ctrl->info.size); +else + ret =uvc_query_ctrl (chain->dev,UVC_GET_CUR , + ctrl->entity->id, chain->dev->intfnum, + ctrl->info.selector, data, + ctrl->info.size); + +if (ret <0 ) +return ret; + + ctrl->loaded =1 ; + +return ret; +} + +static int __uvc_ctrl_get (struct uvc_video_chain *chain, +struct uvc_control *ctrl, +struct uvc_control_mapping *mapping, +s32 *value) +{ +int ret; + +if ((ctrl->info.flags &UVC_CTRL_FLAG_GET_CUR ) ==0 ) +return -EACCES ; + + ret =__uvc_ctrl_load_cur (chain, ctrl); +if (ret <0 ) +return ret; + *value =__uvc_ctrl_get_value (mapping,uvc_ctrl_data (ctrl,UVC_CTRL_DATA_CURRENT ));
@@ -1675,21 +1695,10 @@ int uvc_ctrl_set(struct uvc_fh *handle,* needs to be loaded from the device to perform the read-modify-write * operation. */ -if (!ctrl->loaded && (ctrl->info.size *8 ) != mapping->size) { -if ((ctrl->info.flags &UVC_CTRL_FLAG_GET_CUR ) ==0 ) { -memset (uvc_ctrl_data (ctrl,UVC_CTRL_DATA_CURRENT ), -0 , ctrl->info.size); - }else { - ret =uvc_query_ctrl (chain->dev,UVC_GET_CUR , - ctrl->entity->id, chain->dev->intfnum, - ctrl->info.selector, -uvc_ctrl_data (ctrl,UVC_CTRL_DATA_CURRENT ), - ctrl->info.size); -if (ret <0 ) -return ret; - } - - ctrl->loaded =1 ; +if ((ctrl->info.size *8 ) != mapping->size) { + ret =__uvc_ctrl_load_cur (chain, ctrl); +if (ret <0 ) +return ret; }/* Backup the current value in case we need to rollback later. */
Greg Kroah-Hartman
maintainerPATCH 347/352 exec: Fix ToCToU between perm check and set-uid/gid usage
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
commit f50733b45d865f91db90919f8311e2127ce5a0cb upstream.
When opening a file for exec via do_filp_open(), permission checking is done against the file's metadata at that moment, and on success, a file pointer is passed back. Much later in the execve() code path, the file metadata (specifically mode, uid, and gid) is used to determine if/how to set the uid and gid. However, those values may have changed since the permissions check, meaning the execution may gain unintended privileges.
For example, if a file could change permissions from executable and not set-id:
---------x 1 root root 16048 Aug 7 13:16 target
to set-id and non-executable:
---S------ 1 root root 16048 Aug 7 13:16 target
it is possible to gain root privileges when execution should have been disallowed.
While this race condition is rare in real-world scenarios, it has been observed (and proven exploitable) when package managers are updating the setuid bits of installed programs. Such files start with being world-executable but then are adjusted to be group-exec with a set-uid bit. For example, "chmod o-x,u+s target" makes "target" executable only by uid "root" and gid "cdrom", while also becoming setuid-root:
-rwxr-xr-x 1 root cdrom 16048 Aug 7 13:16 target
becomes:
-rwsr-xr-- 1 root cdrom 16048 Aug 7 13:16 target
But racing the chmod means users without group "cdrom" membership can get the permission to execute "target" just before the chmod, and when the chmod finishes, the exec reaches brpm_fill_uid(), and performs the setuid to root, violating the expressed authorization of "only cdrom group members can setuid to root".
Re-check that we still have execute permissions in case the metadata has changed. It would be better to keep a copy from the perm-check time, but until we can do that refactoring, the least-bad option is to do a full inode_permission() call (under inode lock). It is understood that this is safe against dead-locks, but hardly optimal.
--- fs/exec.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
fs/exec.c +7 -1
@@ -1588,6 +1588,7 @@ static void bprm_fill_uid(struct linux_bunsigned int mode;kuid_t uid;kgid_t gid; +int err;if (!mnt_may_suid (file->f_path.mnt))return ;
@@ -1603,12 +1604,17 @@ static void bprm_fill_uid(struct linux_b/* Be careful if suid/sgid is set */ inode_lock (inode); -/* reload atomically mode/uid/gid now that lock held */ +/* Atomically reload and check mode/uid/gid now that lock held. */ mode = inode->i_mode; uid = inode->i_uid; gid = inode->i_gid; + err =inode_permission (inode,MAY_EXEC );inode_unlock (inode); +/* Did the exec bit vanish out from under us? Give up. */ +if (err) +return ; +/* We ignore suid/sgid if there are no mappings for them in the ns */ if (!kuid_has_mapping (bprm->cred->user_ns, uid) || !kgid_has_mapping (bprm->cred->user_ns, gid))
Greg Kroah-Hartman
maintainerPATCH 348/352 nvme/pci: Add APST quirk for Lenovo N60z laptop
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: WangYuli <[email protected]>
commit ab091ec536cb7b271983c0c063b17f62f3591583 upstream.
There is a hardware power-saving problem with the Lenovo N60z board. When turn it on and leave it for 10 hours, there is a 20% chance that a nvme disk will not wake up until reboot.
--- drivers/nvme/host/pci.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/nvme/host/pci.c +7 -0
@@ -2846,6 +2846,13 @@ static unsigned long check_vendor_combinreturn NVME_QUIRK_SIMPLE_SUSPEND ; } +/* +* NVMe SSD drops off the PCIe bus after system idle +* for 10 hours on a Lenovo N60z board. +*/ +if (dmi_match (DMI_BOARD_NAME ,"LXKT-ZXEG-N6" )) +return NVME_QUIRK_NO_APST ; +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 349/352 vdpa: Make use of PFN_PHYS/PFN_UP/PFN_DOWN helper macro
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cai Huoqing <[email protected]>
[ Upstream commit 729ce5a5bd6fda5eb2322a39db2287f1f26f92f3 ]
it's a nice refactor to make use of
PFN_PHYS/PFN_UP/PFN_DOWN helper macro
Stable-dep-of: 0823dc64586b ("vhost-vdpa: switch to use vmf_insert_pfn() in the fault handler")
--- drivers/vhost/vdpa.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/vhost/vdpa.c +12 -12
@@ -519,15 +519,15 @@ static void vhost_vdpa_iotlb_unmap(struct vhost_vdpa *v, u64 start, u64 last)unsigned long pfn, pinned;while ((map =vhost_iotlb_itree_first (iotlb, start, last)) !=NULL ) { - pinned = map->size >>PAGE_SHIFT ; -for (pfn = map->addr >>PAGE_SHIFT ; + pinned =PFN_DOWN (map->size); +for (pfn =PFN_DOWN (map->addr); pinned >0 ; pfn++, pinned--) { page =pfn_to_page (pfn);if (map->perm &VHOST_ACCESS_WO )set_page_dirty_lock (page);unpin_user_page (page); } -atomic64_sub (map->size >>PAGE_SHIFT , &dev->mm->pinned_vm); +atomic64_sub (PFN_DOWN (map->size), &dev->mm->pinned_vm);vhost_iotlb_map_free (iotlb, map); } }
@@ -589,7 +589,7 @@ static int vhost_vdpa_map(struct vhost_vdpa *v,if (r)vhost_iotlb_del_range (dev->iotlb, iova, iova + size -1 );else -atomic64_add (size >>PAGE_SHIFT , &dev->mm->pinned_vm); +atomic64_add (PFN_DOWN (size), &dev->mm->pinned_vm);return r; }
@@ -643,7 +643,7 @@ static int vhost_vdpa_process_iotlb_update(struct vhost_vdpa *v,if (msg->perm &VHOST_ACCESS_WO ) gup_flags |=FOLL_WRITE ; - npages =PAGE_ALIGN (msg->size + (iova & ~PAGE_MASK )) >>PAGE_SHIFT ; + npages =PFN_UP (msg->size + (iova & ~PAGE_MASK ));if (!npages) { ret = -EINVAL ; goto free;
@@ -651,7 +651,7 @@ static int vhost_vdpa_process_iotlb_update(struct vhost_vdpa *v,mmap_read_lock (dev->mm); - lock_limit =rlimit (RLIMIT_MEMLOCK ) >>PAGE_SHIFT ; + lock_limit =PFN_DOWN (rlimit (RLIMIT_MEMLOCK ));if (npages +atomic64_read (&dev->mm->pinned_vm) > lock_limit) { ret = -ENOMEM ; goto unlock;
@@ -685,9 +685,9 @@ static int vhost_vdpa_process_iotlb_update(struct vhost_vdpa *v,if (last_pfn && (this_pfn != last_pfn +1 )) {/* Pin a contiguous chunk of memory */ - csize = (last_pfn - map_pfn +1 ) <<PAGE_SHIFT ; + csize =PFN_PHYS (last_pfn - map_pfn +1 ); ret =vhost_vdpa_map (v, iova, csize, - map_pfn <<PAGE_SHIFT , +PFN_PHYS (map_pfn), msg->perm);if (ret) {/*
@@ -711,13 +711,13 @@ static int vhost_vdpa_process_iotlb_update(struct vhost_vdpa *v, last_pfn = this_pfn; } - cur_base += pinned <<PAGE_SHIFT ; + cur_base +=PFN_PHYS (pinned); npages -= pinned; }/* Pin the rest chunk */ - ret =vhost_vdpa_map (v, iova, (last_pfn - map_pfn +1 ) <<PAGE_SHIFT , - map_pfn <<PAGE_SHIFT , msg->perm); + ret =vhost_vdpa_map (v, iova,PFN_PHYS (last_pfn - map_pfn +1 ), +PFN_PHYS (map_pfn), msg->perm); out:if (ret) {if (nchunks) {
@@ -961,7 +961,7 @@ static vm_fault_t vhost_vdpa_fault(struct vm_fault *vmf) vma->vm_page_prot =pgprot_noncached (vma->vm_page_prot);if (remap_pfn_range (vma, vmf->address &PAGE_MASK , - notify.addr >>PAGE_SHIFT ,PAGE_SIZE , +PFN_DOWN (notify.addr),PAGE_SIZE , vma->vm_page_prot))return VM_FAULT_SIGBUS ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 350/352 vhost-vdpa: switch to use vmf_insert_pfn() in the fault handler
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Wang <[email protected]>
[ Upstream commit 0823dc64586ba5ea13a7d200a5d33e4c5fa45950 ]
remap_pfn_page() should not be called in the fault handler as it may change the vma->flags which may trigger lockdep warning since the vma write lock is not held. Actually there's no need to modify the vma->flags as it has been set in the mmap(). So this patch switches to use vmf_insert_pfn() instead.
Message-Id: <[email protected]>
--- drivers/vhost/vdpa.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
drivers/vhost/vdpa.c +1 -7
@@ -959,13 +959,7 @@ static vm_fault_t vhost_vdpa_fault(struct vm_fault *vmf) notify = ops->get_vq_notification (vdpa, index); - vma->vm_page_prot =pgprot_noncached (vma->vm_page_prot); -if (remap_pfn_range (vma, vmf->address &PAGE_MASK , -PFN_DOWN (notify.addr),PAGE_SIZE , - vma->vm_page_prot)) -return VM_FAULT_SIGBUS ; - -return VM_FAULT_NOPAGE ; +return vmf_insert_pfn (vma, vmf->address &PAGE_MASK ,PFN_DOWN (notify.addr)); }static const struct vm_operations_struct vhost_vdpa_vm_ops = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 351/352 wifi: cfg80211: restrict NL80211_ATTR_TXQ_QUANTUM values
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit d1cba2ea8121e7fdbe1328cea782876b1dd80993 ]
syzbot is able to trigger softlockups, setting NL80211_ATTR_TXQ_QUANTUM to 2^31.
We had a similar issue in sch_fq, fixed with commit d9e15a273306 ("pkt_sched: fq: do not accept silly TCA_FQ_QUANTUM")
watchdog: BUG: soft lockup - CPU#1 stuck for 26s! [kworker/1:0:24] Modules linked in: irq event stamp: 131135 hardirqs last enabled at (131134): [<ffff80008ae8778c>] __exit_to_kernel_mode arch/arm64/kernel/entry-common.c:85 [inline] hardirqs last enabled at (131134): [<ffff80008ae8778c>] exit_to_kernel_mode+0xdc/0x10c arch/arm64/kernel/entry-common.c:95 hardirqs last disabled at (131135): [<ffff80008ae85378>] __el1_irq arch/arm64/kernel/entry-common.c:533 [inline] hardirqs last disabled at (131135): [<ffff80008ae85378>] el1_interrupt+0x24/0x68 arch/arm64/kernel/entry-common.c:551 softirqs last enabled at (125892): [<ffff80008907e82c>] neigh_hh_init net/core/neighbour.c:1538 [inline] softirqs last enabled at (125892): [<ffff80008907e82c>] neigh_resolve_output+0x268/0x658 net/core/neighbour.c:1553 softirqs last disabled at (125896): [<ffff80008904166c>] local_bh_disable+0x10/0x34 include/linux/bottom_half.h:19 CPU: 1 PID: 24 Comm: kworker/1:0 Not tainted 6.9.0-rc7-syzkaller-gfda5695d692c #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/27/2024 Workqueue: mld mld_ifc_work pstate: 80400005 (Nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : __list_del include/linux/list.h:195 [inline] pc : __list_del_entry include/linux/list.h:218 [inline] pc : list_move_tail include/linux/list.h:310 [inline] pc : fq_tin_dequeue include/net/fq_impl.h:112 [inline] pc : ieee80211_tx_dequeue+0x6b8/0x3b4c net/mac80211/tx.c:3854 lr : __list_del_entry include/linux/list.h:218 [inline] lr : list_move_tail include/linux/list.h:310 [inline] lr : fq_tin_dequeue include/net/fq_impl.h:112 [inline] lr : ieee80211_tx_dequeue+0x67c/0x3b4c net/mac80211/tx.c:3854
sp : ffff800093d36700
x29: ffff800093d36a60 x28: ffff800093d36960 x27: dfff800000000000
x26: ffff0000d800ad50 x25: ffff0000d800abe0 x24: ffff0000d800abf0
x23: ffff0000e0032468 x22: ffff0000e00324d4 x21: ffff0000d800abf0
x20: ffff0000d800abf8 x19: ffff0000d800abf0 x18: ffff800093d363c0
x17: 000000000000d476 x16: ffff8000805519dc x15: ffff7000127a6cc8
x14: 1ffff000127a6cc8 x13: 0000000000000004 x12: ffffffffffffffff
x11: ffff7000127a6cc8 x10: 0000000000ff0100 x9 : 0000000000000000 x8 : 0000000000000000 x7 : 0000000000000000 x6 : 0000000000000000 x5 : ffff80009287aa08 x4 : 0000000000000008 x3 : ffff80008034c7fc x2 : ffff0000e0032468 x1 : 00000000da0e46b8 x0 : ffff0000e0032470
Call trace: __list_del include/linux/list.h:195 [inline] __list_del_entry include/linux/list.h:218 [inline] list_move_tail include/linux/list.h:310 [inline] fq_tin_dequeue include/net/fq_impl.h:112 [inline] ieee80211_tx_dequeue+0x6b8/0x3b4c net/mac80211/tx.c:3854 wake_tx_push_queue net/mac80211/util.c:294 [inline] ieee80211_handle_wake_tx_queue+0x118/0x274 net/mac80211/util.c:315 drv_wake_tx_queue net/mac80211/driver-ops.h:1350 [inline] schedule_and_wake_txq net/mac80211/driver-ops.h:1357 [inline] ieee80211_queue_skb+0x18e8/0x2244 net/mac80211/tx.c:1664 ieee80211_tx+0x260/0x400 net/mac80211/tx.c:1966 ieee80211_xmit+0x278/0x354 net/mac80211/tx.c:2062 __ieee80211_subif_start_xmit+0xab8/0x122c net/mac80211/tx.c:4338 ieee80211_subif_start_xmit+0xe0/0x438 net/mac80211/tx.c:4532 __netdev_start_xmit include/linux/netdevice.h:4903 [inline] netdev_start_xmit include/linux/netdevice.h:4917 [inline] xmit_one net/core/dev.c:3531 [inline] dev_hard_start_xmit+0x27c/0x938 net/core/dev.c:3547 __dev_queue_xmit+0x1678/0x33fc net/core/dev.c:4341 dev_queue_xmit include/linux/netdevice.h:3091 [inline] neigh_resolve_output+0x558/0x658 net/core/neighbour.c:1563 neigh_output include/net/neighbour.h:542 [inline] ip6_finish_output2+0x104c/0x1ee8 net/ipv6/ip6_output.c:137 ip6_finish_output+0x428/0x7a0 net/ipv6/ip6_output.c:222 NF_HOOK_COND include/linux/netfilter.h:303 [inline] ip6_output+0x270/0x594 net/ipv6/ip6_output.c:243 dst_output include/net/dst.h:450 [inline] NF_HOOK+0x160/0x4f0 include/linux/netfilter.h:314 mld_sendpack+0x7b4/0x10f4 net/ipv6/mcast.c:1818 mld_send_cr net/ipv6/mcast.c:2119 [inline] mld_ifc_work+0x840/0xd0c net/ipv6/mcast.c:2650 process_one_work+0x7b8/0x15d4 kernel/workqueue.c:3267 process_scheduled_works kernel/workqueue.c:3348 [inline] worker_thread+0x938/0xef4 kernel/workqueue.c:3429 kthread+0x288/0x310 kernel/kthread.c:388 ret_from_fork+0x10/0x20 arch/arm64/kernel/entry.S:860
--- net/wireless/nl80211.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/wireless/nl80211.c +5 -1
@@ -403,6 +403,10 @@ nl80211_unsol_bcast_probe_resp_policy[NL .len = IEEE80211_MAX_DATA_LEN } }; +static struct netlink_range_validation q_range = { + .max =INT_MAX , +}; +static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR ] = { [0 ] = { .strict_start_type =NL80211_ATTR_HE_OBSS_PD }, [NL80211_ATTR_WIPHY ] = { .type =NLA_U32 },
@@ -685,7 +689,7 @@ static const struct nla_policy nl80211_p [NL80211_ATTR_TXQ_LIMIT] = { .type = NLA_U32 }, [NL80211_ATTR_TXQ_MEMORY_LIMIT] = { .type = NLA_U32 }, - [NL80211_ATTR_TXQ_QUANTUM] = { .type = NLA_U32 }, + [NL80211_ATTR_TXQ_QUANTUM] = NLA_POLICY_FULL_RANGE(NLA_U32, &q_range), [NL80211_ATTR_HE_CAPABILITY ] = NLA_POLICY_RANGE(NLA_BINARY, NL80211_HE_MIN_CAPABILITY_LEN,
Greg Kroah-Hartman
maintainerPATCH 352/352 ARM: dts: imx6qdl-kontron-samx6i: fix phy-mode
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Walle <[email protected]>
commit 0df3c7d7a73d75153090637392c0b73a63cdc24a upstream.
The i.MX6 cannot add any RGMII delays. The PHY has to add both the RX and TX delays on the RGMII interface. Fix the interface mode. While at it, use the new phy-connection-type property name.
--- arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi +1 -1
@@ -260,7 +260,7 @@ &fec { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_enet>; - phy-mode = "rgmii"; + phy-connection-type = "rgmii-id"; phy-handle = <ðphy>; mdio {
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 5.10.224 release. There are 352 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.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-5.10.y
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Erika Unter HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.224 release. There are 352 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 17 Aug 2024 13:18:17 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.224-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.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
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.224 release. There are 352 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 17 Aug 2024 13:18:17 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.224-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
The following S390 build failed on stable-rc 5.10.y with gcc-12 and clang due to following warnings and errors [1].
s390:
build:
* gcc-8-defconfig-fe40093d
* gcc-12-defconfig
* clang-18-defconfig
Bisect point to 0fbb54ce4bff ("KVM: s390: pv: avoid stalls when making pages secure")
as the problematic commit [ Upstream commit f0a1a0615a6ff6d38af2c65a522698fb4bb85df6 ].
Build log:
------
/builds/linux/arch/s390/kernel/uv.c:205:15: error: implicit declaration of function 'folio_mapcount'; did you mean 'total_mapcount'? [-Werror=implicit-function-declaration]
205 | res = folio_mapcount(folio);
| ^~~~~~~~~~~~~~
| total_mapcount
/builds/linux/arch/s390/kernel/uv.c:206:13: error: implicit
declaration of function 'folio_test_swapcache'
[-Werror=implicit-function-declaration]
206 | if (folio_test_swapcache(folio)) {
| ^~~~~~~~~~~~~~~~~~~~
/builds/linux/arch/s390/kernel/uv.c:208:20: error: implicit
declaration of function 'folio_mapping'
[-Werror=implicit-function-declaration]
208 | } else if (folio_mapping(folio)) {
| ^~~~~~~~~~~~~/builds/linux/arch/s390/kernel/uv.c:210:26: error: invalid use of undefined type 'struct folio'
210 | if (folio->private)
| ^~
Build log link:
-------
[1] https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.10.y/build/v5.10.223-353-g4dac9055c10c/testrun/24874277/suite/build/test/gcc-12-defconfig/log
metadata:
--------
* kernel: 5.10.224-rc1
* git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
* git commit: 4dac9055c10c8973c91824a692ed00f3f650e5f0
* git describe: v5.10.223-353-g4dac9055c10c
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.10.y/build/v5.10.223-353-g4dac9055c10c
* arch: s390
* toolchain: gcc-12 and clang-18
* config: https://storage.tuxsuite.com/public/linaro/lkft/builds/2khPV1GrHYOypPzmwQE6yACrEg5/config
* download_url:
https://storage.tuxsuite.com/public/linaro/lkft/builds/2khPV1GrHYOypPzmwQE6yACrEg5/
--
Linaro LKFT
https://lkft.linaro.org