6.11.7-rc1 review
Subsystems (4)
Greg Kroah-Hartman
maintainerPATCH 143/245 cxl/port: Fix use-after-free, permit out-of-order decoder shutdown
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Williams <[email protected]>
commit 101c268bd2f37e965a5468353e62d154db38838e upstream.
In support of investigating an initialization failure report [1], cxl_test was updated to register mock memory-devices after the mock root-port/bus device had been registered. That led to cxl_test crashing with a use-after-free bug with the following signature:
cxl_port_attach_region: cxl region3: cxl_host_bridge.0:port3 decoder3.0 add: mem0:decoder7.0 @ 0 next: cxl_switch_uport.0 nr_eps: 1 nr_targets: 1
cxl_port_attach_region: cxl region3: cxl_host_bridge.0:port3 decoder3.0 add: mem4:decoder14.0 @ 1 next: cxl_switch_uport.0 nr_eps: 2 nr_targets: 1
cxl_port_setup_targets: cxl region3: cxl_switch_uport.0:port6 target[0] = cxl_switch_dport.0 for mem0:decoder7.0 @ 0
1) cxl_port_setup_targets: cxl region3: cxl_switch_uport.0:port6 target[1] = cxl_switch_dport.4 for mem4:decoder14.0 @ 1 [..]
cxld_unregister: cxl decoder14.0:
cxl_region_decode_reset: cxl_region region3:
mock_decoder_reset: cxl_port port3: decoder3.0 reset
2) mock_decoder_reset: cxl_port port3: decoder3.0: out of order reset, expected decoder3.1
cxl_endpoint_decoder_release: cxl decoder14.0:
[..]
cxld_unregister: cxl decoder7.0:
3) cxl_region_decode_reset: cxl_region region3:
Oops: general protection fault, probably for non-canonical address 0x6b6b6b6b6b6b6bc3: 0000 [#1] PREEMPT SMP PTI
[..]
RIP: 0010:to_cxl_port+0x8/0x60 [cxl_core]
[..]
Call Trace:
<TASK>
cxl_region_decode_reset+0x69/0x190 [cxl_core]
cxl_region_detach+0xe8/0x210 [cxl_core]
cxl_decoder_kill_region+0x27/0x40 [cxl_core]
cxld_unregister+0x5d/0x60 [cxl_core]At 1) a region has been established with 2 endpoint decoders (7.0 and 14.0). Those endpoints share a common switch-decoder in the topology (3.0). At teardown, 2), decoder14.0 is the first to be removed and hits the "out of order reset case" in the switch decoder. The effect though is that region3 cleanup is aborted leaving it in-tact and referencing decoder14.0. At 3) the second attempt to teardown region3 trips over the stale decoder14.0 object which has long since been deleted.
The fix here is to recognize that the CXL specification places no mandate on in-order shutdown of switch-decoders, the driver enforces in-order allocation, and hardware enforces in-order commit. So, rather than fail and leave objects dangling, always remove them.
In support of making cxl_region_decode_reset() always succeed, cxl_region_invalidate_memregion() failures are turned into warnings. Crashing the kernel is ok there since system integrity is at risk if caches cannot be managed around physical address mutation events like CXL region destruction.
A new device_for_each_child_reverse_from() is added to cleanup port->commit_end after all dependent decoders have been disabled. In other words if decoders are allocated 0->1->2 and disabled 1->2->0 then port->commit_end only decrements from 2 after 2 has been disabled, and it decrements all the way to zero since 1 was disabled previously.
--- drivers/base/core.c | 35 ++++++++++++++++++++++++++++++ drivers/cxl/core/hdm.c | 50 ++++++++++++++++++++++++++++++++++++------- drivers/cxl/core/region.c | 48 +++++++++++------------------------------ drivers/cxl/cxl.h | 3 +- include/linux/device.h | 3 ++ tools/testing/cxl/test/cxl.c | 14 ++++-------- 6 files changed, 100 insertions(+), 53 deletions(-)
drivers/base/core.c +35 -0
@@ -4042,6 +4042,41 @@ int device_for_each_child_reverse(structEXPORT_SYMBOL_GPL (device_for_each_child_reverse);/** +* device_for_each_child_reverse_from - device child iterator in reversed order. +* @parent: parent struct device. +* @from: optional starting point in child list +* @fn: function to be called for each device. +* @data: data for the callback. +* +* Iterate over @parent's child devices, starting at @from, and call @fn +* for each, passing it @data. This helper is identical to +* device_for_each_child_reverse() when @from is NULL. +* +* @fn is checked each iteration. If it returns anything other than 0, +* iteration stop and that value is returned to the caller of +* device_for_each_child_reverse_from(); +*/ +int device_for_each_child_reverse_from (struct device *parent, +struct device *from,const void *data, +int (*fn)(struct device *,const void *)) +{ +struct klist_iter i; +struct device *child; +int error =0 ; + +if (!parent->p) +return 0 ; + +klist_iter_init_node (&parent->p->klist_children, &i, + (from ? &from->p->knode_parent :NULL )); +while ((child =prev_device (&i)) && !error) + error =fn (child, data); +klist_iter_exit (&i); +return error; +} +EXPORT_SYMBOL_GPL (device_for_each_child_reverse_from); + +/** * device_find_child - device iterator for locating a particular device. * @parent: parent struct device * @match: Callback function to check device
drivers/cxl/core/hdm.c +42 -8
78 lines not on this page · raw message
drivers/cxl/core/region.c +13 -35
92 lines not on this page · raw message
drivers/cxl/cxl.h +2 -1
@@ -359,7 +359,7 @@ struct cxl_decoder {struct cxl_region *region;unsigned long flags;int (*commit)(struct cxl_decoder *cxld); -int (*reset)(struct cxl_decoder *cxld); +void (*reset)(struct cxl_decoder *cxld); };/*
@@ -730,6 +730,7 @@ static inline bool is_cxl_root(struct cxint cxl_num_decoders_committed (struct cxl_port *port);bool is_cxl_port (const struct device *dev);struct cxl_port *to_cxl_port (const struct device *dev); +void cxl_port_commit_reap (struct cxl_decoder *cxld);struct pci_bus ;int devm_cxl_register_pci_bus (struct device *host,struct device *uport_dev,struct pci_bus *bus);
include/linux/device.h +3 -0
@@ -1073,6 +1073,9 @@ int device_for_each_child(struct device int (*fn)(struct device *dev, void *data));int device_for_each_child_reverse (struct device *dev,void *data,int (*fn)(struct device *dev,void *data)); +int device_for_each_child_reverse_from (struct device *parent, +struct device *from,const void *data, +int (*fn)(struct device *,const void *));struct device *device_find_child (struct device *dev,void *data,int (*match)(struct device *dev,void *data)); struct device *device_find_child_by_name(struct device *parent,
tools/testing/cxl/test/cxl.c +5 -9
@@ -693,26 +693,22 @@ static int mock_decoder_commit(struct cxreturn 0 ; } -static int mock_decoder_reset (struct cxl_decoder *cxld) +static void mock_decoder_reset (struct cxl_decoder *cxld) {struct cxl_port *port =to_cxl_port (cxld->dev.parent);int id = cxld->id;if ((cxld->flags &CXL_DECODER_F_ENABLE ) ==0 ) -return 0 ; +return ;dev_dbg (&port->dev,"%s reset\n" ,dev_name (&cxld->dev)); -if (port->commit_end != id) { +if (port->commit_end == id) +cxl_port_commit_reap (cxld); +else dev_dbg (&port->dev,"%s: out of order reset, expected decoder%d.%d\n" ,dev_name (&cxld->dev), port->id, port->commit_end); -return -EBUSY ; - } - - port->commit_end--; cxld->flags &= ~CXL_DECODER_F_ENABLE ; - -return 0 ; }static void default_mock_decoder (struct cxl_decoder *cxld)
Greg Kroah-Hartman
maintainerPATCH 144/245 cxl/port: Fix CXL port initialization order when the subsystem is built-in
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Williams <[email protected]>
commit 6575b268157f37929948a8d1f3bafb3d7c055bc1 upstream.
When the CXL subsystem is built-in the module init order is determined by Makefile order. That order violates expectations. The expectation is that cxl_acpi and cxl_mem can race to attach. If cxl_acpi wins the race, cxl_mem will find the enabled CXL root ports it needs. If cxl_acpi loses the race it will retrigger cxl_mem to attach via cxl_bus_rescan(). That flow only works if cxl_acpi can assume ports are enabled immediately upon cxl_acpi_probe() return. That in turn can only happen in the CONFIG_CXL_ACPI=y case if the cxl_port driver is registered before cxl_acpi_probe() runs.
Fix up the order to prevent initialization failures. Ensure that cxl_port is built-in when cxl_acpi is also built-in, arrange for Makefile order to resolve the subsys_initcall() order of cxl_port and cxl_acpi, and arrange for Makefile order to resolve the device_initcall() (module_init()) order of the remaining objects.
As for what contributed to this not being found earlier, the CXL regression environment, cxl_test, builds all CXL functionality as a module to allow to symbol mocking and other dynamic reload tests. As a result there is no regression coverage for the built-in case.
--- drivers/cxl/Kconfig | 1 + drivers/cxl/Makefile | 20 ++++++++++++++------ drivers/cxl/port.c | 17 ++++++++++++++++- 3 files changed, 31 insertions(+), 7 deletions(-)
drivers/cxl/Kconfig +1 -0
@@ -60,6 +60,7 @@ config CXL_ACPI default CXL_BUS select ACPI_TABLE_LIB select ACPI_HMAT + select CXL_PORT help Enable support for host managed device memory (HDM) resources published by a platform's ACPI CXL memory layout description. See
drivers/cxl/Makefile +14 -6
@@ -1,13 +1,21 @@ # SPDX-License-Identifier: GPL-2.0 + +# Order is important here for the built-in case: +# - 'core' first for fundamental init +# - 'port' before platform root drivers like 'acpi' so that CXL-root ports +# are immediately enabled +# - 'mem' and 'pmem' before endpoint drivers so that memdevs are +# immediately enabled +# - 'pci' last, also mirrors the hardware enumeration hierarchy obj-y += core/ -obj-$(CONFIG_CXL_PCI) += cxl_pci.o -obj-$(CONFIG_CXL_MEM) += cxl_mem.o +obj-$(CONFIG_CXL_PORT) += cxl_port.o obj-$(CONFIG_CXL_ACPI) += cxl_acpi.o obj-$(CONFIG_CXL_PMEM) += cxl_pmem.o -obj-$(CONFIG_CXL_PORT) += cxl_port.o +obj-$(CONFIG_CXL_MEM) += cxl_mem.o +obj-$(CONFIG_CXL_PCI) += cxl_pci.o -cxl_mem-y := mem.o -cxl_pci-y := pci.o +cxl_port-y := port.o cxl_acpi-y := acpi.o cxl_pmem-y := pmem.o security.o -cxl_port-y := port.o +cxl_mem-y := mem.o +cxl_pci-y := pci.o
drivers/cxl/port.c +16 -1
@@ -208,7 +208,22 @@ static struct cxl_driver cxl_port_driver }, }; -module_cxl_driver (cxl_port_driver); +static int __init cxl_port_init (void ) +{ +return cxl_driver_register (&cxl_port_driver); +} +/* +* Be ready to immediately enable ports emitted by the platform CXL root +* (e.g. cxl_acpi) when CONFIG_CXL_PORT=y. +*/ +subsys_initcall (cxl_port_init); + +static void __exit cxl_port_exit(void) +{ +cxl_driver_unregister (&cxl_port_driver); +} +module_exit (cxl_port_exit); +MODULE_DESCRIPTION ("CXL: Port enumeration and services" );MODULE_LICENSE ("GPL v2" );MODULE_IMPORT_NS (CXL );
Greg Kroah-Hartman
maintainerPATCH 145/245 mmc: sdhci-pci-gli: GL9767: Fix low power mode on the set clock function
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Chuang <[email protected]>
commit 8c68b5656e55e9324875881f1000eb4ee3603a87 upstream.
On sdhci_gl9767_set_clock(), the vendor header space(VHS) is read-only after calling gl9767_disable_ssc_pll() and gl9767_set_ssc_pll_205mhz(). So the low power negotiation mode cannot be enabled again. Introduce gl9767_set_low_power_negotiation() function to fix it.
The explanation process is as below.
static void sdhci_gl9767_set_clock()
{
...
gl9767_vhs_write();
...
value |= PCIE_GLI_9767_CFG_LOW_PWR_OFF;
pci_write_config_dword(pdev, PCIE_GLI_9767_CFG, value); <--- (a)
gl9767_disable_ssc_pll(); <--- (b)
sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
if (clock == 0)
return; <-- (I)
...
if (clock == 200000000 && ios->timing == MMC_TIMING_UHS_SDR104) {
...
gl9767_set_ssc_pll_205mhz(); <--- (c)
}
...
value &= ~PCIE_GLI_9767_CFG_LOW_PWR_OFF;
pci_write_config_dword(pdev, PCIE_GLI_9767_CFG, value); <-- (II)
gl9767_vhs_read();
}(a) disable low power negotiation mode. When return on (I), the low power mode is disabled. After (b) and (c), VHS is read-only, the low power mode cannot be enabled on (II).
Message-ID: <[email protected]>
--- drivers/mmc/host/sdhci-pci-gli.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-)
drivers/mmc/host/sdhci-pci-gli.c +21 -14
@@ -892,28 +892,40 @@ static void gl9767_disable_ssc_pll(strucgl9767_vhs_read (pdev); } +static void gl9767_set_low_power_negotiation (struct pci_dev *pdev,bool enable) +{ +u32 value; + +gl9767_vhs_write (pdev); + +pci_read_config_dword (pdev,PCIE_GLI_9767_CFG , &value); +if (enable) + value &= ~PCIE_GLI_9767_CFG_LOW_PWR_OFF ; +else + value |=PCIE_GLI_9767_CFG_LOW_PWR_OFF ; +pci_write_config_dword (pdev,PCIE_GLI_9767_CFG , value); + +gl9767_vhs_read (pdev); +} +static void sdhci_gl9767_set_clock (struct sdhci_host *host,unsigned int clock) {struct sdhci_pci_slot *slot =sdhci_priv (host);struct mmc_ios *ios = &host->mmc->ios;struct pci_dev *pdev; -u32 value;u16 clk; pdev = slot->chip->pdev; host->mmc->actual_clock =0 ; -gl9767_vhs_write (pdev); - -pci_read_config_dword (pdev,PCIE_GLI_9767_CFG , &value); - value |=PCIE_GLI_9767_CFG_LOW_PWR_OFF ; -pci_write_config_dword (pdev,PCIE_GLI_9767_CFG , value); - +gl9767_set_low_power_negotiation (pdev, false);gl9767_disable_ssc_pll (pdev);sdhci_writew (host,0 ,SDHCI_CLOCK_CONTROL ); -if (clock ==0 ) +if (clock ==0 ) { +gl9767_set_low_power_negotiation (pdev, true);return ; + } clk =sdhci_calc_clk (host, clock, &host->mmc->actual_clock);if (clock ==200000000 && ios->timing ==MMC_TIMING_UHS_SDR104 ) {
@@ -922,12 +934,7 @@ static void sdhci_gl9767_set_clock(struc }sdhci_enable_clk (host, clk); - -pci_read_config_dword (pdev,PCIE_GLI_9767_CFG , &value); - value &= ~PCIE_GLI_9767_CFG_LOW_PWR_OFF ; -pci_write_config_dword (pdev,PCIE_GLI_9767_CFG , value); - -gl9767_vhs_read (pdev); +gl9767_set_low_power_negotiation (pdev, true); }static void gli_set_9767 (struct sdhci_host *host)
Greg Kroah-Hartman
maintainerPATCH 146/245 mmc: sdhci-pci-gli: GL9767: Fix low power mode in the SD Express process
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Chuang <[email protected]>
commit c4dedaaeb3f78d3718e9c1b1e4d972a6b99073cd upstream.
When starting the SD Express process, the low power negotiation mode will be disabled, so we need to re-enable it after switching back to SD mode.
Message-ID: <[email protected]>
--- drivers/mmc/host/sdhci-pci-gli.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/mmc/host/sdhci-pci-gli.c +3 -0
@@ -1068,6 +1068,9 @@ static int gl9767_init_sd_express(structsdhci_writew (host, value,SDHCI_CLOCK_CONTROL ); } +pci_read_config_dword (pdev,PCIE_GLI_9767_CFG , &value); + value &= ~PCIE_GLI_9767_CFG_LOW_PWR_OFF ; +pci_write_config_dword (pdev,PCIE_GLI_9767_CFG , value);gl9767_vhs_read (pdev);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 147/245 block: fix sanity checks in blk_rq_map_user_bvec
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xinyu Zhang <[email protected]>
[ Upstream commit 2ff949441802a8d076d9013c7761f63e8ae5a9bd ]
blk_rq_map_user_bvec contains a check bytes + bv->bv_len > nr_iter which causes unnecessary failures in NVMe passthrough I/O, reproducible as follows:
- register a 2 page, page-aligned buffer against a ring
- use that buffer to do a 1 page io_uring NVMe passthrough read
The second (i = 1) iteration of the loop in blk_rq_map_user_bvec will then have nr_iter == 1 page, bytes == 1 page, bv->bv_len == 1 page, so the check bytes + bv->bv_len > nr_iter will succeed, causing the I/O to fail. This failure is unnecessary, as when the check succeeds, it means we've checked the entire buffer that will be used by the request - i.e. blk_rq_map_user_bvec should complete successfully. Therefore, terminate the loop early and return successfully when the check bytes + bv->bv_len
Quoted 1 line
nr_itersucceeds.
While we're at it, also remove the check that all segments in the bvec are single-page. While this seems to be true for all users of the function, it doesn't appear to be required anywhere downstream.
--- block/blk-map.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
block/blk-map.c +1 -3
@@ -600,9 +600,7 @@ static int blk_rq_map_user_bvec(struct request *rq, const struct iov_iter *iter)if (nsegs >= nr_segs || bytes >UINT_MAX - bv->bv_len) goto put_bio;if (bytes + bv->bv_len > nr_iter) - goto put_bio; -if (bv->bv_offset + bv->bv_len >PAGE_SIZE ) - goto put_bio; +break ; nsegs++; bytes += bv->bv_len;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 148/245 cgroup/bpf: use a dedicated workqueue for cgroup bpf destruction
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Ridong <[email protected]>
[ Upstream commit 117932eea99b729ee5d12783601a4f7f5fd58a23 ]
A hung_task problem shown below was found:
INFO: task kworker/0:0:8 blocked for more than 327 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Workqueue: events cgroup_bpf_release Call Trace: <TASK> __schedule+0x5a2/0x2050 ? find_held_lock+0x33/0x100 ? wq_worker_sleeping+0x9e/0xe0 schedule+0x9f/0x180 schedule_preempt_disabled+0x25/0x50 __mutex_lock+0x512/0x740 ? cgroup_bpf_release+0x1e/0x4d0 ? cgroup_bpf_release+0xcf/0x4d0 ? process_scheduled_works+0x161/0x8a0 ? cgroup_bpf_release+0x1e/0x4d0 ? mutex_lock_nested+0x2b/0x40 ? __pfx_delay_tsc+0x10/0x10 mutex_lock_nested+0x2b/0x40 cgroup_bpf_release+0xcf/0x4d0 ? process_scheduled_works+0x161/0x8a0 ? trace_event_raw_event_workqueue_execute_start+0x64/0xd0 ? process_scheduled_works+0x161/0x8a0 process_scheduled_works+0x23a/0x8a0 worker_thread+0x231/0x5b0 ? __pfx_worker_thread+0x10/0x10 kthread+0x14d/0x1c0 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x59/0x70 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1b/0x30 </TASK>
This issue can be reproduced by the following pressuse test:
1. A large number of cpuset cgroups are deleted.
2. Set cpu on and off repeatly.
3. Set watchdog_thresh repeatly.
The scripts can be obtained at LINK mentioned above the signature.
The reason for this issue is cgroup_mutex and cpu_hotplug_lock are acquired in different tasks, which may lead to deadlock.
It can lead to a deadlock through the following steps:
1. A large number of cpusets are deleted asynchronously, which puts a large number of cgroup_bpf_release works into system_wq. The max_active of system_wq is WQ_DFL_ACTIVE(256). Consequently, all active works are cgroup_bpf_release works, and many cgroup_bpf_release works will be put into inactive queue. As illustrated in the diagram, there are 256 (in the acvtive queue) + n (in the inactive queue) works.
2. Setting watchdog_thresh will hold cpu_hotplug_lock.read and put smp_call_on_cpu work into system_wq. However step 1 has already filled system_wq, 'sscs.work' is put into inactive queue. 'sscs.work' has to wait until the works that were put into the inacvtive queue earlier have executed (n cgroup_bpf_release), so it will be blocked for a while.
3. Cpu offline requires cpu_hotplug_lock.write, which is blocked by step 2.
4. Cpusets that were deleted at step 1 put cgroup_release works into cgroup_destroy_wq. They are competing to get cgroup_mutex all the time. When cgroup_metux is acqured by work at css_killed_work_fn, it will call cpuset_css_offline, which needs to acqure cpu_hotplug_lock.read. However, cpuset_css_offline will be blocked for step 3.
5. At this moment, there are 256 works in active queue that are cgroup_bpf_release, they are attempting to acquire cgroup_mutex, and as a result, all of them are blocked. Consequently, sscs.work can not be executed. Ultimately, this situation leads to four processes being blocked, forming a deadlock.
system_wq(step1) WatchDog(step2) cpu offline(step3) cgroup_destroy_wq(step4)
...
2000+ cgroups deleted asyn
256 actives + n inactives
__lockup_detector_reconfigure P(cpu_hotplug_lock.read) put sscs.work into system_wq
256 + n + 1(sscs.work)
sscs.work wait to be executed
warting sscs.work finish percpu_down_write P(cpu_hotplug_lock.write) ...blocking... css_killed_work_fn P(cgroup_mutex) cpuset_css_offline P(cpu_hotplug_lock.read) ...blocking...
256 cgroup_bpf_releasemutex_lock(&cgroup_mutex);
..blocking...
To fix the problem, place cgroup_bpf_release works on a dedicated workqueue which can break the loop and solve the problem. System wqs are for misc things which shouldn't create a large number of concurrent work items. If something is going to generate >WQ_DFL_ACTIVE(256) concurrent work items, it should use its own dedicated workqueue.
--- kernel/bpf/cgroup.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-)
kernel/bpf/cgroup.c +18 -1
@@ -24,6 +24,23 @@DEFINE_STATIC_KEY_ARRAY_FALSE (cgroup_bpf_enabled_key,MAX_CGROUP_BPF_ATTACH_TYPE );EXPORT_SYMBOL (cgroup_bpf_enabled_key); +/* +* cgroup bpf destruction makes heavy use of work items and there can be a lot +* of concurrent destructions. Use a separate workqueue so that cgroup bpf +* destruction work items don't end up filling up max_active of system_wq +* which may lead to deadlock. +*/ +static struct workqueue_struct *cgroup_bpf_destroy_wq; + +static int __init cgroup_bpf_wq_init (void ) +{ + cgroup_bpf_destroy_wq =alloc_workqueue ("cgroup_bpf_destroy" ,0 ,1 ); +if (!cgroup_bpf_destroy_wq) +panic ("Failed to alloc workqueue for cgroup bpf destroy.\n" ); +return 0 ; +} +core_initcall (cgroup_bpf_wq_init); +/* __always_inline is necessary to prevent indirect call through run_prog * function pointer. */
@@ -334,7 +351,7 @@ static void cgroup_bpf_release_fn(struct percpu_ref *ref) struct cgroup *cgrp = container_of(ref, struct cgroup, bpf.refcnt);INIT_WORK (&cgrp->bpf.release_work, cgroup_bpf_release); -queue_work (system_wq, &cgrp->bpf.release_work); +queue_work (cgroup_bpf_destroy_wq, &cgrp->bpf.release_work); }/* Get underlying bpf_prog of bpf_prog_list entry, regardless if it's through
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 149/245 phy: freescale: imx8m-pcie: Do CMN_RST just before PHY PLL lock check
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Zhu <[email protected]>
[ Upstream commit f89263b69731e0144d275fff777ee0dd92069200 ]
When enable initcall_debug together with higher debug level below. CONFIG_CONSOLE_LOGLEVEL_DEFAULT=9 CONFIG_CONSOLE_LOGLEVEL_QUIET=9 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=7
The initialization of i.MX8MP PCIe PHY might be timeout failed randomly. To fix this issue, adjust the sequence of the resets refer to the power up sequence listed below.
i.MX8MP PCIe PHY power up sequence:
/---------------------------------------------
1.8v supply ---------/
/---------------------------------------------------0.8v supply ---/
---\ /--------------------------------------------------
X REFCLK Valid
Reference Clock ---/ \--------------------------------------------------
-------------------------------------------
|
i_init_restn --------------
------------------------------------
|
i_cmn_rstn ---------------------
-------------------------------
|o_pll_lock_done --------------------------
Logs:
imx6q-pcie 33800000.pcie: host bridge /soc@0/pcie@33800000 ranges: imx6q-pcie 33800000.pcie: IO 0x001ff80000..0x001ff8ffff -> 0x0000000000 imx6q-pcie 33800000.pcie: MEM 0x0018000000..0x001fefffff -> 0x0018000000
probe of clk_imx8mp_audiomix.reset.0 returned 0 after 1052 usecs
probe of 30e20000.clock-controller returned 0 after 32971 usecs
phy phy-32f00000.pcie-phy.4: phy poweron failed --> -110
probe of 30e10000.dma-controller returned 0 after 10235 usecs
imx6q-pcie 33800000.pcie: waiting for PHY ready timeout!
dwhdmi-imx 32fd8000.hdmi: Detected HDMI TX controller v2.13a with HDCP (samsung_dw_hdmi_phy2) imx6q-pcie 33800000.pcie: probe with driver imx6q-pcie failed with error -110
v2 changes:
- Rebase to latest fixes branch of linux-phy git repo.
- Richard's environment have problem and can't sent out patch. So I help post this fix patch.
--- drivers/phy/freescale/phy-fsl-imx8m-pcie.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/phy/freescale/phy-fsl-imx8m-pcie.c +5 -5
@@ -141,11 +141,6 @@ static int imx8_pcie_phy_power_on(struct phy *phy) IMX8MM_GPR_PCIE_REF_CLK_PLL);usleep_range (100 ,200 ); -/* Do the PHY common block reset */ -regmap_update_bits (imx8_phy->iomuxc_gpr,IOMUXC_GPR14 , -IMX8MM_GPR_PCIE_CMN_RST , -IMX8MM_GPR_PCIE_CMN_RST ); -switch (imx8_phy->drvdata->variant) {case IMX8MP :reset_control_deassert (imx8_phy->perst);
@@ -156,6 +151,11 @@ static int imx8_pcie_phy_power_on(struct phy *phy)break ; } +/* Do the PHY common block reset */ +regmap_update_bits (imx8_phy->iomuxc_gpr,IOMUXC_GPR14 , +IMX8MM_GPR_PCIE_CMN_RST , +IMX8MM_GPR_PCIE_CMN_RST ); +/* Polling to check the phy is ready or not. */ ret =readl_poll_timeout (imx8_phy->base +IMX8MM_PCIE_PHY_CMN_REG075 , val, val ==ANA_PLL_DONE ,10 ,20000 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 150/245 btrfs: merge btrfs_orig_bbio_end_io() into btrfs_bio_end_io()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qu Wenruo <[email protected]>
[ Upstream commit 9ca0e58cb752b09816f56f7a3147a39773d5e831 ]
There are only two differences between the two functions:
- btrfs_orig_bbio_end_io() does extra error propagation This is mostly to allow tolerance for write errors.
- btrfs_orig_bbio_end_io() does extra pending_ios check This check can handle both the original bio, or the cloned one. (All accounting happens in the original one).
This makes btrfs_orig_bbio_end_io() a much safer call. In fact we already had a double freeing error due to usage of btrfs_bio_end_io() in the error path of btrfs_submit_chunk().
So just move the whole content of btrfs_orig_bbio_end_io() into btrfs_bio_end_io().
For normal paths this brings no change, because they are already calling btrfs_orig_bbio_end_io() in the first place.
For error paths (not only inside bio.c but also external callers), this change will introduce extra checks, especially for external callers, as they will error out without submitting the btrfs bio.
But considering it's already in the error path, such slower but much safer checks are still an overall win.
Stable-dep-of: d48e1dea3931 ("btrfs: fix error propagation of split bios")
--- fs/btrfs/bio.c | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-)
fs/btrfs/bio.c +11 -18
@@ -120,12 +120,6 @@ static void __btrfs_bio_end_io(struct btrfs_bio *bbio) } } -void btrfs_bio_end_io (struct btrfs_bio *bbio,blk_status_t status) -{ - bbio->bio.bi_status = status; -__btrfs_bio_end_io (bbio); -} -static void btrfs_orig_write_end_io (struct bio *bio); static void btrfs_bbio_propagate_error(struct btrfs_bio *bbio,
@@ -147,8 +141,9 @@ static void btrfs_bbio_propagate_error(struct btrfs_bio *bbio, } } -static void btrfs_orig_bbio_end_io (struct btrfs_bio *bbio) +void btrfs_bio_end_io (struct btrfs_bio *bbio,blk_status_t status) { + bbio->bio.bi_status = status;if (bbio->bio.bi_pool == &btrfs_clone_bioset) {struct btrfs_bio *orig_bbio = bbio->private;
@@ -179,7 +174,7 @@ static int prev_repair_mirror(struct btrfs_failed_bio *fbio, int cur_mirror)static void btrfs_repair_done (struct btrfs_failed_bio *fbio) {if (atomic_dec_and_test (&fbio->repair_count)) { -btrfs_orig_bbio_end_io (fbio->bbio); +btrfs_bio_end_io (fbio->bbio, fbio->bbio->bio.bi_status);mempool_free (fbio, &btrfs_failed_bio_pool); } }
@@ -326,7 +321,7 @@ static void btrfs_check_read_bio(struct btrfs_bio *bbio, struct btrfs_device *deif (fbio)btrfs_repair_done (fbio);else -btrfs_orig_bbio_end_io (bbio); +btrfs_bio_end_io (bbio, bbio->bio.bi_status); }static void btrfs_log_dev_io_error (struct bio *bio,struct btrfs_device *dev)
@@ -360,7 +355,7 @@ static void btrfs_end_bio_work(struct work_struct *work)if (is_data_bbio (bbio))btrfs_check_read_bio (bbio, bbio->bio.bi_private);else -btrfs_orig_bbio_end_io (bbio); +btrfs_bio_end_io (bbio, bbio->bio.bi_status); }static void btrfs_simple_end_io (struct bio *bio)
@@ -380,7 +375,7 @@ static void btrfs_simple_end_io(struct bio *bio) }else {if (bio_op (bio) ==REQ_OP_ZONE_APPEND && !bio->bi_status)btrfs_record_physical_zoned (bbio); -btrfs_orig_bbio_end_io (bbio); +btrfs_bio_end_io (bbio, bbio->bio.bi_status); } }
@@ -394,7 +389,7 @@ static void btrfs_raid56_end_io(struct bio *bio)if (bio_op (bio) ==REQ_OP_READ &&is_data_bbio (bbio))btrfs_check_read_bio (bbio,NULL );else -btrfs_orig_bbio_end_io (bbio); +btrfs_bio_end_io (bbio, bbio->bio.bi_status);btrfs_put_bioc (bioc); }
@@ -424,7 +419,7 @@ static void btrfs_orig_write_end_io(struct bio *bio)if (bio_op (bio) ==REQ_OP_ZONE_APPEND && !bio->bi_status) stripe->physical = bio->bi_iter.bi_sector <<SECTOR_SHIFT ; -btrfs_orig_bbio_end_io (bbio); +btrfs_bio_end_io (bbio, bbio->bio.bi_status);btrfs_put_bioc (bioc); }
@@ -593,7 +588,7 @@ static void run_one_async_done(struct btrfs_work *work, bool do_free)/* If an error occurred we just want to clean up the bio and move on. */ if (bio->bi_status) { -btrfs_orig_bbio_end_io (async->bbio); +btrfs_bio_end_io (async->bbio, async->bbio->bio.bi_status);return ; }
@@ -765,11 +760,9 @@ static bool btrfs_submit_chunk(struct btrfs_bio *bbio, int mirror_num)ASSERT (bbio->bio.bi_pool == &btrfs_clone_bioset);ASSERT (remaining); - remaining->bio.bi_status = ret; -btrfs_orig_bbio_end_io (remaining); +btrfs_bio_end_io (remaining, ret); } - bbio->bio.bi_status = ret; -btrfs_orig_bbio_end_io (bbio); +btrfs_bio_end_io (bbio, ret);/* Do not submit another chunk */ return true; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 151/245 btrfs: fix error propagation of split bios
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Naohiro Aota <[email protected]>
[ Upstream commit d48e1dea3931de64c26717adc2b89743c7ab6594 ]
The purpose of btrfs_bbio_propagate_error() shall be propagating an error of split bio to its original btrfs_bio, and tell the error to the upper layer. However, it's not working well on some cases.
* Case 1. Immediate (or quick) end_bio with an error
When btrfs sends btrfs_bio to mirrored devices, btrfs calls btrfs_bio_end_io() when all the mirroring bios are completed. If that btrfs_bio was split, it is from btrfs_clone_bioset and its end_io function is btrfs_orig_write_end_io. For this case, btrfs_bbio_propagate_error() accesses the orig_bbio's bio context to increase the error count.
That works well in most cases. However, if the end_io is called enough fast, orig_bbio's (remaining part after split) bio context may not be properly set at that time. Since the bio context is set when the orig_bbio (the last btrfs_bio) is sent to devices, that might be too late for earlier split btrfs_bio's completion. That will result in NULL pointer dereference.
That bug is easily reproducible by running btrfs/146 on zoned devices [1] and it shows the following trace.
[1] You need raid-stripe-tree feature as it create "-d raid0 -m raid1" FS.
BUG: kernel NULL pointer dereference, address: 0000000000000020 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: Oops: 0000 [#1] PREEMPT SMP PTI CPU: 1 UID: 0 PID: 13 Comm: kworker/u32:1 Not tainted 6.11.0-rc7-BTRFS-ZNS+ #474 Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 Workqueue: writeback wb_workfn (flush-btrfs-5) RIP: 0010:btrfs_bio_end_io+0xae/0xc0 [btrfs] BTRFS error (device dm-0): bdev /dev/mapper/error-test errs: wr 2, rd 0, flush 0, corrupt 0, gen 0 RSP: 0018:ffffc9000006f248 EFLAGS: 00010246 RAX: 0000000000000000 RBX: ffff888005a7f080 RCX: ffffc9000006f1dc RDX: 0000000000000000 RSI: 000000000000000a RDI: ffff888005a7f080 RBP: ffff888011dfc540 R08: 0000000000000000 R09: 0000000000000001 R10: ffffffff82e508e0 R11: 0000000000000005 R12: ffff88800ddfbe58 R13: ffff888005a7f080 R14: ffff888005a7f158 R15: ffff888005a7f158 FS: 0000000000000000(0000) GS:ffff88803ea80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000020 CR3: 0000000002e22006 CR4: 0000000000370ef0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> ? __die_body.cold+0x19/0x26 ? page_fault_oops+0x13e/0x2b0 ? _printk+0x58/0x73 ? do_user_addr_fault+0x5f/0x750 ? exc_page_fault+0x76/0x240 ? asm_exc_page_fault+0x22/0x30 ? btrfs_bio_end_io+0xae/0xc0 [btrfs] ? btrfs_log_dev_io_error+0x7f/0x90 [btrfs] btrfs_orig_write_end_io+0x51/0x90 [btrfs] dm_submit_bio+0x5c2/0xa50 [dm_mod] ? find_held_lock+0x2b/0x80 ? blk_try_enter_queue+0x90/0x1e0 __submit_bio+0xe0/0x130 ? ktime_get+0x10a/0x160 ? lockdep_hardirqs_on+0x74/0x100 submit_bio_noacct_nocheck+0x199/0x410 btrfs_submit_bio+0x7d/0x150 [btrfs] btrfs_submit_chunk+0x1a1/0x6d0 [btrfs] ? lockdep_hardirqs_on+0x74/0x100 ? __folio_start_writeback+0x10/0x2c0 btrfs_submit_bbio+0x1c/0x40 [btrfs] submit_one_bio+0x44/0x60 [btrfs] submit_extent_folio+0x13f/0x330 [btrfs] ? btrfs_set_range_writeback+0xa3/0xd0 [btrfs] extent_writepage_io+0x18b/0x360 [btrfs] extent_write_locked_range+0x17c/0x340 [btrfs] ? __pfx_end_bbio_data_write+0x10/0x10 [btrfs] run_delalloc_cow+0x71/0xd0 [btrfs] btrfs_run_delalloc_range+0x176/0x500 [btrfs] ? find_lock_delalloc_range+0x119/0x260 [btrfs] writepage_delalloc+0x2ab/0x480 [btrfs] extent_write_cache_pages+0x236/0x7d0 [btrfs] btrfs_writepages+0x72/0x130 [btrfs] do_writepages+0xd4/0x240 ? find_held_lock+0x2b/0x80 ? wbc_attach_and_unlock_inode+0x12c/0x290 ? wbc_attach_and_unlock_inode+0x12c/0x290 __writeback_single_inode+0x5c/0x4c0 ? do_raw_spin_unlock+0x49/0xb0 writeback_sb_inodes+0x22c/0x560 __writeback_inodes_wb+0x4c/0xe0 wb_writeback+0x1d6/0x3f0 wb_workfn+0x334/0x520 process_one_work+0x1ee/0x570 ? lock_is_held_type+0xc6/0x130 worker_thread+0x1d1/0x3b0 ? __pfx_worker_thread+0x10/0x10 kthread+0xee/0x120 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x30/0x50 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 </TASK> Modules linked in: dm_mod btrfs blake2b_generic xor raid6_pq rapl CR2: 0000000000000020
* Case 2. Earlier completion of orig_bbio for mirrored btrfs_bios
btrfs_bbio_propagate_error() assumes the end_io function for orig_bbio is called last among split bios. In that case, btrfs_orig_write_end_io() sets the bio->bi_status to BLK_STS_IOERR by seeing the bioc->error [2]. Otherwise, the increased orig_bio's bioc->error is not checked by anyone and return BLK_STS_OK to the upper layer.
[2] Actually, this is not true. Because we only increases orig_bioc->errors by max_errors, the condition "atomic_read(&bioc->error) > bioc->max_errors" is still not met if only one split btrfs_bio fails.
* Case 3. Later completion of orig_bbio for un-mirrored btrfs_bios
In contrast to the above case, btrfs_bbio_propagate_error() is not working well if un-mirrored orig_bbio is completed last. It sets orig_bbio->bio.bi_status to the btrfs_bio's error. But, that is easily over-written by orig_bbio's completion status. If the status is BLK_STS_OK, the upper layer would not know the failure.
* Solution
Considering the above cases, we can only save the error status in the orig_bbio (remaining part after split) itself as it is always available. Also, the saved error status should be propagated when all the split btrfs_bios are finished (i.e, bbio->pending_ios == 0).
This commit introduces "status" to btrfs_bbio and saves the first error of split bios to original btrfs_bio's "status" variable. When all the split bios are finished, the saved status is loaded into original btrfs_bio's status.
With this commit, btrfs/146 on zoned devices does not hit the NULL pointer dereference anymore.
--- fs/btrfs/bio.c | 37 +++++++++++++------------------------ fs/btrfs/bio.h | 3 +++ 2 files changed, 16 insertions(+), 24 deletions(-)
fs/btrfs/bio.c +13 -24
@@ -49,6 +49,7 @@ void btrfs_bio_init(struct btrfs_bio *bbio, struct btrfs_fs_info *fs_info, bbio->end_io = end_io; bbio->private = private;atomic_set (&bbio->pending_ios,1 ); +WRITE_ONCE (bbio->status,BLK_STS_OK ); }/*
@@ -120,41 +121,29 @@ static void __btrfs_bio_end_io(struct btrfs_bio *bbio) } } -static void btrfs_orig_write_end_io (struct bio *bio); - -static void btrfs_bbio_propagate_error (struct btrfs_bio *bbio, -struct btrfs_bio *orig_bbio) -{ -/* -* For writes we tolerate nr_mirrors - 1 write failures, so we can't -* just blindly propagate a write failure here. Instead increment the -* error count in the original I/O context so that it is guaranteed to -* be larger than the error tolerance. -*/ -if (bbio->bio.bi_end_io == &btrfs_orig_write_end_io) { -struct btrfs_io_stripe *orig_stripe = orig_bbio->bio.bi_private; -struct btrfs_io_context *orig_bioc = orig_stripe->bioc; - -atomic_add (orig_bioc->max_errors, &orig_bioc->error); - }else { - orig_bbio->bio.bi_status = bbio->bio.bi_status; - } -} -void btrfs_bio_end_io (struct btrfs_bio *bbio,blk_status_t status) { bbio->bio.bi_status = status;if (bbio->bio.bi_pool == &btrfs_clone_bioset) {struct btrfs_bio *orig_bbio = bbio->private; -if (bbio->bio.bi_status) -btrfs_bbio_propagate_error (bbio, orig_bbio);btrfs_cleanup_bio (bbio); bbio = orig_bbio; } -if (atomic_dec_and_test (&bbio->pending_ios)) +/* +* At this point, bbio always points to the original btrfs_bio. Save +* the first error in it. +*/ +if (status !=BLK_STS_OK ) +cmpxchg (&bbio->status,BLK_STS_OK , status); + +if (atomic_dec_and_test (&bbio->pending_ios)) { +/* Load split bio's error which might be set above. */ +if (status ==BLK_STS_OK ) + bbio->bio.bi_status =READ_ONCE (bbio->status);__btrfs_bio_end_io (bbio); + } }static int next_repair_mirror (struct btrfs_failed_bio *fbio,int cur_mirror)
fs/btrfs/bio.h +3 -0
@@ -79,6 +79,9 @@ struct btrfs_bio {/* File system that this I/O operates on. */ struct btrfs_fs_info *fs_info; +/* Save the first error status of split bio. */ +blk_status_t status; +/* * This member must come last, bio_alloc_bioset will allocate enough * bytes for entire btrfs_bio but relies on bio being last.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 152/245 spi: spi-fsl-dspi: Fix crash when not using GPIO chip select
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Li <[email protected]>
[ Upstream commit 25f00a13dccf8e45441265768de46c8bf58e08f6 ]
Add check for the return value of spi_get_csgpiod() to avoid passing a NULL pointer to gpiod_direction_output(), preventing a crash when GPIO chip select is not used.
Fix below crash:
[ 4.251960] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 [ 4.260762] Mem abort info: [ 4.263556] ESR = 0x0000000096000004 [ 4.267308] EC = 0x25: DABT (current EL), IL = 32 bits [ 4.272624] SET = 0, FnV = 0 [ 4.275681] EA = 0, S1PTW = 0 [ 4.278822] FSC = 0x04: level 0 translation fault [ 4.283704] Data abort info: [ 4.286583] ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000 [ 4.292074] CM = 0, WnR = 0, TnD = 0, TagAccess = 0 [ 4.297130] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 [ 4.302445] [0000000000000000] user address but active_mm is swapper [ 4.308805] Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP [ 4.315072] Modules linked in: [ 4.318124] CPU: 2 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.12.0-rc4-next-20241023-00008-ga20ec42c5fc1 #359 [ 4.328130] Hardware name: LS1046A QDS Board (DT) [ 4.332832] pstate: 40000005 (nZcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 4.339794] pc : gpiod_direction_output+0x34/0x5c [ 4.344505] lr : gpiod_direction_output+0x18/0x5c [ 4.349208] sp : ffff80008003b8f0 [ 4.352517] x29: ffff80008003b8f0 x28: 0000000000000000 x27: ffffc96bcc7e9068 [ 4.359659] x26: ffffc96bcc6e00b0 x25: ffffc96bcc598398 x24: ffff447400132810 [ 4.366800] x23: 0000000000000000 x22: 0000000011e1a300 x21: 0000000000020002 [ 4.373940] x20: 0000000000000000 x19: 0000000000000000 x18: ffffffffffffffff [ 4.381081] x17: ffff44740016e600 x16: 0000000500000003 x15: 0000000000000007 [ 4.388221] x14: 0000000000989680 x13: 0000000000020000 x12: 000000000000001e [ 4.395362] x11: 0044b82fa09b5a53 x10: 0000000000000019 x9 : 0000000000000008 [ 4.402502] x8 : 0000000000000002 x7 : 0000000000000007 x6 : 0000000000000000 [ 4.409641] x5 : 0000000000000200 x4 : 0000000002000000 x3 : 0000000000000000 [ 4.416781] x2 : 0000000000022202 x1 : 0000000000000000 x0 : 0000000000000000 [ 4.423921] Call trace: [ 4.426362] gpiod_direction_output+0x34/0x5c (P) [ 4.431067] gpiod_direction_output+0x18/0x5c (L) [ 4.435771] dspi_setup+0x220/0x334
--- drivers/spi/spi-fsl-dspi.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/spi/spi-fsl-dspi.c +5 -1
@@ -1003,6 +1003,7 @@ static int dspi_setup(struct spi_device *spi)u32 cs_sck_delay =0 , sck_cs_delay =0 ;struct fsl_dspi_platform_data *pdata;unsigned char pasc =0 , asc =0 ; +struct gpio_desc *gpio_cs;struct chip_data *chip;unsigned long clkrate;bool cs = true;
@@ -1077,7 +1078,10 @@ static int dspi_setup(struct spi_device *spi) chip->ctar_val |=SPI_CTAR_LSBFE ; } -gpiod_direction_output (spi_get_csgpiod (spi,0 ), false); + gpio_cs =spi_get_csgpiod (spi,0 ); +if (gpio_cs) +gpiod_direction_output (gpio_cs, false); +dspi_deassert_cs (spi, &cs);spi_set_ctldata (spi, chip);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 153/245 riscv: vdso: Prevent the compiler from inserting calls to memset()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandre Ghiti <[email protected]>
[ Upstream commit bf40167d54d55d4b54d0103713d86a8638fb9290 ]
The compiler is smart enough to insert a call to memset() in riscv_vdso_get_cpus(), which generates a dynamic relocation.
So prevent this by using -fno-builtin option.
--- arch/riscv/kernel/vdso/Makefile | 1 + 1 file changed, 1 insertion(+)
arch/riscv/kernel/vdso/Makefile +1 -0
@@ -18,6 +18,7 @@ obj-vdso = $(patsubst %, %.o, $(vdso-syms)) note.o ccflags-y := -fno-stack-protector ccflags-y += -DDISABLE_BRANCH_PROFILING +ccflags-y += -fno-builtin ifneq ($(c-gettimeofday-y),) CFLAGS_vgettimeofday.o += -fPIC -include $(c-gettimeofday-y)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 154/245 Input: edt-ft5x06 - fix regmap leak when probe fails
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Torokhov <[email protected]>
[ Upstream commit bffdf9d7e51a7be8eeaac2ccf9e54a5fde01ff65 ]
The driver neglects to free the instance of I2C regmap constructed at the beginning of the edt_ft5x06_ts_probe() method when probe fails. Additionally edt_ft5x06_ts_remove() is freeing the regmap too early, before the rest of the device resources that are managed by devm are released.
Fix this by installing a custom devm action that will ensure that the regmap is released at the right time during normal teardown as well as in case of probe failure.
Note that devm_regmap_init_i2c() could not be used because the driver may replace the original regmap with a regmap specific for M06 devices in the middle of the probe, and using devm_regmap_init_i2c() would result in releasing the M06 regmap too early.
--- drivers/input/touchscreen/edt-ft5x06.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-)
drivers/input/touchscreen/edt-ft5x06.c +18 -1
@@ -1121,6 +1121,14 @@ static void edt_ft5x06_ts_set_regs(struct edt_ft5x06_ts_data *tsdata) } } +static void edt_ft5x06_exit_regmap (void *arg) +{ +struct edt_ft5x06_ts_data *data = arg; + +if (!IS_ERR_OR_NULL (data->regmap)) +regmap_exit (data->regmap); +} +static void edt_ft5x06_disable_regulators (void *arg) {struct edt_ft5x06_ts_data *data = arg;
@@ -1154,6 +1162,16 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client)return PTR_ERR (tsdata->regmap); } +/* +* We are not using devm_regmap_init_i2c() and instead install a +* custom action because we may replace regmap with M06-specific one +* and we need to make sure that it will not be released too early. +*/ + error =devm_add_action_or_reset (&client->dev, edt_ft5x06_exit_regmap, + tsdata); +if (error) +return error; + chip_data =device_get_match_data (&client->dev);if (!chip_data) chip_data = (const struct edt_i2c_chip_data *)id->driver_data;
@@ -1347,7 +1365,6 @@ static void edt_ft5x06_ts_remove(struct i2c_client *client)struct edt_ft5x06_ts_data *tsdata =i2c_get_clientdata (client);edt_ft5x06_ts_teardown_debugfs (tsdata); -regmap_exit (tsdata->regmap); }static int edt_ft5x06_ts_suspend (struct device *dev)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 155/245 ALSA: hda/realtek: Limit internal Mic boost on Dell platform
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kailang Yang <[email protected]>
[ Upstream commit 78e7be018784934081afec77f96d49a2483f9188 ]
Dell want to limit internal Mic boost on all Dell platform.
--- sound/pci/hda/patch_realtek.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-)
sound/pci/hda/patch_realtek.c +18 -3
@@ -7507,6 +7507,7 @@ enum {ALC286_FIXUP_SONY_MIC_NO_PRESENCE ,ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT ,ALC269_FIXUP_DELL1_MIC_NO_PRESENCE , +ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST ,ALC269_FIXUP_DELL2_MIC_NO_PRESENCE ,ALC269_FIXUP_DELL3_MIC_NO_PRESENCE , ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
@@ -7541,6 +7542,7 @@ enum {ALC255_FIXUP_ACER_MIC_NO_PRESENCE ,ALC255_FIXUP_ASUS_MIC_NO_PRESENCE ,ALC255_FIXUP_DELL1_MIC_NO_PRESENCE , +ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST ,ALC255_FIXUP_DELL2_MIC_NO_PRESENCE ,ALC255_FIXUP_HEADSET_MODE , ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
@@ -8102,6 +8104,12 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id =ALC269_FIXUP_HEADSET_MODE }, + [ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc269_fixup_limit_int_mic_boost, + .chained = true, + .chain_id =ALC269_FIXUP_DELL1_MIC_NO_PRESENCE + }, [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = { .type = HDA_FIXUP_PINS, .v.pins = (const struct hda_pintbl []) {
@@ -8382,6 +8390,12 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id =ALC255_FIXUP_HEADSET_MODE }, + [ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc269_fixup_limit_int_mic_boost, + .chained = true, + .chain_id =ALC255_FIXUP_DELL1_MIC_NO_PRESENCE + }, [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = { .type = HDA_FIXUP_PINS, .v.pins = (const struct hda_pintbl []) {
@@ -11050,6 +11064,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = { {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"}, {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"}, {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"}, + {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET, .name = "dell-headset4-quiet"}, {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"}, {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"}, {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
@@ -11604,16 +11619,16 @@ static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {SND_HDA_PIN_QUIRK (0x10ec0289 ,0x1028 ,"Dell" ,ALC269_FIXUP_DELL4_MIC_NO_PRESENCE , {0x19, 0x40000000}, {0x1b, 0x40000000}), -SND_HDA_PIN_QUIRK (0x10ec0295 ,0x1028 ,"Dell" ,ALC269_FIXUP_DELL4_MIC_NO_PRESENCE , +SND_HDA_PIN_QUIRK (0x10ec0295 ,0x1028 ,"Dell" ,ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET , {0x19, 0x40000000}, {0x1b, 0x40000000}),SND_HDA_PIN_QUIRK (0x10ec0256 ,0x1028 ,"Dell" ,ALC255_FIXUP_DELL1_MIC_NO_PRESENCE , {0x19, 0x40000000}, {0x1a, 0x40000000}), -SND_HDA_PIN_QUIRK (0x10ec0236 ,0x1028 ,"Dell" ,ALC255_FIXUP_DELL1_MIC_NO_PRESENCE , +SND_HDA_PIN_QUIRK (0x10ec0236 ,0x1028 ,"Dell" ,ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST , {0x19, 0x40000000}, {0x1a, 0x40000000}), -SND_HDA_PIN_QUIRK (0x10ec0274 ,0x1028 ,"Dell" ,ALC274_FIXUP_DELL_AIO_LINEOUT_VERB , +SND_HDA_PIN_QUIRK (0x10ec0274 ,0x1028 ,"Dell" ,ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST , {0x19, 0x40000000}, {0x1a, 0x40000000}), SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC2XX_FIXUP_HEADSET_MIC,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 156/245 riscv: efi: Set NX compat flag in PE/COFF header
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heinrich Schuchardt <[email protected]>
[ Upstream commit d41373a4b910961df5a5e3527d7bde6ad45ca438 ]
The IMAGE_DLLCHARACTERISTICS_NX_COMPAT informs the firmware that the EFI binary does not rely on pages that are both executable and writable.
The flag is used by some distro versions of GRUB to decide if the EFI binary may be executed.
As the Linux kernel neither has RWX sections nor needs RWX pages for relocation we should set the flag.
--- arch/riscv/kernel/efi-header.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/kernel/efi-header.S +1 -1
@@ -64,7 +64,7 @@ extra_header_fields: .long efi_header_end - _start // SizeOfHeaders .long 0 // CheckSum .short IMAGE_SUBSYSTEM_EFI_APPLICATION // Subsystem - .short 0 // DllCharacteristics + .short IMAGE_DLL_CHARACTERISTICS_NX_COMPAT // DllCharacteristics .quad 0 // SizeOfStackReserve .quad 0 // SizeOfStackCommit .quad 0 // SizeOfHeapReserve
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 157/245 riscv: Prevent a bad reference count on CPU nodes
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miquel Sabaté Solà <[email protected]>
[ Upstream commit 37233169a6ea912020c572f870075a63293b786a ]
When populating cache leaves we previously fetched the CPU device node at the very beginning. But when ACPI is enabled we go through a specific branch which returns early and does not call 'of_node_put' for the node that was acquired.
Since we are not using a CPU device node for the ACPI code anyways, we can simply move the initialization of it just passed the ACPI block, and we are guaranteed to have an 'of_node_put' call for the acquired node. This prevents a bad reference count of the CPU device node.
Moreover, the previous function did not check for errors when acquiring the device node, so a return -ENOENT has been added for that case.
--- arch/riscv/kernel/cacheinfo.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
arch/riscv/kernel/cacheinfo.c +5 -2
@@ -75,8 +75,7 @@ int populate_cache_leaves(unsigned int cpu) {struct cpu_cacheinfo *this_cpu_ci =get_cpu_cacheinfo (cpu);struct cacheinfo *this_leaf = this_cpu_ci->info_list; -struct device_node *np =of_cpu_device_node_get (cpu); -struct device_node *prev =NULL ; +struct device_node *np, *prev;int levels =1 , level =1 ;if (!acpi_disabled) {
@@ -100,6 +99,10 @@ int populate_cache_leaves(unsigned int cpu)return 0 ; } + np =of_cpu_device_node_get (cpu); +if (!np) +return -ENOENT ; +if (of_property_read_bool (np,"cache-size" ))ci_leaf_init (this_leaf++,CACHE_TYPE_UNIFIED , level);if (of_property_read_bool (np,"i-cache-size" ))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 158/245 riscv: Use %u to format the output of cpu
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: WangYuli <[email protected]>
[ Upstream commit e0872ab72630dada3ae055bfa410bf463ff1d1e0 ]
'cpu' is an unsigned integer, so its conversion specifier should be %u, not %d.
--- arch/riscv/kernel/cpu-hotplug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/kernel/cpu-hotplug.c +1 -1
@@ -58,7 +58,7 @@ void arch_cpuhp_cleanup_dead_cpu(unsigned int cpu)if (cpu_ops->cpu_is_stopped) ret = cpu_ops->cpu_is_stopped (cpu);if (ret) -pr_warn ("CPU%d may not have stopped: %d\n" , cpu, ret); +pr_warn ("CPU%u may not have stopped: %d\n" , cpu, ret); }/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 159/245 riscv: Remove unused GENERATING_ASM_OFFSETS
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chunyan Zhang <[email protected]>
[ Upstream commit 46d4e5ac6f2f801f97bcd0ec82365969197dc9b1 ]
The macro is not used in the current version of kernel, it looks like can be removed to avoid a build warning:
../arch/riscv/kernel/asm-offsets.c: At top level:../arch/riscv/kernel/asm-offsets.c:7: warning: macro "GENERATING_ASM_OFFSETS" is not used [-Wunused-macros]
7 | #define GENERATING_ASM_OFFSETS
--- arch/riscv/kernel/asm-offsets.c | 2 -- 1 file changed, 2 deletions(-)
arch/riscv/kernel/asm-offsets.c +0 -2
@@ -4,8 +4,6 @@* Copyright (C) 2017 SiFive */ -#define GENERATING_ASM_OFFSETS -#include <linux/kbuild.h> #include <linux/mm.h> #include <linux/sched.h>
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 160/245 riscv: Remove duplicated GET_RM
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chunyan Zhang <[email protected]>
[ Upstream commit 164f66de6bb6ef454893f193c898dc8f1da6d18b ]
The macro GET_RM defined twice in this file, one can be removed.
--- arch/riscv/kernel/traps_misaligned.c | 2 -- 1 file changed, 2 deletions(-)
arch/riscv/kernel/traps_misaligned.c +0 -2
@@ -136,8 +136,6 @@#define REG_PTR (insn, pos, regs) \ (ulong *)((ulong)(regs) + REG_OFFSET(insn, pos)) -#define GET_RM (insn) (((insn) >> 12) & 7) -#define GET_RS1 (insn, regs) (*REG_PTR(insn, SH_RS1, regs))#define GET_RS2 (insn, regs) (*REG_PTR(insn, SH_RS2, regs))#define GET_RS1S (insn, regs) (*REG_PTR(RVC_RS1S(insn), 0, regs))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 161/245 scsi: ufs: core: Fix another deadlock during RTC update
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Wang <[email protected]>
[ Upstream commit cb7e509c4e0197f63717fee54fb41c4990ba8d3a ]
If ufshcd_rtc_work calls ufshcd_rpm_put_sync() and the pm's usage_count is 0, we will enter the runtime suspend callback. However, the runtime suspend callback will wait to flush ufshcd_rtc_work, causing a deadlock.
Replace ufshcd_rpm_put_sync() with ufshcd_rpm_put() to avoid the deadlock.
--- drivers/ufs/core/ufshcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/ufs/core/ufshcd.c +1 -1
@@ -8224,7 +8224,7 @@ static void ufshcd_update_rtc(struct ufs_hba *hba) err =ufshcd_query_attr (hba,UPIU_QUERY_OPCODE_WRITE_ATTR ,QUERY_ATTR_IDN_SECONDS_PASSED ,0 ,0 , &val); -ufshcd_rpm_put_sync (hba); +ufshcd_rpm_put (hba);if (err)dev_err (hba->dev,"%s: Failed to update rtc %d\n" , __func__, err);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 162/245 cxl/port: Fix cxl_bus_rescan() vs bus_rescan_devices()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Williams <[email protected]>
[ Upstream commit 3d6ebf16438de5d712030fefbb4182b46373d677 ]
It turns out since its original introduction, pre-2.6.12, bus_rescan_devices() has skipped devices that might be in the process of attaching or detaching from their driver. For CXL this behavior is unwanted and expects that cxl_bus_rescan() is a probe barrier.
That behavior is simple enough to achieve with bus_for_each_dev() paired with call to device_attach(), and it is unclear why bus_rescan_devices() took the position of lockless consumption of dev->driver which is racy.
The "Fixes:" but no "Cc: stable" on this patch reflects that the issue is merely by inspection since the bug that triggered the discovery of this potential problem [1] is fixed by other means. However, a stable backport should do no harm.
--- drivers/cxl/core/port.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/cxl/core/port.c +10 -3
@@ -2088,11 +2088,18 @@ static void cxl_bus_remove(struct device *dev)static struct workqueue_struct *cxl_bus_wq; -static void cxl_bus_rescan_queue (struct work_struct *w) +static int cxl_rescan_attach (struct device *dev,void *data) { -int rc =bus_rescan_devices (&cxl_bus_type); +int rc =device_attach (dev); + +dev_vdbg (dev,"rescan: %s\n" , rc ?"attach" :"detached" ); -pr_debug ("CXL bus rescan result: %d\n" , rc); +return 0 ; +} + +static void cxl_bus_rescan_queue (struct work_struct *w) +{ +bus_for_each_dev (&cxl_bus_type,NULL ,NULL , cxl_rescan_attach); }void cxl_bus_rescan (void )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 163/245 cxl/acpi: Ensure ports ready at cxl_acpi_probe() return
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Williams <[email protected]>
[ Upstream commit 48f62d38a07d464a499fa834638afcfd2b68f852 ]
In order to ensure root CXL ports are enabled upon cxl_acpi_probe() when the 'cxl_port' driver is built as a module, arrange for the module to be pre-loaded or built-in.
The "Fixes:" but no "Cc: stable" on this patch reflects that the issue is merely by inspection since the bug that triggered the discovery of this potential problem [1] is fixed by other means. However, a stable backport should do no harm.
--- drivers/cxl/acpi.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/cxl/acpi.c +7 -0
@@ -924,6 +924,13 @@ static void __exit cxl_acpi_exit(void)/* load before dax_hmem sees 'Soft Reserved' CXL ranges */ subsys_initcall (cxl_acpi_init); + +/* +* Arrange for host-bridge ports to be active synchronous with +* cxl_acpi_probe() exit. +*/ +MODULE_SOFTDEP ("pre: cxl_port" ); +module_exit (cxl_acpi_exit);MODULE_DESCRIPTION ("CXL ACPI: Platform Support" );MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 164/245 sched/numa: Fix the potential null pointer dereference in task_numa_work()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shawn Wang <[email protected]>
[ Upstream commit 9c70b2a33cd2aa6a5a59c5523ef053bd42265209 ]
When running stress-ng-vm-segv test, we found a null pointer dereference error in task_numa_work(). Here is the backtrace:
[323676.066985] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000020 ...... [323676.067108] CPU: 35 PID: 2694524 Comm: stress-ng-vm-se ...... [323676.067113] pstate: 23401009 (nzCv daif +PAN -UAO +TCO +DIT +SSBS BTYPE=--) [323676.067115] pc : vma_migratable+0x1c/0xd0 [323676.067122] lr : task_numa_work+0x1ec/0x4e0 [323676.067127] sp : ffff8000ada73d20 [323676.067128] x29: ffff8000ada73d20 x28: 0000000000000000 x27: 000000003e89f010 [323676.067130] x26: 0000000000080000 x25: ffff800081b5c0d8 x24: ffff800081b27000 [323676.067133] x23: 0000000000010000 x22: 0000000104d18cc0 x21: ffff0009f7158000 [323676.067135] x20: 0000000000000000 x19: 0000000000000000 x18: ffff8000ada73db8 [323676.067138] x17: 0001400000000000 x16: ffff800080df40b0 x15: 0000000000000035 [323676.067140] x14: ffff8000ada73cc8 x13: 1fffe0017cc72001 x12: ffff8000ada73cc8 [323676.067142] x11: ffff80008001160c x10: ffff000be639000c x9 : ffff8000800f4ba4 [323676.067145] x8 : ffff000810375000 x7 : ffff8000ada73974 x6 : 0000000000000001 [323676.067147] x5 : 0068000b33e26707 x4 : 0000000000000001 x3 : ffff0009f7158000 [323676.067149] x2 : 0000000000000041 x1 : 0000000000004400 x0 : 0000000000000000 [323676.067152] Call trace: [323676.067153] vma_migratable+0x1c/0xd0 [323676.067155] task_numa_work+0x1ec/0x4e0 [323676.067157] task_work_run+0x78/0xd8 [323676.067161] do_notify_resume+0x1ec/0x290 [323676.067163] el0_svc+0x150/0x160 [323676.067167] el0t_64_sync_handler+0xf8/0x128 [323676.067170] el0t_64_sync+0x17c/0x180 [323676.067173] Code: d2888001 910003fd f9000bf3 aa0003f3 (f9401000) [323676.067177] SMP: stopping secondary CPUs [323676.070184] Starting crashdump kernel...
stress-ng-vm-segv in stress-ng is used to stress test the SIGSEGV error handling function of the system, which tries to cause a SIGSEGV error on return from unmapping the whole address space of the child process.
Normally this program will not cause kernel crashes. But before the munmap system call returns to user mode, a potential task_numa_work() for numa balancing could be added and executed. In this scenario, since the child process has no vma after munmap, the vma_next() in task_numa_work() will return a null pointer even if the vma iterator restarts from 0.
Recheck the vma pointer before dereferencing it in task_numa_work().
--- kernel/sched/fair.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/sched/fair.c +2 -2
@@ -3289,7 +3289,7 @@ static void task_numa_work(struct callback_head *work) vma =vma_next (&vmi); } - do { +for (; vma; vma =vma_next (&vmi)) {if (!vma_migratable (vma) || !vma_policy_mof (vma) ||is_vm_hugetlb_page (vma) || (vma->vm_flags &VM_MIXEDMAP )) {trace_sched_skip_vma_numa (mm, vma,NUMAB_SKIP_UNSUITABLE );
@@ -3411,7 +3411,7 @@ static void task_numa_work(struct callback_head *work)*/ if (vma_pids_forced)break ; - }for_each_vma (vmi, vma); + }/* * If no VMAs are remaining and VMAs were skipped due to the PID
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 165/245 posix-cpu-timers: Clear TICK_DEP_BIT_POSIX_TIMER on clone
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Segall <[email protected]>
[ Upstream commit b5413156bad91dc2995a5c4eab1b05e56914638a ]
When cloning a new thread, its posix_cputimers are not inherited, and are cleared by posix_cputimers_init(). However, this does not clear the tick dependency it creates in tsk->tick_dep_mask, and the handler does not reach the code to clear the dependency if there were no timers to begin with.
Thus if a thread has a cputimer running before clone/fork, all descendants will prevent nohz_full unless they create a cputimer of their own.
Fix this by entirely clearing the tick_dep_mask in copy_process(). (There is currently no inherited state that needs a tick dependency)
Process-wide timers do not have this problem because fork does not copy signal_struct as a baseline, it creates one from scratch.
--- include/linux/tick.h | 8 ++++++++ kernel/fork.c | 2 ++ 2 files changed, 10 insertions(+)
include/linux/tick.h +8 -0
@@ -251,12 +251,19 @@ static inline void tick_dep_set_task(struct task_struct *tsk,if (tick_nohz_full_enabled ())tick_nohz_dep_set_task (tsk, bit); } +static inline void tick_dep_clear_task (struct task_struct *tsk,enum tick_dep_bits bit) {if (tick_nohz_full_enabled ())tick_nohz_dep_clear_task (tsk, bit); } + +static inline void tick_dep_init_task (struct task_struct *tsk) +{ +atomic_set (&tsk->tick_dep_mask,0 ); +} +static inline void tick_dep_set_signal (struct task_struct *tsk,enum tick_dep_bits bit) {
@@ -290,6 +297,7 @@ static inline void tick_dep_set_task(struct task_struct *tsk, enum tick_dep_bits bit) { }static inline void tick_dep_clear_task (struct task_struct *tsk,enum tick_dep_bits bit) { } +static inline void tick_dep_init_task (struct task_struct *tsk) { }static inline void tick_dep_set_signal (struct task_struct *tsk,enum tick_dep_bits bit) { } static inline void tick_dep_clear_signal(struct signal_struct *signal,
kernel/fork.c +2 -0
@@ -104,6 +104,7 @@#include <linux/rseq.h> #include <uapi/linux/pidfd.h> #include <linux/pidfs.h> +#include <linux/tick.h> #include <asm/pgalloc.h> #include <linux/uaccess.h>
@@ -2290,6 +2291,7 @@ __latent_entropy struct task_struct *copy_process(acct_clear_integrals (p);posix_cputimers_init (&p->posix_cputimers); +tick_dep_init_task (p); p->io_context =NULL ;audit_set_context (p,NULL );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 166/245 iov_iter: fix copy_page_from_iter_atomic() if KMAP_LOCAL_FORCE_MAP
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hugh Dickins <[email protected]>
[ Upstream commit c749d9b7ebbc5716af7a95f7768634b30d9446ec ]
generic/077 on x86_32 CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP=y with highmem, on huge=always tmpfs, issues a warning and then hangs (interruptibly):
WARNING: CPU: 5 PID: 3517 at mm/highmem.c:622 kunmap_local_indexed+0x62/0xc9 CPU: 5 UID: 0 PID: 3517 Comm: cp Not tainted 6.12.0-rc4 #2 ... copy_page_from_iter_atomic+0xa6/0x5ec generic_perform_write+0xf6/0x1b4 shmem_file_write_iter+0x54/0x67
Fix copy_page_from_iter_atomic() by limiting it in that case (include/linux/skbuff.h skb_frag_must_loop() does similar).
But going forward, perhaps CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is too surprising, has outlived its usefulness, and should just be removed?
--- lib/iov_iter.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
lib/iov_iter.c +4 -2
@@ -461,6 +461,8 @@ size_t copy_page_from_iter_atomic(struct page *page, size_t offset, size_t bytes, struct iov_iter *i) { size_t n, copied = 0; +bool uses_kmap =IS_ENABLED (CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP ) || +PageHighMem (page);if (!page_copy_sane (page, offset, bytes))return 0 ;
@@ -471,7 +473,7 @@ size_t copy_page_from_iter_atomic(struct page *page, size_t offset,char *p; n = bytes - copied; -if (PageHighMem (page)) { +if (uses_kmap) { page += offset /PAGE_SIZE ; offset %=PAGE_SIZE ; n =min_t (size_t, n,PAGE_SIZE - offset);
@@ -482,7 +484,7 @@ size_t copy_page_from_iter_atomic(struct page *page, size_t offset,kunmap_atomic (p); copied += n; offset += n; - }while (PageHighMem (page) && copied != bytes && n >0 ); + }while (uses_kmap && copied != bytes && n >0 );return copied; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 167/245 tpm: Return tpm2_sessions_init() when null key creation fails
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jarkko Sakkinen <[email protected]>
[ Upstream commit d658d59471ed80c4a8aaf082ccc3e83cdf5ae4c1 ]
Do not continue tpm2_sessions_init() further if the null key pair creation fails.
--- drivers/char/tpm/tpm2-sessions.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/char/tpm/tpm2-sessions.c +9 -2
@@ -1347,14 +1347,21 @@ static int tpm2_create_null_primary(struct tpm_chip *chip)* * Derive and context save the null primary and allocate memory in the * struct tpm_chip for the authorizations. +* +* Return: +* * 0 - OK +* * -errno - A system error +* * TPM_RC - A TPM error */ int tpm2_sessions_init (struct tpm_chip *chip) {int rc; rc =tpm2_create_null_primary (chip); -if (rc) -dev_err (&chip->dev,"TPM: security failed (NULL seed derivation): %d\n" , rc); +if (rc) { +dev_err (&chip->dev,"null key creation failed with %d\n" , rc); +return rc; + } chip->auth =kmalloc (sizeof (*chip->auth),GFP_KERNEL );if (!chip->auth)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 168/245 tpm: Rollback tpm2_load_null()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jarkko Sakkinen <[email protected]>
[ Upstream commit cc7d8594342a25693d40fe96f97e5c6c29ee609c ]
Do not continue on tpm2_create_primary() failure in tpm2_load_null().
--- drivers/char/tpm/tpm2-sessions.c | 44 +++++++++++++++++--------------- 1 file changed, 24 insertions(+), 20 deletions(-)
drivers/char/tpm/tpm2-sessions.c +24 -20
@@ -915,33 +915,37 @@ static int tpm2_parse_start_auth_session(struct tpm2_auth *auth,static int tpm2_load_null (struct tpm_chip *chip,u32 *null_key) { -int rc;unsigned int offset =0 ;/* dummy offset for null seed context */ u8 name[SHA256_DIGEST_SIZE +2 ]; +u32 tmp_null_key; +int rc; rc =tpm2_load_context (chip, chip->null_key_context, &offset, - null_key); -if (rc != -EINVAL ) -return rc; + &tmp_null_key); +if (rc != -EINVAL ) { +if (!rc) + *null_key = tmp_null_key; + goto err; + } -/* an integrity failure may mean the TPM has been reset */ -dev_err (&chip->dev,"NULL key integrity failure!\n" ); -/* check the null name against what we know */ -tpm2_create_primary (chip,TPM2_RH_NULL ,NULL , name); -if (memcmp (name, chip->null_key_name,sizeof (name)) ==0 ) -/* name unchanged, assume transient integrity failure */ -return rc; -/* -* Fatal TPM failure: the NULL seed has actually changed, so -* the TPM must have been illegally reset. All in-kernel TPM -* operations will fail because the NULL primary can't be -* loaded to salt the sessions, but disable the TPM anyway so -* userspace programmes can't be compromised by it. -*/ -dev_err (&chip->dev,"NULL name has changed, disabling TPM due to interference\n" ); +/* Try to re-create null key, given the integrity failure: */ + rc =tpm2_create_primary (chip,TPM2_RH_NULL , &tmp_null_key, name); +if (rc) + goto err; + +/* Return null key if the name has not been changed: */ +if (!memcmp (name, chip->null_key_name,sizeof (name))) { + *null_key = tmp_null_key; +return 0 ; + } + +/* Deduce from the name change TPM interference: */ +dev_err (&chip->dev,"null key integrity check failed\n" ); +tpm2_flush_context (chip, tmp_null_key); chip->flags |=TPM_CHIP_FLAG_DISABLE ; -return rc; +err: +return rc ? -ENODEV :0 ; }/**
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 169/245 drm/amd/pm: Vangogh: Fix kernel memory out of bounds write
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tvrtko Ursulin <[email protected]>
[ Upstream commit 4aa923a6e6406b43566ef6ac35a3d9a3197fa3e8 ]
KASAN reports that the GPU metrics table allocated in vangogh_tables_init() is not large enough for the memset done in smu_cmn_init_soft_gpu_metrics(). Condensed report follows:
[ 33.861314] BUG: KASAN: slab-out-of-bounds in smu_cmn_init_soft_gpu_metrics+0x73/0x200 [amdgpu] [ 33.861799] Write of size 168 at addr ffff888129f59500 by task mangoapp/1067 ... [ 33.861808] CPU: 6 UID: 1000 PID: 1067 Comm: mangoapp Tainted: G W 6.12.0-rc4 #356 1a56f59a8b5182eeaf67eb7cb8b13594dd23b544 [ 33.861816] Tainted: [W]=WARN [ 33.861818] Hardware name: Valve Galileo/Galileo, BIOS F7G0107 12/01/2023 [ 33.861822] Call Trace: [ 33.861826] <TASK> [ 33.861829] dump_stack_lvl+0x66/0x90 [ 33.861838] print_report+0xce/0x620 [ 33.861853] kasan_report+0xda/0x110 [ 33.862794] kasan_check_range+0xfd/0x1a0 [ 33.862799] __asan_memset+0x23/0x40 [ 33.862803] smu_cmn_init_soft_gpu_metrics+0x73/0x200 [amdgpu 13b1bc364ec578808f676eba412c20eaab792779] [ 33.863306] vangogh_get_gpu_metrics_v2_4+0x123/0xad0 [amdgpu 13b1bc364ec578808f676eba412c20eaab792779] [ 33.864257] vangogh_common_get_gpu_metrics+0xb0c/0xbc0 [amdgpu 13b1bc364ec578808f676eba412c20eaab792779] [ 33.865682] amdgpu_dpm_get_gpu_metrics+0xcc/0x110 [amdgpu 13b1bc364ec578808f676eba412c20eaab792779] [ 33.866160] amdgpu_get_gpu_metrics+0x154/0x2d0 [amdgpu 13b1bc364ec578808f676eba412c20eaab792779] [ 33.867135] dev_attr_show+0x43/0xc0 [ 33.867147] sysfs_kf_seq_show+0x1f1/0x3b0 [ 33.867155] seq_read_iter+0x3f8/0x1140 [ 33.867173] vfs_read+0x76c/0xc50 [ 33.867198] ksys_read+0xfb/0x1d0 [ 33.867214] do_syscall_64+0x90/0x160 ... [ 33.867353] Allocated by task 378 on cpu 7 at 22.794876s: [ 33.867358] kasan_save_stack+0x33/0x50 [ 33.867364] kasan_save_track+0x17/0x60 [ 33.867367] __kasan_kmalloc+0x87/0x90 [ 33.867371] vangogh_init_smc_tables+0x3f9/0x840 [amdgpu] [ 33.867835] smu_sw_init+0xa32/0x1850 [amdgpu] [ 33.868299] amdgpu_device_init+0x467b/0x8d90 [amdgpu] [ 33.868733] amdgpu_driver_load_kms+0x19/0xf0 [amdgpu] [ 33.869167] amdgpu_pci_probe+0x2d6/0xcd0 [amdgpu] [ 33.869608] local_pci_probe+0xda/0x180 [ 33.869614] pci_device_probe+0x43f/0x6b0
Empirically we can confirm that the former allocates 152 bytes for the table, while the latter memsets the 168 large block.
Root cause appears that when GPU metrics tables for v2_4 parts were added it was not considered to enlarge the table to fit.
The fix in this patch is rather "brute force" and perhaps later should be done in a smarter way, by extracting and consolidating the part version to size logic to a common helper, instead of brute forcing the largest possible allocation. Nevertheless, for now this works and fixes the out of bounds write.
v2:
* Drop impossible v3_0 case. (Mario)
--- drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c +3 -1
@@ -242,7 +242,9 @@ static int vangogh_tables_init(struct smu_context *smu) goto err0_out; smu_table->metrics_time =0 ; - smu_table->gpu_metrics_table_size =max (sizeof (struct gpu_metrics_v2_3 ),sizeof (struct gpu_metrics_v2_2 )); + smu_table->gpu_metrics_table_size =sizeof (struct gpu_metrics_v2_2 ); + smu_table->gpu_metrics_table_size =max (smu_table->gpu_metrics_table_size,sizeof (struct gpu_metrics_v2_3 )); + smu_table->gpu_metrics_table_size =max (smu_table->gpu_metrics_table_size,sizeof (struct gpu_metrics_v2_4 )); smu_table->gpu_metrics_table =kzalloc (smu_table->gpu_metrics_table_size,GFP_KERNEL );if (!smu_table->gpu_metrics_table) goto err1_out;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 170/245 drm/amdgpu/smu13: fix profile reporting
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit 935abb86a95def8c20dbb184ce30051db168e541 ]
The following 3 commits landed in parallel:
commit d7d2688bf4ea ("drm/amd/pm: update workload mask after the setting") commit 7a1613e47e65 ("drm/amdgpu/smu13: always apply the powersave optimization") commit 7c210ca5a2d7 ("drm/amdgpu: handle default profile on on devices without fullscreen 3D") While everything is set correctly, this caused the profile to be
reported incorrectly because both the powersave and fullscreen3d bits
were set in the mask and when the driver prints the profile, it looks
for the first bit set.
--- drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c +3 -3
@@ -2485,7 +2485,7 @@ static int smu_v13_0_0_set_power_profile_mode(struct smu_context *smu,DpmActivityMonitorCoeffInt_t *activity_monitor = &(activity_monitor_external.DpmActivityMonitorCoeffInt);int workload_type, ret =0 ; -u32 workload_mask; +u32 workload_mask, selected_workload_mask; smu->power_profile_mode = input[size];
@@ -2552,7 +2552,7 @@ static int smu_v13_0_0_set_power_profile_mode(struct smu_context *smu,if (workload_type <0 )return -EINVAL ; - workload_mask =1 << workload_type; + selected_workload_mask = workload_mask =1 << workload_type;/* Add optimizations for SMU13.0.0/10. Reuse the power saving profile */ if ((amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 0) &&
@@ -2572,7 +2572,7 @@ static int smu_v13_0_0_set_power_profile_mode(struct smu_context *smu, workload_mask, NULL);if (!ret) - smu->workload_mask = workload_mask; + smu->workload_mask = selected_workload_mask;return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 171/245 tpm: Lazily flush the auth session
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jarkko Sakkinen <[email protected]>
[ Upstream commit df745e25098dcb2f706399c0d06dd8d1bab6b6ec ]
Move the allocation of chip->auth to tpm2_start_auth_session() so that this field can be used as flag to tell whether auth session is active or not.
Instead of flushing and reloading the auth session for every transaction separately, keep the session open unless /dev/tpm0 is used.
--- drivers/char/tpm/tpm-chip.c | 10 +++++++ drivers/char/tpm/tpm-dev-common.c | 3 +++ drivers/char/tpm/tpm-interface.c | 6 +++-- drivers/char/tpm/tpm2-sessions.c | 45 ++++++++++++++++++------------- 4 files changed, 44 insertions(+), 20 deletions(-)
drivers/char/tpm/tpm-chip.c +10 -0
@@ -674,6 +674,16 @@ EXPORT_SYMBOL_GPL(tpm_chip_register);*/ void tpm_chip_unregister (struct tpm_chip *chip) { +#ifdef CONFIG_TCG_TPM2_HMAC +int rc; + + rc =tpm_try_get_ops (chip); +if (!rc) { +tpm2_end_auth_session (chip); +tpm_put_ops (chip); + } +#endif +tpm_del_legacy_sysfs (chip);if (tpm_is_hwrng_enabled (chip))hwrng_unregister (&chip->hwrng);
drivers/char/tpm/tpm-dev-common.c +3 -0
@@ -27,6 +27,9 @@ static ssize_t tpm_dev_transmit(struct tpm_chip *chip, struct tpm_space *space,struct tpm_header *header = (void *)buf;ssize_t ret, len; +if (chip->flags &TPM_CHIP_FLAG_TPM2 ) +tpm2_end_auth_session (chip); + ret =tpm2_prepare_space (chip, space, buf, bufsiz);/* If the command is not implemented by the TPM, synthesize a * response with a TPM2_RC_COMMAND_CODE return for user-space.
drivers/char/tpm/tpm-interface.c +4 -2
@@ -379,10 +379,12 @@ int tpm_pm_suspend(struct device *dev) rc =tpm_try_get_ops (chip);if (!rc) { -if (chip->flags &TPM_CHIP_FLAG_TPM2 ) +if (chip->flags &TPM_CHIP_FLAG_TPM2 ) { +tpm2_end_auth_session (chip);tpm2_shutdown (chip,TPM2_SU_STATE ); -else + }else { rc =tpm1_pm_suspend (chip, tpm_suspend_pcr); + }tpm_put_ops (chip); }
drivers/char/tpm/tpm2-sessions.c +27 -18
112 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 172/245 mptcp: init: protect sched with rcu_read_lock
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu Baerts (NGI0) <[email protected]>
[ Upstream commit 3deb12c788c385e17142ce6ec50f769852fcec65 ]
Enabling CONFIG_PROVE_RCU_LIST with its dependence CONFIG_RCU_EXPERT creates this splat when an MPTCP socket is created:
=============================
WARNING: suspicious RCU usage
6.12.0-rc2+ #11 Not tainted
-----------------------------
net/mptcp/sched.c:44 RCU-list traversed in non-reader section!!
other info that might help us debug this:
rcu_scheduler_active = 2, debug_locks = 1
no locks held by mptcp_connect/176.
stack backtrace: CPU: 0 UID: 0 PID: 176 Comm: mptcp_connect Not tainted 6.12.0-rc2+ #11 Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 Call Trace: <TASK> dump_stack_lvl (lib/dump_stack.c:123) lockdep_rcu_suspicious (kernel/locking/lockdep.c:6822) mptcp_sched_find (net/mptcp/sched.c:44 (discriminator 7)) mptcp_init_sock (net/mptcp/protocol.c:2867 (discriminator 1)) ? sock_init_data_uid (arch/x86/include/asm/atomic.h:28) inet_create.part.0.constprop.0 (net/ipv4/af_inet.c:386) ? __sock_create (include/linux/rcupdate.h:347 (discriminator 1)) __sock_create (net/socket.c:1576) __sys_socket (net/socket.c:1671) ? __pfx___sys_socket (net/socket.c:1712) ? do_user_addr_fault (arch/x86/mm/fault.c:1419 (discriminator 1)) __x64_sys_socket (net/socket.c:1728) do_syscall_64 (arch/x86/entry/common.c:52 (discriminator 1)) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130)
That's because when the socket is initialised, rcu_read_lock() is not used despite the explicit comment written above the declaration of mptcp_sched_find() in sched.c. Adding the missing lock/unlock avoids the warning.
--- net/mptcp/protocol.c | 2 ++ 1 file changed, 2 insertions(+)
net/mptcp/protocol.c +2 -0
@@ -2864,8 +2864,10 @@ static int mptcp_init_sock(struct sock *sk)if (unlikely (!net->mib.mptcp_statistics) && !mptcp_mib_alloc (net))return -ENOMEM ; +rcu_read_lock (); ret =mptcp_init_sched (mptcp_sk (sk),mptcp_sched_find (mptcp_get_scheduler (net))); +rcu_read_unlock ();if (ret)return ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 173/245 mei: use kvmalloc for read buffer
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Usyskin <[email protected]>
[ Upstream commit 4adf613e01bf99e1739f6ff3e162ad5b7d578d1a ]
Read buffer is allocated according to max message size, reported by the firmware and may reach 64K in systems with pxp client. Contiguous 64k allocation may fail under memory pressure. Read buffer is used as in-driver message storage and not required to be contiguous.
Use kvmalloc to allow kernel to allocate non-contiguous memory.
--- drivers/misc/mei/client.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/misc/mei/client.c +2 -2
@@ -321,7 +321,7 @@ void mei_io_cb_free(struct mei_cl_cb *cb)return ;list_del (&cb->list); -kfree (cb->buf.data); +kvfree (cb->buf.data);kfree (cb->ext_hdr);kfree (cb); }
@@ -497,7 +497,7 @@ struct mei_cl_cb *mei_cl_alloc_cb(struct mei_cl *cl, size_t length,if (length ==0 )return cb; - cb->buf.data =kmalloc (roundup (length,MEI_SLOT_SIZE ),GFP_KERNEL ); + cb->buf.data =kvmalloc (roundup (length,MEI_SLOT_SIZE ),GFP_KERNEL );if (!cb->buf.data) {mei_io_cb_free (cb);return NULL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 175/245 fork: only invoke khugepaged, ksm hooks if no error
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Stoakes <[email protected]>
[ Upstream commit 985da552a98e27096444508ce5d853244019111f ]
There is no reason to invoke these hooks early against an mm that is in an incomplete state.
The change in commit d24062914837 ("fork: use __mt_dup() to duplicate maple tree in dup_mmap()") makes this more pertinent as we may be in a state where entries in the maple tree are not yet consistent.
Their placement early in dup_mmap() only appears to have been meaningful for early error checking, and since functionally it'd require a very small allocation to fail (in practice 'too small to fail') that'd only occur in the most dire circumstances, meaning the fork would fail or be OOM'd in any case.
Since both khugepaged and KSM tracking are there to provide optimisations to memory performance rather than critical functionality, it doesn't really matter all that much if, under such dire memory pressure, we fail to register an mm with these.
As a result, we follow the example of commit d2081b2bf819 ("mm:
khugepaged: make khugepaged_enter() void function") and make ksm_fork() a void function also.
We only expose the mm to these functions once we are done with them and only if no error occurred in the fork operation.
--- include/linux/ksm.h | 10 ++++------ kernel/fork.c | 7 ++----- 2 files changed, 6 insertions(+), 11 deletions(-)
include/linux/ksm.h +4 -6
@@ -54,12 +54,11 @@ static inline long mm_ksm_zero_pages(struct mm_struct *mm)return atomic_long_read (&mm->ksm_zero_pages); } -static inline int ksm_fork (struct mm_struct *mm,struct mm_struct *oldmm) +static inline void ksm_fork (struct mm_struct *mm,struct mm_struct *oldmm) { +/* Adding mm to ksm is best effort on fork. */ if (test_bit (MMF_VM_MERGEABLE , &oldmm->flags)) -return __ksm_enter (mm); - -return 0 ; +__ksm_enter (mm); }static inline int ksm_execve (struct mm_struct *mm)
@@ -107,9 +106,8 @@ static inline int ksm_disable(struct mm_struct *mm)return 0 ; } -static inline int ksm_fork (struct mm_struct *mm,struct mm_struct *oldmm) +static inline void ksm_fork (struct mm_struct *mm,struct mm_struct *oldmm) { -return 0 ; }static inline int ksm_execve (struct mm_struct *mm)
kernel/fork.c +2 -5
@@ -653,11 +653,6 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm, mm->exec_vm = oldmm->exec_vm; mm->stack_vm = oldmm->stack_vm; - retval =ksm_fork (mm, oldmm); -if (retval) - goto out; -khugepaged_fork (mm, oldmm); -/* Use __mt_dup() to efficiently build an identical maple tree. */ retval =__mt_dup (&oldmm->mm_mt, &mm->mm_mt,GFP_KERNEL );if (unlikely (retval))
@@ -760,6 +755,8 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm,vma_iter_free (&vmi);if (!retval) {mt_set_in_rcu (vmi.mas.tree); +ksm_fork (mm, oldmm); +khugepaged_fork (mm, oldmm); }else if (mpnt) {/* * The entire maple tree has already been duplicated. If the
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 176/245 mm/page_alloc: let GFP_ATOMIC order-0 allocs access highatomic reserves
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Fleming <[email protected]>
[ Upstream commit 281dd25c1a018261a04d1b8bf41a0674000bfe38 ]
Under memory pressure it's possible for GFP_ATOMIC order-0 allocations to fail even though free pages are available in the highatomic reserves. GFP_ATOMIC allocations cannot trigger unreserve_highatomic_pageblock() since it's only run from reclaim.
Given that such allocations will pass the watermarks in __zone_watermark_unusable_free(), it makes sense to fallback to highatomic reserves the same way that ALLOC_OOM can.
This fixes order-0 page allocation failures observed on Cloudflare's fleet when handling network packets:
kswapd1: page allocation failure: order:0, mode:0x820(GFP_ATOMIC), nodemask=(null),cpuset=/,mems_allowed=0-7
CPU: 10 PID: 696 Comm: kswapd1 Kdump: loaded Tainted: G O 6.6.43-CUSTOM #1 Hardware name: MACHINE Call Trace: <IRQ> dump_stack_lvl+0x3c/0x50 warn_alloc+0x13a/0x1c0 __alloc_pages_slowpath.constprop.0+0xc9d/0xd10 __alloc_pages+0x327/0x340 __napi_alloc_skb+0x16d/0x1f0 bnxt_rx_page_skb+0x96/0x1b0 [bnxt_en] bnxt_rx_pkt+0x201/0x15e0 [bnxt_en] __bnxt_poll_work+0x156/0x2b0 [bnxt_en] bnxt_poll+0xd9/0x1c0 [bnxt_en] __napi_poll+0x2b/0x1b0 bpf_trampoline_6442524138+0x7d/0x1000 __napi_poll+0x5/0x1b0 net_rx_action+0x342/0x740 handle_softirqs+0xcf/0x2b0 irq_exit_rcu+0x6c/0x90 sysvec_apic_timer_interrupt+0x72/0x90 </IRQ>
--- mm/page_alloc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
mm/page_alloc.c +5 -5
@@ -2874,12 +2874,12 @@ struct page *rmqueue_buddy(struct zone *preferred_zone, struct zone *zone, page =__rmqueue (zone, order, migratetype, alloc_flags);/* -* If the allocation fails, allow OOM handling access -* to HIGHATOMIC reserves as failing now is worse than -* failing a high-order atomic allocation in the -* future. +* If the allocation fails, allow OOM handling and +* order-0 (atomic) allocs access to HIGHATOMIC +* reserves as failing now is worse than failing a +* high-order atomic allocation in the future. */ -if (!page && (alloc_flags &ALLOC_OOM )) +if (!page && (alloc_flags & (ALLOC_OOM |ALLOC_NON_BLOCK ))) page =__rmqueue_smallest (zone, order,MIGRATE_HIGHATOMIC );if (!page) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 177/245 x86/traps: Enable UBSAN traps on x86
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gatlin Newhouse <[email protected]>
[ Upstream commit 7424fc6b86c8980a87169e005f5cd4438d18efe6 ]
Currently ARM64 extracts which specific sanitizer has caused a trap via encoded data in the trap instruction. Clang on x86 currently encodes the same data in the UD1 instruction but x86 handle_bug() and is_valid_bugaddr() currently only look at UD2.
Bring x86 to parity with ARM64, similar to commit 25b84002afb9 ("arm64:
Support Clang UBSAN trap codes for better reporting"). See the llvm links for information about the code generation.
Enable the reporting of UBSAN sanitizer details on x86 compiled with clang when CONFIG_UBSAN_TRAP=y by analysing UD1 and retrieving the type immediate which is encoded by the compiler after the UD1.
[ tglx: Simplified it by moving the printk() into handle_bug() ]
Stable-dep-of: 1db272864ff2 ("x86/traps: move kmsan check after instrumentation_begin")
--- arch/x86/include/asm/bug.h | 12 ++++++++ arch/x86/kernel/traps.c | 59 ++++++++++++++++++++++++++++++++++---- include/linux/ubsan.h | 5 ++++ lib/Kconfig.ubsan | 4 +-- 4 files changed, 73 insertions(+), 7 deletions(-)
arch/x86/include/asm/bug.h +12 -0
@@ -13,6 +13,18 @@#define INSN_UD2 0x0b0f#define LEN_UD2 2 +/* +* In clang we have UD1s reporting UBSAN failures on X86, 64 and 32bit. +*/ +#define INSN_ASOP 0x67 +#define OPCODE_ESCAPE 0x0f +#define SECOND_BYTE_OPCODE_UD1 0xb9 +#define SECOND_BYTE_OPCODE_UD2 0x0b + +#define BUG_NONE 0xffff +#define BUG_UD1 0xfffe +#define BUG_UD2 0xfffd +#ifdef CONFIG_GENERIC_BUG #ifdef CONFIG_X86_32
arch/x86/kernel/traps.c +54 -5
89 lines not on this page · raw message
include/linux/ubsan.h +5 -0
@@ -4,6 +4,11 @@#ifdef CONFIG_UBSAN_TRAP const char *report_ubsan_failure (struct pt_regs *regs,u32 check_type); +#else +static inline const char *report_ubsan_failure (struct pt_regs *regs,u32 check_type) +{ +return NULL ; +}#endif #endif
lib/Kconfig.ubsan +2 -2
@@ -29,8 +29,8 @@ config UBSAN_TRAP Also note that selecting Y will cause your kernel to Oops with an "illegal instruction" error with no further details - when a UBSAN violation occurs. (Except on arm64, which will - report which Sanitizer failed.) This may make it hard to + when a UBSAN violation occurs. (Except on arm64 and x86, which + will report which Sanitizer failed.) This may make it hard to determine whether an Oops was caused by UBSAN or to figure out the details of a UBSAN violation. It makes the kernel log output less useful for bug reports.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 178/245 x86/traps: move kmsan check after instrumentation_begin
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sabyrzhan Tasbolatov <[email protected]>
[ Upstream commit 1db272864ff250b5e607283eaec819e1186c8e26 ]
During x86_64 kernel build with CONFIG_KMSAN, the objtool warns following:
AR built-in.a AR vmlinux.a LD vmlinux.o
vmlinux.o: warning: objtool: handle_bug+0x4: call to
kmsan_unpoison_entry_regs() leaves .noinstr.text section
OBJCOPY modules.builtin.modinfo
GEN modules.builtin
MODPOST Module.symvers
CC .vmlinux.export.o
Moving kmsan_unpoison_entry_regs() _after_ instrumentation_begin() fixes the warning.
There is decode_bug(regs->ip, &imm) is left before KMSAN unpoisoining, but it has the return condition and if we include it after instrumentation_begin() it results the warning "return with instrumentation enabled", hence, I'm concerned that regs will not be KMSAN unpoisoned if ud_type == BUG_NONE is true.
--- arch/x86/kernel/traps.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
arch/x86/kernel/traps.c +6 -6
@@ -261,12 +261,6 @@ static noinstr bool handle_bug(struct pt_regs *regs)int ud_type;u32 imm; -/* -* Normally @regs are unpoisoned by irqentry_enter(), but handle_bug() -* is a rare case that uses @regs without passing them to -* irqentry_enter(). -*/ -kmsan_unpoison_entry_regs (regs); ud_type =decode_bug (regs->ip, &imm);if (ud_type ==BUG_NONE )return handled;
@@ -275,6 +269,12 @@ static noinstr bool handle_bug(struct pt_regs *regs)* All lies, just get the WARN/BUG out. */ instrumentation_begin (); +/* +* Normally @regs are unpoisoned by irqentry_enter(), but handle_bug() +* is a rare case that uses @regs without passing them to +* irqentry_enter(). +*/ +kmsan_unpoison_entry_regs (regs);/* * Since we're emulating a CALL with exceptions, restore the interrupt * state to what it was at the exception site.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 179/245 ocfs2: pass u64 to ocfs2_truncate_inline maybe overflow
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Edward Adam Davis <[email protected]>
[ Upstream commit bc0a2f3a73fcdac651fca64df39306d1e5ebe3b0 ]
Syzbot reported a kernel BUG in ocfs2_truncate_inline. There are two reasons for this: first, the parameter value passed is greater than ocfs2_max_inline_data_with_xattr, second, the start and end parameters of ocfs2_truncate_inline are "unsigned int".
So, we need to add a sanity check for byte_start and byte_len right before ocfs2_truncate_inline() in ocfs2_remove_inode_range(), if they are greater than ocfs2_max_inline_data_with_xattr return -EINVAL.
--- fs/ocfs2/file.c | 8 ++++++++ 1 file changed, 8 insertions(+)
fs/ocfs2/file.c +8 -0
@@ -1783,6 +1783,14 @@ int ocfs2_remove_inode_range(struct inode *inode,return 0 ;if (OCFS2_I (inode)->ip_dyn_features &OCFS2_INLINE_DATA_FL ) { +int id_count =ocfs2_max_inline_data_with_xattr (inode->i_sb, di); + +if (byte_start > id_count || byte_start + byte_len > id_count) { + ret = -EINVAL ; +mlog_errno (ret); + goto out; + } + ret =ocfs2_truncate_inline (inode, di_bh, byte_start, byte_start + byte_len,0 );if (ret) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 180/245 resource,kexec: walk_system_ram_res_rev must retain resource flags
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gregory Price <[email protected]>
[ Upstream commit b125a0def25a082ae944c9615208bf359abdb61c ]
walk_system_ram_res_rev() erroneously discards resource flags when passing the information to the callback.
This causes systems with IORESOURCE_SYSRAM_DRIVER_MANAGED memory to have these resources selected during kexec to store kexec buffers if that memory happens to be at placed above normal system ram.
This leads to undefined behavior after reboot. If the kexec buffer is never touched, nothing happens. If the kexec buffer is touched, it could lead to a crash (like below) or undefined behavior.
Tested on a system with CXL memory expanders with driver managed memory, TPM enabled, and CONFIG_IMA_KEXEC=y. Adding printk's showed the flags were being discarded and as a result the check for IORESOURCE_SYSRAM_DRIVER_MANAGED passes.
find_next_iomem_res: name(System RAM (kmem))
start(10000000000) end(1034fffffff) flags(83000200)
locate_mem_hole_top_down: start(10000000000) end(1034fffffff) flags(0)
[.] BUG: unable to handle page fault for address: ffff89834ffff000 [.] #PF: supervisor read access in kernel mode
[.] #PF: error_code(0x0000) - not-present page
[.] PGD c04c8bf067 P4D c04c8bf067 PUD c04c8be067 PMD 0
[.] Oops: 0000 [#1] SMP
[.] RIP: 0010:ima_restore_measurement_list+0x95/0x4b0
[.] RSP: 0018:ffffc900000d3a80 EFLAGS: 00010286
[.] RAX: 0000000000001000 RBX: 0000000000000000 RCX: ffff89834ffff000 [.] RDX: 0000000000000018 RSI: ffff89834ffff000 RDI: ffff89834ffff018 [.] RBP: ffffc900000d3ba0 R08: 0000000000000020 R09: ffff888132b8a900 [.] R10: 4000000000000000 R11: 000000003a616d69 R12: 0000000000000000 [.] R13: ffffffff8404ac28 R14: 0000000000000000 R15: ffff89834ffff000 [.] FS: 0000000000000000(0000) GS:ffff893d44640000(0000) knlGS:0000000000000000 [.] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[.] ata5: SATA link down (SStatus 0 SControl 300)
[.] CR2: ffff89834ffff000 CR3: 000001034d00f001 CR4: 0000000000770ef0 [.] PKRU: 55555554
[.] Call Trace:
[.] <TASK> [.] ? __die+0x78/0xc0 [.] ? page_fault_oops+0x2a8/0x3a0 [.] ? exc_page_fault+0x84/0x130 [.] ? asm_exc_page_fault+0x22/0x30 [.] ? ima_restore_measurement_list+0x95/0x4b0 [.] ? template_desc_init_fields+0x317/0x410 [.] ? crypto_alloc_tfm_node+0x9c/0xc0 [.] ? init_ima_lsm+0x30/0x30 [.] ima_load_kexec_buffer+0x72/0xa0 [.] ima_init+0x44/0xa0 [.] __initstub__kmod_ima__373_1201_init_ima7+0x1e/0xb0 [.] ? init_ima_lsm+0x30/0x30 [.] do_one_initcall+0xad/0x200 [.] ? idr_alloc_cyclic+0xaa/0x110 [.] ? new_slab+0x12c/0x420 [.] ? new_slab+0x12c/0x420 [.] ? number+0x12a/0x430 [.] ? sysvec_apic_timer_interrupt+0xa/0x80 [.] ? asm_sysvec_apic_timer_interrupt+0x16/0x20 [.] ? parse_args+0xd4/0x380 [.] ? parse_args+0x14b/0x380 [.] kernel_init_freeable+0x1c1/0x2b0 [.] ? rest_init+0xb0/0xb0 [.] kernel_init+0x16/0x1a0 [.] ret_from_fork+0x2f/0x40 [.] ? rest_init+0xb0/0xb0 [.] ret_from_fork_asm+0x11/0x20 [.] </TASK>
--- kernel/resource.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
kernel/resource.c +1 -3
@@ -460,9 +460,7 @@ int walk_system_ram_res_rev(u64 start, u64 end, void *arg, rams_size +=16 ; } - rams[i].start = res.start; - rams[i++].end = res.end; - + rams[i++] = res; start = res.end +1 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 181/245 mctp i2c: handle NULL header address
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Johnston <[email protected]>
[ Upstream commit 01e215975fd80af81b5b79f009d49ddd35976c13 ]
daddr can be NULL if there is no neighbour table entry present, in that case the tx packet should be dropped.
saddr will usually be set by MCTP core, but check for NULL in case a packet is transmitted by a different protocol.
--- drivers/net/mctp/mctp-i2c.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/mctp/mctp-i2c.c +3 -0
@@ -588,6 +588,9 @@ static int mctp_i2c_header_create(struct sk_buff *skb, struct net_device *dev,if (len >MCTP_I2C_MAXMTU )return -EMSGSIZE ; +if (!daddr || !saddr) +return -EINVAL ; + lldst = *((u8 *)daddr); llsrc = *((u8 *)saddr);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 182/245 btrfs: fix use-after-free of block device file in __btrfs_free_extra_devids()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhihao Cheng <[email protected]>
[ Upstream commit aec8e6bf839101784f3ef037dcdb9432c3f32343 ]
Mounting btrfs from two images (which have the same one fsid and two different dev_uuids) in certain executing order may trigger an UAF for variable 'device->bdev_file' in __btrfs_free_extra_devids(). And following are the details:
1. Attach image_1 to loop0, attach image_2 to loop1, and scan btrfs devices by ioctl(BTRFS_IOC_SCAN_DEV):
/ btrfs_device_1 → loop0
fs_device
\ btrfs_device_2 → loop1
2. mount /dev/loop0 /mnt
btrfs_open_devices
btrfs_device_1->bdev_file = btrfs_get_bdev_and_sb(loop0)
btrfs_device_2->bdev_file = btrfs_get_bdev_and_sb(loop1)
btrfs_fill_super
open_ctree
fail: btrfs_close_devices // -ENOMEM
btrfs_close_bdev(btrfs_device_1)
fput(btrfs_device_1->bdev_file)
// btrfs_device_1->bdev_file is freed
btrfs_close_bdev(btrfs_device_2)
fput(btrfs_device_2->bdev_file)3. mount /dev/loop1 /mnt
btrfs_open_devices
btrfs_get_bdev_and_sb(&bdev_file)
// EIO, btrfs_device_1->bdev_file is not assigned,
// which points to a freed memory area
btrfs_device_2->bdev_file = btrfs_get_bdev_and_sb(loop1)
btrfs_fill_super
open_ctree
btrfs_free_extra_devids
if (btrfs_device_1->bdev_file)
fput(btrfs_device_1->bdev_file) // UAF !Fix it by setting 'device->bdev_file' as 'NULL' after closing the btrfs_device in btrfs_close_one_device().
--- fs/btrfs/volumes.c | 1 + 1 file changed, 1 insertion(+)
fs/btrfs/volumes.c +1 -0
@@ -1103,6 +1103,7 @@ static void btrfs_close_one_device(struct btrfs_device *device)if (device->bdev) { fs_devices->open_devices--; device->bdev =NULL ; + device->bdev_file =NULL ; }clear_bit (BTRFS_DEV_STATE_WRITEABLE , &device->dev_state);btrfs_destroy_dev_zone_info (device);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 183/245 accel/ivpu: Fix NOC firewall interrupt handling
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrzej Kacprowski <[email protected]>
[ Upstream commit 72f7e16eccddde99386a10eb2d08833e805917c6 ]
The NOC firewall interrupt means that the HW prevented unauthorized access to a protected resource, so there is no need to trigger device reset in such case.
To facilitate security testing add firewall_irq_counter debugfs file that tracks firewall interrupts.
--- drivers/accel/ivpu/ivpu_debugfs.c | 9 +++++++++ drivers/accel/ivpu/ivpu_hw.c | 1 + drivers/accel/ivpu/ivpu_hw.h | 1 + drivers/accel/ivpu/ivpu_hw_ip.c | 5 ++++- 4 files changed, 15 insertions(+), 1 deletion(-)
drivers/accel/ivpu/ivpu_debugfs.c +9 -0
@@ -108,6 +108,14 @@ static int reset_pending_show(struct seq_file *s, void *v)return 0 ; } +static int firewall_irq_counter_show (struct seq_file *s,void *v) +{ +struct ivpu_device *vdev =seq_to_ivpu (s); + +seq_printf (s,"%d\n" ,atomic_read (&vdev->hw->firewall_irq_counter)); +return 0 ; +} +static const struct drm_debugfs_info vdev_debugfs_list[] = { {"bo_list" , bo_list_show,0 }, {"fw_name" , fw_name_show,0 },
@@ -116,6 +124,7 @@ static const struct drm_debugfs_info vdev_debugfs_list[] = { {"last_bootmode", last_bootmode_show, 0}, {"reset_counter", reset_counter_show, 0}, {"reset_pending", reset_pending_show, 0}, + {"firewall_irq_counter", firewall_irq_counter_show, 0}, }; static ssize_t
drivers/accel/ivpu/ivpu_hw.c +1 -0
@@ -249,6 +249,7 @@ int ivpu_hw_init(struct ivpu_device *vdev)platform_init (vdev);wa_init (vdev);timeouts_init (vdev); +atomic_set (&vdev->hw->firewall_irq_counter,0 );return 0 ; }
drivers/accel/ivpu/ivpu_hw.h +1 -0
@@ -52,6 +52,7 @@ struct ivpu_hw_info {int dma_bits;ktime_t d0i3_entry_host_ts;u64 d0i3_entry_vpu_ts; +atomic_t firewall_irq_counter; };int ivpu_hw_init (struct ivpu_device *vdev);
drivers/accel/ivpu/ivpu_hw_ip.c +4 -1
@@ -1062,7 +1062,10 @@ static void irq_wdt_mss_handler(struct ivpu_device *vdev)static void irq_noc_firewall_handler (struct ivpu_device *vdev) { -ivpu_pm_trigger_recovery (vdev,"NOC Firewall IRQ" ); +atomic_inc (&vdev->hw->firewall_irq_counter); + +ivpu_dbg (vdev,IRQ ,"NOC Firewall interrupt detected, counter %d\n" , +atomic_read (&vdev->hw->firewall_irq_counter)); }/* Handler for IRQs from NPU core */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 184/245 xfs: fix finding a last resort AG in xfs_filestream_pick_ag
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
[ Upstream commit dc60992ce76fbc2f71c2674f435ff6bde2108028 ]
When the main loop in xfs_filestream_pick_ag fails to find a suitable AG it tries to just pick the online AG. But the loop for that uses args->pag as loop iterator while the later code expects pag to be set. Fix this by reusing the max_pag case for this last resort, and also add a check for impossible case of no AG just to make sure that the uninitialized pag doesn't even escape in theory.
--- fs/xfs/xfs_filestream.c | 23 ++++++++++++----------- fs/xfs/xfs_trace.h | 15 +++++---------- 2 files changed, 17 insertions(+), 21 deletions(-)
fs/xfs/xfs_filestream.c +12 -11
@@ -64,7 +64,7 @@ xfs_filestream_pick_ag(struct xfs_perag *pag;struct xfs_perag *max_pag =NULL ;xfs_extlen_t minlen = *longest; -xfs_extlen_t free =0 , minfree, maxfree =0 ; +xfs_extlen_t minfree, maxfree =0 ;xfs_agnumber_t agno;bool first_pass = true;int err;
@@ -107,7 +107,6 @@ xfs_filestream_pick_ag( !(flags & XFS_PICK_USERDATA) || (flags & XFS_PICK_LOWSPACE))) {/* Break out, retaining the reference on the AG. */ - free = pag->pagf_freeblks;break ; } }
@@ -150,23 +149,25 @@ xfs_filestream_pick_ag(* grab. */ if (!max_pag) { -for_each_perag_wrap (args->mp,0 , start_agno, args->pag) +for_each_perag_wrap (args->mp,0 , start_agno, pag) { + max_pag = pag;break ; -atomic_inc (&args->pag->pagf_fstrms); - *longest =0 ; - }else { - pag = max_pag; - free = maxfree; -atomic_inc (&pag->pagf_fstrms); + } + +/* Bail if there are no AGs at all to select from. */ +if (!max_pag) +return -ENOSPC ; } + + pag = max_pag; +atomic_inc (&pag->pagf_fstrms); }else if (max_pag) {xfs_perag_rele (max_pag); } -trace_xfs_filestream_pick (pag, pino, free); +trace_xfs_filestream_pick (pag, pino); args->pag = pag;return 0 ; - } static struct xfs_inode *
fs/xfs/xfs_trace.h +5 -10
@@ -691,8 +691,8 @@ DEFINE_FILESTREAM_EVENT(xfs_filestream_lookup);DEFINE_FILESTREAM_EVENT (xfs_filestream_scan); TRACE_EVENT(xfs_filestream_pick, - TP_PROTO(struct xfs_perag *pag, xfs_ino_t ino, xfs_extlen_t free), - TP_ARGS(pag, ino, free), + TP_PROTO(struct xfs_perag *pag, xfs_ino_t ino), + TP_ARGS(pag, ino), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_ino_t, ino)
@@ -703,14 +703,9 @@ TRACE_EVENT(xfs_filestream_pick,TP_fast_assign ( __entry->dev = pag->pag_mount->m_super->s_dev; __entry->ino = ino; -if (pag) { - __entry->agno = pag->pag_agno; - __entry->streams =atomic_read (&pag->pagf_fstrms); - }else { - __entry->agno =NULLAGNUMBER ; - __entry->streams =0 ; - } - __entry->free = free; + __entry->agno = pag->pag_agno; + __entry->streams =atomic_read (&pag->pagf_fstrms); + __entry->free = pag->pagf_freeblks; ), TP_printk("dev %d:%d ino 0x%llx agno 0x%x streams %d free %d", MAJOR(__entry->dev), MINOR(__entry->dev),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 185/245 ALSA: hda/realtek: Fix headset mic on TUXEDO Gemini 17 Gen3
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoffer Sandberg <[email protected]>
[ Upstream commit 0b04fbe886b4274c8e5855011233aaa69fec6e75 ]
Quirk is needed to enable headset microphone on missing pin 0x19.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -10729,6 +10729,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1558 ,0x1404 ,"Clevo N150CU" ,ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1558 ,0x14a1 ,"Clevo L141MU" ,ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1558 ,0x2624 ,"Clevo L240TU" ,ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE ), +SND_PCI_QUIRK (0x1558 ,0x28c1 ,"Clevo V370VND" ,ALC2XX_FIXUP_HEADSET_MIC ),SND_PCI_QUIRK (0x1558 ,0x4018 ,"Clevo NV40M[BE]" ,ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1558 ,0x4019 ,"Clevo NV40MZ" ,ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE ), SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 186/245 ALSA: hda/realtek: Fix headset mic on TUXEDO Stellaris 16 Gen6 mb1
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoffer Sandberg <[email protected]>
[ Upstream commit e49370d769e71456db3fbd982e95bab8c69f73e8 ]
Quirk is needed to enable headset microphone on missing pin 0x19.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -10971,6 +10971,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1d05 ,0x115c ,"TongFang GMxTGxx" ,ALC269_FIXUP_NO_SHUTUP ),SND_PCI_QUIRK (0x1d05 ,0x121b ,"TongFang GMxAGxx" ,ALC269_FIXUP_NO_SHUTUP ),SND_PCI_QUIRK (0x1d05 ,0x1387 ,"TongFang GMxIXxx" ,ALC2XX_FIXUP_HEADSET_MIC ), +SND_PCI_QUIRK (0x1d05 ,0x1409 ,"TongFang GMxIXxx" ,ALC2XX_FIXUP_HEADSET_MIC ),SND_PCI_QUIRK (0x1d17 ,0x3288 ,"Haier Boyue G42" ,ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS ),SND_PCI_QUIRK (0x1d72 ,0x1602 ,"RedmiBook" ,ALC255_FIXUP_XIAOMI_HEADSET_MIC ), SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 187/245 nvmet-auth: assign dh_key to NULL after kfree_sensitive
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vitaliy Shevtsov <[email protected]>
[ Upstream commit d2f551b1f72b4c508ab9298419f6feadc3b5d791 ]
ctrl->dh_key might be used across multiple calls to nvmet_setup_dhgroup() for the same controller. So it's better to nullify it after release on error path in order to avoid double free later in nvmet_destroy_auth().
Found by Linux Verification Center (linuxtesting.org) with Svace.
--- drivers/nvme/target/auth.c | 1 + 1 file changed, 1 insertion(+)
drivers/nvme/target/auth.c +1 -0
@@ -103,6 +103,7 @@ int nvmet_setup_dhgroup(struct nvmet_ctrl *ctrl, u8 dhgroup_id)pr_debug ("%s: ctrl %d failed to generate private key, err %d\n" , __func__, ctrl->cntlid, ret);kfree_sensitive (ctrl->dh_key); + ctrl->dh_key =NULL ;return ret; } ctrl->dh_keysize =crypto_kpp_maxsize (ctrl->dh_tfm);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 188/245 nvme: re-fix error-handling for io_uring nvme-passthrough
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keith Busch <[email protected]>
[ Upstream commit 5eed4fb274cd6579f2fb4190b11c4c86c553cd06 ]
This was previously fixed with commit 1147dd0503564fa0e0348 ("nvme: fix error-handling for io_uring nvme-passthrough"), but the change was mistakenly undone in a later commit.
--- drivers/nvme/host/ioctl.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/nvme/host/ioctl.c +5 -2
@@ -423,10 +423,13 @@ static enum rq_end_io_ret nvme_uring_cmd_end_io(struct request *req,struct io_uring_cmd *ioucmd = req->end_io_data;struct nvme_uring_cmd_pdu *pdu =nvme_uring_cmd_pdu (ioucmd); -if (nvme_req (req)->flags &NVME_REQ_CANCELLED ) +if (nvme_req (req)->flags &NVME_REQ_CANCELLED ) { pdu->status = -EINTR ; -else + }else { pdu->status =nvme_req (req)->status; +if (!pdu->status) + pdu->status =blk_status_to_errno (err); + } pdu->result =le64_to_cpu (nvme_req (req)->result.u64);/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 189/245 kasan: remove vmalloc_percpu test
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrey Konovalov <[email protected]>
[ Upstream commit 330d8df81f3673d6fb74550bbc9bb159d81b35f7 ]
Commit 1a2473f0cbc0 ("kasan: improve vmalloc tests") added the vmalloc_percpu KASAN test with the assumption that __alloc_percpu always uses vmalloc internally, which is tagged by KASAN.
However, __alloc_percpu might allocate memory from the first per-CPU chunk, which is not allocated via vmalloc(). As a result, the test might fail.
Remove the test until proper KASAN annotation for the per-CPU allocated are added; tracked in https://bugzilla.kernel.org/show_bug.cgi?id=215019.
--- mm/kasan/kasan_test.c | 27 --------------------------- 1 file changed, 27 deletions(-)
mm/kasan/kasan_test.c +0 -27
@@ -1765,32 +1765,6 @@ static void vm_map_ram_tags(struct kunit *test)free_pages ((unsigned long )p_ptr,1 ); } -static void vmalloc_percpu (struct kunit *test) -{ -char __percpu *ptr; -int cpu; - -/* -* This test is specifically crafted for the software tag-based mode, -* the only tag-based mode that poisons percpu mappings. -*/ -KASAN_TEST_NEEDS_CONFIG_ON (test,CONFIG_KASAN_SW_TAGS ); - - ptr =__alloc_percpu (PAGE_SIZE ,PAGE_SIZE ); - -for_each_possible_cpu (cpu) { -char *c_ptr =per_cpu_ptr (ptr, cpu); - -KUNIT_EXPECT_GE (test, (u8 )get_tag (c_ptr), (u8 )KASAN_TAG_MIN ); -KUNIT_EXPECT_LT (test, (u8 )get_tag (c_ptr), (u8 )KASAN_TAG_KERNEL ); - -/* Make sure that in-bounds accesses don't crash the kernel. */ - *c_ptr =0 ; - } - -free_percpu (ptr); -} -/* * Check that the assigned pointer tag falls within the [KASAN_TAG_MIN, * KASAN_TAG_KERNEL) range (note: excluding the match-all tag) for tag-based
@@ -1967,7 +1941,6 @@ static struct kunit_case kasan_kunit_test_cases[] = {KUNIT_CASE (vmalloc_oob),KUNIT_CASE (vmap_tags),KUNIT_CASE (vm_map_ram_tags), -KUNIT_CASE (vmalloc_percpu),KUNIT_CASE (match_all_not_assigned),KUNIT_CASE (match_all_ptr_tag), KUNIT_CASE(match_all_mem_tag),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 190/245 drm/tests: helpers: Add helper for drm_display_mode_from_cea_vic()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit caa714f86699bcfb01aa2d698db12d91af7d0d81 ]
As Maxime suggested, add a new helper drm_kunit_display_mode_from_cea_vic(), it can replace the direct call of drm_display_mode_from_cea_vic(), and it will help solving the mode memory leaks.
Stable-dep-of: 926163342a2e ("drm/connector: hdmi: Fix memory leak in drm_display_mode_from_cea_vic()")
--- drivers/gpu/drm/tests/drm_kunit_helpers.c | 42 +++++++++++++++++++++++ include/drm/drm_kunit_helpers.h | 4 +++ 2 files changed, 46 insertions(+)
drivers/gpu/drm/tests/drm_kunit_helpers.c +42 -0
@@ -3,6 +3,7 @@#include <drm/drm_atomic.h> #include <drm/drm_atomic_helper.h> #include <drm/drm_drv.h> +#include <drm/drm_edid.h> #include <drm/drm_fourcc.h> #include <drm/drm_kunit_helpers.h> #include <drm/drm_managed.h>
@@ -311,6 +312,47 @@ drm_kunit_helper_create_crtc(struct kunit *test, }EXPORT_SYMBOL_GPL (drm_kunit_helper_create_crtc); +static void kunit_action_drm_mode_destroy (void *ptr) +{ +struct drm_display_mode *mode = ptr; + +drm_mode_destroy (NULL , mode); +} + +/** +* drm_kunit_display_mode_from_cea_vic() - return a mode for CEA VIC +for a KUnit test +* @test: The test context object +* @dev: DRM device +* @video_code: CEA VIC of the mode +* +* Creates a new mode matching the specified CEA VIC for a KUnit test. +* +* Resources will be cleaned up automatically. +* +* Returns: A new drm_display_mode on success or NULL on failure +*/ +struct drm_display_mode * +drm_kunit_display_mode_from_cea_vic (struct kunit *test,struct drm_device *dev, +u8 video_code) +{ +struct drm_display_mode *mode; +int ret; + + mode =drm_display_mode_from_cea_vic (dev, video_code); +if (!mode) +return NULL ; + + ret =kunit_add_action_or_reset (test, + kunit_action_drm_mode_destroy, + mode); +if (ret) +return NULL ; + +return mode; +} +EXPORT_SYMBOL_GPL (drm_kunit_display_mode_from_cea_vic); +MODULE_AUTHOR ("Maxime Ripard <[email protected]>" );MODULE_DESCRIPTION ("KUnit test suite helper functions" );MODULE_LICENSE ("GPL" );
include/drm/drm_kunit_helpers.h +4 -0
@@ -120,4 +120,8 @@ drm_kunit_helper_create_crtc(struct kunit *test,const struct drm_crtc_funcs *funcs, const struct drm_crtc_helper_funcs *helper_funcs); +struct drm_display_mode * +drm_kunit_display_mode_from_cea_vic (struct kunit *test,struct drm_device *dev, +u8 video_code); +#endif // DRM_KUNIT_HELPERS_H_
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 191/245 drm/connector: hdmi: Fix memory leak in drm_display_mode_from_cea_vic()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 926163342a2e7595d950e84c17c693b1272bd491 ]
modprobe drm_connector_test and then rmmod drm_connector_test, the following memory leak occurs.
The mode allocated in drm_mode_duplicate() called by drm_display_mode_from_cea_vic() is not freed, which cause the memory leak:
unreferenced object 0xffffff80cb0ee400 (size 128): comm "kunit_try_catch", pid 1948, jiffies 4294950339 hex dump (first 32 bytes): 14 44 02 00 80 07 d8 07 04 08 98 08 00 00 38 04 .D............8. 3c 04 41 04 65 04 00 00 05 00 00 00 00 00 00 00 <.A.e........... backtrace (crc 90e9585c): [<00000000ec42e3d7>] kmemleak_alloc+0x34/0x40 [<00000000d0ef055a>] __kmalloc_cache_noprof+0x26c/0x2f4 [<00000000c2062161>] drm_mode_duplicate+0x44/0x19c [<00000000f96c74aa>] drm_display_mode_from_cea_vic+0x88/0x98 [<00000000d8f2c8b4>] 0xffffffdc982a4868 [<000000005d164dbc>] kunit_try_run_case+0x13c/0x3ac [<000000006fb23398>] kunit_generic_run_threadfn_adapter+0x80/0xec [<000000006ea56ca0>] kthread+0x2e8/0x374 [<000000000676063f>] ret_from_fork+0x10/0x20 ......
Free mode by using drm_kunit_display_mode_from_cea_vic() to fix it.
--- drivers/gpu/drm/tests/drm_connector_test.c | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/gpu/drm/tests/drm_connector_test.c +12 -12
@@ -996,7 +996,7 @@ static void drm_test_drm_hdmi_compute_mode_clock_rgb(struct kunit *test)unsigned long long rate;struct drm_device *drm = &priv->drm; - mode =drm_display_mode_from_cea_vic (drm,16 ); + mode =drm_kunit_display_mode_from_cea_vic (test, drm,16 );KUNIT_ASSERT_NOT_NULL (test, mode);KUNIT_ASSERT_FALSE (test, mode->flags &DRM_MODE_FLAG_DBLCLK );
@@ -1017,7 +1017,7 @@ static void drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc(struct kunit *test)unsigned long long rate;struct drm_device *drm = &priv->drm; - mode =drm_display_mode_from_cea_vic (drm,16 ); + mode =drm_kunit_display_mode_from_cea_vic (test, drm,16 );KUNIT_ASSERT_NOT_NULL (test, mode);KUNIT_ASSERT_FALSE (test, mode->flags &DRM_MODE_FLAG_DBLCLK );
@@ -1038,7 +1038,7 @@ static void drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1(struct kunit *tunsigned long long rate;struct drm_device *drm = &priv->drm; - mode =drm_display_mode_from_cea_vic (drm,1 ); + mode =drm_kunit_display_mode_from_cea_vic (test, drm,1 );KUNIT_ASSERT_NOT_NULL (test, mode); rate =drm_hdmi_compute_mode_clock (mode,10 ,HDMI_COLORSPACE_RGB );
@@ -1056,7 +1056,7 @@ static void drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc(struct kunit *test)unsigned long long rate;struct drm_device *drm = &priv->drm; - mode =drm_display_mode_from_cea_vic (drm,16 ); + mode =drm_kunit_display_mode_from_cea_vic (test, drm,16 );KUNIT_ASSERT_NOT_NULL (test, mode);KUNIT_ASSERT_FALSE (test, mode->flags &DRM_MODE_FLAG_DBLCLK );
@@ -1077,7 +1077,7 @@ static void drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1(struct kunit *tunsigned long long rate;struct drm_device *drm = &priv->drm; - mode =drm_display_mode_from_cea_vic (drm,1 ); + mode =drm_kunit_display_mode_from_cea_vic (test, drm,1 );KUNIT_ASSERT_NOT_NULL (test, mode); rate =drm_hdmi_compute_mode_clock (mode,12 ,HDMI_COLORSPACE_RGB );
@@ -1095,7 +1095,7 @@ static void drm_test_drm_hdmi_compute_mode_clock_rgb_double(struct kunit *test)unsigned long long rate;struct drm_device *drm = &priv->drm; - mode =drm_display_mode_from_cea_vic (drm,6 ); + mode =drm_kunit_display_mode_from_cea_vic (test, drm,6 );KUNIT_ASSERT_NOT_NULL (test, mode);KUNIT_ASSERT_TRUE (test, mode->flags &DRM_MODE_FLAG_DBLCLK );
@@ -1118,7 +1118,7 @@ static void drm_test_connector_hdmi_compute_mode_clock_yuv420_valid(struct kunitunsigned long long rate;unsigned int vic = *(unsigned int *)test->param_value; - mode =drm_display_mode_from_cea_vic (drm, vic); + mode =drm_kunit_display_mode_from_cea_vic (test, drm, vic);KUNIT_ASSERT_NOT_NULL (test, mode);KUNIT_ASSERT_FALSE (test, mode->flags &DRM_MODE_FLAG_DBLCLK );
@@ -1155,7 +1155,7 @@ static void drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc(struct kuni drm_hdmi_compute_mode_clock_yuv420_vic_valid_tests[0 ];unsigned long long rate; - mode =drm_display_mode_from_cea_vic (drm, vic); + mode =drm_kunit_display_mode_from_cea_vic (test, drm, vic);KUNIT_ASSERT_NOT_NULL (test, mode);KUNIT_ASSERT_FALSE (test, mode->flags &DRM_MODE_FLAG_DBLCLK );
@@ -1180,7 +1180,7 @@ static void drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc(struct kuni drm_hdmi_compute_mode_clock_yuv420_vic_valid_tests[0 ];unsigned long long rate; - mode =drm_display_mode_from_cea_vic (drm, vic); + mode =drm_kunit_display_mode_from_cea_vic (test, drm, vic);KUNIT_ASSERT_NOT_NULL (test, mode);KUNIT_ASSERT_FALSE (test, mode->flags &DRM_MODE_FLAG_DBLCLK );
@@ -1203,7 +1203,7 @@ static void drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc(struct kunitstruct drm_device *drm = &priv->drm;unsigned long long rate; - mode =drm_display_mode_from_cea_vic (drm,16 ); + mode =drm_kunit_display_mode_from_cea_vic (test, drm,16 );KUNIT_ASSERT_NOT_NULL (test, mode);KUNIT_ASSERT_FALSE (test, mode->flags &DRM_MODE_FLAG_DBLCLK );
@@ -1225,7 +1225,7 @@ static void drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc(struct kunistruct drm_device *drm = &priv->drm;unsigned long long rate; - mode =drm_display_mode_from_cea_vic (drm,16 ); + mode =drm_kunit_display_mode_from_cea_vic (test, drm,16 );KUNIT_ASSERT_NOT_NULL (test, mode);KUNIT_ASSERT_FALSE (test, mode->flags &DRM_MODE_FLAG_DBLCLK );
@@ -1247,7 +1247,7 @@ static void drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc(struct kunistruct drm_device *drm = &priv->drm;unsigned long long rate; - mode =drm_display_mode_from_cea_vic (drm,16 ); + mode =drm_kunit_display_mode_from_cea_vic (test, drm,16 );KUNIT_ASSERT_NOT_NULL (test, mode);KUNIT_ASSERT_FALSE (test, mode->flags &DRM_MODE_FLAG_DBLCLK );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 192/245 drm/tests: hdmi: Fix memory leaks in drm_display_mode_from_cea_vic()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit add4163aca0d4a86e9fe4aa513865e4237db8aef ]
modprobe drm_hdmi_state_helper_test and then rmmod it, the following memory leak occurs.
The mode allocated in drm_mode_duplicate() called by drm_display_mode_from_cea_vic() is not freed, which cause the memory leak:
unreferenced object 0xffffff80ccd18100 (size 128): comm "kunit_try_catch", pid 1851, jiffies 4295059695 hex dump (first 32 bytes): 57 62 00 00 80 02 90 02 f0 02 20 03 00 00 e0 01 Wb........ ..... ea 01 ec 01 0d 02 00 00 0a 00 00 00 00 00 00 00 ................ backtrace (crc c2f1aa95): [<000000000f10b11b>] kmemleak_alloc+0x34/0x40 [<000000001cd4cf73>] __kmalloc_cache_noprof+0x26c/0x2f4 [<00000000f1f3cffa>] drm_mode_duplicate+0x44/0x19c [<000000008cbeef13>] drm_display_mode_from_cea_vic+0x88/0x98 [<0000000019daaacf>] 0xffffffedc11ae69c [<000000000aad0f85>] kunit_try_run_case+0x13c/0x3ac [<00000000a9210bac>] kunit_generic_run_threadfn_adapter+0x80/0xec [<000000000a0b2e9e>] kthread+0x2e8/0x374 [<00000000bd668858>] ret_from_fork+0x10/0x20 ......
Free mode by using drm_kunit_display_mode_from_cea_vic() to fix it.
--- drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c +4 -4
@@ -441,7 +441,7 @@ static void drm_test_check_broadcast_rgb_auto_cea_mode_vic_1(struct kunit *test) ctx =drm_kunit_helper_acquire_ctx_alloc (test);KUNIT_ASSERT_NOT_ERR_OR_NULL (test, ctx); - mode =drm_display_mode_from_cea_vic (drm,1 ); + mode =drm_kunit_display_mode_from_cea_vic (test, drm,1 );KUNIT_ASSERT_NOT_NULL (test, mode); drm = &priv->drm;
@@ -555,7 +555,7 @@ static void drm_test_check_broadcast_rgb_full_cea_mode_vic_1(struct kunit *test) ctx =drm_kunit_helper_acquire_ctx_alloc (test);KUNIT_ASSERT_NOT_ERR_OR_NULL (test, ctx); - mode =drm_display_mode_from_cea_vic (drm,1 ); + mode =drm_kunit_display_mode_from_cea_vic (test, drm,1 );KUNIT_ASSERT_NOT_NULL (test, mode); drm = &priv->drm;
@@ -671,7 +671,7 @@ static void drm_test_check_broadcast_rgb_limited_cea_mode_vic_1(struct kunit *te ctx =drm_kunit_helper_acquire_ctx_alloc (test);KUNIT_ASSERT_NOT_ERR_OR_NULL (test, ctx); - mode =drm_display_mode_from_cea_vic (drm,1 ); + mode =drm_kunit_display_mode_from_cea_vic (test, drm,1 );KUNIT_ASSERT_NOT_NULL (test, mode); drm = &priv->drm;
@@ -1263,7 +1263,7 @@ static void drm_test_check_output_bpc_format_vic_1(struct kunit *test) ctx =drm_kunit_helper_acquire_ctx_alloc (test);KUNIT_ASSERT_NOT_ERR_OR_NULL (test, ctx); - mode =drm_display_mode_from_cea_vic (drm,1 ); + mode =drm_kunit_display_mode_from_cea_vic (test, drm,1 );KUNIT_ASSERT_NOT_NULL (test, mode);/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 193/245 drm/xe: Fix register definition order in xe_regs.h
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Wajdeczko <[email protected]>
[ Upstream commit 9dae9751c7b0086963f5cbb82424b5e4cf58f123 ]
Swap XEHP_CLOCK_GATE_DIS(0x101014) with GU_DEBUG(x101018).
Stable-dep-of: 993ca0eccec6 ("drm/xe: Add mmio read before GGTT invalidate")
--- drivers/gpu/drm/xe/regs/xe_regs.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/xe/regs/xe_regs.h +3 -3
@@ -24,12 +24,12 @@#define LMEM_INIT REG_BIT(7)#define DRIVERFLR REG_BIT(31) -#define GU_DEBUG XE_REG(0x101018) -#define DRIVERFLR_STATUS REG_BIT(31) -#define XEHP_CLOCK_GATE_DIS XE_REG(0x101014)#define SGSI_SIDECLK_DIS REG_BIT(17) +#define GU_DEBUG XE_REG(0x101018) +#define DRIVERFLR_STATUS REG_BIT(31) +#define XEHP_MTCFG_ADDR XE_REG(0x101800)#define TILE_COUNT REG_GENMASK(15, 8)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 194/245 drm/xe: Kill regs/xe_sriov_regs.h
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Wajdeczko <[email protected]>
[ Upstream commit 466a6c3855cf00653c14a92a6e9f8ae50077b77d ]
There is no real benefit to maintain a separate file. The register definitions related to SR-IOV can be placed in existing headers.
Stable-dep-of: 993ca0eccec6 ("drm/xe: Add mmio read before GGTT invalidate")
--- drivers/gpu/drm/xe/regs/xe_gt_regs.h | 6 ++++++ drivers/gpu/drm/xe/regs/xe_regs.h | 6 ++++++ drivers/gpu/drm/xe/regs/xe_sriov_regs.h | 23 ----------------------- drivers/gpu/drm/xe/xe_gt_sriov_pf.c | 2 +- drivers/gpu/drm/xe/xe_lmtt.c | 2 +- drivers/gpu/drm/xe/xe_sriov.c | 2 +- 6 files changed, 15 insertions(+), 26 deletions(-) delete mode 100644 drivers/gpu/drm/xe/regs/xe_sriov_regs.h
drivers/gpu/drm/xe/regs/xe_gt_regs.h +6 -0
@@ -91,6 +91,8 @@#define VE1_AUX_INV XE_REG(0x42b8)#define AUX_INV REG_BIT(0) +#define XE2_LMEM_CFG XE_REG(0x48b0) +#define XEHP_TILE_ADDR_RANGE (_idx) XE_REG_MCR(0x4900 + (_idx) * 4)#define XEHP_FLAT_CCS_BASE_ADDR XE_REG_MCR(0x4910)#define XEHP_FLAT_CCS_PTR REG_GENMASK(31, 8)
@@ -403,6 +405,10 @@#define INVALIDATION_BROADCAST_MODE_DIS REG_BIT(12)#define GLOBAL_INVALIDATION_MODE REG_BIT(2) +#define LMEM_CFG XE_REG(0xcf58) +#define LMEM_EN REG_BIT(31) +#define LMTT_DIR_PTR REG_GENMASK(30, 0)/* in multiples of 64KB */ +#define HALF_SLICE_CHICKEN5 XE_REG_MCR(0xe188, XE_REG_OPTION_MASKED)#define DISABLE_SAMPLE_G_PERFORMANCE REG_BIT(0)
drivers/gpu/drm/xe/regs/xe_regs.h +6 -0
@@ -30,6 +30,9 @@#define GU_DEBUG XE_REG(0x101018)#define DRIVERFLR_STATUS REG_BIT(31) +#define VIRTUAL_CTRL_REG XE_REG(0x10108c) +#define GUEST_GTT_UPDATE_EN REG_BIT(8) +#define XEHP_MTCFG_ADDR XE_REG(0x101800)#define TILE_COUNT REG_GENMASK(15, 8)
@@ -66,6 +69,9 @@#define DISPLAY_IRQ REG_BIT(16)#define GT_DW_IRQ (x) REG_BIT(x) +#define VF_CAP_REG XE_REG(0x1901f8, XE_REG_OPTION_VF) +#define VF_CAP REG_BIT(0) +#define PVC_RP_STATE_CAP XE_REG(0x281014)#endif
drivers/gpu/drm/xe/regs/xe_sriov_regs.h deleted +0 -23
@@ -1,23 +0,0 @@ -/* SPDX-License-Identifier: MIT */ -/* -* Copyright © 2023 Intel Corporation -*/ - -#ifndef _REGS_XE_SRIOV_REGS_H_ -#define _REGS_XE_SRIOV_REGS_H_ - -#include "regs/xe_reg_defs.h" - -#define XE2_LMEM_CFG XE_REG(0x48b0) - -#define LMEM_CFG XE_REG(0xcf58) -#define LMEM_EN REG_BIT(31) -#define LMTT_DIR_PTR REG_GENMASK(30, 0)/* in multiples of 64KB */ - -#define VIRTUAL_CTRL_REG XE_REG(0x10108c) -#define GUEST_GTT_UPDATE_EN REG_BIT(8) - -#define VF_CAP_REG XE_REG(0x1901f8, XE_REG_OPTION_VF) -#define VF_CAP REG_BIT(0) - -#endif
drivers/gpu/drm/xe/xe_gt_sriov_pf.c +1 -1
@@ -5,7 +5,7 @@#include <drm/drm_managed.h> -#include "regs/xe_sriov_regs.h" +#include "regs/xe_regs.h" #include "xe_gt_sriov_pf.h" #include "xe_gt_sriov_pf_config.h"
drivers/gpu/drm/xe/xe_lmtt.c +1 -1
@@ -7,7 +7,7 @@#include <drm/drm_managed.h> -#include "regs/xe_sriov_regs.h" +#include "regs/xe_gt_regs.h" #include "xe_assert.h" #include "xe_bo.h"
drivers/gpu/drm/xe/xe_sriov.c +1 -1
@@ -5,7 +5,7 @@#include <drm/drm_managed.h> -#include "regs/xe_sriov_regs.h" +#include "regs/xe_regs.h" #include "xe_assert.h" #include "xe_device.h"
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 195/245 drm/xe: Add mmio read before GGTT invalidate
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Brost <[email protected]>
[ Upstream commit 993ca0eccec65a2cacc3cefb15d35ffadc6f00fb ]
On LNL without a mmio read before a GGTT invalidate the GuC can incorrectly read the GGTT scratch page upon next access leading to jobs not getting scheduled. A mmio read before a GGTT invalidate seems to fix this. Since a GGTT invalidate is not a hot code path, blindly do a mmio read before each GGTT invalidate.
--- drivers/gpu/drm/xe/xe_ggtt.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/gpu/drm/xe/xe_ggtt.c +10 -0
@@ -309,6 +309,16 @@ static void ggtt_invalidate_gt_tlb(struct xe_gt *gt)static void xe_ggtt_invalidate (struct xe_ggtt *ggtt) { +struct xe_device *xe =tile_to_xe (ggtt->tile); + +/* +* XXX: Barrier for GGTT pages. Unsure exactly why this required but +* without this LNL is having issues with the GuC reading scratch page +* vs. correct GGTT page. Not particularly a hot code path so blindly +* do a mmio read here which results in GuC reading correct GGTT page. +*/ +xe_mmio_read32 (xe_root_mmio_gt (xe),VF_CAP_REG ); +/* Each GT in a tile has its own TLB to cache GGTT lookups */ ggtt_invalidate_gt_tlb (ggtt->tile->primary_gt);ggtt_invalidate_gt_tlb (ggtt->tile->media_gt);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 196/245 drm/xe: Dont short circuit TDR on jobs not started
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Brost <[email protected]>
[ Upstream commit fe05cee4d9533892210e1ee90147175d87e7c053 ]
Short circuiting TDR on jobs not started is an optimization which is not required. On LNL we are facing an issue where jobs do not get scheduled by the GuC if it misses a GGTT page update. When this occurs let the TDR fire, toggle the scheduling which may get the job unstuck, and print a warning message. If the TDR fires twice on job that hasn't started, timeout the job.
v2:
- Add warning message (Paulo)
- Add fixes tag (Paulo)
- Timeout job which hasn't started after TDR firing twice
v3:
- Include local change
v4:
- Short circuit check_timeout on job not started
- use warn level rather than notice (Paulo)
--- drivers/gpu/drm/xe/xe_guc_submit.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
drivers/gpu/drm/xe/xe_guc_submit.c +12 -6
@@ -989,12 +989,22 @@ static void xe_guc_exec_queue_lr_cleanup(struct work_struct *w)static bool check_timeout (struct xe_exec_queue *q,struct xe_sched_job *job) {struct xe_gt *gt =guc_to_gt (exec_queue_to_guc (q)); -u32 ctx_timestamp =xe_lrc_ctx_timestamp (q->lrc[0 ]); -u32 ctx_job_timestamp =xe_lrc_ctx_job_timestamp (q->lrc[0 ]); +u32 ctx_timestamp, ctx_job_timestamp;u32 timeout_ms = q->sched_props.job_timeout_ms;u32 diff;u64 running_time_ms; +if (!xe_sched_job_started (job)) { +xe_gt_warn (gt,"Check job timeout: seqno=%u, lrc_seqno=%u, guc_id=%d, not started" , +xe_sched_job_seqno (job),xe_sched_job_lrc_seqno (job), + q->guc->id); + +return xe_sched_invalidate_job (job,2 ); + } + + ctx_timestamp =xe_lrc_ctx_timestamp (q->lrc[0 ]); + ctx_job_timestamp =xe_lrc_ctx_job_timestamp (q->lrc[0 ]); +/* * Counter wraps at ~223s at the usual 19.2MHz, be paranoid catch * possible overflows with a high timeout.
@@ -1120,10 +1130,6 @@ guc_exec_queue_timedout_job(struct drm_sched_job *drm_job)exec_queue_killed_or_banned_or_wedged (q) ||exec_queue_destroyed (q); -/* Job hasn't started, can't be timed out */ -if (!skip_timeout_check && !xe_sched_job_started (job)) - goto rearm; -/* * XXX: Sampling timeout doesn't work in wedged mode as we have to * modify scheduling state to read timestamp. We could read the
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 197/245 io_uring/rw: fix missing NOWAIT check for O_DIRECT start write
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Axboe <[email protected]>
[ Upstream commit 1d60d74e852647255bd8e76f5a22dc42531e4389 ]
When io_uring starts a write, it'll call kiocb_start_write() to bump the super block rwsem, preventing any freezes from happening while that write is in-flight. The freeze side will grab that rwsem for writing, excluding any new writers from happening and waiting for existing writes to finish. But io_uring unconditionally uses kiocb_start_write(), which will block if someone is currently attempting to freeze the mount point. This causes a deadlock where freeze is waiting for previous writes to complete, but the previous writes cannot complete, as the task that is supposed to complete them is blocked waiting on starting a new write. This results in the following stuck trace showing that dependency with the write blocked starting a new write:
task:fio state:D stack:0 pid:886 tgid:886 ppid:876
Call trace:
__switch_to+0x1d8/0x348
__schedule+0x8e8/0x2248
schedule+0x110/0x3f0
percpu_rwsem_wait+0x1e8/0x3f8
__percpu_down_read+0xe8/0x500
io_write+0xbb8/0xff8
io_issue_sqe+0x10c/0x1020
io_submit_sqes+0x614/0x2110
__arm64_sys_io_uring_enter+0x524/0x1038
invoke_syscall+0x74/0x268
el0_svc_common.constprop.0+0x160/0x238
do_el0_svc+0x44/0x60
el0_svc+0x44/0xb0
el0t_64_sync_handler+0x118/0x128
el0t_64_sync+0x168/0x170
INFO: task fsfreeze:7364 blocked for more than 15 seconds.
Not tainted 6.12.0-rc5-00063-g76aaf945701c #7963with the attempting freezer stuck trying to grab the rwsem:
task:fsfreeze state:D stack:0 pid:7364 tgid:7364 ppid:995
Call trace: __switch_to+0x1d8/0x348 __schedule+0x8e8/0x2248 schedule+0x110/0x3f0 percpu_down_write+0x2b0/0x680 freeze_super+0x248/0x8a8 do_vfs_ioctl+0x149c/0x1b18 __arm64_sys_ioctl+0xd0/0x1a0 invoke_syscall+0x74/0x268 el0_svc_common.constprop.0+0x160/0x238 do_el0_svc+0x44/0x60 el0_svc+0x44/0xb0 el0t_64_sync_handler+0x118/0x128 el0t_64_sync+0x168/0x170
Fix this by having the io_uring side honor IOCB_NOWAIT, and only attempt a blocking grab of the super block rwsem if it isn't set. For normal issue where IOCB_NOWAIT would always be set, this returns -EAGAIN which will have io_uring core issue a blocking attempt of the write. That will in turn also get completions run, ensuring forward progress.
Since freezing requires CAP_SYS_ADMIN in the first place, this isn't something that can be triggered by a regular user.
--- io_uring/rw.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-)
io_uring/rw.c +21 -2
@@ -1016,6 +1016,25 @@ int io_read_mshot(struct io_kiocb *req, unsigned int issue_flags)return IOU_OK ; } +static bool io_kiocb_start_write (struct io_kiocb *req,struct kiocb *kiocb) +{ +struct inode *inode; +bool ret; + +if (!(req->flags &REQ_F_ISREG )) +return true; +if (!(kiocb->ki_flags &IOCB_NOWAIT )) { +kiocb_start_write (kiocb); +return true; + } + + inode =file_inode (kiocb->ki_filp); + ret =sb_start_write_trylock (inode->i_sb); +if (ret) +__sb_writers_release (inode->i_sb,SB_FREEZE_WRITE ); +return ret; +} +int io_write (struct io_kiocb *req,unsigned int issue_flags) {bool force_nonblock = issue_flags &IO_URING_F_NONBLOCK ;
@@ -1053,8 +1072,8 @@ int io_write(struct io_kiocb *req, unsigned int issue_flags)if (unlikely (ret))return ret; -if (req->flags &REQ_F_ISREG ) -kiocb_start_write (kiocb); +if (unlikely (!io_kiocb_start_write (req, kiocb))) +return -EAGAIN ; kiocb->ki_flags |=IOCB_WRITE ;if (likely (req->file->f_op->write_iter))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 198/245 btrfs: fix extent map merging not happening for adjacent extents
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
[ Upstream commit a0f0625390858321525c2a8d04e174a546bd19b3 ]
If we have 3 or more adjacent extents in a file, that is, consecutive file extent items pointing to adjacent extents, within a contiguous file range and compatible flags, we end up not merging all the extents into a single extent map.
For example:
$ mkfs.btrfs -f /dev/sdc $ mount /dev/sdc /mnt/sdc
$ xfs_io -f -d -c "pwrite -b 64K 0 64K" \
-c "pwrite -b 64K 64K 64K" \
-c "pwrite -b 64K 128K 64K" \
-c "pwrite -b 64K 192K 64K" \
/mnt/sdc/fooAfter all the ordered extents complete we unpin the extent maps and try to merge them, but instead of getting a single extent map we get two because:
1) When the first ordered extent completes (file range [0, 64K)) we unpin its extent map and attempt to merge it with the extent map for the range [64K, 128K), but we can't because that extent map is still pinned;
2) When the second ordered extent completes (file range [64K, 128K)), we unpin its extent map and merge it with the previous extent map, for file range [0, 64K), but we can't merge with the next extent map, for the file range [128K, 192K), because this one is still pinned.
The merged extent map for the file range [0, 128K) gets the flag EXTENT_MAP_MERGED set;
3) When the third ordered extent completes (file range [128K, 192K)), we unpin its extent map and attempt to merge it with the previous extent map, for file range [0, 128K), but we can't because that extent map has the flag EXTENT_MAP_MERGED set (mergeable_maps() returns false due to different flags) while the extent map for the range [128K, 192K) doesn't have that flag set.
We also can't merge it with the next extent map, for file range [192K, 256K), because that one is still pinned.
At this moment we have 3 extent maps:
One for file range [0, 128K), with the flag EXTENT_MAP_MERGED set. One for file range [128K, 192K).
One for file range [192K, 256K) which is still pinned;
4) When the fourth and final extent completes (file range [192K, 256K)), we unpin its extent map and attempt to merge it with the previous extent map, for file range [128K, 192K), which succeeds since none of these extent maps have the EXTENT_MAP_MERGED flag set.
So we end up with 2 extent maps:
One for file range [0, 128K), with the flag EXTENT_MAP_MERGED set. One for file range [128K, 256K), with the flag EXTENT_MAP_MERGED set.
Since after merging extent maps we don't attempt to merge again, that is, merge the resulting extent map with the one that is now preceding it (and the one following it), we end up with those two extent maps, when we could have had a single extent map to represent the whole file.
Fix this by making mergeable_maps() ignore the EXTENT_MAP_MERGED flag. While this doesn't present any functional issue, it prevents the merging of extent maps which allows to save memory, and can make defrag not merging extents too (that will be addressed in the next patch).
--- fs/btrfs/extent_map.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
fs/btrfs/extent_map.c +6 -1
@@ -227,7 +227,12 @@ static bool mergeable_maps(const struct extent_map *prev, const struct extent_maif (extent_map_end (prev) != next->start)return false; -if (prev->flags != next->flags) +/* +* The merged flag is not an on-disk flag, it just indicates we had the +* extent maps of 2 (or more) adjacent extents merged, so factor it out. +*/ +if ((prev->flags & ~EXTENT_FLAG_MERGED ) != + (next->flags & ~EXTENT_FLAG_MERGED ))return false;if (next->disk_bytenr <EXTENT_MAP_LAST_BYTE -1 )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 199/245 btrfs: fix defrag not merging contiguous extents due to merged extent maps
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
[ Upstream commit 77b0d113eec49a7390ff1a08ca1923e89f5f86c6 ]
When running defrag (manual defrag) against a file that has extents that are contiguous and we already have the respective extent maps loaded and merged, we end up not defragging the range covered by those contiguous extents. This happens when we have an extent map that was the result of merging multiple extent maps for contiguous extents and the length of the merged extent map is greater than or equals to the defrag threshold length.
The script below reproduces this scenario:
$ cat test.sh #!/bin/bash
DEV=/dev/sdi
MNT=/mnt/sdi
mkfs.btrfs -f $DEV
mount $DEV $MNT
# Create a 256K file with 4 extents of 64K each.
xfs_io -f -c "falloc 0 64K" \
-c "pwrite 0 64K" \
-c "falloc 64K 64K" \
-c "pwrite 64K 64K" \
-c "falloc 128K 64K" \
-c "pwrite 128K 64K" \
-c "falloc 192K 64K" \
-c "pwrite 192K 64K" \
$MNT/foo umount $MNT
echo -n "Initial number of file extent items: "
btrfs inspect-internal dump-tree -t 5 $DEV | grep EXTENT_DATA | wc -l
mount $DEV $MNT
# Read the whole file in order to load and merge extent maps. cat $MNT/foo > /dev/null
btrfs filesystem defragment -t 128K $MNT/foo
umount $MNT
echo -n "Number of file extent items after defrag with 128K threshold: " btrfs inspect-internal dump-tree -t 5 $DEV | grep EXTENT_DATA | wc -l
mount $DEV $MNT
# Read the whole file in order to load and merge extent maps. cat $MNT/foo > /dev/null
btrfs filesystem defragment -t 256K $MNT/foo
umount $MNT
echo -n "Number of file extent items after defrag with 256K threshold: " btrfs inspect-internal dump-tree -t 5 $DEV | grep EXTENT_DATA | wc -l
Running it:
$ ./test.sh Initial number of file extent items: 4 Number of file extent items after defrag with 128K threshold: 4 Number of file extent items after defrag with 256K threshold: 4
The 4 extents don't get merged because we have an extent map with a size of 256K that is the result of merging the individual extent maps for each of the four 64K extents and at defrag_lookup_extent() we have a value of zero for the generation threshold ('newer_than' argument) since this is a manual defrag. As a consequence we don't call defrag_get_extent() to get an extent map representing a single file extent item in the inode's subvolume tree, so we end up using the merged extent map at defrag_collect_targets() and decide not to defrag.
Fix this by updating defrag_lookup_extent() to always discard extent maps that were merged and call defrag_get_extent() regardless of the minimum generation threshold ('newer_than' argument).
A test case for fstests will be sent along soon.
--- fs/btrfs/defrag.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
fs/btrfs/defrag.c +5 -5
@@ -772,12 +772,12 @@ static struct extent_map *defrag_lookup_extent(struct inode *inode, u64 start,* We can get a merged extent, in that case, we need to re-search * tree to get the original em for defrag. * -* If @newer_than is 0 or em::generation < newer_than, we can trust -* this em, as either we don't care about the generation, or the -* merged extent map will be rejected anyway. +* This is because even if we have adjacent extents that are contiguous +* and compatible (same type and flags), we still want to defrag them +* so that we use less metadata (extent items in the extent tree and +* file extent items in the inode's subvolume tree). */ -if (em && (em->flags &EXTENT_FLAG_MERGED ) && - newer_than && em->generation >= newer_than) { +if (em && (em->flags &EXTENT_FLAG_MERGED )) {free_extent_map (em); em =NULL ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 200/245 gpiolib: fix debugfs newline separators
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
[ Upstream commit 3e8b7238b427e05498034c240451af5f5495afda ]
The gpiolib debugfs interface exports a list of all gpio chips in a system and the state of their pins.
The gpio chip sections are supposed to be separated by a newline character, but a long-standing bug prevents the separator from being included when output is generated in multiple sessions, making the output inconsistent and hard to read.
Make sure to only suppress the newline separator at the beginning of the file as intended.
--- drivers/gpio/gpiolib.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpio/gpiolib.c +2 -0
@@ -4834,6 +4834,8 @@ static void *gpiolib_seq_start(struct seq_file *s, loff_t *pos)return NULL ; s->private = priv; +if (*pos >0 ) + priv->newline = true; priv->idx =srcu_read_lock (&gpio_devices_srcu); list_for_each_entry_srcu(gdev, &gpio_devices, list,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 201/245 gpiolib: fix debugfs dangling chip separator
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
[ Upstream commit 604888f8c3d01fddd9366161efc65cb3182831f1 ]
Add the missing newline after entries for recently removed gpio chips so that the chip sections are separated by a newline as intended.
--- drivers/gpio/gpiolib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpio/gpiolib.c +1 -1
@@ -4879,7 +4879,7 @@ static int gpiolib_seq_show(struct seq_file *s, void *v) gc =srcu_dereference (gdev->chip, &gdev->srcu);if (!gc) { -seq_printf (s,"%s%s: (dangling chip)" , +seq_printf (s,"%s%s: (dangling chip)\n" , priv->newline ?"\n" :"" ,dev_name (&gdev->dev));return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 202/245 vmscan,migrate: fix page count imbalance on node stats when demoting pages
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gregory Price <[email protected]>
[ Upstream commit 35e41024c4c2b02ef8207f61b9004f6956cf037b ]
When numa balancing is enabled with demotion, vmscan will call migrate_pages when shrinking LRUs. migrate_pages will decrement the the node's isolated page count, leading to an imbalanced count when invoked from (MG)LRU code.
The result is dmesg output like such:
$ cat /proc/sys/vm/stat_refresh
[77383.088417] vmstat_refresh: nr_isolated_anon -103212 [77383.088417] vmstat_refresh: nr_isolated_file -899642
This negative value may impact compaction and reclaim throttling.
The following path produces the decrement:
shrink_folio_list
demote_folio_list
migrate_pages
migrate_pages_batch
migrate_folio_move
migrate_folio_done
mod_node_page_state(-ve) <- decrement
This path happens for SUCCESSFUL migrations, not failures. Typically callers to migrate_pages are required to handle putback/accounting for failures, but this is already handled in the shrink code.
When accounting for migrations, instead do not decrement the count when the migration reason is MR_DEMOTION. As of v6.11, this demotion logic is the only source of MR_DEMOTION.
--- mm/migrate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/migrate.c +1 -1
@@ -1099,7 +1099,7 @@ static void migrate_folio_done(struct folio *src,* not accounted to NR_ISOLATED_*. They can be recognized * as __folio_test_movable */ -if (likely (!__folio_test_movable (src))) +if (likely (!__folio_test_movable (src)) && reason !=MR_DEMOTION )mod_node_page_state (folio_pgdat (src),NR_ISOLATED_ANON +folio_is_file_lru (src), -folio_nr_pages (src));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 203/245 mm, mmap: limit THP alignment of anonymous mappings to PMD-aligned sizes
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vlastimil Babka <[email protected]>
[ Upstream commit d4148aeab412432bf928f311eca8a2ba52bb05df ]
Since commit efa7df3e3bb5 ("mm: align larger anonymous mappings on THP boundaries") a mmap() of anonymous memory without a specific address hint and of at least PMD_SIZE will be aligned to PMD so that it can benefit from a THP backing page.
However this change has been shown to regress some workloads significantly. [1] reports regressions in various spec benchmarks, with up to 600% slowdown of the cactusBSSN benchmark on some platforms. The benchmark seems to create many mappings of 4632kB, which would have merged to a large THP-backed area before commit efa7df3e3bb5 and now they are fragmented to multiple areas each aligned to PMD boundary with gaps between. The regression then seems to be caused mainly due to the benchmark's memory access pattern suffering from TLB or cache aliasing due to the aligned boundaries of the individual areas.
Another known regression bisected to commit efa7df3e3bb5 is darktable [2]
[3] and early testing suggests this patch fixes the regression there as well.
To fix the regression but still try to benefit from THP-friendly anonymous mapping alignment, add a condition that the size of the mapping must be a multiple of PMD size instead of at least PMD size. In case of many odd-sized mapping like the cactusBSSN creates, those will stop being aligned and with gaps between, and instead naturally merge again.
--- mm/mmap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
mm/mmap.c +2 -1
@@ -1952,7 +1952,8 @@ __get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,if (get_area) { addr =get_area (file, addr, len, pgoff, flags); - }else if (IS_ENABLED (CONFIG_TRANSPARENT_HUGEPAGE )) { + }else if (IS_ENABLED (CONFIG_TRANSPARENT_HUGEPAGE ) + &&IS_ALIGNED (len,PMD_SIZE )) {/* Ensures that larger anonymous mappings are THP aligned. */ addr =thp_get_unmapped_area_vmflags (file, addr, len, pgoff, flags, vm_flags);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 204/245 Input: fix regression when re-registering input handlers
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Torokhov <[email protected]>
[ Upstream commit 071b24b54d2d05fbf39ddbb27dee08abd1d713f3 ]
Commit d469647bafd9 ("Input: simplify event handling logic") introduced code that would set handler->events() method to either input_handler_events_filter() or input_handler_events_default() or input_handler_events_null(), depending on the kind of input handler (a filter or a regular one) we are dealing with. Unfortunately this breaks cases when we try to re-register the same filter (as is the case with sysrq handler): after initial registration the handler will have 2 event handling methods defined, and will run afoul of the check in input_handler_check_methods():
input: input_handler_check_methods: only one event processing method can be defined (sysrq)
sysrq: Failed to register input handler, error -22
Fix this by adding handle_events() method to input_handle structure and setting it up when registering a new input handle according to event handling methods defined in associated input_handler structure, thus avoiding modifying the input_handler structure.
--- drivers/input/input.c | 134 +++++++++++++++++++++++------------------- include/linux/input.h | 10 +++- 2 files changed, 82 insertions(+), 62 deletions(-)
drivers/input/input.c +73 -61
@@ -119,12 +119,12 @@ static void input_pass_values(struct input_dev *dev, handle =rcu_dereference (dev->grab);if (handle) { - count = handle->handler->events (handle, vals, count); + count = handle->handle_events (handle, vals, count); }else {list_for_each_entry_rcu (handle, &dev->h_list, d_node)if (handle->open) { - count = handle->handler->events (handle, vals, - count); + count = handle->handle_events (handle, vals, + count);if (!count)break ; }
@@ -2537,57 +2537,6 @@ static int input_handler_check_methods(const struct input_handler *handler)return 0 ; } -/* -* An implementation of input_handler's events() method that simply -* invokes handler->event() method for each event one by one. -*/ -static unsigned int input_handler_events_default (struct input_handle *handle, -struct input_value *vals, -unsigned int count) -{ -struct input_handler *handler = handle->handler; -struct input_value *v; - -for (v = vals; v != vals + count; v++) - handler->event (handle, v->type, v->code, v->value); - -return count; -} - -/* -* An implementation of input_handler's events() method that invokes -* handler->filter() method for each event one by one and removes events -* that were filtered out from the "vals" array. -*/ -static unsigned int input_handler_events_filter (struct input_handle *handle, -struct input_value *vals, -unsigned int count) -{ -struct input_handler *handler = handle->handler; -struct input_value *end = vals; -struct input_value *v; - -for (v = vals; v != vals + count; v++) { -if (handler->filter (handle, v->type, v->code, v->value)) -continue ; -if (end != v) - *end = *v; - end++; - } - -return end - vals; -} - -/* -* An implementation of input_handler's events() method that does nothing. -*/ -static unsigned int input_handler_events_null (struct input_handle *handle, -struct input_value *vals, -unsigned int count) -{ -return count; -} -/** * input_register_handler - register a new input handler * @handler: handler to be registered
@@ -2607,13 +2556,6 @@ int input_register_handler(struct input_handler *handler)INIT_LIST_HEAD (&handler->h_list); -if (handler->filter) - handler->events = input_handler_events_filter; -else if (handler->event) - handler->events = input_handler_events_default; -else if (!handler->events) - handler->events = input_handler_events_null; - error =mutex_lock_interruptible (&input_mutex);if (error)return error;
@@ -2687,6 +2629,75 @@ int input_handler_for_each_handle(struct input_handler *handler, void *data, }EXPORT_SYMBOL (input_handler_for_each_handle); +/* +* An implementation of input_handle's handle_events() method that simply +* invokes handler->event() method for each event one by one. +*/ +static unsigned int input_handle_events_default (struct input_handle *handle, +struct input_value *vals, +unsigned int count) +{ +struct input_handler *handler = handle->handler; +struct input_value *v; + +for (v = vals; v != vals + count; v++) + handler->event (handle, v->type, v->code, v->value); + +return count; +} + +/* +* An implementation of input_handle's handle_events() method that invokes +* handler->filter() method for each event one by one and removes events +* that were filtered out from the "vals" array. +*/ +static unsigned int input_handle_events_filter (struct input_handle *handle, +struct input_value *vals, +unsigned int count) +{ +struct input_handler *handler = handle->handler; +struct input_value *end = vals; +struct input_value *v; + +for (v = vals; v != vals + count; v++) { +if (handler->filter (handle, v->type, v->code, v->value)) +continue ; +if (end != v) + *end = *v; + end++; + } + +return end - vals; +} + +/* +* An implementation of input_handle's handle_events() method that does nothing. +*/ +static unsigned int input_handle_events_null (struct input_handle *handle, +struct input_value *vals, +unsigned int count) +{ +return count; +} + +/* +* Sets up appropriate handle->event_handler based on the input_handler +* associated with the handle. +*/ +static void input_handle_setup_event_handler (struct input_handle *handle) +{ +struct input_handler *handler = handle->handler; + +if (handler->filter) + handle->handle_events = input_handle_events_filter; +else if (handler->event) + handle->handle_events = input_handle_events_default; +else if (handler->events) + handle->handle_events = handler->events; +else + handle->handle_events = input_handle_events_null; +} +/** * input_register_handle - register a new input handle * @handle: handle to register
@@ -2704,6 +2715,7 @@ int input_register_handle(struct input_handle *handle)struct input_dev *dev = handle->dev;int error; +input_handle_setup_event_handler (handle);/* * We take dev->mutex here to prevent race with * input_release_device().
include/linux/input.h +9 -1
@@ -339,12 +339,16 @@ struct input_handler {* @name: name given to the handle by handler that created it * @dev: input device the handle is attached to * @handler: handler that works with the device through this handle +* @handle_events: event sequence handler. It is set up by the input core +* according to event handling method specified in the @handler. See +* input_handle_setup_event_handler(). +* This method is being called by the input core with interrupts disabled +* and dev->event_lock spinlock held and so it may not sleep. * @d_node: used to put the handle on device's list of attached handles * @h_node: used to put the handle on handler's list of handles from which * it gets events */ struct input_handle { -void *private;int open;
@@ -353,6 +357,10 @@ struct input_handle {struct input_dev *dev;struct input_handler *handler; +unsigned int (*handle_events)(struct input_handle *handle, +struct input_value *vals, +unsigned int count); +struct list_head d_node;struct list_head h_node; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 205/245 mm: multi-gen LRU: ignore non-leaf pmd_young for force_scan=true
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuanchu Xie <[email protected]>
[ Upstream commit bceeeaed4817ba7ad9013b4116c97220a60fcf7c ]
When non-leaf pmd accessed bits are available, MGLRU page table walks can clear the non-leaf pmd accessed bit and ignore the accessed bit on the pte if it's on a different node, skipping a generation update as well. If another scan occurs on the same node as said skipped pte.
The non-leaf pmd accessed bit might remain cleared and the pte accessed bits won't be checked. While this is sufficient for reclaim-driven aging, where the goal is to select a reasonably cold page, the access can be missed when aging proactively for workingset estimation of a node/memcg.
In more detail, get_pfn_folio returns NULL if the folio's nid != node under scanning, so the page table walk skips processing of said pte. Now the pmd_young flag on this pmd is cleared, and if none of the pte's are accessed before another scan occurs on the folio's node, the pmd_young check fails and the pte accessed bit is skipped.
Since force_scan disables various other optimizations, we check force_scan to ignore the non-leaf pmd accessed bit.
Stable-dep-of: ddd6d8e975b1 ("mm: multi-gen LRU: remove MM_LEAF_OLD and MM_NONLEAF_TOTAL stats")
--- mm/vmscan.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
mm/vmscan.c +2 -2
@@ -3456,7 +3456,7 @@ static void walk_pmd_range_locked(pud_t *pud, unsigned long addr, struct vm_area goto next;if (!pmd_trans_huge (pmd[i])) { -if (should_clear_pmd_young ()) +if (!walk->force_scan &&should_clear_pmd_young ())pmdp_test_and_clear_young (vma, addr, pmd + i); goto next; }
@@ -3543,7 +3543,7 @@ static void walk_pmd_range(pud_t *pud, unsigned long start, unsigned long end, walk->mm_stats[MM_NONLEAF_TOTAL ]++; -if (should_clear_pmd_young ()) { +if (!walk->force_scan &&should_clear_pmd_young ()) {if (!pmd_young (val))continue ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 206/245 mm: multi-gen LRU: remove MM_LEAF_OLD and MM_NONLEAF_TOTAL stats
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yu Zhao <[email protected]>
[ Upstream commit ddd6d8e975b171ea3f63a011a75820883ff0d479 ]
Patch series "mm: multi-gen LRU: Have secondary MMUs participate in MM_WALK".
Today, the MM_WALK capability causes MGLRU to clear the young bit from PMDs and PTEs during the page table walk before eviction, but MGLRU does not call the clear_young() MMU notifier in this case. By not calling this notifier, the MM walk takes less time/CPU, but it causes pages that are accessed mostly through KVM / secondary MMUs to appear younger than they should be.
We do call the clear_young() notifier today, but only when attempting to evict the page, so we end up clearing young/accessed information less frequently for secondary MMUs than for mm PTEs, and therefore they appear younger and are less likely to be evicted. Therefore, memory that is *not* being accessed mostly by KVM will be evicted *more* frequently, worsening performance.
ChromeOS observed a tab-open latency regression when enabling MGLRU with a setup that involved running a VM:
Tab-open latency histogram (ms)
Version p50 mean p95 p99 max
base 1315 1198 2347 3454 10319
mglru 2559 1311 7399 12060 43758
fix 1119 926 2470 4211 6947
This series replaces the final non-selftest patchs from this series[1], which introduced a similar change (and a new MMU notifier) with KVM optimizations. I'll send a separate series (to Sean and Paolo) for the KVM optimizations.
This series also makes proactive reclaim with MGLRU possible for KVM memory. I have verified that this functions correctly with the selftest from [1], but given that that test is a KVM selftest, I'll send it with the rest of the KVM optimizations later. Andrew, let me know if you'd like to take the test now anyway.
[1]: https://lore.kernel.org/linux-mm/[email protected]/
This patch (of 2):
The removed stats, MM_LEAF_OLD and MM_NONLEAF_TOTAL, are not very helpful and become more complicated to properly compute when adding test/clear_young() notifiers in MGLRU's mm walk.
--- include/linux/mmzone.h | 2 -- mm/vmscan.c | 14 +++++--------- 2 files changed, 5 insertions(+), 11 deletions(-)
include/linux/mmzone.h +0 -2
@@ -458,9 +458,7 @@ struct lru_gen_folio {enum {MM_LEAF_TOTAL ,/* total leaf entries */ -MM_LEAF_OLD ,/* old leaf entries */ MM_LEAF_YOUNG ,/* young leaf entries */ -MM_NONLEAF_TOTAL ,/* total non-leaf entries */ MM_NONLEAF_FOUND ,/* non-leaf entries found in Bloom filters */ MM_NONLEAF_ADDED ,/* non-leaf entries added to Bloom filters */ NR_MM_STATS
mm/vmscan.c +5 -9
@@ -3376,7 +3376,6 @@ static bool walk_pte_range(pmd_t *pmd, unsigned long start, unsigned long end,continue ;if (!pte_young (ptent)) { - walk->mm_stats[MM_LEAF_OLD ]++;continue ; }
@@ -3529,7 +3528,6 @@ static void walk_pmd_range(pud_t *pud, unsigned long start, unsigned long end, walk->mm_stats[MM_LEAF_TOTAL ]++;if (!pmd_young (val)) { - walk->mm_stats[MM_LEAF_OLD ]++;continue ; }
@@ -3541,8 +3539,6 @@ static void walk_pmd_range(pud_t *pud, unsigned long start, unsigned long end,continue ; } - walk->mm_stats[MM_NONLEAF_TOTAL ]++; -if (!walk->force_scan &&should_clear_pmd_young ()) {if (!pmd_young (val))continue ;
@@ -5231,11 +5227,11 @@ static void lru_gen_seq_show_full(struct seq_file *m, struct lruvec *lruvec,for (tier =0 ; tier <MAX_NR_TIERS ; tier++) {seq_printf (m," %10d" , tier);for (type =0 ; type <ANON_AND_FILE ; type++) { -const char *s =" " ; +const char *s ="xxx" ;unsigned long n[3 ] = {};if (seq == max_seq) { - s ="RT " ; + s ="RTx" ; n[0 ] =READ_ONCE (lrugen->avg_refaulted[type][tier]); n[1 ] =READ_ONCE (lrugen->avg_total[type][tier]); }else if (seq == min_seq[type] ||NR_HIST_GENS >1 ) {
@@ -5257,14 +5253,14 @@ static void lru_gen_seq_show_full(struct seq_file *m, struct lruvec *lruvec,seq_puts (m," " );for (i =0 ; i <NR_MM_STATS ; i++) { -const char *s =" " ; +const char *s ="xxxx" ;unsigned long n =0 ;if (seq == max_seq &&NR_HIST_GENS ==1 ) { - s ="LOYNFA" ; + s ="TYFA" ; n =READ_ONCE (mm_state->stats[hist][i]); }else if (seq != max_seq &&NR_HIST_GENS >1 ) { - s ="loynfa" ; + s ="tyfa" ; n =READ_ONCE (mm_state->stats[hist][i]); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 207/245 mm: shrink skip folio mapped by an exiting process
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhiguo Jiang <[email protected]>
[ Upstream commit c495b97624d0c059b0403e26dadb166d69918409 ]
The releasing process of the non-shared anonymous folio mapped solely by an exiting process may go through two flows: 1) the anonymous folio is firstly is swaped-out into swapspace and transformed into a swp_entry in shrink_folio_list; 2) then the swp_entry is released in the process exiting flow. This will result in the high cpu load of releasing a non-shared anonymous folio mapped solely by an exiting process.
When the low system memory and the exiting process exist at the same time, it will be likely to happen, because the non-shared anonymous folio mapped solely by an exiting process may be reclaimed by shrink_folio_list.
This patch is that shrink skips the non-shared anonymous folio solely mapped by an exting process and this folio is only released directly in the process exiting flow, which will save swap-out time and alleviate the load of the process exiting.
Barry provided some effectiveness testing in [1]. "I observed that this patch effectively skipped 6114 folios (either 4KB or 64KB mTHP), potentially reducing the swap-out by up to 92MB (97,300,480 bytes) during the process exit. The working set size is 256MB."
Stable-dep-of: 1d4832becdc2 ("mm: multi-gen LRU: use {ptep,pmdp}_clear_young_notify()")
--- mm/rmap.c | 15 +++++++++++++++ mm/vmscan.c | 7 ++++++- 2 files changed, 21 insertions(+), 1 deletion(-)
mm/rmap.c +15 -0
@@ -75,6 +75,7 @@#include <linux/memremap.h> #include <linux/userfaultfd_k.h> #include <linux/mm_inline.h> +#include <linux/oom.h> #include <asm/tlbflush.h>
@@ -870,6 +871,20 @@ static bool folio_referenced_one(struct folio *folio,continue ; } +/* +* Skip the non-shared swapbacked folio mapped solely by +* the exiting or OOM-reaped process. This avoids redundant +* swap-out followed by an immediate unmap. +*/ +if ((!atomic_read (&vma->vm_mm->mm_users) || +check_stable_address_space (vma->vm_mm)) && +folio_test_anon (folio) &&folio_test_swapbacked (folio) && + !folio_likely_mapped_shared (folio)) { + pra->referenced =-1 ; +page_vma_mapped_walk_done (&pvmw); +return false; + } +if (pvmw.pte) {if (lru_gen_enabled () &&pte_young (ptep_get (pvmw.pte))) {
mm/vmscan.c +6 -1
@@ -863,7 +863,12 @@ static enum folio_references folio_check_references(struct folio *folio,if (vm_flags &VM_LOCKED )return FOLIOREF_ACTIVATE ; -/* rmap lock contention: rotate */ +/* +* There are two cases to consider. +* 1) Rmap lock contention: rotate. +* 2) Skip the non-shared swapbacked folio mapped solely by +* the exiting or OOM-reaped process. +*/ if (referenced_ptes ==-1 )return FOLIOREF_KEEP ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 208/245 mm: multi-gen LRU: use {ptep,pmdp}_clear_young_notify()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yu Zhao <[email protected]>
[ Upstream commit 1d4832becdc2cdb2cffe2a6050c9d9fd8ff1c58c ]
When the MM_WALK capability is enabled, memory that is mostly accessed by a VM appears younger than it really is, therefore this memory will be less likely to be evicted. Therefore, the presence of a running VM can significantly increase swap-outs for non-VM memory, regressing the performance for the rest of the system.
Fix this regression by always calling {ptep,pmdp}_clear_young_notify() whenever we clear the young bits on PMDs/PTEs.
--- include/linux/mmzone.h | 5 ++- mm/rmap.c | 9 ++--- mm/vmscan.c | 88 +++++++++++++++++++++++------------------- 3 files changed, 55 insertions(+), 47 deletions(-)
include/linux/mmzone.h +3 -2
@@ -555,7 +555,7 @@ struct lru_gen_memcg {void lru_gen_init_pgdat (struct pglist_data *pgdat);void lru_gen_init_lruvec (struct lruvec *lruvec); -void lru_gen_look_around (struct page_vma_mapped_walk *pvmw); +bool lru_gen_look_around (struct page_vma_mapped_walk *pvmw);void lru_gen_init_memcg (struct mem_cgroup *memcg);void lru_gen_exit_memcg (struct mem_cgroup *memcg);
@@ -574,8 +574,9 @@ static inline void lru_gen_init_lruvec(struct lruvec *lruvec) { } -static inline void lru_gen_look_around (struct page_vma_mapped_walk *pvmw) +static inline bool lru_gen_look_around (struct page_vma_mapped_walk *pvmw) { +return false; }static inline void lru_gen_init_memcg (struct mem_cgroup *memcg)
mm/rmap.c +3 -6
@@ -885,13 +885,10 @@ static bool folio_referenced_one(struct folio *folio,return false; } -if (pvmw.pte) { -if (lru_gen_enabled () && -pte_young (ptep_get (pvmw.pte))) { -lru_gen_look_around (&pvmw); +if (lru_gen_enabled () && pvmw.pte) { +if (lru_gen_look_around (&pvmw)) referenced++; - } - + }else if (pvmw.pte) {if (ptep_clear_flush_young_notify (vma, address, pvmw.pte)) referenced++;
mm/vmscan.c +49 -39
222 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 209/245 riscv: dts: starfive: Update ethernet phy0 delay parameter values for Star64
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: E Shattow <[email protected]>
commit 825bb69228c8ab85637d21cdf4d44207937130b6 upstream.
Improve function of Star64 bottom network port phy0 with updated delay values. Initial upstream patches supporting Star64 use the same vendor board support package parameters known to result in an unreliable bottom network port.
Success acquiring DHCP lease and no dropped packets to ping LAN address:
rx 900: tx 1500 1650 1800 1950
rx 750: tx 1650 1800 1950
rx 600: tx 1800 1950
rx 1050: tx 1650 1800 1950
rx 1200: tx 1500 1650 1800 1950
rx 1350: tx 1500 1650 1800 1950
rx 1500: tx 1500 1650 1800 1950
rx 1650: tx 1500 1650 1800 1950
rx 1800: tx 1500 1650 1800 1950
rx 1900: tx 1950
rx 1950: tx 1950
Failure acquiring DHCP lease or many dropped packets:
rx 450: tx 1500 1800 1950
rx 600: tx 1200 1350 1650
rx 750: tx 1350 1500
rx 900: tx 1200 1350
rx 1050: tx 1050 1200 1350 1500
rx 1200: tx 1350
rx 1350: tx 1350
rx 1500: tx 1200 1350
rx 1650: tx 1050 1200 1350
rx 1800: tx 1050 1200 1350
rx 1900: tx 1500 1650 1800
rx 1950: tx 1200 1350
Non-functional:
rx 0: tx 0 150 300 450 600 750 900 1050 1200 1350 1500 1650 1800 1950
rx 150: tx 0 150 300 450 600 750 900 1050 1200 1350 1500 1650 1800 1950 rx 300: tx 0 150 300 450 600 750 900 1050 1200 1350 1500 1650 1800 1950
rx 450: tx 0 150 300 450 600 750 900 1050 1200 1350 1650
rx 600: tx 0 150 300 450 600 750 900 1050
rx 750: tx 0 150 300 450 600 750 900 1050 1200
rx 900: tx 0 150 300 450 600 750 900 1050
rx 1050: tx 0 150 300 450 600 750 900
rx 1200: tx 0 150 300 450 600 750 900 1050 1200
rx 1350: tx 0 150 300 450 600 750 900 1050 1200
rx 1500: tx 0 150 300 450 600 750 900 1050
rx 1650: tx 0 150 300 450 600 750 900
rx 1800: tx 0 150 300 450 600 750 900
rx 1900: tx 0 150 300 450 600 750 900 1050 1200 1350
rx 1950: tx 0 150 300 450 600 750 900 1050
Selecting the median of all working rx delay values 1500 combined with tx delay values 1500, 1650, 1800, and 1950 only the tx delay value of 1950 (default) is reliable as tested in both Linux 6.11.2 and U-Boot v2024.10
--- arch/riscv/boot/dts/starfive/jh7110-pine64-star64.dts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
arch/riscv/boot/dts/starfive/jh7110-pine64-star64.dts +1 -2
@@ -44,8 +44,7 @@ }; &phy0 { - rx-internal-delay-ps = <1900>; - tx-internal-delay-ps = <1500>; + rx-internal-delay-ps = <1500>; motorcomm,rx-clk-drv-microamp = <2910>; motorcomm,rx-data-drv-microamp = <2910>; motorcomm,tx-clk-adj-enabled;
Greg Kroah-Hartman
maintainerPATCH 210/245 riscv: dts: starfive: disable unused csi/camss nodes
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Conor Dooley <[email protected]>
commit 2e11e78667db90a9e732fbe42820e734d0658fc7 upstream.
Aurelien reported probe failures due to the csi node being enabled without having a camera attached to it. A camera was in the initial submissions, but was removed from the dts, as it had not actually been present on the board, but was from an addon board used by the developer of the relevant drivers. The non-camera pipeline nodes were not disabled when this happened and the probe failures are problematic for Debian. Disable them.
--- arch/riscv/boot/dts/starfive/jh7110-common.dtsi | 2 -- 1 file changed, 2 deletions(-)
arch/riscv/boot/dts/starfive/jh7110-common.dtsi +0 -2
@@ -128,7 +128,6 @@ assigned-clocks = <&ispcrg JH7110_ISPCLK_DOM4_APB_FUNC>, <&ispcrg JH7110_ISPCLK_MIPI_RX0_PXL>; assigned-clock-rates = <49500000>, <198000000>; - status = "okay"; ports { #address-cells = <1>;
@@ -151,7 +150,6 @@ &csi2rx { assigned-clocks = <&ispcrg JH7110_ISPCLK_VIN_SYS>; assigned-clock-rates = <297000000>; - status = "okay"; ports { #address-cells = <1>;
Greg Kroah-Hartman
maintainerPATCH 211/245 arm64: dts: qcom: msm8939: revert use of APCS mbox for RPM
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fabien Parent <[email protected]>
commit d92e9ea2f0f918d7b01cbacb838288bffccc8954 upstream.
Commit 22e4e43484c4 ("arm64: dts: qcom: msm8939: Use mboxes properties for APCS") broke the boot on msm8939 platforms.
The issue comes from the SMD driver failing to request the mbox channel because of circular dependencies:
1. rpm -> apcs1_mbox -> rpmcc (RPM_SMD_XO_CLK_SRC) -> rpm.
2. rpm -> apcs1_mbox -> gcc -> rpmcc (RPM_SMD_XO_CLK_SRC) -> rpm
3. rpm -> apcs1_mbox -> apcs2 -> gcc -> rpmcc (RPM_SMD_XO_CLK_SRC) -> rpm
To fix this issue let's switch back to using the deprecated qcom,ipc property for the RPM node.
--- arch/arm64/boot/dts/qcom/msm8939.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/qcom/msm8939.dtsi +1 -1
@@ -248,7 +248,7 @@ rpm: remoteproc { smd-edge { interrupts = <GIC_SPI 168 IRQ_TYPE_EDGE_RISING>; - mboxes = <&apcs1_mbox 0>; + qcom,ipc = <&apcs1_mbox 8 0>; qcom,smd-edge = <15>; rpm_requests: rpm-requests {
Signature · 1 line
2.47.0
Greg Kroah-Hartman
maintainerPATCH 212/245 arm64: dts: qcom: x1e80100-yoga-slim7x: fix nvme regulator boot glitch
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 1badd07e4c0e1ecfb187dcba05357c0f3e70e797 upstream.
The NVMe regulator has been left enabled by the boot firmware. Mark it as such to avoid disabling the regulator temporarily during boot.
--- arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts +2 -0
@@ -206,6 +206,8 @@ pinctrl-0 = <&nvme_reg_en>; pinctrl-names = "default"; + + regulator-boot-on; }; };
Greg Kroah-Hartman
maintainerPATCH 213/245 arm64: dts: qcom: x1e80100: Fix up BAR spaces
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
commit 7af1418500124150f9fd24e1a5b9c288771df271 upstream.
The 32-bit BAR spaces are reaching outside their assigned register regions. Shrink them to match their actual sizes.
This resolves an issue where the regions overlap and one of the controllers won't come up, which can be seen in the log as:
qcom-pcie 1c08000.pci: resource collision: [mem 0x7c300000-0x7fffffff] conflicts with 1c00000.pci dbi [mem 0x7e000000-0x7e000f1c]
While at it, unify the style.
--- arch/arm64/boot/dts/qcom/x1e80100.dtsi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/arm64/boot/dts/qcom/x1e80100.dtsi +5 -5
@@ -2895,9 +2895,9 @@ "mhi"; #address-cells = <3>; #size-cells = <2>; - ranges = <0x01000000 0 0x00000000 0 0x70200000 0 0x100000>, - <0x02000000 0 0x70300000 0 0x70300000 0 0x3d00000>; - bus-range = <0 0xff>; + ranges = <0x01000000 0x0 0x00000000 0x0 0x70200000 0x0 0x100000>, + <0x02000000 0x0 0x70300000 0x0 0x70300000 0x0 0x1d00000>; + bus-range = <0x00 0xff>; dma-coherent;
@@ -3017,8 +3017,8 @@ "mhi"; #address-cells = <3>; #size-cells = <2>; - ranges = <0x01000000 0 0x00000000 0 0x7c200000 0 0x100000>, - <0x02000000 0 0x7c300000 0 0x7c300000 0 0x3d00000>; + ranges = <0x01000000 0x0 0x00000000 0x0 0x7c200000 0x0 0x100000>, + <0x02000000 0x0 0x7c300000 0x0 0x7c300000 0x0 0x1d00000>; bus-range = <0x00 0xff>; dma-coherent;
Greg Kroah-Hartman
maintainerPATCH 214/245 arm64: dts: qcom: x1e80100-vivobook-s15: fix nvme regulator boot glitch
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit c6d151f61b6703124e14bc0eae98d05206e36e02 upstream.
The NVMe regulator has been left enabled by the boot firmware. Mark it as such to avoid disabling the regulator temporarily during boot.
--- arch/arm64/boot/dts/qcom/x1e80100-asus-vivobook-s15.dts | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/qcom/x1e80100-asus-vivobook-s15.dts +2 -0
@@ -134,6 +134,8 @@ vreg_nvme: regulator-nvme { pinctrl-0 = <&nvme_reg_en>; pinctrl-names = "default"; + + regulator-boot-on; }; };
Signature · 1 line
2.47.0
Greg Kroah-Hartman
maintainerPATCH 215/245 arm64: dts: qcom: x1e80100: fix PCIe4 interconnect
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit f3bba5eb46ddb8f460fc808a65050a9bf2f7ef23 upstream.
The fourth PCIe controller is connected to the PCIe North ANoC.
Fix the corresponding interconnect property so that the OS manages the right path.
--- arch/arm64/boot/dts/qcom/x1e80100.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/qcom/x1e80100.dtsi +1 -1
@@ -3068,7 +3068,7 @@ assigned-clocks = <&gcc GCC_PCIE_4_AUX_CLK>; assigned-clock-rates = <19200000>; - interconnects = <&pcie_south_anoc MASTER_PCIE_4 QCOM_ICC_TAG_ALWAYS + interconnects = <&pcie_north_anoc MASTER_PCIE_4 QCOM_ICC_TAG_ALWAYS &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>, <&gem_noc MASTER_APPSS_PROC QCOM_ICC_TAG_ALWAYS &cnoc_main SLAVE_PCIE_4 QCOM_ICC_TAG_ALWAYS>;
Greg Kroah-Hartman
maintainerPATCH 216/245 arm64: dts: qcom: x1e80100-qcp: fix nvme regulator boot glitch
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 717f0637ffc6a6a59f838df94a7d61e643c98d62 upstream.
The NVMe regulator has been left enabled by the boot firmware. Mark it as such to avoid disabling the regulator temporarily during boot.
--- arch/arm64/boot/dts/qcom/x1e80100-qcp.dts | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/qcom/x1e80100-qcp.dts +2 -0
@@ -253,6 +253,8 @@ vreg_nvme: regulator-nvme { pinctrl-names = "default"; pinctrl-0 = <&nvme_reg_en>; + + regulator-boot-on; }; };
Signature · 1 line
2.47.0
Greg Kroah-Hartman
maintainerPATCH 217/245 arm64: dts: qcom: x1e80100-crd: fix nvme regulator boot glitch
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 37f9477ce9d07ed87f6efe9b99de580bc9d27df5 upstream.
The NVMe regulator has been left enabled by the boot firmware. Mark it as such to avoid disabling the regulator temporarily during boot.
--- arch/arm64/boot/dts/qcom/x1e80100-crd.dts | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/qcom/x1e80100-crd.dts +2 -0
@@ -283,6 +283,8 @@ pinctrl-names = "default"; pinctrl-0 = <&nvme_reg_en>; + + regulator-boot-on; }; };
Greg Kroah-Hartman
maintainerPATCH 218/245 arm64: dts: imx8ulp: correct the flexspi compatible string
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haibo Chen <[email protected]>
commit 409dc5196d5b6eb67468a06bf4d2d07d7225a67b upstream.
The flexspi on imx8ulp only has 16 LUTs, and imx8mm flexspi has 32 LUTs, so correct the compatible string here, otherwise will meet below error:
[ 1.119072] ------------[ cut here ]------------ [ 1.123926] WARNING: CPU: 0 PID: 1 at drivers/spi/spi-nxp-fspi.c:855 nxp_fspi_exec_op+0xb04/0xb64 [ 1.133239] Modules linked in: [ 1.136448] CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.11.0-rc6-next-20240902-00001-g131bf9439dd9 #69 [ 1.146821] Hardware name: NXP i.MX8ULP EVK (DT) [ 1.151647] pstate: 40000005 (nZcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 1.158931] pc : nxp_fspi_exec_op+0xb04/0xb64 [ 1.163496] lr : nxp_fspi_exec_op+0xa34/0xb64 [ 1.168060] sp : ffff80008002b2a0 [ 1.171526] x29: ffff80008002b2d0 x28: 0000000000000000 x27: 0000000000000000 [ 1.179002] x26: ffff2eb645542580 x25: ffff800080610014 x24: ffff800080610000 [ 1.186480] x23: ffff2eb645548080 x22: 0000000000000006 x21: ffff2eb6455425e0 [ 1.193956] x20: 0000000000000000 x19: ffff80008002b5e0 x18: ffffffffffffffff [ 1.201432] x17: ffff2eb644467508 x16: 0000000000000138 x15: 0000000000000002 [ 1.208907] x14: 0000000000000000 x13: ffff2eb6400d8080 x12: 00000000ffffff00 [ 1.216378] x11: 0000000000000000 x10: ffff2eb6400d8080 x9 : ffff2eb697adca80 [ 1.223850] x8 : ffff2eb697ad3cc0 x7 : 0000000100000000 x6 : 0000000000000001 [ 1.231324] x5 : 0000000000000000 x4 : 0000000000000000 x3 : 00000000000007a6 [ 1.238795] x2 : 0000000000000000 x1 : 00000000000001ce x0 : 00000000ffffff92 [ 1.246267] Call trace: [ 1.248824] nxp_fspi_exec_op+0xb04/0xb64 [ 1.253031] spi_mem_exec_op+0x3a0/0x430 [ 1.257139] spi_nor_read_id+0x80/0xcc [ 1.261065] spi_nor_scan+0x1ec/0xf10 [ 1.264901] spi_nor_probe+0x108/0x2fc [ 1.268828] spi_mem_probe+0x6c/0xbc [ 1.272574] spi_probe+0x84/0xe4 [ 1.275958] really_probe+0xbc/0x29c [ 1.279713] __driver_probe_device+0x78/0x12c [ 1.284277] driver_probe_device+0xd8/0x15c [ 1.288660] __device_attach_driver+0xb8/0x134 [ 1.293316] bus_for_each_drv+0x88/0xe8 [ 1.297337] __device_attach+0xa0/0x190 [ 1.301353] device_initial_probe+0x14/0x20 [ 1.305734] bus_probe_device+0xac/0xb0 [ 1.309752] device_add+0x5d0/0x790 [ 1.313408] __spi_add_device+0x134/0x204 [ 1.317606] of_register_spi_device+0x3b4/0x590 [ 1.322348] spi_register_controller+0x47c/0x754 [ 1.327181] devm_spi_register_controller+0x4c/0xa4 [ 1.332289] nxp_fspi_probe+0x1cc/0x2b0 [ 1.336307] platform_probe+0x68/0xc4 [ 1.340145] really_probe+0xbc/0x29c [ 1.343893] __driver_probe_device+0x78/0x12c [ 1.348457] driver_probe_device+0xd8/0x15c [ 1.352838] __driver_attach+0x90/0x19c [ 1.356857] bus_for_each_dev+0x7c/0xdc [ 1.360877] driver_attach+0x24/0x30 [ 1.364624] bus_add_driver+0xe4/0x208 [ 1.368552] driver_register+0x5c/0x124 [ 1.372573] __platform_driver_register+0x28/0x34 [ 1.377497] nxp_fspi_driver_init+0x1c/0x28 [ 1.381888] do_one_initcall+0x80/0x1c8 [ 1.385908] kernel_init_freeable+0x1c4/0x28c [ 1.390472] kernel_init+0x20/0x1d8 [ 1.394138] ret_from_fork+0x10/0x20 [ 1.397885] ---[ end trace 0000000000000000 ]--- [ 1.407908] ------------[ cut here ]------------
--- arch/arm64/boot/dts/freescale/imx8ulp.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8ulp.dtsi +1 -1
@@ -384,7 +384,7 @@ }; flexspi2: spi@29810000 { - compatible = "nxp,imx8mm-fspi"; + compatible = "nxp,imx8ulp-fspi"; reg = <0x29810000 0x10000>, <0x60000000 0x10000000>; reg-names = "fspi_base", "fspi_mmap"; #address-cells = <1>;
Greg Kroah-Hartman
maintainerPATCH 219/245 arm64: dts: qcom: x1e80100: Add Broadcast_AND region in LLCC block
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abel Vesa <[email protected]>
commit 80fe25fcc605209b707583e3337e3cd40b7ed0bf upstream.
Add missing Broadcast_AND region to the LLCC block for x1e80100, as the LLCC version on this platform is 4.1 and it provides the region.
This also fixes the following error caused by the missing region:
[ 3.797768] qcom-llcc 25000000.system-cache-controller: error -EINVAL: invalid resource (null)
This error started showing up only after the new regmap region called Broadcast_AND that has been added to the llcc-qcom driver.
--- arch/arm64/boot/dts/qcom/x1e80100.dtsi | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/qcom/x1e80100.dtsi +4 -2
@@ -5700,7 +5700,8 @@ <0 0x25a00000 0 0x200000>, <0 0x25c00000 0 0x200000>, <0 0x25e00000 0 0x200000>, - <0 0x26000000 0 0x200000>; + <0 0x26000000 0 0x200000>, + <0 0x26200000 0 0x200000>; reg-names = "llcc0_base", "llcc1_base", "llcc2_base",
@@ -5709,7 +5710,8 @@ "llcc5_base", "llcc6_base", "llcc7_base", - "llcc_broadcast_base"; + "llcc_broadcast_base", + "llcc_broadcast_and_base"; interrupts = <GIC_SPI 266 IRQ_TYPE_LEVEL_HIGH>; };
Greg Kroah-Hartman
maintainerPATCH 220/245 arm64: dts: qcom: x1e80100: fix PCIe4 and PCIe6a PHY clocks
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 27727cb6604e0998d03d9ec063b517b239d2bb0f upstream.
Add the missing clkref enable and pipediv2 clocks to the PCIe4 and PCIe6a PHYs.
--- arch/arm64/boot/dts/qcom/x1e80100.dtsi | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
arch/arm64/boot/dts/qcom/x1e80100.dtsi +10 -6
@@ -2973,14 +2973,16 @@ clocks = <&gcc GCC_PCIE_6A_PHY_AUX_CLK>, <&gcc GCC_PCIE_6A_CFG_AHB_CLK>, - <&rpmhcc RPMH_CXO_CLK>, + <&tcsr TCSR_PCIE_4L_CLKREF_EN>, <&gcc GCC_PCIE_6A_PHY_RCHNG_CLK>, - <&gcc GCC_PCIE_6A_PIPE_CLK>; + <&gcc GCC_PCIE_6A_PIPE_CLK>, + <&gcc GCC_PCIE_6A_PIPEDIV2_CLK>; clock-names = "aux", "cfg_ahb", "ref", "rchng", - "pipe"; + "pipe", + "pipediv2"; resets = <&gcc GCC_PCIE_6A_PHY_BCR>, <&gcc GCC_PCIE_6A_NOCSR_COM_PHY_BCR>;
@@ -3105,14 +3107,16 @@ clocks = <&gcc GCC_PCIE_4_AUX_CLK>, <&gcc GCC_PCIE_4_CFG_AHB_CLK>, - <&rpmhcc RPMH_CXO_CLK>, + <&tcsr TCSR_PCIE_2L_4_CLKREF_EN>, <&gcc GCC_PCIE_4_PHY_RCHNG_CLK>, - <&gcc GCC_PCIE_4_PIPE_CLK>; + <&gcc GCC_PCIE_4_PIPE_CLK>, + <&gcc GCC_PCIE_4_PIPEDIV2_CLK>; clock-names = "aux", "cfg_ahb", "ref", "rchng", - "pipe"; + "pipe", + "pipediv2"; resets = <&gcc GCC_PCIE_4_PHY_BCR>; reset-names = "phy";
Greg Kroah-Hartman
maintainerPATCH 221/245 drm/i915: Skip programming FIA link enable bits for MTL+
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo Sousa <[email protected]>
commit 9fc97277eb2d17492de636b68cf7d2f5c4f15c1b upstream.
Starting with Xe_LPD+, although FIA is still used to readout Type-C pin assignment, part of Type-C support is moved to PICA and programming PORT_TX_DFLEXDPMLE1(*) registers is not applicable anymore like it was for previous display IPs (e.g. see BSpec 49190).
v2:
- Mention Bspec 49190 as a reference of instructions for previous IPs. (Shekhar Chauhan)
- s/Xe_LPDP/Xe_LPD+/ in the commit message. (Matt Roper)
- Update commit message to be more accurate to the changes in the IP. (Imre Deak)
Bspec: 65750, 65448
--- drivers/gpu/drm/i915/display/intel_tc.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/i915/display/intel_tc.c +3 -0
@@ -393,6 +393,9 @@ void intel_tc_port_set_fia_lane_count(stbool lane_reversal = dig_port->saved_port_bits &DDI_BUF_PORT_REVERSAL ;u32 val; +if (DISPLAY_VER (i915) >=14 ) +return ; +drm_WARN_ON (&i915->drm, lane_reversal && tc->mode !=TC_PORT_LEGACY );
Greg Kroah-Hartman
maintainerPATCH 222/245 drm/i915: disable fbc due to Wa_16023588340
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Auld <[email protected]>
commit c55f79f317ab428ae6d005965bc07e37496f209f upstream.
On BMG-G21 we need to disable fbc due to complications around the WA.
v2:
- Try to handle with i915_drv.h and compat layer. (Rodrigo)
v3:
- For simplicity retreat back to the original design for now.
- Drop the extra \ from the Makefile (Jani)
[ commit dc0f1644c47e ("drm/xe: Generate oob before compiling anything")
makes part of the change to the Makefile not needed.
Drop that to resolve conflict. ]
--- drivers/gpu/drm/i915/display/intel_display_wa.h | 8 ++++++++ drivers/gpu/drm/i915/display/intel_fbc.c | 6 ++++++ drivers/gpu/drm/xe/Makefile | 1 + drivers/gpu/drm/xe/display/xe_display_wa.c | 16 ++++++++++++++++ 4 files changed, 31 insertions(+) create mode 100644 drivers/gpu/drm/xe/display/xe_display_wa.c
drivers/gpu/drm/i915/display/intel_display_wa.h +8 -0
@@ -6,8 +6,16 @@#ifndef __INTEL_DISPLAY_WA_H__#define __INTEL_DISPLAY_WA_H__ +#include <linux/types.h> +struct drm_i915_private ;void intel_display_wa_apply (struct drm_i915_private *i915); +#ifdef I915 +static inline bool intel_display_needs_wa_16023588340 (struct drm_i915_private *i915) {return false; } +#else +bool intel_display_needs_wa_16023588340 (struct drm_i915_private *i915); +#endif +#endif
drivers/gpu/drm/i915/display/intel_fbc.c +6 -0
@@ -56,6 +56,7 @@#include "intel_display_device.h" #include "intel_display_trace.h" #include "intel_display_types.h" +#include "intel_display_wa.h" #include "intel_fbc.h" #include "intel_fbc_regs.h" #include "intel_frontbuffer.h"
@@ -1237,6 +1238,11 @@ static int intel_fbc_check_plane(structreturn 0 ; } +if (intel_display_needs_wa_16023588340 (i915)) { + plane_state->no_fbc_reason ="Wa_16023588340" ; +return 0 ; + } +/* WaFbcTurnOffFbcWhenHyperVisorIsUsed:skl,bxt */ if (i915_vtd_active (i915) && (IS_SKYLAKE (i915) ||IS_BROXTON (i915))) { plane_state->no_fbc_reason ="VT-d enabled" ;
drivers/gpu/drm/xe/Makefile +1 -0
@@ -175,6 +175,7 @@ xe-$(CONFIG_DRM_XE_DISPLAY) += \ display/xe_display.o \ display/xe_display_misc.o \ display/xe_display_rps.o \ + display/xe_display_wa.o \ display/xe_dsb_buffer.o \ display/xe_fb_pin.o \ display/xe_hdcp_gsc.o \
drivers/gpu/drm/xe/display/xe_display_wa.c new file +16 -0
@@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +/* +* Copyright © 2024 Intel Corporation +*/ + +#include "intel_display_wa.h" + +#include "xe_device.h" +#include "xe_wa.h" + +#include <generated/xe_wa_oob.h> + +bool intel_display_needs_wa_16023588340 (struct drm_i915_private *i915) +{ +return XE_WA (xe_root_mmio_gt (i915),16023588340 ); +}
Greg Kroah-Hartman
maintainerPATCH 223/245 drm/i915/display: Cache adpative sync caps to use it later
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mitul Golani <[email protected]>
commit b2013783c4458a1fe8b25c0b249d2e878bcf6999 upstream.
Add new member to struct intel_dp to cache support of Adaptive Sync SDP capabilities and use it whenever required to avoid HW access to read capability during each atomic commit.
-v2:
- Squash both the patches
--- drivers/gpu/drm/i915/display/intel_alpm.c | 2 - drivers/gpu/drm/i915/display/intel_display_types.h | 1 drivers/gpu/drm/i915/display/intel_dp.c | 22 +++++++++++---------- drivers/gpu/drm/i915/display/intel_dp.h | 1 drivers/gpu/drm/i915/display/intel_vrr.c | 3 -- 5 files changed, 15 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/display/intel_alpm.c +1 -1
@@ -280,7 +280,7 @@ void intel_alpm_lobf_compute_config(struif (DISPLAY_VER (i915) <20 )return ; -if (!intel_dp_as_sdp_supported (intel_dp)) +if (!intel_dp->as_sdp_supported)return ;if (crtc_state->has_psr)
drivers/gpu/drm/i915/display/intel_display_types.h +1 -0
@@ -1806,6 +1806,7 @@ struct intel_dp {/* connector directly attached - won't be use for modeset in mst world */ struct intel_connector *attached_connector; +bool as_sdp_supported;struct drm_dp_tunnel *tunnel; bool tunnel_suspended:1;
drivers/gpu/drm/i915/display/intel_dp.c +12 -10
@@ -130,14 +130,6 @@ bool intel_dp_is_edp(struct intel_dp *inreturn dig_port->base.type ==INTEL_OUTPUT_EDP ; } -bool intel_dp_as_sdp_supported (struct intel_dp *intel_dp) -{ -struct drm_i915_private *i915 =dp_to_i915 (intel_dp); - -return HAS_AS_SDP (i915) && -drm_dp_as_sdp_supported (&intel_dp->aux, intel_dp->dpcd); -} -static void intel_dp_unset_edid (struct intel_dp *intel_dp);/* Is link rate UHBR and thus 128b/132b? */
@@ -2635,8 +2627,7 @@ static void intel_dp_compute_as_sdp(struconst struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; -if (!crtc_state->vrr.enable || - !intel_dp_as_sdp_supported (intel_dp)) +if (!crtc_state->vrr.enable || intel_dp->as_sdp_supported)return ; crtc_state->infoframes.enable |=intel_hdmi_infoframe_enable (DP_SDP_ADAPTIVE_SYNC );
@@ -5921,6 +5912,15 @@ intel_dp_detect_dsc_caps(struct intel_dp connector); } +static void +intel_dp_detect_sdp_caps (struct intel_dp *intel_dp) +{ +struct drm_i915_private *i915 =dp_to_i915 (intel_dp); + + intel_dp->as_sdp_supported =HAS_AS_SDP (i915) && +drm_dp_as_sdp_supported (&intel_dp->aux, intel_dp->dpcd); +} + static int intel_dp_detect(struct drm_connector *connector, struct drm_modeset_acquire_ctx *ctx,
@@ -5991,6 +5991,8 @@ intel_dp_detect(struct drm_connector *cointel_dp_detect_dsc_caps (intel_dp, intel_connector); +intel_dp_detect_sdp_caps (intel_dp); +intel_dp_mst_configure (intel_dp);if (intel_dp->reset_link_params) {
drivers/gpu/drm/i915/display/intel_dp.h +0 -1
@@ -85,7 +85,6 @@ void intel_dp_audio_compute_config(struc struct drm_connector_state *conn_state);bool intel_dp_has_hdmi_sink (struct intel_dp *intel_dp);bool intel_dp_is_edp (struct intel_dp *intel_dp); -bool intel_dp_as_sdp_supported (struct intel_dp *intel_dp);bool intel_dp_is_uhbr (const struct intel_crtc_state *crtc_state);bool intel_dp_has_dsc (const struct intel_connector *connector);int intel_dp_link_symbol_size (int rate);
drivers/gpu/drm/i915/display/intel_vrr.c +1 -2
@@ -233,8 +233,7 @@ intel_vrr_compute_config(struct intel_cr crtc_state->mode_flags |=I915_MODE_FLAG_VRR ; } -if (intel_dp_as_sdp_supported (intel_dp) && - crtc_state->vrr.enable) { +if (intel_dp->as_sdp_supported && crtc_state->vrr.enable) { crtc_state->vrr.vsync_start = (crtc_state->hw.adjusted_mode.crtc_vtotal - crtc_state->hw.adjusted_mode.vsync_start);
Greg Kroah-Hartman
maintainerPATCH 224/245 drm/i915/display: WA for Re-initialize dispcnlunitt1 xosc clock
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mitul Golani <[email protected]>
commit 7fbad577c82c5dd6db7217855c26f51554e53d85 upstream.
The dispcnlunit1_cp_xosc_clk should be de-asserted in display off and only asserted in display on. As part of this workaround, Display driver shall execute set-reset sequence at the end of the initialize sequence to ensure clk does not remain active in display OFF.
--v2:
- Rebase.
--v3:
- Correct HSD number in commit message.
--v4:
- Reformat commit message.
- Use intel_de_rmw instead of intel_de_write
--v5:
- Build Fixes.
WA: 15013987218
--- drivers/gpu/drm/i915/display/intel_display_power.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/gpu/drm/i915/display/intel_display_power.c +8 -0
@@ -1704,6 +1704,14 @@ static void icl_display_core_init(struct/* Wa_14011503030:xelpd */ if (DISPLAY_VER (dev_priv) ==13 )intel_de_write (dev_priv,XELPD_DISPLAY_ERR_FATAL_MASK , ~0 ); + +/* Wa_15013987218 */ +if (DISPLAY_VER (dev_priv) ==20 ) { +intel_de_rmw (dev_priv,SOUTH_DSPCLK_GATE_D , +0 ,PCH_GMBUSUNIT_CLOCK_GATE_DISABLE ); +intel_de_rmw (dev_priv,SOUTH_DSPCLK_GATE_D , +PCH_GMBUSUNIT_CLOCK_GATE_DISABLE ,0 ); + } }static void icl_display_core_uninit (struct drm_i915_private *dev_priv)
Greg Kroah-Hartman
maintainerPATCH 225/245 drm/i915/hdcp: Add encoder check in intel_hdcp_get_capability
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suraj Kandpal <[email protected]>
commit 31b42af516afa1e184d1a9f9dd4096c54044269a upstream.
Sometimes during hotplug scenario or suspend/resume scenario encoder is not always initialized when intel_hdcp_get_capability add
a check to avoid kernel null pointer dereference.
--- drivers/gpu/drm/i915/display/intel_hdcp.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/display/intel_hdcp.c +6 -1
@@ -203,11 +203,16 @@ int intel_hdcp_read_valid_bksv(struct in/* Is HDCP1.4 capable on Platform and Sink */ bool intel_hdcp_get_capability (struct intel_connector *connector) { -struct intel_digital_port *dig_port =intel_attached_dig_port (connector); +struct intel_digital_port *dig_port;const struct intel_hdcp_shim *shim = connector->hdcp.shim;bool capable = false;u8 bksv[5 ]; +if (!intel_attached_encoder (connector)) +return capable; + + dig_port =intel_attached_dig_port (connector); +if (!shim)return capable;
Greg Kroah-Hartman
maintainerPATCH 226/245 drm/i915/hdcp: Add encoder check in hdcp2_get_capability
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suraj Kandpal <[email protected]>
commit d34f4f058edf1235c103ca9c921dc54820d14d40 upstream.
Add encoder check in intel_hdcp2_get_capability to avoid null pointer error.
--- drivers/gpu/drm/i915/display/intel_dp_hdcp.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/display/intel_dp_hdcp.c +9 -2
@@ -677,8 +677,15 @@ staticint intel_dp_hdcp2_get_capability (struct intel_connector *connector,bool *capable) { -struct intel_digital_port *dig_port =intel_attached_dig_port (connector); -struct drm_dp_aux *aux = &dig_port->dp.aux; +struct intel_digital_port *dig_port; +struct drm_dp_aux *aux; + + *capable = false; +if (!intel_attached_encoder (connector)) +return -EINVAL ; + + dig_port =intel_attached_dig_port (connector); + aux = &dig_port->dp.aux;return _intel_dp_hdcp2_get_capability (aux, capable); }
Greg Kroah-Hartman
maintainerPATCH 227/245 drm/i915/dp: Clear VSC SDP during post ddi disable routine
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suraj Kandpal <[email protected]>
commit 3e307d6c28e7bc7d94b5699d0ed7fe07df6db094 upstream.
Clear VSC SDP if intel_dp_set_infoframes is called from post ddi disable routine i.e with the variable of enable as false. This is to avoid an infoframes.enable mismatch issue which is caused when pipe is connected to eDp which has psr then connected to DPMST. In this case eDp's post ddi disable routine does not clear infoframes.enable VSC for the given pipe and DPMST does not recompute VSC SDP and write infoframes.enable which causes a mismatch.
--v2
-Make the comment match the code [Jani]
--- drivers/gpu/drm/i915/display/intel_dp.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/display/intel_dp.c +5 -2
@@ -4393,8 +4393,11 @@ void intel_dp_set_infoframes(struct inteif (!enable &&HAS_DSC (dev_priv)) val &= ~VDIP_ENABLE_PPS ; -/* When PSR is enabled, this routine doesn't disable VSC DIP */ -if (!crtc_state->has_psr) +/* +* This routine disables VSC DIP if the function is called +* to disable SDP or if it does not have PSR +*/ +if (!enable || !crtc_state->has_psr) val &= ~VIDEO_DIP_ENABLE_VSC_HSW ;intel_de_write (dev_priv, reg, val);
Greg Kroah-Hartman
maintainerPATCH 228/245 drm/i915/display/dp: Compute AS SDP when vrr is also enabled
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mitul Golani <[email protected]>
commit eb53e5b933b9ff315087305b3dc931af3067d19c upstream.
AS SDP should be computed when VRR timing generator is also enabled. Correct the compute condition to compute params of Adaptive sync SDP when VRR timing genrator is enabled along with sink support indication.
--v2:
Modify if condition (Jani).
(added prefix drm in subject)
--- drivers/gpu/drm/i915/display/intel_dp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/i915/display/intel_dp.c +1 -1
@@ -2627,7 +2627,7 @@ static void intel_dp_compute_as_sdp(struconst struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; -if (!crtc_state->vrr.enable || intel_dp->as_sdp_supported) +if (!crtc_state->vrr.enable || !intel_dp->as_sdp_supported)return ; crtc_state->infoframes.enable |=intel_hdmi_infoframe_enable (DP_SDP_ADAPTIVE_SYNC );
Greg Kroah-Hartman
maintainerPATCH 229/245 drm/i915/pps: Disable DPLS_GATING around pps sequence
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suraj Kandpal <[email protected]>
commit c7085d08c7e53d9aef0cdd4b20798356f6f5d469 upstream.
Disable bit 29 of SCLKGATE_DIS register around pps sequence when we turn panel power on.
--v2
-Squash two commit together [Jani]
-Use IS_DISPLAY_VER [Jani]
-Fix multiline comment [Jani]
--v3
-Define register in a more appropriate place [Mitul]
--v4
-Register is already defined no need to define it again [Ville] -Use correct WA number (lineage no.) [Dnyaneshwar] -Fix the range on which this WA is applied [Dnyaneshwar]
Bspec: 49304
--- drivers/gpu/drm/i915/display/intel_pps.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/gpu/drm/i915/display/intel_pps.c +12 -0
@@ -951,6 +951,14 @@ void intel_pps_on_unlocked(struct intel_intel_de_posting_read (dev_priv, pp_ctrl_reg); } +/* +* WA: 22019252566 +* Disable DPLS gating around power sequence. +*/ +if (IS_DISPLAY_VER (dev_priv,13 ,14 )) +intel_de_rmw (dev_priv,SOUTH_DSPCLK_GATE_D , +0 ,PCH_DPLSUNIT_CLOCK_GATE_DISABLE ); + pp |=PANEL_POWER_ON ;if (!IS_IRONLAKE (dev_priv)) pp |=PANEL_POWER_RESET ;
@@ -961,6 +969,10 @@ void intel_pps_on_unlocked(struct intel_wait_panel_on (intel_dp); intel_dp->pps.last_power_on = jiffies; +if (IS_DISPLAY_VER (dev_priv,13 ,14 )) +intel_de_rmw (dev_priv,SOUTH_DSPCLK_GATE_D , +PCH_DPLSUNIT_CLOCK_GATE_DISABLE ,0 ); +if (IS_IRONLAKE (dev_priv)) { pp |=PANEL_POWER_RESET ;/* restore panel reset bit */ intel_de_write (dev_priv, pp_ctrl_reg, pp);
Greg Kroah-Hartman
maintainerPATCH 230/245 drm/i915: move rawclk from runtime to display runtime info
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
commit a9556637a23311dea96f27fa3c3e5bfba0b38ae4 upstream.
It's mostly about display, so move it under display. This should also fix rawclk freq initialization in the xe driver.
v2: Change the init location
--- drivers/gpu/drm/i915/display/intel_backlight.c | 10 +++++----- drivers/gpu/drm/i915/display/intel_display_device.c | 5 +++++ drivers/gpu/drm/i915/display/intel_display_device.h | 2 ++ drivers/gpu/drm/i915/display/intel_display_power_well.c | 4 ++-- drivers/gpu/drm/i915/display/intel_dp_aux.c | 4 ++-- drivers/gpu/drm/i915/display/intel_pps.c | 2 +- drivers/gpu/drm/i915/intel_device_info.c | 5 ----- drivers/gpu/drm/i915/intel_device_info.h | 2 -- 8 files changed, 17 insertions(+), 17 deletions(-)
drivers/gpu/drm/i915/display/intel_backlight.c +5 -5
@@ -1011,7 +1011,7 @@ static u32 cnp_hz_to_pwm(struct intel_co {struct drm_i915_private *i915 =to_i915 (connector->base.dev); -return DIV_ROUND_CLOSEST (KHz (RUNTIME_INFO (i915)->rawclk_freq), +return DIV_ROUND_CLOSEST (KHz (DISPLAY_RUNTIME_INFO (i915)->rawclk_freq), pwm_freq_hz); }
@@ -1073,7 +1073,7 @@ static u32 pch_hz_to_pwm(struct intel_co {struct drm_i915_private *i915 =to_i915 (connector->base.dev); -return DIV_ROUND_CLOSEST (KHz (RUNTIME_INFO (i915)->rawclk_freq), +return DIV_ROUND_CLOSEST (KHz (DISPLAY_RUNTIME_INFO (i915)->rawclk_freq), pwm_freq_hz *128 ); }
@@ -1091,7 +1091,7 @@ static u32 i9xx_hz_to_pwm(struct intel_cint clock;if (IS_PINEVIEW (i915)) - clock =KHz (RUNTIME_INFO (i915)->rawclk_freq); + clock =KHz (DISPLAY_RUNTIME_INFO (i915)->rawclk_freq);else clock =KHz (i915->display.cdclk.hw.cdclk);
@@ -1109,7 +1109,7 @@ static u32 i965_hz_to_pwm(struct intel_cint clock;if (IS_G4X (i915)) - clock =KHz (RUNTIME_INFO (i915)->rawclk_freq); + clock =KHz (DISPLAY_RUNTIME_INFO (i915)->rawclk_freq);else clock =KHz (i915->display.cdclk.hw.cdclk);
@@ -1133,7 +1133,7 @@ static u32 vlv_hz_to_pwm(struct intel_co clock =MHz (25 ); mul =16 ; }else { - clock =KHz (RUNTIME_INFO (i915)->rawclk_freq); + clock =KHz (DISPLAY_RUNTIME_INFO (i915)->rawclk_freq); mul =128 ; }
drivers/gpu/drm/i915/display/intel_display_device.c +5 -0
@@ -1474,6 +1474,9 @@ static void __intel_display_device_info_ } } + display_runtime->rawclk_freq =intel_read_rawclk (i915); +drm_dbg_kms (&i915->drm,"rawclk rate: %d kHz\n" , display_runtime->rawclk_freq); +return ; display_fused_off:
@@ -1516,6 +1519,8 @@ void intel_display_device_info_print(condrm_printf (p,"has_hdcp: %s\n" ,str_yes_no (runtime->has_hdcp));drm_printf (p,"has_dmc: %s\n" ,str_yes_no (runtime->has_dmc));drm_printf (p,"has_dsc: %s\n" ,str_yes_no (runtime->has_dsc)); + +drm_printf (p,"rawclk rate: %u kHz\n" , runtime->rawclk_freq); }/*
drivers/gpu/drm/i915/display/intel_display_device.h +2 -0
@@ -204,6 +204,8 @@ struct intel_display_runtime_info {u16 step; } ip; +u32 rawclk_freq; +u8 pipe_mask;u8 cpu_transcoder_mask;u16 port_mask;
drivers/gpu/drm/i915/display/intel_display_power_well.c +2 -2
@@ -1176,9 +1176,9 @@ static void vlv_init_display_clock_gatin MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE);intel_de_write (dev_priv,CBR1_VLV ,0 ); -drm_WARN_ON (&dev_priv->drm,RUNTIME_INFO (dev_priv)->rawclk_freq ==0 ); +drm_WARN_ON (&dev_priv->drm,DISPLAY_RUNTIME_INFO (dev_priv)->rawclk_freq ==0 );intel_de_write (dev_priv,RAWCLK_FREQ_VLV , -DIV_ROUND_CLOSEST (RUNTIME_INFO (dev_priv)->rawclk_freq, +DIV_ROUND_CLOSEST (DISPLAY_RUNTIME_INFO (dev_priv)->rawclk_freq,1000 )); }
drivers/gpu/drm/i915/display/intel_dp_aux.c +2 -2
@@ -84,7 +84,7 @@ static u32 g4x_get_aux_clock_divider(str* The clock divider is based off the hrawclk, and would like to run at * 2MHz. So, take the hrawclk value and divide by 2000 and use that */ -return DIV_ROUND_CLOSEST (RUNTIME_INFO (i915)->rawclk_freq,2000 ); +return DIV_ROUND_CLOSEST (DISPLAY_RUNTIME_INFO (i915)->rawclk_freq,2000 ); }static u32 ilk_get_aux_clock_divider (struct intel_dp *intel_dp,int index)
@@ -104,7 +104,7 @@ static u32 ilk_get_aux_clock_divider(strif (dig_port->aux_ch ==AUX_CH_A ) freq = i915->display.cdclk.hw.cdclk;else - freq =RUNTIME_INFO (i915)->rawclk_freq; + freq =DISPLAY_RUNTIME_INFO (i915)->rawclk_freq;return DIV_ROUND_CLOSEST (freq,2000 ); }
drivers/gpu/drm/i915/display/intel_pps.c +1 -1
@@ -1483,7 +1483,7 @@ static void pps_init_registers(struct in {struct drm_i915_private *dev_priv =dp_to_i915 (intel_dp);u32 pp_on, pp_off, port_sel =0 ; -int div =RUNTIME_INFO (dev_priv)->rawclk_freq /1000 ; +int div =DISPLAY_RUNTIME_INFO (dev_priv)->rawclk_freq /1000 ;struct pps_registers regs;enum port port =dp_to_dig_port (intel_dp)->base.port;const struct edp_power_seq *seq = &intel_dp->pps.pps_delays;
drivers/gpu/drm/i915/intel_device_info.c +0 -5
@@ -124,7 +124,6 @@ void intel_device_info_print(const struc#undef PRINT_FLAGdrm_printf (p,"has_pooled_eu: %s\n" ,str_yes_no (runtime->has_pooled_eu)); -drm_printf (p,"rawclk rate: %u kHz\n" , runtime->rawclk_freq); }#define ID (id) (id)
@@ -377,10 +376,6 @@ void intel_device_info_runtime_init(stru "Disabling ppGTT for VT-d support\n"); runtime->ppgtt_type =INTEL_PPGTT_NONE ; } - - runtime->rawclk_freq =intel_read_rawclk (dev_priv); -drm_dbg (&dev_priv->drm,"rawclk rate: %d kHz\n" , runtime->rawclk_freq); - }/*
drivers/gpu/drm/i915/intel_device_info.h +0 -2
@@ -207,8 +207,6 @@ struct intel_runtime_info {u16 device_id; -u32 rawclk_freq; -struct intel_step_info step;unsigned int page_sizes;/* page sizes supported by the HW */
Greg Kroah-Hartman
maintainerPATCH 231/245 drm/xe/display: drop unused rawclk_freq and RUNTIME_INFO()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
commit f15e5587448989a55cf8b4feaad0df72ca3aa6a0 upstream.
With rawclk_freq moved to display runtime info, xe has no users left for them.
--- drivers/gpu/drm/xe/compat-i915-headers/i915_drv.h | 1 - drivers/gpu/drm/xe/xe_device_types.h | 6 ------ 2 files changed, 7 deletions(-)
drivers/gpu/drm/xe/compat-i915-headers/i915_drv.h +0 -1
@@ -116,7 +116,6 @@ struct i915_sched_attr {#define i915_gem_fence_wait_priority (fence, attr) do { (void) attr; } while (0)#define pdev_to_i915 pdev_to_xe_device -#define RUNTIME_INFO (xe) (&(xe)->info.i915_runtime)#define FORCEWAKE_ALL XE_FORCEWAKE_ALL
drivers/gpu/drm/xe/xe_device_types.h +0 -6
@@ -297,12 +297,6 @@ struct xe_device { u8 has_atomic_enable_pte_bit:1;/** @info.has_device_atomics_on_smem: Supports device atomics on SMEM */ u8 has_device_atomics_on_smem:1; - -#if IS_ENABLED (CONFIG_DRM_XE_DISPLAY ) -struct { -u32 rawclk_freq; - } i915_runtime; -#endif } info;/** @irq: device interrupt state */
Greg Kroah-Hartman
maintainerPATCH 232/245 drm/i915/psr: Prevent Panel Replay if CRC calculation is enabled
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jouni Högander <[email protected]>
commit a8efd8ce280996fe29f2564f705e96e18da3fa62 upstream.
Similarly as for PSR2 CRC calculation seems to timeout when Panel Replay is enabled. Fix this by falling back to PSR if CRC calculation is enabled.
--- drivers/gpu/drm/i915/display/intel_psr.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/i915/display/intel_psr.c +6 -0
@@ -1605,6 +1605,12 @@ _panel_replay_compute_config(struct inteif (!alpm_config_valid (intel_dp, crtc_state, true))return false; +if (crtc_state->crc_enabled) { +drm_dbg_kms (&i915->drm, +"Panel Replay not enabled because it would inhibit pipe CRC calculation\n" ); +return false; + } +return true; }
Greg Kroah-Hartman
maintainerPATCH 233/245 drm/i915/display: Dont enable decompression on Xe2 with Tile4
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Juha-Pekka Heikkila <[email protected]>
commit 4cce34b3835b6f7dc52ee2da95c96b6364bb72e5 upstream.
Quoted 1 line
Quoted 1 line
From now on expect Tile4 not to be using compression
--- drivers/gpu/drm/i915/display/skl_universal_plane.c | 5 ----- 1 file changed, 5 deletions(-)
drivers/gpu/drm/i915/display/skl_universal_plane.c +0 -5
@@ -1085,11 +1085,6 @@ static u32 skl_plane_ctl(const struct inif (DISPLAY_VER (dev_priv) ==13 ) plane_ctl |=adlp_plane_ctl_arb_slots (plane_state); -if (GRAPHICS_VER (dev_priv) >=20 && - fb->modifier ==I915_FORMAT_MOD_4_TILED ) { - plane_ctl |=PLANE_CTL_RENDER_DECOMPRESSION_ENABLE ; - } -return plane_ctl; }
Greg Kroah-Hartman
maintainerPATCH 234/245 drm/xe: Support nomodeset kernel command-line option
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Zimmermann <[email protected]>
commit 014125c64d09e58e90dde49fbb57d802a13e2559 upstream.
Setting 'nomodeset' on the kernel command line disables all graphics drivers with modesetting capabilities, leaving only firmware drivers, such as simpledrm or efifb.
Most DRM drivers automatically support 'nomodeset' via DRM's module helper macros. In xe, which uses regular module_init(), manually call drm_firmware_drivers_only() to test for 'nomodeset'. Do not register the driver if set.
v2:
- use xe's init table (Lucas)
- do NULL test for init/exit functions
--- drivers/gpu/drm/xe/xe_module.c | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-)
drivers/gpu/drm/xe/xe_module.c +36 -3
@@ -8,6 +8,8 @@#include <linux/init.h> #include <linux/module.h> +#include <drm/drm_module.h> +#include "xe_drv.h" #include "xe_hw_fence.h" #include "xe_pci.h"
@@ -61,6 +63,14 @@ module_param_named_unsafe(wedged_mode, xMODULE_PARM_DESC (wedged_mode,"Module's default policy for the wedged mode - 0=never, 1=upon-critical-errors[default], 2=upon-any-hang" ); +static int xe_check_nomodeset (void ) +{ +if (drm_firmware_drivers_only ()) +return -ENODEV ; + +return 0 ; +} +struct init_funcs {int (*init)(void );void (*exit)(void );
@@ -68,6 +78,9 @@ struct init_funcs {static const struct init_funcs init_funcs[] = { { + .init = xe_check_nomodeset, + }, + { .init = xe_hw_fence_module_init, .exit = xe_hw_fence_module_exit, },
@@ -85,15 +98,35 @@ static const struct init_funcs init_func }, }; +static int __init xe_call_init_func (unsigned int i) +{ +if (WARN_ON (i >=ARRAY_SIZE (init_funcs))) +return 0 ; +if (!init_funcs[i].init) +return 0 ; + +return init_funcs[i].init (); +} + +static void xe_call_exit_func (unsigned int i) +{ +if (WARN_ON (i >=ARRAY_SIZE (init_funcs))) +return ; +if (!init_funcs[i].exit) +return ; + + init_funcs[i].exit (); +} +static int __init xe_init (void ) {int err, i;for (i =0 ; i <ARRAY_SIZE (init_funcs); i++) { - err = init_funcs[i].init (); + err =xe_call_init_func (i);if (err) {while (i--) - init_funcs[i].exit (); +xe_call_exit_func (i);return err; } }
@@ -106,7 +139,7 @@ static void __exit xe_exit(void)int i;for (i =ARRAY_SIZE (init_funcs) -1 ; i >=0 ; i--) - init_funcs[i].exit (); +xe_call_exit_func (i); }module_init (xe_init);
Greg Kroah-Hartman
maintainerPATCH 235/245 drm/xe/xe2hpg: Add Wa_15016589081
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejas Upadhyay <[email protected]>
commit da9a73b7b25eab574cb9c984fcce0b5e240bdd2c upstream.
Wa_15016589081 applies to xe2_hpg renderCS
V2(Gustavo)
- rename bit macro
--- drivers/gpu/drm/xe/regs/xe_gt_regs.h | 1 + drivers/gpu/drm/xe/xe_wa.c | 4 ++++ 2 files changed, 5 insertions(+)
drivers/gpu/drm/xe/regs/xe_gt_regs.h +1 -0
@@ -102,6 +102,7 @@#define CHICKEN_RASTER_1 XE_REG_MCR(0x6204, XE_REG_OPTION_MASKED)#define DIS_SF_ROUND_NEAREST_EVEN REG_BIT(8) +#define DIS_CLIP_NEGATIVE_BOUNDING_BOX REG_BIT(6)#define CHICKEN_RASTER_2 XE_REG_MCR(0x6208, XE_REG_OPTION_MASKED)#define TBIMR_FAST_CLIP REG_BIT(5)
drivers/gpu/drm/xe/xe_wa.c +4 -0
@@ -733,6 +733,10 @@ static const struct xe_rtp_entry_sr lrc_ DIS_PARTIAL_AUTOSTRIP | DIS_AUTOSTRIP)) }, + {XE_RTP_NAME ("15016589081" ), +XE_RTP_RULES (GRAPHICS_VERSION (2001 ),ENGINE_CLASS (RENDER )), +XE_RTP_ACTIONS (SET (CHICKEN_RASTER_1 ,DIS_CLIP_NEGATIVE_BOUNDING_BOX )) + }, {} };
Greg Kroah-Hartman
maintainerPATCH 236/245 drm/xe: Move enable host l2 VRAM post MCR init
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejas Upadhyay <[email protected]>
commit ab0d6ef864c5fa820e894ee1a07f861e63851664 upstream.
xe_gt_enable_host_l2_vram() is reading the XE2_GAMREQSTRM_CTRL register that is currently missing the MCR annotation. However, just adding the annotation doesn't work as this function is called before MCR handling is initialized in xe_gt_mcr_init().
xe_gt_enable_host_l2_vram() is used to implement WA 16023588340 that needs to be done as early as possible during initialization in order to be effective since the MMIO writes impact it. In the failure scenario, driver would simply not be able to bind successfully.
Moving xe_gt_enable_host_l2_vram() later, after MCR initialization is done, only incurs a few additional HW accesses, particularly when loading GuC for hwconfig. Binding/unbinding the driver 100 times in BMG still works so it should be ok to start handling the WA a little bit later. This is sufficient to allow adding the MCR annotation to XE2_GAMREQSTRM_CTRL.
--- drivers/gpu/drm/xe/xe_gt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/xe/xe_gt.c +1 -1
@@ -555,7 +555,6 @@ int xe_gt_init_hwconfig(struct xe_gt *gtxe_gt_mcr_init_early (gt);xe_pat_init (gt); -xe_gt_enable_host_l2_vram (gt); err =xe_uc_init (>->uc);if (err)
@@ -567,6 +566,7 @@ int xe_gt_init_hwconfig(struct xe_gt *gtxe_gt_topology_init (gt);xe_gt_mcr_init (gt); +xe_gt_enable_host_l2_vram (gt); out_fw:xe_force_wake_put (gt_to_fw (gt),XE_FW_GT );
Greg Kroah-Hartman
maintainerPATCH 237/245 drm/xe/xe2hpg: Introduce performance tuning changes for Xe2_HPG
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sai Teja Pottumuttu <[email protected]>
commit e4ac526c440af8aa94d2bdfe6066339dd93b4db2 upstream.
Add performance tuning changes for Xe2_HPG
Bspec: 72161
--- drivers/gpu/drm/xe/regs/xe_gt_regs.h | 1 + drivers/gpu/drm/xe/xe_tuning.c | 8 ++++++++ 2 files changed, 9 insertions(+)
drivers/gpu/drm/xe/regs/xe_gt_regs.h +1 -0
@@ -109,6 +109,7 @@#define FF_MODE XE_REG_MCR(0x6210)#define DIS_TE_AUTOSTRIP REG_BIT(31) +#define VS_HIT_MAX_VALUE_MASK REG_GENMASK(25, 20)#define DIS_MESH_PARTIAL_AUTOSTRIP REG_BIT(16)#define DIS_MESH_AUTOSTRIP REG_BIT(15)
drivers/gpu/drm/xe/xe_tuning.c +8 -0
@@ -93,6 +93,14 @@ static const struct xe_rtp_entry_sr lrc_ REG_FIELD_PREP(L3_PWM_TIMER_INIT_VAL_MASK, 0x7f))) }, +/* Xe2_HPG */ + + {XE_RTP_NAME ("Tuning: vs hit max value" ), +XE_RTP_RULES (GRAPHICS_VERSION (2001 ),ENGINE_CLASS (RENDER )), +XE_RTP_ACTIONS (FIELD_SET (FF_MODE ,VS_HIT_MAX_VALUE_MASK , +REG_FIELD_PREP (VS_HIT_MAX_VALUE_MASK ,0x3f ))) + }, + {} };
Greg Kroah-Hartman
maintainerPATCH 238/245 drm/xe/xe2: Introduce performance changes
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akshata Jahagirdar <[email protected]>
commit 2009e808bc3e0df6d4d83e2271bc25ae63a4ac05 upstream.
Add Compression Performance Improvement Changes in Xe2
v2: Rebase
v3: Rebase, updated as per latest changes on bspec,
Removed unnecessary default actions (Matt) formatting nits (Tejas)
v4: Formatting nits, removed default set action for bit 14 (Matt)
Bspec: 72161
--- drivers/gpu/drm/xe/regs/xe_gt_regs.h | 3 +++ drivers/gpu/drm/xe/xe_tuning.c | 5 +++++ 2 files changed, 8 insertions(+)
drivers/gpu/drm/xe/regs/xe_gt_regs.h +3 -0
@@ -368,6 +368,9 @@#define XEHP_L3NODEARBCFG XE_REG_MCR(0xb0b4)#define XEHP_LNESPARE REG_BIT(19) +#define L3SQCREG2 XE_REG_MCR(0xb104) +#define COMPMEMRD256BOVRFETCHEN REG_BIT(20) +#define L3SQCREG3 XE_REG_MCR(0xb108)#define COMPPWOVERFETCHEN REG_BIT(28)
drivers/gpu/drm/xe/xe_tuning.c +5 -0
@@ -45,6 +45,11 @@ static const struct xe_rtp_entry_sr gt_t XE_RTP_RULES(GRAPHICS_VERSION_RANGE(2001, XE_RTP_END_VERSION_UNDEFINED)), XE_RTP_ACTIONS(SET(L3SQCREG3, COMPPWOVERFETCHEN)) }, + {XE_RTP_NAME ("Tuning: L2 Overfetch Compressible Only" ), +XE_RTP_RULES (GRAPHICS_VERSION_RANGE (2001 ,XE_RTP_END_VERSION_UNDEFINED )), +XE_RTP_ACTIONS (SET (L3SQCREG2 , +COMPMEMRD256BOVRFETCHEN )) + }, {} };
Greg Kroah-Hartman
maintainerPATCH 239/245 drm/xe/xe2: Add performance turning changes
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shekhar Chauhan <[email protected]>
commit ecabb5e6ce54711c28706fc794d77adb3ecd0605 upstream.
Update performance tuning according to the hardware spec.
Bspec: 72161
--- drivers/gpu/drm/xe/regs/xe_gt_regs.h | 4 ++++ drivers/gpu/drm/xe/xe_tuning.c | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-)
drivers/gpu/drm/xe/regs/xe_gt_regs.h +4 -0
@@ -80,6 +80,9 @@#define LE_CACHEABILITY_MASK REG_GENMASK(1, 0)#define LE_CACHEABILITY (value) REG_FIELD_PREP(LE_CACHEABILITY_MASK, value) +#define STATELESS_COMPRESSION_CTRL XE_REG(0x4148) +#define UNIFIED_COMPRESSION_FORMAT REG_GENMASK(3, 0) +#define XE2_GAMREQSTRM_CTRL XE_REG(0x4194)#define CG_DIS_CNTLBUS REG_BIT(6)
@@ -194,6 +197,7 @@#define GSCPSMI_BASE XE_REG(0x880c)#define CCCHKNREG1 XE_REG_MCR(0x8828) +#define L3CMPCTRL REG_BIT(23)#define ENCOMPPERFFIX REG_BIT(18)/* Fuse readout registers for GT */
drivers/gpu/drm/xe/xe_tuning.c +7 -1
@@ -39,7 +39,8 @@ static const struct xe_rtp_entry_sr gt_t }, {XE_RTP_NAME ("Tuning: Compression Overfetch" ),XE_RTP_RULES (GRAPHICS_VERSION_RANGE (2001 ,XE_RTP_END_VERSION_UNDEFINED )), -XE_RTP_ACTIONS (CLR (CCCHKNREG1 ,ENCOMPPERFFIX )), +XE_RTP_ACTIONS (CLR (CCCHKNREG1 ,ENCOMPPERFFIX ), +SET (CCCHKNREG1 ,L3CMPCTRL )) }, { XE_RTP_NAME("Tuning: Enable compressible partial write overfetch in L3"), XE_RTP_RULES(GRAPHICS_VERSION_RANGE(2001, XE_RTP_END_VERSION_UNDEFINED)),
@@ -50,6 +51,11 @@ static const struct xe_rtp_entry_sr gt_t XE_RTP_ACTIONS(SET(L3SQCREG2, COMPMEMRD256BOVRFETCHEN)) }, + {XE_RTP_NAME ("Tuning: Stateless compression control" ), +XE_RTP_RULES (GRAPHICS_VERSION_RANGE (2001 ,XE_RTP_END_VERSION_UNDEFINED )), +XE_RTP_ACTIONS (FIELD_SET (STATELESS_COMPRESSION_CTRL ,UNIFIED_COMPRESSION_FORMAT , +REG_FIELD_PREP (UNIFIED_COMPRESSION_FORMAT ,0 ))) + }, {} };
Greg Kroah-Hartman
maintainerPATCH 240/245 drm/xe: Define STATELESS_COMPRESSION_CTRL as mcr register
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejas Upadhyay <[email protected]>
commit 4551d60299b5ddc2655b6b365a4b92634e14e04f upstream.
Register STATELESS_COMPRESSION_CTRL should be considered mcr register which should write to all slices as per documentation.
Bspec: 71185
--- drivers/gpu/drm/xe/regs/xe_gt_regs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/xe/regs/xe_gt_regs.h +1 -1
@@ -80,7 +80,7 @@#define LE_CACHEABILITY_MASK REG_GENMASK(1, 0)#define LE_CACHEABILITY (value) REG_FIELD_PREP(LE_CACHEABILITY_MASK, value) -#define STATELESS_COMPRESSION_CTRL XE_REG(0x4148) +#define STATELESS_COMPRESSION_CTRL XE_REG_MCR(0x4148)#define UNIFIED_COMPRESSION_FORMAT REG_GENMASK(3, 0)#define XE2_GAMREQSTRM_CTRL XE_REG(0x4194)
Greg Kroah-Hartman
maintainerPATCH 241/245 drm/xe: Write all slices if its mcr register
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejas Upadhyay <[email protected]>
commit f0ffa657e9f3913c7921cbd4d876343401f15f52 upstream.
Register GAMREQSTRM_CTRL should be considered mcr register which should write to all slices as per documentation.
Bspec: 71185
--- drivers/gpu/drm/xe/regs/xe_gt_regs.h | 2 +- drivers/gpu/drm/xe/xe_gt.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-)
drivers/gpu/drm/xe/regs/xe_gt_regs.h +1 -1
@@ -83,7 +83,7 @@#define STATELESS_COMPRESSION_CTRL XE_REG_MCR(0x4148)#define UNIFIED_COMPRESSION_FORMAT REG_GENMASK(3, 0) -#define XE2_GAMREQSTRM_CTRL XE_REG(0x4194) +#define XE2_GAMREQSTRM_CTRL XE_REG_MCR(0x4194)#define CG_DIS_CNTLBUS REG_BIT(6)#define CCS_AUX_INV XE_REG(0x4208)
drivers/gpu/drm/xe/xe_gt.c +4 -4
@@ -109,9 +109,9 @@ static void xe_gt_enable_host_l2_vram(stif (!xe_gt_is_media_type (gt)) {xe_mmio_write32 (gt,SCRATCH1LPFC ,EN_L3_RW_CCS_CACHE_FLUSH ); - reg =xe_mmio_read32 (gt,XE2_GAMREQSTRM_CTRL ); + reg =xe_gt_mcr_unicast_read_any (gt,XE2_GAMREQSTRM_CTRL ); reg |=CG_DIS_CNTLBUS ; -xe_mmio_write32 (gt,XE2_GAMREQSTRM_CTRL , reg); +xe_gt_mcr_multicast_write (gt,XE2_GAMREQSTRM_CTRL , reg); }xe_gt_mcr_multicast_write (gt,XEHPC_L3CLOS_MASK (3 ),0x3 );
@@ -133,9 +133,9 @@ static void xe_gt_disable_host_l2_vram(sif (WARN_ON (err))return ; - reg =xe_mmio_read32 (gt,XE2_GAMREQSTRM_CTRL ); + reg =xe_gt_mcr_unicast_read_any (gt,XE2_GAMREQSTRM_CTRL ); reg &= ~CG_DIS_CNTLBUS ; -xe_mmio_write32 (gt,XE2_GAMREQSTRM_CTRL , reg); +xe_gt_mcr_multicast_write (gt,XE2_GAMREQSTRM_CTRL , reg);xe_force_wake_put (gt_to_fw (gt),XE_FW_GT ); }
Greg Kroah-Hartman
maintainerPATCH 242/245 drm/amdgpu/swsmu: fix ordering for setting workload_mask
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit b932d5ad9257f262a0bfd1bd7146120b0adc11a7 upstream.
No change in functionality for the current code, but we need to set the index properly before changing it if we ever use a non-0 index.
--- drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c +1 -1
@@ -1257,7 +1257,6 @@ static int smu_sw_init(void *handle)atomic_set (&smu->smu_power.power_gate.vpe_gated,1 );atomic_set (&smu->smu_power.power_gate.umsch_mm_gated,1 ); - smu->workload_mask =1 << smu->workload_prority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ]; smu->workload_prority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ] =0 ; smu->workload_prority[PP_SMC_POWER_PROFILE_FULLSCREEN3D ] =1 ; smu->workload_prority[PP_SMC_POWER_PROFILE_POWERSAVING ] =2 ;
@@ -1265,6 +1264,7 @@ static int smu_sw_init(void *handle) smu->workload_prority[PP_SMC_POWER_PROFILE_VR ] =4 ; smu->workload_prority[PP_SMC_POWER_PROFILE_COMPUTE ] =5 ; smu->workload_prority[PP_SMC_POWER_PROFILE_CUSTOM ] =6 ; + smu->workload_mask =1 << smu->workload_prority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ]; smu->workload_setting[0 ] =PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ; smu->workload_setting[1 ] =PP_SMC_POWER_PROFILE_FULLSCREEN3D ;
Greg Kroah-Hartman
maintainerPATCH 243/245 drm/amdgpu/swsmu: default to fullscreen 3D profile for dGPUs
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit ec1aab7816b06c32f42935e34ce3a3040c778afb upstream.
This uses more aggressive hueristics than the the bootup default profile. On windows the OS has a special fullscreen 3D mode where this is used. Since we don't have the equivalent on Linux default to this profile for dGPUs.
--- drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c +5 -1
@@ -1264,7 +1264,11 @@ static int smu_sw_init(void *handle) smu->workload_prority[PP_SMC_POWER_PROFILE_VR ] =4 ; smu->workload_prority[PP_SMC_POWER_PROFILE_COMPUTE ] =5 ; smu->workload_prority[PP_SMC_POWER_PROFILE_CUSTOM ] =6 ; - smu->workload_mask =1 << smu->workload_prority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ]; + +if (smu->is_apu) + smu->workload_mask =1 << smu->workload_prority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ]; +else + smu->workload_mask =1 << smu->workload_prority[PP_SMC_POWER_PROFILE_FULLSCREEN3D ]; smu->workload_setting[0 ] =PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ; smu->workload_setting[1 ] =PP_SMC_POWER_PROFILE_FULLSCREEN3D ;
Greg Kroah-Hartman
maintainerPATCH 244/245 fs/ntfs3: Sequential field availability check in mi_enum_attr()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Komarov <[email protected]>
commit 090f612756a9720ec18b0b130e28be49839d7cb5 upstream.
The code is slightly reformatted to consistently check field availability without duplication.
--- fs/ntfs3/record.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
fs/ntfs3/record.c +7 -8
@@ -237,6 +237,7 @@ struct ATTRIB *mi_enum_attr(struct mft_i }/* Can we use the first field (attr->type). */ +/* NOTE: this code also checks attr->size availability. */ if (off +8 > used) {static_assert (ALIGN (sizeof (enum ATTR_TYPE ),8 ) ==8 );return NULL ;
@@ -257,10 +258,6 @@ struct ATTRIB *mi_enum_attr(struct mft_ireturn NULL ; asize =le32_to_cpu (attr->size); -if (asize <SIZEOF_RESIDENT ) { -/* Impossible 'cause we should not return such attribute. */ -return NULL ; - }/* Check overflow and boundary. */ if (off + asize < off || off + asize > used)
@@ -290,6 +287,10 @@ struct ATTRIB *mi_enum_attr(struct mft_iif (attr->non_res !=1 )return NULL ; +/* Can we use memory including attr->nres.valid_size? */ +if (asize <SIZEOF_NONRESIDENT ) +return NULL ; + t16 =le16_to_cpu (attr->nres.run_off);if (t16 > asize)return NULL ;
@@ -316,7 +317,8 @@ struct ATTRIB *mi_enum_attr(struct mft_iif (!attr->nres.svcn &&is_attr_ext (attr)) {/* First segment of sparse/compressed attribute */ -if (asize +8 <SIZEOF_NONRESIDENT_EX ) +/* Can we use memory including attr->nres.total_size? */ +if (asize <SIZEOF_NONRESIDENT_EX )return NULL ; tot_size =le64_to_cpu (attr->nres.total_size);
@@ -326,9 +328,6 @@ struct ATTRIB *mi_enum_attr(struct mft_iif (tot_size > alloc_size)return NULL ; }else { -if (asize +8 <SIZEOF_NONRESIDENT ) -return NULL ; -if (attr->nres.c_unit)return NULL ;
Greg Kroah-Hartman
maintainerPATCH 245/245 drm/amdgpu: handle default profile on on devices without fullscreen 3D
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 7c210ca5a2d72868e5a052fc533d5dcb7e070f89 upstream.
Some devices do not support fullscreen 3D.
v2: Make the check generic.
--- drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c +10 -1
@@ -1234,6 +1234,14 @@ static void smu_init_xgmi_plpd_mode(stru } } +static bool smu_is_workload_profile_available (struct smu_context *smu, +u32 profile) +{ +if (profile >=PP_SMC_POWER_PROFILE_COUNT ) +return false; +return smu->workload_map && smu->workload_map[profile].valid_mapping; +} +static int smu_sw_init (void *handle) {struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -1265,7 +1273,8 @@ static int smu_sw_init(void *handle) smu->workload_prority[PP_SMC_POWER_PROFILE_COMPUTE ] =5 ; smu->workload_prority[PP_SMC_POWER_PROFILE_CUSTOM ] =6 ; -if (smu->is_apu) +if (smu->is_apu || + !smu_is_workload_profile_available (smu,PP_SMC_POWER_PROFILE_FULLSCREEN3D )) smu->workload_mask =1 << smu->workload_prority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ];else smu->workload_mask =1 << smu->workload_prority[PP_SMC_POWER_PROFILE_FULLSCREEN3D ];
AMD Ryzen 5 5600 6-Core Processor:
https://www.inet.se/produkt/5304697/amd-ryzen-5-5600-3-5-ghz-35mb on a
https://www.gigabyte.com/Motherboard/B550-AORUS-ELITE-V2-rev-12
https://www.inet.se/produkt/1903406/gigabyte-b550-aorus-elite-v2
motherboard :)
running Arch Linux with the testing repos enabled:
https://archlinux.org/ https://archboot.com/
https://wiki.archlinux.org/title/Arch_Testing_Team
Den ons 6 nov. 2024 kl 13:26 skrev Greg Kroah-Hartman <[email protected]>:
Quoted 1,044 lines
This is the start of the stable review cycle for the 6.11.7 release. There are 245 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 Fri, 08 Nov 2024 12:02:47 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.11.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.11.y
and the diffstat can be found below.thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:Greg Kroah-Hartman <[email protected]>
Linux 6.11.7-rc1Alex Deucher <[email protected]>
drm/amdgpu: handle default profile on on devices without fullscreen 3DKonstantin Komarov <[email protected]>
fs/ntfs3: Sequential field availability check inmi_enum_attr()Alex Deucher <[email protected]>
drm/amdgpu/swsmu: default to fullscreen 3D profile for dGPUsAlex Deucher <[email protected]>
drm/amdgpu/swsmu: fix ordering for settingworkload_maskTejas Upadhyay <[email protected]>
drm/xe: Write all slices if its mcr registerTejas Upadhyay <[email protected]>
drm/xe: DefineSTATELESS_COMPRESSION_CTRLas mcr registerShekhar Chauhan <[email protected]>
drm/xe/xe2: Add performance turning changesAkshata Jahagirdar <[email protected]>
drm/xe/xe2: Introduce performance changesSai Teja Pottumuttu <[email protected]>
drm/xe/xe2hpg: Introduce performance tuning changes forXe2_HPGTejas Upadhyay <[email protected]>
drm/xe: Move enable host l2 VRAM post MCR initTejas Upadhyay <[email protected]>
drm/xe/xe2hpg: Add Wa_15016589081Thomas Zimmermann <[email protected]>
drm/xe: Support 'nomodeset' kernel command-line optionJuha-Pekka Heikkila <[email protected]>
drm/i915/display: Don't enable decompression on Xe2 with Tile4Jouni Högander <[email protected]>
drm/i915/psr: Prevent Panel Replay if CRC calculation is enabledJani Nikula <[email protected]>
drm/xe/display: drop unusedrawclk_freqandRUNTIME_INFO()Jani Nikula <[email protected]>
drm/i915: move rawclk from runtime to display runtime infoSuraj Kandpal <[email protected]>
drm/i915/pps: DisableDPLS_GATINGaround pps sequenceMitul Golani <[email protected]>
drm/i915/display/dp: Compute AS SDP when vrr is also enabledSuraj Kandpal <[email protected]>
drm/i915/dp: Clear VSC SDP during post ddi disable routineSuraj Kandpal <[email protected]>
drm/i915/hdcp: Add encoder check inhdcp2_get_capabilitySuraj Kandpal <[email protected]>
drm/i915/hdcp: Add encoder check inintel_hdcp_get_capabilityMitul Golani <[email protected]>
drm/i915/display: WA for Re-initialize dispcnlunitt1 xosc clockMitul Golani <[email protected]>
drm/i915/display: Cache adpative sync caps to use it laterMatthew Auld <[email protected]>
drm/i915: disable fbc due to Wa_16023588340Gustavo Sousa <[email protected]>
drm/i915: Skip programming FIA link enable bits for MTL+Johan Hovold <[email protected]>
arm64: dts: qcom: x1e80100: fix PCIe4 and PCIe6a PHY clocksAbel Vesa <[email protected]>
arm64: dts: qcom: x1e80100: AddBroadcast_ANDregion in LLCC blockHaibo Chen <[email protected]>
arm64: dts: imx8ulp: correct the flexspi compatible stringJohan Hovold <[email protected]>
arm64: dts: qcom: x1e80100-crd: fix nvme regulator boot glitchJohan Hovold <[email protected]>
arm64: dts: qcom: x1e80100-qcp: fix nvme regulator boot glitchJohan Hovold <[email protected]>
arm64: dts: qcom: x1e80100: fix PCIe4 interconnectJohan Hovold <[email protected]>
arm64: dts: qcom: x1e80100-vivobook-s15: fix nvme regulator boot glitchKonrad Dybcio <[email protected]>
arm64: dts: qcom: x1e80100: Fix up BAR spacesJohan Hovold <[email protected]>
arm64: dts: qcom: x1e80100-yoga-slim7x: fix nvme regulator boot glitchFabien Parent <[email protected]>
arm64: dts: qcom: msm8939: revert use of APCS mbox for RPMConor Dooley <[email protected]>
riscv: dts: starfive: disable unused csi/camss nodesE Shattow <[email protected]>
riscv: dts: starfive: Update ethernet phy0 delay parameter values for Star64Yu Zhao <[email protected]>
mm: multi-gen LRU: use {ptep,pmdp}_clear_young_notify()Zhiguo Jiang <[email protected]>
mm: shrink skip folio mapped by an exiting processYu Zhao <[email protected]>
mm: multi-gen LRU: removeMM_LEAF_OLDandMM_NONLEAF_TOTALstatsYuanchu Xie <[email protected]>
mm: multi-gen LRU: ignore non-leafpmd_youngfor force_scan=trueDmitry Torokhov <[email protected]>
Input: fix regression when re-registering input handlersVlastimil Babka <[email protected]>
mm, mmap: limit THP alignment of anonymous mappings to PMD-aligned sizesGregory Price <[email protected]>
vmscan,migrate: fix page count imbalance on node stats when demoting pagesJohan Hovold <[email protected]>
gpiolib: fix debugfs dangling chip separatorJohan Hovold <[email protected]>
gpiolib: fix debugfs newline separatorsFilipe Manana <[email protected]>
btrfs: fix defrag not merging contiguous extents due to merged extent mapsFilipe Manana <[email protected]>
btrfs: fix extent map merging not happening for adjacent extentsJens Axboe <[email protected]>
io_uring/rw: fix missing NOWAIT check forO_DIRECTstart writeMatthew Brost <[email protected]>
drm/xe: Don't short circuit TDR on jobs not startedMatthew Brost <[email protected]>
drm/xe: Add mmio read before GGTT invalidateMichal Wajdeczko <[email protected]>
drm/xe: Killregs/xe_sriov_regs.hMichal Wajdeczko <[email protected]>
drm/xe: Fix register definition order inxe_regs.hJinjie Ruan <[email protected]>
drm/tests: hdmi: Fix memory leaks indrm_display_mode_from_cea_vic()Jinjie Ruan <[email protected]>
drm/connector: hdmi: Fix memory leak indrm_display_mode_from_cea_vic()Jinjie Ruan <[email protected]>
drm/tests: helpers: Add helper fordrm_display_mode_from_cea_vic()Andrey Konovalov <[email protected]>
kasan: removevmalloc_percputestKeith Busch <[email protected]>
nvme: re-fix error-handling forio_uringnvme-passthroughVitaliy Shevtsov <[email protected]>
nvmet-auth: assigndh_keyto NULL afterkfree_sensitiveChristoffer Sandberg <[email protected]>
ALSA: hda/realtek: Fix headset mic on TUXEDO Stellaris 16 Gen6 mb1Christoffer Sandberg <[email protected]>
ALSA: hda/realtek: Fix headset mic on TUXEDO Gemini 17 Gen3Christoph Hellwig <[email protected]>
xfs: fix finding a last resort AG inxfs_filestream_pick_agAndrzej Kacprowski <[email protected]>
accel/ivpu: Fix NOC firewall interrupt handlingZhihao Cheng <[email protected]>
btrfs: fix use-after-free of block device file in__btrfs_free_extra_devids()Matt Johnston <[email protected]>
mctp i2c: handle NULL header addressGregory Price <[email protected]>
resource,kexec:walk_system_ram_res_revmust retain resource flagsEdward Adam Davis <[email protected]>
ocfs2: pass u64 toocfs2_truncate_inlinemaybe overflowSabyrzhan Tasbolatov <[email protected]>
x86/traps: move kmsan check afterinstrumentation_beginGatlin Newhouse <[email protected]>
x86/traps: Enable UBSAN traps on x86Matt Fleming <[email protected]>
mm/page_alloc: letGFP_ATOMICorder-0 allocs access highatomic reservesLorenzo Stoakes <[email protected]>
fork: only invoke khugepaged, ksm hooks if no errorLorenzo Stoakes <[email protected]>
fork: do not invoke uffd on fork if error occursAlexander Usyskin <[email protected]>
mei: use kvmalloc for read bufferMatthieu Baerts (NGI0) <[email protected]>
mptcp: init: protect sched withrcu_read_lockJarkko Sakkinen <[email protected]>
tpm: Lazily flush the auth sessionAlex Deucher <[email protected]>
drm/amdgpu/smu13: fix profile reportingTvrtko Ursulin <[email protected]>
drm/amd/pm: Vangogh: Fix kernel memory out of bounds writeJarkko Sakkinen <[email protected]>
tpm: Rollbacktpm2_load_null()Jarkko Sakkinen <[email protected]>
tpm: Returntpm2_sessions_init()when null key creation failsHugh Dickins <[email protected]>
iov_iter: fixcopy_page_from_iter_atomic()ifKMAP_LOCAL_FORCE_MAPBenjamin Segall <[email protected]>
posix-cpu-timers: ClearTICK_DEP_BIT_POSIX_TIMERon cloneShawn Wang <[email protected]>
sched/numa: Fix the potential null pointer dereference intask_numa_work()Dan Williams <[email protected]>
cxl/acpi: Ensure ports ready atcxl_acpi_probe()returnDan Williams <[email protected]>
cxl/port: Fixcxl_bus_rescan()vsbus_rescan_devices()Peter Wang <[email protected]>
scsi: ufs: core: Fix another deadlock during RTC updateChunyan Zhang <[email protected]>
riscv: Remove duplicatedGET_RMChunyan Zhang <[email protected]>
riscv: Remove unusedGENERATING_ASM_OFFSETSWangYuli <[email protected]>
riscv: Use '%u' to format the output of 'cpu'Miquel Sabaté Solà <[email protected]>
riscv: Prevent a bad reference count on CPU nodesHeinrich Schuchardt <[email protected]>
riscv: efi: Set NX compat flag in PE/COFF headerKailang Yang <[email protected]>
ALSA: hda/realtek: Limit internal Mic boost on Dell platformDmitry Torokhov <[email protected]>
Input: edt-ft5x06 - fix regmap leak when probe failsAlexandre Ghiti <[email protected]>
riscv: vdso: Prevent the compiler from inserting calls tomemset()Frank Li <[email protected]>
spi: spi-fsl-dspi: Fix crash when not using GPIO chip selectNaohiro Aota <[email protected]>
btrfs: fix error propagation of split biosQu Wenruo <[email protected]>
btrfs: mergebtrfs_orig_bbio_end_io()intobtrfs_bio_end_io()Richard Zhu <[email protected]>
phy: freescale: imx8m-pcie: DoCMN_RSTjust before PHY PLL lock checkChen Ridong <[email protected]>
cgroup/bpf: use a dedicated workqueue for cgroup bpf destructionXinyu Zhang <[email protected]>
block: fix sanity checks inblk_rq_map_user_bvecBen Chuang <[email protected]>
mmc: sdhci-pci-gli: GL9767: Fix low power mode in the SD Express processBen Chuang <[email protected]>
mmc: sdhci-pci-gli: GL9767: Fix low power mode on the set clock functionDan Williams <[email protected]>
cxl/port: Fix CXL port initialization order when the subsystem is built-inDan Williams <[email protected]>
cxl/port: Fix use-after-free, permit out-of-order decoder shutdownBjorn Andersson <[email protected]>
soc: qcom:pmic_glink: Handle GLINK intent allocation rejectionsGil Fine <[email protected]>
thunderbolt: Honor TMU requirements in the domain when setting TMU modeMika Westerberg <[email protected]>
thunderbolt: Fix KASAN reported stack out-of-bounds read intb_retimer_scan()Conor Dooley <[email protected]>
firmware: microchip: auto-update: fixpoll_complete()to not report spurious timeout errorsChen Ridong <[email protected]>
mm: shrinker: avoid memleak inalloc_shrinker_infoWladislav Wiebe <[email protected]>
tools/mm: -Werror fixes in page-types/slabinfoJeongjun Park <[email protected]>
mm: shmem: fix data-race inshmem_getattr()Yunhui Cui <[email protected]>
RISC-V: ACPI: fixearly_ioremaptoearly_memremapRyusuke Konishi <[email protected]>
nilfs2: fix potential deadlock with newly created symlinksRyusuke Konishi <[email protected]>
nilfs2: fix kernel bug due to missing clearing of checked flagJavier Carrasco <[email protected]>
iio: light: veml6030: fix microlux value calculationJinjie Ruan <[email protected]>
iio: gts-helper: Fix memory leaks iniio_gts_build_avail_scale_table()Jinjie Ruan <[email protected]>
iio: gts-helper: Fix memory leaks for the error path ofiio_gts_build_avail_scale_table()Zicheng Qu <[email protected]>
iio: adc: ad7124: fix division by zero inad7124_set_channel_odr()Julien Stephan <[email protected]>
dt-bindings: iio: adc: ad7380: fix ad7380-4 reference supplyZicheng Qu <[email protected]>
staging: iio: frequency: ad9832: fix division by zero inad9832_calc_freqreg()Johannes Berg <[email protected]>
wifi: iwlwifi: mvm: fix 6 GHz scan constructionVille Syrjälä <[email protected]>
wifi: iwlegacy: Clear stale interrupts before resuming deviceJohannes Berg <[email protected]>
wifi: cfg80211: clear wdev->cqm_config pointer on freeManikanta Pubbisetty <[email protected]>
wifi: ath10k: Fix memory leak in management txFelix Fietkau <[email protected]>
wifi: mac80211: do not pass a stopped vif to the driver in .get_txpowerEdward Liaw <[email protected]>
Revert "selftests/mm: replaceatomic_boolwithpthread_barrier_t"Edward Liaw <[email protected]>
Revert "selftests/mm: fix deadlock for fork afterpthread_createon ARM"Ovidiu Bunea <[email protected]>
Revert "drm/amd/display: update DML2 policy EnhancedPrefetchScheduleAccelerationFinal DCN35"Greg Kroah-Hartman <[email protected]>
Revert "driver core: Fixuevent_show()vs driver detach race"Basavaraj Natikar <[email protected]>
xhci: Usepm_runtime_getto prevent RPM on unsupported systemsFaisal Hassan <[email protected]>
xhci: Fix Link TRB DMA in command ring stopped completion eventJohan Hovold <[email protected]>
phy: qcom: qmp-usbc: fix NULL-deref on runtime suspendJohan Hovold <[email protected]>
phy: qcom: qmp-usb-legacy: fix NULL-deref on runtime suspendJohan Hovold <[email protected]>
phy: qcom: qmp-usb: fix NULL-deref on runtime suspendJavier Carrasco <[email protected]>
usb: typec: qcom-pmic-typec: fix missing fwnode removal in error pathJavier Carrasco <[email protected]>
usb: typec: qcom-pmic-typec: usefwnode_handle_put()to release fwnodesAmit Sunil Dhamne <[email protected]>
usb: typec: tcpm: restrictSNK_WAIT_CAPABILITIES_TIMEOUTtransitions to non self-powered devicesJavier Carrasco <[email protected]>
usb: typec: fix unreleasedfwnode_handleintypec_port_register_altmodes()Zijun Hu <[email protected]>
usb: phy: Fix APIdevm_usb_put_phy()can not release the phyZongmin Zhou <[email protected]>
usbip: tools: Fixdetach_port()invalid port error pathBitterblue Smith <[email protected]>
wifi: rtlwifi: rtl8192du: Don't claim USB ID 0bda:8171Jan Schär <[email protected]>
ALSA: usb-audio: Add quirks for Dell WD19 dockChuck Lever <[email protected]>
rpcrdma: Always release the rpcrdma_device'sxa_arrayChuck Lever <[email protected]>
NFSD: Never decrementpending_async_copieson errorChuck Lever <[email protected]>
NFSD: Initialize structnfsd4_copyearlierDimitri Sivanich <[email protected]>
misc: sgi-gru: Don't disable preemption in GRU driverDai Ngo <[email protected]>
NFS: remove revoked delegation from server's delegation listDaniel Palmer <[email protected]>
net: amd: mvme147: Fix probe banner messageZhang Rui <[email protected]>
thermal: intel: int340x: processor: Add MMIO RAPL PL4 supportZhang Rui <[email protected]>
thermal: intel: int340x: processor: Remove MMIO RAPL CPU hotplug supportSumeet Pawnikar <[email protected]>
powercap:intel_rapl_msr: Add PL4 support for Arrowlake-UHans de Goede <[email protected]>
ACPI: resource: Fold Asus Vivobook Pro N6506M* DMI quirks togetherPali Rohár <[email protected]>
cifs: Fix creating native symlinks pointing to current or parent directoryPali Rohár <[email protected]>
cifs: Improve creating native symlinks pointing to directoryBenjamin Marzinski <[email protected]>
scsi:scsi_transport_fc: Allow setting rport state to current stateGuilherme Giacomo Simoes <[email protected]>
rust: device: change thefrom_raw()functionKonstantin Komarov <[email protected]>
fs/ntfs3: Additional check inntfs_file_releaseKonstantin Komarov <[email protected]>
fs/ntfs3: Fix general protection fault inrun_is_mapped_fullKonstantin Komarov <[email protected]>
fs/ntfs3: Additional check inni_clear()Konstantin Komarov <[email protected]>
fs/ntfs3: Fix possible deadlock inmi_readKonstantin Komarov <[email protected]>
fs/ntfs3: Add rough attralloc_sizecheckKonstantin Komarov <[email protected]>
fs/ntfs3: Stale inode instead of badKonstantin Komarov <[email protected]>
fs/ntfs3: Fix warning possible deadlock inntfs_set_stateAndrew Ballance <[email protected]>
fs/ntfs3: Check if more than chunk-size bytes are writtenlei lu <[email protected]>
ntfs3: Add bounds checking tomi_enum_attr()Boris Brezillon <[email protected]>
drm/panthor: Report group as timedout when we fail to properly suspendBoris Brezillon <[email protected]>
drm/panthor: Fail job creation when the group is deadBoris Brezillon <[email protected]>
drm/panthor: Fix firmware initialization on systems with a page size > 4kKeith Busch <[email protected]>
nvme: module parameter to disable pi with offsetsJason Gunthorpe <[email protected]>
PCI: Fixpci_enable_acs()support for the ACS quirksShiju Jose <[email protected]>
cxl/events: Fix Trace DRAM Event RecordDan Carpenter <[email protected]>
drm/tegra: Fix NULL vsIS_ERR()check inprobe()Dan Carpenter <[email protected]>
drm/mediatek: Fix potential NULL dereference inmtk_crtc_destroy()Chun-Kuang Hu <[email protected]>
drm/mediatek: Usecmdq_pkt_create()andcmdq_pkt_destroy()Liankun Yang <[email protected]>
drm/mediatek: Fix get efuse issue for MT8188 DPTXHsin-Te Yuan <[email protected]>
drm/mediatek: Fix color format MACROs in OVLJason-JH.Lin <[email protected]>
drm/mediatek: ovl: Remove the color format comment forovl_fmt_convert()Paulo Alcantara <[email protected]>
smb: client: set correct device number on nfs reparse pointsPaulo Alcantara <[email protected]>
smb: client: fix parsing of device numbersAndy Shevchenko <[email protected]>
gpio: sloppy-logic-analyzer: Check for error code fromdevm_mutex_init()callPierre Gondois <[email protected]>
ACPI: CPPC: Makermw_lockaraw_spin_lockDavid Howells <[email protected]>
afs: Fix missing subdir edit when renamed between parent dirsXiongfeng Wang <[email protected]>
firmware:arm_sdei: Fix the input parameter ofcpuhp_remove_state()Marco Elver <[email protected]>
kasan: Fix Software Tag-Based KASAN with GCCChristoph Hellwig <[email protected]>
iomap: turniomap_want_unshare_iterinto an inline functionDarrick J. Wong <[email protected]>
fsdax:dax_unshare_iterneeds to copy entire blocksDarrick J. Wong <[email protected]>
fsdax: remove zeroing code fromdax_unshare_iterDarrick J. Wong <[email protected]>
iomap: shareiomap_unshare_iterpredicate code with fsdaxDarrick J. Wong <[email protected]>
iomap: don't bother unsharing delalloc extentsChristoph Hellwig <[email protected]>
iomap: improve shared block detection iniomap_unshare_iterToke Høiland-Jørgensen <[email protected]>
bpf,test_run: FixLIVE_FRAMEframe update after a page has been recycledPablo Neira Ayuso <[email protected]>
netfilter:nft_payload: sanitize offset and length before callingskb_checksum()Daniel Golle <[email protected]>
net: ethernet:mtk_wed: fix path of MT7988 WO firmwareIdo Schimmel <[email protected]>
mlxsw:spectrum_ipip: Fix memory leak when changing remote IPv6 addressAmit Cohen <[email protected]>
mlxsw: pci: Sync Rx buffers for deviceAmit Cohen <[email protected]>
mlxsw: pci: Sync Rx buffers for CPUAmit Cohen <[email protected]>
mlxsw:spectrum_ptp: Add missing verification before pushing Tx headerBenoît Monin <[email protected]>
net: skip offload forNETIF_F_IPV6_CSUMif ipv6 header contains extensionHou Tao <[email protected]>
bpf: Check the validity ofnr_wordsinbpf_iter_bits_new()Hou Tao <[email protected]>
bpf: Addbpf_mem_alloc_check_size()helperHou Tao <[email protected]>
bpf: Free dynamically allocated bits inbpf_iter_bits_destroy()Sungwoo Kim <[email protected]>
Bluetooth: hci: fix null-ptr-deref inhci_read_supported_codecsEric Dumazet <[email protected]>
netfilter:nf_reject_ipv6: fix potential crash innf_send_reset6()Dong Chenchen <[email protected]>
netfilter: Fix use-after-free inget_info()Wang Liang <[email protected]>
net: fix crash when config small gso_max_size/gso_ipv4_max_sizeByeonguk Jeong <[email protected]>
bpf: Fix out-of-bounds write intrie_get_next_key()Vladimir Oltean <[email protected]>
net/sched:sch_api: fixxa_insert()error path intcf_block_get_ext()Zichen Xie <[email protected]>
netdevsim: Add trailing zero to terminate the string innsim_nexthop_bucket_activity_write()Eduard Zingerman <[email protected]>
bpf: Force checkpoint when jmp history is too longPedro Tammela <[email protected]>
net/sched: stopqdisc_tree_reduce_backlogonTC_H_ROOTPablo Neira Ayuso <[email protected]>
gtp: allow -1 to be specified as file description from userspaceIdo Schimmel <[email protected]>
ipv4:ip_tunnel: Fix suspicious RCU usage warning inip_tunnel_find()Ido Schimmel <[email protected]>
ipv4:ip_tunnel: Fix suspicious RCU usage warning inip_tunnel_init_flow()Arkadiusz Kubalewski <[email protected]>
ice: fix crash on probe for DPLL enabled E810 LOMArkadiusz Kubalewski <[email protected]>
ice: add callbacks for Embedded SYNC enablement on dpll pinsArkadiusz Kubalewski <[email protected]>
dpll: add Embedded SYNC feature for a pinWander Lairson Costa <[email protected]>
igb: Disable threaded IRQ forigb_msix_otherFurong Xu <[email protected]>
net: stmmac: TSO: Fix unbalanced DMA map/unmap for non-paged SKB dataLey Foon Tan <[email protected]>
net: stmmac: dwmac4: Fix high address display by updating reg_space[] from register valuesCong Wang <[email protected]>
sock_map: fix a NULL pointer dereference insock_map_link_update_prog()Aleksei Vetrov <[email protected]>
ASoC: dapm: fix bounds checker error indapm_widget_list_createJianbo Liu <[email protected]>
macsec: Fix use-after-free while sending the offloading packetChristophe JAILLET <[email protected]>
ASoC: cs42l51: Fix some error handling paths incs42l51_probe()Emmanuel Grumbach <[email protected]>
Revert "wifi: iwlwifi: remove retry loops in start"Emmanuel Grumbach <[email protected]>
wifi: iwlwifi: mvm: don't add default link in fw restart flowDaniel Gabay <[email protected]>
wifi: iwlwifi: mvm: Fix response handling iniwl_mvm_send_recovery_cmd()Miri Korenblit <[email protected]>
wifi: iwlwifi: mvm: really sendiwl_txpower_constraints_cmdEmmanuel Grumbach <[email protected]>
wifi: iwlwifi: mvm: don't leak a link on AP removalSelvin Xavier <[email protected]>
RDMA/bnxt_re: synchronize the qp-handle table arraySelvin Xavier <[email protected]>
RDMA/bnxt_re: Fix the usage of control path spin locksPatrisious Haddad <[email protected]>
RDMA/mlx5: Round max_rd_atomic/max_dest_rd_atomic up instead of downLeon Romanovsky <[email protected]>
RDMA/cxgb4: Dump vendor specific QP detailsGeert Uytterhoeven <[email protected]>
wifi: brcm80211:BRCM_TRACINGshould depend on TRACINGPing-Ke Shih <[email protected]>
wifi: rtw89: pci: early chips only enable 36-bit DMA on specific PCI hostsRemi Pommarel <[email protected]>
wifi: ath11k: Fix invalid ring usage in full monitor modeFelix Fietkau <[email protected]>
wifi: mac80211: skip non-uploaded keys inieee80211_iter_keysGeert Uytterhoeven <[email protected]>
mac80211:MAC80211_MESSAGE_TRACINGshould depend on TRACINGBen Hutchings <[email protected]>
wifi: iwlegacy: Fix "field-spanning write" warning inil_enqueue_hcmd()John Garry <[email protected]>
scsi:scsi_debug: Fixdo_device_access()handling of unexpected SG copy lengthArnaldo Carvalho de Melo <[email protected]>
perf python: Fix up the build on architectures withoutHAVE_KVM_STAT_SUPPORTJiri Slaby <[email protected]>
perf trace: Fix non-listed archs in the syscalltbl routinesPei Xiao <[email protected]>
slub/kunit: fix a WARNING due to unwrapped__kmalloc_cache_noprofGeorgi Djakov <[email protected]>
spi: geni-qcom: Fix boot warning related topm_runtimeand devresXiu Jianfeng <[email protected]>
cgroup: Fix potential overflow issue when checkingmax_depthFrank Min <[email protected]>
drm/amdgpu: fix random data corruption for sdma 7Florian Westphal <[email protected]>
lib:alloc_tag_module_unloadmust wait for pendingkfree_rcucalls-------------
Diffstat:
.../devicetree/bindings/iio/adc/adi,ad7380.yaml | 21 ++ Documentation/driver-api/dpll.rst | 21 ++ Documentation/netlink/specs/dpll.yaml | 24 ++ Makefile | 4 +- arch/arm64/boot/dts/freescale/imx8ulp.dtsi | 2 +- arch/arm64/boot/dts/qcom/msm8939.dtsi | 2 +- .../boot/dts/qcom/x1e80100-asus-vivobook-s15.dts | 2 + arch/arm64/boot/dts/qcom/x1e80100-crd.dts | 2 + .../boot/dts/qcom/x1e80100-lenovo-yoga-slim7x.dts | 2 + arch/arm64/boot/dts/qcom/x1e80100-qcp.dts | 2 + arch/arm64/boot/dts/qcom/x1e80100.dtsi | 34 ++- arch/riscv/boot/dts/starfive/jh7110-common.dtsi | 2 - .../boot/dts/starfive/jh7110-pine64-star64.dts | 3 +- arch/riscv/kernel/acpi.c | 4 +- arch/riscv/kernel/asm-offsets.c | 2 - arch/riscv/kernel/cacheinfo.c | 7 +- arch/riscv/kernel/cpu-hotplug.c | 2 +- arch/riscv/kernel/efi-header.S | 2 +- arch/riscv/kernel/traps_misaligned.c | 2 - arch/riscv/kernel/vdso/Makefile | 1 + arch/x86/include/asm/bug.h | 12 + arch/x86/kernel/traps.c | 71 ++++- block/blk-map.c | 4 +- drivers/accel/ivpu/ivpu_debugfs.c | 9 + drivers/accel/ivpu/ivpu_hw.c | 1 + drivers/accel/ivpu/ivpu_hw.h | 1 + drivers/accel/ivpu/ivpu_hw_ip.c | 5 +- drivers/acpi/cppc_acpi.c | 9 +- drivers/acpi/resource.c | 18 +- drivers/base/core.c | 48 +++- drivers/base/module.c | 4 - drivers/char/tpm/tpm-chip.c | 10 + drivers/char/tpm/tpm-dev-common.c | 3 + drivers/char/tpm/tpm-interface.c | 6 +- drivers/char/tpm/tpm2-sessions.c | 100 ++++--- drivers/cxl/Kconfig | 1 + drivers/cxl/Makefile | 20 +- drivers/cxl/acpi.c | 7 + drivers/cxl/core/hdm.c | 50 +++- drivers/cxl/core/port.c | 13 +- drivers/cxl/core/region.c | 48 +--- drivers/cxl/core/trace.h | 17 +- drivers/cxl/cxl.h | 3 +- drivers/cxl/port.c | 17 +- drivers/dpll/dpll_netlink.c | 130 +++++++++ drivers/dpll/dpll_nl.c | 5 +- drivers/firmware/arm_sdei.c | 2 +- drivers/firmware/microchip/mpfs-auto-update.c | 42 +-- drivers/gpio/gpio-sloppy-logic-analyzer.c | 4 +- drivers/gpio/gpiolib.c | 4 +- drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c | 9 +- drivers/gpu/drm/amd/display/dc/dml2/dml2_policy.c | 1 + drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 15 +- drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c | 4 +- .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 6 +- drivers/gpu/drm/i915/display/intel_alpm.c | 2 +- drivers/gpu/drm/i915/display/intel_backlight.c | 10 +- .../gpu/drm/i915/display/intel_display_device.c | 5 + .../gpu/drm/i915/display/intel_display_device.h | 2 + drivers/gpu/drm/i915/display/intel_display_power.c | 8 + .../drm/i915/display/intel_display_power_well.c | 4 +- drivers/gpu/drm/i915/display/intel_display_types.h | 1 + drivers/gpu/drm/i915/display/intel_display_wa.h | 8 + drivers/gpu/drm/i915/display/intel_dp.c | 29 +- drivers/gpu/drm/i915/display/intel_dp.h | 1 - drivers/gpu/drm/i915/display/intel_dp_aux.c | 4 +- drivers/gpu/drm/i915/display/intel_dp_hdcp.c | 11 +- drivers/gpu/drm/i915/display/intel_fbc.c | 6 + drivers/gpu/drm/i915/display/intel_hdcp.c | 7 +- drivers/gpu/drm/i915/display/intel_pps.c | 14 +- drivers/gpu/drm/i915/display/intel_psr.c | 6 + drivers/gpu/drm/i915/display/intel_tc.c | 3 + drivers/gpu/drm/i915/display/intel_vrr.c | 3 +- drivers/gpu/drm/i915/display/skl_universal_plane.c | 5 - drivers/gpu/drm/i915/intel_device_info.c | 5 - drivers/gpu/drm/i915/intel_device_info.h | 2 - drivers/gpu/drm/mediatek/mtk_crtc.c | 47 +--- drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 9 +- drivers/gpu/drm/mediatek/mtk_dp.c | 85 +++++- drivers/gpu/drm/panthor/panthor_fw.c | 4 +- drivers/gpu/drm/panthor/panthor_gem.c | 11 +- drivers/gpu/drm/panthor/panthor_mmu.c | 16 +- drivers/gpu/drm/panthor/panthor_mmu.h | 1 + drivers/gpu/drm/panthor/panthor_sched.c | 20 +- drivers/gpu/drm/tegra/drm.c | 4 +- drivers/gpu/drm/tests/drm_connector_test.c | 24 +- drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c | 8 +- drivers/gpu/drm/tests/drm_kunit_helpers.c | 42 +++ drivers/gpu/drm/xe/Makefile | 1 + drivers/gpu/drm/xe/compat-i915-headers/i915_drv.h | 1 - drivers/gpu/drm/xe/display/xe_display_wa.c | 16 ++ drivers/gpu/drm/xe/regs/xe_gt_regs.h | 17 +- drivers/gpu/drm/xe/regs/xe_regs.h | 10 +- drivers/gpu/drm/xe/regs/xe_sriov_regs.h | 23 -- drivers/gpu/drm/xe/xe_device_types.h | 6 - drivers/gpu/drm/xe/xe_ggtt.c | 10 + drivers/gpu/drm/xe/xe_gt.c | 10 +- drivers/gpu/drm/xe/xe_gt_sriov_pf.c | 2 +- drivers/gpu/drm/xe/xe_guc_submit.c | 18 +- drivers/gpu/drm/xe/xe_lmtt.c | 2 +- drivers/gpu/drm/xe/xe_module.c | 39 ++- drivers/gpu/drm/xe/xe_sriov.c | 2 +- drivers/gpu/drm/xe/xe_tuning.c | 21 +- drivers/gpu/drm/xe/xe_wa.c | 4 + drivers/iio/adc/ad7124.c | 2 +- drivers/iio/industrialio-gts-helper.c | 4 +- drivers/iio/light/veml6030.c | 2 +- drivers/infiniband/hw/bnxt_re/qplib_fp.c | 4 + drivers/infiniband/hw/bnxt_re/qplib_rcfw.c | 38 +-- drivers/infiniband/hw/bnxt_re/qplib_rcfw.h | 2 + drivers/infiniband/hw/cxgb4/provider.c | 1 + drivers/infiniband/hw/mlx5/qp.c | 4 +- drivers/input/input.c | 134 +++++----- drivers/input/touchscreen/edt-ft5x06.c | 19 +- drivers/misc/mei/client.c | 4 +- drivers/misc/sgi-gru/grukservices.c | 2 - drivers/misc/sgi-gru/grumain.c | 4 - drivers/misc/sgi-gru/grutlbpurge.c | 2 - drivers/mmc/host/sdhci-pci-gli.c | 38 ++- drivers/net/ethernet/amd/mvme147.c | 7 +- drivers/net/ethernet/intel/ice/ice_dpll.c | 293 ++++++++++++++++++++- drivers/net/ethernet/intel/ice/ice_dpll.h | 1 + drivers/net/ethernet/intel/ice/ice_ptp_hw.c | 21 +- drivers/net/ethernet/intel/ice/ice_ptp_hw.h | 1 + drivers/net/ethernet/intel/igb/igb_main.c | 2 +- drivers/net/ethernet/mediatek/mtk_wed_wo.h | 4 +- drivers/net/ethernet/mellanox/mlxsw/pci.c | 25 +- .../net/ethernet/mellanox/mlxsw/spectrum_ipip.c | 26 +- drivers/net/ethernet/mellanox/mlxsw/spectrum_ptp.c | 7 + drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c | 8 + drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h | 2 + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 22 +- drivers/net/gtp.c | 22 +- drivers/net/macsec.c | 3 +- drivers/net/mctp/mctp-i2c.c | 3 + drivers/net/netdevsim/fib.c | 4 +- drivers/net/wireless/ath/ath10k/wmi-tlv.c | 7 +- drivers/net/wireless/ath/ath10k/wmi.c | 2 + drivers/net/wireless/ath/ath11k/dp_rx.c | 7 +- drivers/net/wireless/broadcom/brcm80211/Kconfig | 1 + drivers/net/wireless/intel/iwlegacy/common.c | 15 +- drivers/net/wireless/intel/iwlegacy/common.h | 12 + drivers/net/wireless/intel/iwlwifi/iwl-drv.c | 34 ++- drivers/net/wireless/intel/iwlwifi/iwl-drv.h | 3 + drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 10 +- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 12 +- .../net/wireless/intel/iwlwifi/mvm/mld-mac80211.c | 34 ++- drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 6 +- .../net/wireless/realtek/rtlwifi/rtl8192du/sw.c | 1 - drivers/net/wireless/realtek/rtw89/pci.c | 48 +++- drivers/nvme/host/core.c | 19 +- drivers/nvme/host/ioctl.c | 7 +- drivers/nvme/target/auth.c | 1 + drivers/pci/pci.c | 14 +- drivers/phy/freescale/phy-fsl-imx8m-pcie.c | 10 +- drivers/phy/qualcomm/phy-qcom-qmp-usb-legacy.c | 1 + drivers/phy/qualcomm/phy-qcom-qmp-usb.c | 1 + drivers/phy/qualcomm/phy-qcom-qmp-usbc.c | 1 + drivers/powercap/intel_rapl_msr.c | 1 + drivers/scsi/scsi_debug.c | 10 +- drivers/scsi/scsi_transport_fc.c | 4 +- drivers/soc/qcom/pmic_glink.c | 25 +- drivers/spi/spi-fsl-dspi.c | 6 +- drivers/spi/spi-geni-qcom.c | 8 +- drivers/staging/iio/frequency/ad9832.c | 7 +- .../intel/int340x_thermal/processor_thermal_rapl.c | 70 ++--- drivers/thunderbolt/retimer.c | 5 +- drivers/thunderbolt/tb.c | 48 +++- drivers/ufs/core/ufshcd.c | 2 +- drivers/usb/host/xhci-pci.c | 6 +- drivers/usb/host/xhci-ring.c | 16 +- drivers/usb/phy/phy.c | 2 +- drivers/usb/typec/class.c | 1 + drivers/usb/typec/tcpm/qcom/qcom_pmic_typec.c | 10 +- drivers/usb/typec/tcpm/tcpm.c | 10 +- fs/afs/dir.c | 25 ++ fs/afs/dir_edit.c | 91 ++++++- fs/afs/internal.h | 2 + fs/btrfs/bio.c | 62 ++--- fs/btrfs/bio.h | 3 + fs/btrfs/defrag.c | 10 +- fs/btrfs/extent_map.c | 7 +- fs/btrfs/volumes.c | 1 + fs/dax.c | 49 ++-- fs/iomap/buffered-io.c | 7 +- fs/nfs/delegation.c | 5 + fs/nfsd/nfs4proc.c | 10 +- fs/nilfs2/namei.c | 3 + fs/nilfs2/page.c | 1 + fs/ntfs3/file.c | 9 +- fs/ntfs3/frecord.c | 4 +- fs/ntfs3/inode.c | 15 +- fs/ntfs3/lznt.c | 3 + fs/ntfs3/namei.c | 2 +- fs/ntfs3/ntfs_fs.h | 2 +- fs/ntfs3/record.c | 31 ++- fs/ocfs2/file.c | 8 + fs/smb/client/cifs_unicode.c | 17 +- fs/smb/client/reparse.c | 174 +++++++++++- fs/smb/client/reparse.h | 9 +- fs/smb/client/smb2inode.c | 3 +- fs/smb/client/smb2proto.h | 1 + fs/userfaultfd.c | 28 ++ fs/xfs/xfs_filestream.c | 23 +- fs/xfs/xfs_trace.h | 15 +- include/acpi/cppc_acpi.h | 2 +- include/drm/drm_kunit_helpers.h | 4 + include/linux/bpf_mem_alloc.h | 3 + include/linux/compiler-gcc.h | 4 + include/linux/device.h | 3 + include/linux/dpll.h | 15 ++ include/linux/input.h | 10 +- include/linux/iomap.h | 19 ++ include/linux/ksm.h | 10 +- include/linux/mmzone.h | 7 +- include/linux/tick.h | 8 + include/linux/ubsan.h | 5 + include/linux/userfaultfd_k.h | 5 + include/net/ip_tunnels.h | 2 +- include/trace/events/afs.h | 7 +- include/uapi/linux/dpll.h | 3 + io_uring/rw.c | 23 +- kernel/bpf/cgroup.c | 19 +- kernel/bpf/helpers.c | 21 +- kernel/bpf/lpm_trie.c | 2 +- kernel/bpf/memalloc.c | 14 +- kernel/bpf/verifier.c | 9 +- kernel/cgroup/cgroup.c | 4 +- kernel/fork.c | 14 +- kernel/resource.c | 4 +- kernel/sched/fair.c | 4 +- lib/Kconfig.ubsan | 4 +- lib/codetag.c | 3 + lib/iov_iter.c | 6 +- lib/slub_kunit.c | 2 +- mm/kasan/kasan_test.c | 27 -- mm/migrate.c | 2 +- mm/mmap.c | 3 +- mm/page_alloc.c | 10 +- mm/rmap.c | 24 +- mm/shmem.c | 2 + mm/shrinker.c | 8 +- mm/vmscan.c | 109 ++++---- net/bluetooth/hci_sync.c | 18 +- net/bpf/test_run.c | 1 + net/core/dev.c | 4 + net/core/rtnetlink.c | 4 +- net/core/sock_map.c | 4 + net/ipv4/ip_tunnel.c | 2 +- net/ipv6/netfilter/nf_reject_ipv6.c | 15 +- net/mac80211/Kconfig | 2 +- net/mac80211/cfg.c | 3 +- net/mac80211/key.c | 42 +-- net/mptcp/protocol.c | 2 + net/netfilter/nft_payload.c | 3 + net/netfilter/x_tables.c | 2 +- net/sched/cls_api.c | 1 + net/sched/sch_api.c | 2 +- net/sunrpc/xprtrdma/ib_client.c | 1 + net/wireless/core.c | 1 + rust/kernel/device.rs | 15 +- rust/kernel/firmware.rs | 2 +- sound/pci/hda/patch_realtek.c | 23 +- sound/soc/codecs/cs42l51.c | 7 +- sound/soc/soc-dapm.c | 2 + sound/usb/mixer_quirks.c | 3 + tools/mm/page-types.c | 9 +- tools/mm/slabinfo.c | 4 +- tools/perf/util/python.c | 3 + tools/perf/util/syscalltbl.c | 10 + tools/testing/cxl/test/cxl.c | 14 +- tools/testing/selftests/mm/uffd-common.c | 5 +- tools/testing/selftests/mm/uffd-common.h | 3 +- tools/testing/selftests/mm/uffd-unit-tests.c | 21 +- tools/usb/usbip/src/usbip_detach.c | 1 + 275 files changed, 2818 insertions(+), 1069 deletions(-)
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.11.7 release. There are 245 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 Fri, 08 Nov 2024 12:02:47 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.11.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.11.y
and the diffstat can be found below.thanks,
greg k-h
The mips gcc-12 allmodconfig build failed on the Linux stable-rc linux-6.11.y branch.
First seen on Linux stable-rc v6.11.4-642-g0e21c72fc970
Good: v6.11.4-397-g4ccf0b49d5b6
Bad: v6.11.4-642-g0e21c72fc970
mips:
build:
* gcc-12-allmodconfig
Build errors:
-------------
ERROR: modpost: "__cmpxchg_small" [fs/btrfs/btrfs.ko] undefined!
Links:
- https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.11.y/build/v6.11.4-642-g0e21c72fc970/testrun/25700362/suite/build/test/gcc-12-allmodconfig/log
- https://storage.tuxsuite.com/public/linaro/lkft/builds/2oTbq5WdzEalBxPXBBCuzLUA45b/
- https://storage.tuxsuite.com/public/linaro/lkft/builds/2oTbq5WdzEalBxPXBBCuzLUA45b/config
Steps to reproduce:
------------
- tuxmake --runtime podman --target-arch mips --toolchain gcc-12
--kconfig allmodconfig
metadata:
----
git describe: v6.11.4-642-g0e21c72fc970
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git sha: 0e21c72fc970e320e6c1ca9d81d2dce4aab95b3b
kernel config:
https://storage.tuxsuite.com/public/linaro/lkft/builds/2oTbq5WdzEalBxPXBBCuzLUA45b/config
build url: https://storage.tuxsuite.com/public/linaro/lkft/builds/2oTbq5WdzEalBxPXBBCuzLUA45b/
toolchain: gcc-12
config: allmodconfig
arch: mips
--
Linaro LKFT
https://lkft.linaro.org
Quoted 30 lines · Naresh Kamboju
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.11.7 release. There are 245 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 Fri, 08 Nov 2024 12:02:47 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.11.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.11.y
and the diffstat can be found below.thanks,
greg k-h
The mips gcc-12 allmodconfig build failed on the Linux stable-rc linux-6.11.y branch.
First seen on Linux stable-rc v6.11.4-642-g0e21c72fc970
Good: v6.11.4-397-g4ccf0b49d5b6
Bad: v6.11.4-642-g0e21c72fc970
Quoted 7 lines
mips:
build:
* gcc-12-allmodconfigBuild errors:
-------------
ERROR: modpost: "__cmpxchg_small" [fs/btrfs/btrfs.ko] undefined!
The patch "btrfs: fix error propagation of split bios" needs 90a88784cdb7 ("MIPS: export __cmpxchg_small()")
Greg Kroah-Hartman
maintainerQuoted 35 lines · David Sterba
Quoted 34 lines · Naresh Kamboju
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.11.7 release. There are 245 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 Fri, 08 Nov 2024 12:02:47 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.11.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.11.y
and the diffstat can be found below.thanks,
greg k-h
The mips gcc-12 allmodconfig build failed on the Linux stable-rc linux-6.11.y branch.
First seen on Linux stable-rc v6.11.4-642-g0e21c72fc970
Good: v6.11.4-397-g4ccf0b49d5b6
Bad: v6.11.4-642-g0e21c72fc970mips:
build:
* gcc-12-allmodconfig
Quoted 6 lines
Quoted 3 lines
Build errors:
-------------
ERROR: modpost: "__cmpxchg_small" [fs/btrfs/btrfs.ko] undefined!The patch "btrfs: fix error propagation of split bios" needs
90a88784cdb7("MIPS: export__cmpxchg_small()")
Thanks, I"ll queue that up now and push out a -rc2 soon.
greg k-h
Hello,
Quoted 7 lines · On Wed, 6 Nov 2024 13:00:53 +0100 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 6.11.7 release. There are 245 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 Fri, 08 Nov 2024 12:02:47 +0000. Anything received after that time might be too late.
This rc kernel passes DAMON functionality test[1] on my test machine. Attaching the test results summary below. Please note that I retrieved the kernel from linux-stable-rc tree[2].
[1] https://github.com/damonitor/damon-tests/tree/next/corr
[2] 0e21c72fc970 ("Linux 6.11.7-rc1")
Thanks,
SJ
[...]
---
ok 9 selftests: damon: damos_tried_regions.py
ok 10 selftests: damon: damon_nr_regions.py
ok 11 selftests: damon: reclaim.sh
ok 12 selftests: damon: lru_sort.sh
ok 13 selftests: damon: debugfs_empty_targets.sh
ok 14 selftests: damon: debugfs_huge_count_read_write.sh
ok 15 selftests: damon: debugfs_duplicate_context_creation.sh ok 16 selftests: damon: debugfs_rm_non_contexts.sh
ok 17 selftests: damon: debugfs_target_ids_read_before_terminate_race.sh ok 18 selftests: damon: debugfs_target_ids_pid_leak.sh
ok 19 selftests: damon: sysfs_update_removed_scheme_dir.sh
ok 20 selftests: damon: sysfs_update_schemes_tried_regions_hang.py ok 1 selftests: damon-tests: kunit.sh
ok 2 selftests: damon-tests: huge_count_read_write.sh
ok 3 selftests: damon-tests: buffer_overflow.sh
ok 4 selftests: damon-tests: rm_contexts.sh
ok 5 selftests: damon-tests: record_null_deref.sh
ok 6 selftests: damon-tests: dbgfs_target_ids_read_before_terminate_race.sh ok 7 selftests: damon-tests: dbgfs_target_ids_pid_leak.sh
ok 8 selftests: damon-tests: damo_tests.sh
ok 9 selftests: damon-tests: masim-record.sh
ok 10 selftests: damon-tests: build_i386.sh
ok 11 selftests: damon-tests: build_arm64.sh # SKIP
ok 12 selftests: damon-tests: build_m68k.sh # SKIP
ok 13 selftests: damon-tests: build_i386_idle_flag.sh
ok 14 selftests: damon-tests: build_i386_highpte.sh
ok 15 selftests: damon-tests: build_nomemcg.sh
[33m
[92mPASS [39m
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.11.7 release. There are 245 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 Fri, 08 Nov 2024 12:02:47 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 10 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.11.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.11.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah