5.15.94-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 5.15.94-rc1 review
This is the start of the stable review cycle for the 5.15.94 release. There are 67 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Feb 2023 14:46:51 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.94-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-5.15.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.15.94-rc1
Russell King (Oracle) <[email protected]>
nvmem: core: fix return value
Ville Syrjälä <[email protected]>
drm/i915: Fix VBT DSI DVO port handling
Aravind Iddamsetty <[email protected]>
drm/i915: Initialize the obj flags for shmem objects
Guilherme G. Piccoli <[email protected]>
drm/amdgpu/fence: Fix oops due to non-matching drm_sched init/fini
David Chen <[email protected]>
Fix page corruption caused by racy check in __free_pages
Heiner Kallweit <[email protected]>
arm64: dts: meson-axg: Make mmc host controller interrupts level-sensitive
Heiner Kallweit <[email protected]>
arm64: dts: meson-g12-common: Make mmc host controller interrupts level-sensitive
Heiner Kallweit <[email protected]>
arm64: dts: meson-gx: Make mmc host controller interrupts level-sensitive
Wander Lairson Costa <[email protected]>
rtmutex: Ensure that the top waiter is always woken up
Nicholas Piggin <[email protected]>
powerpc/64s/interrupt: Fix interrupt exit race with security mitigation switch
Guo Ren <[email protected]>
riscv: Fixup race condition on PG_dcache_clean in flush_icache_pte
Xiubo Li <[email protected]>
ceph: flush cap releases when the session is flushed
Paul Cercueil <[email protected]>
clk: ingenic: jz4760: Update M/N/OD calculation algorithm
Prashant Malani <[email protected]>
usb: typec: altmodes/displayport: Fix probe pin assign check
Mark Pearson <[email protected]>
usb: core: add quirk for Alcor Link AK9563 smartcard reader
Anand Jain <[email protected]>
btrfs: free device in btrfs_close_devices for a single device filesystem
Paolo Abeni <[email protected]>
mptcp: be careful on subflow status propagation on errors
Alan Stern <[email protected]>
net: USB: Fix wrong-direction WARNING in plusb.c
ZhaoLong Wang <[email protected]>
cifs: Fix use-after-free in rdata->read_into_pages()
Andy Shevchenko <[email protected]>
pinctrl: intel: Restore the pins that used to be in Direct IRQ mode
Serge Semin <[email protected]>
spi: dw: Fix wrong FIFO level setting for long xfers
Maxim Korotkov <[email protected]>
pinctrl: single: fix potential NULL dereference
Joel Stanley <[email protected]>
pinctrl: aspeed: Fix confusing types in return value
Guodong Liu <[email protected]>
pinctrl: mediatek: Fix the drive register definition of some Pins
Amadeusz Sławiński <[email protected]>
ASoC: topology: Return -ENOMEM on memory allocation failure
Liu Shixin <[email protected]>
riscv: stacktrace: Fix missing the first frame
Dan Carpenter <[email protected]>
ALSA: pci: lx6464es: fix a debug loop
Hangbin Liu <[email protected]>
selftests: forwarding: lib: quote the sysctl values
Pietro Borrello <[email protected]>
rds: rds_rm_zerocopy_callback() use list_first_entry()
Sasha Neftin <[email protected]>
igc: Add ndo_tx_timeout support
Shay Drory <[email protected]>
net/mlx5: Serialize module cleanup with reload and remove
Shay Drory <[email protected]>
net/mlx5: fw_tracer, Zero consumer index when reloading the tracer
Shay Drory <[email protected]>
net/mlx5: fw_tracer, Clear load bit when freeing string DBs buffers
Dragos Tatulea <[email protected]>
net/mlx5e: IPoIB, Show unknown speed instead of error
Vlad Buslov <[email protected]>
net/mlx5: Bridge, fix ageing of peer FDB entries
Adham Faris <[email protected]>
net/mlx5e: Update rx ring hw mtu upon each rx-fcs flag change
Maxim Mikityanskiy <[email protected]>
net/mlx5e: Introduce the mlx5e_flush_rq function
Maxim Mikityanskiy <[email protected]>
net/mlx5e: Move repeating clear_bit in mlx5e_rx_reporter_err_rq_cqe_recover
Vladimir Oltean <[email protected]>
net: mscc: ocelot: fix VCAP filters not matching on MAC with "protocol 802.1Q"
Vladimir Oltean <[email protected]>
net: dsa: mt7530: don't change PVC_EG_TAG when CPU port becomes VLAN-aware
Anirudh Venkataramanan <[email protected]>
ice: Do not use WQ_MEM_RECLAIM flag for workqueue
Herton R. Krzesinski <[email protected]>
uapi: add missing ip/ipv6 header dependencies for linux/stddef.h
Neel Patel <[email protected]>
ionic: clean interrupt before enabling queue to avoid credit race
Heiner Kallweit <[email protected]>
net: phy: meson-gxl: use MMD access dummy stubs for GXL, internal PHY
Qi Zheng <[email protected]>
bonding: fix error checking in bond_debug_reregister()
Clément Léger <[email protected]>
net: phylink: move phy_device_free() to correctly release phy device
Christian Hopps <[email protected]>
xfrm: fix bug with DSCP copy to v6 from v4 tunnel
Yang Yingliang <[email protected]>
RDMA/usnic: use iommu_map_atomic() under spin_lock()
Nikita Zhandarovich <[email protected]>
RDMA/irdma: Fix potential NULL-ptr-dereference
Dragos Tatulea <[email protected]>
IB/IPoIB: Fix legacy IPoIB due to wrong number of queues
Eric Dumazet <[email protected]>
xfrm/compat: prevent potential spectre v1 gadget in xfrm_xlate32_attr()
Dean Luick <[email protected]>
IB/hfi1: Restore allocated resources on failed copyout
Anastasia Belova <[email protected]>
xfrm: compat: change expression for switch in xfrm_xlate64
Devid Antonio Filoni <[email protected]>
can: j1939: do not wait 250 ms if the same addr was already claimed
Mark Brown <[email protected]>
of/address: Return an error when no valid dma-ranges are found
Shiju Jose <[email protected]>
tracing: Fix poll() and select() do not work on per_cpu trace_pipe and trace_pipe_raw
Elvis Angelaccio <[email protected]>
ALSA: hda/realtek: Enable mute/micmute LEDs on HP Elitebook, 645 G9
Guillaume Pinot <[email protected]>
ALSA: hda/realtek: Fix the speaker output on Samsung Galaxy Book2 Pro 360
Artemii Karasev <[email protected]>
ALSA: emux: Avoid potential array out-of-bound in snd_emux_xg_control()
Edson Juliano Drosdeck <[email protected]>
ALSA: hda/realtek: Add Positivo N14KP6-TG
Alexander Potapenko <[email protected]>
btrfs: zlib: zero-initialize zlib workspace
Josef Bacik <[email protected]>
btrfs: limit device extents to the device size
Mike Kravetz <[email protected]>
migrate: hugetlb: check for hugetlb shared PMD in node migration
Miaohe Lin <[email protected]>
mm/migration: return errno when isolate_huge_page failed
Russell King (Oracle) <[email protected]>
nvmem: core: fix registration vs use race
Russell King (Oracle) <[email protected]>
nvmem: core: fix cleanup after dev_set_name()
Gaosheng Cui <[email protected]>
nvmem: core: add error handling for dev_set_name
-------------
Diffstat:
Makefile | 4 +- arch/arm64/boot/dts/amlogic/meson-axg.dtsi | 4 +- arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 6 +- arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 6 +- arch/powerpc/kernel/interrupt.c | 6 +- arch/riscv/kernel/stacktrace.c | 3 +- arch/riscv/mm/cacheflush.c | 4 +- drivers/clk/ingenic/jz4760-cgu.c | 18 ++-- drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 8 +- drivers/gpu/drm/i915/display/intel_bios.c | 33 +++++--- drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 2 +- drivers/infiniband/hw/hfi1/file_ops.c | 7 +- drivers/infiniband/hw/irdma/cm.c | 3 + drivers/infiniband/hw/usnic/usnic_uiom.c | 8 +- drivers/infiniband/ulp/ipoib/ipoib_main.c | 8 ++ drivers/net/bonding/bond_debugfs.c | 2 +- drivers/net/dsa/mt7530.c | 26 ++++-- drivers/net/ethernet/intel/ice/ice_main.c | 2 +- drivers/net/ethernet/intel/igc/igc_main.c | 25 +++++- .../ethernet/mellanox/mlx5/core/diag/fw_tracer.c | 3 +- drivers/net/ethernet/mellanox/mlx5/core/en.h | 2 +- .../ethernet/mellanox/mlx5/core/en/rep/bridge.c | 4 - .../ethernet/mellanox/mlx5/core/en/reporter_rx.c | 30 +------ drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 98 ++++++++-------------- .../net/ethernet/mellanox/mlx5/core/esw/bridge.c | 2 +- .../ethernet/mellanox/mlx5/core/ipoib/ethtool.c | 13 ++- drivers/net/ethernet/mellanox/mlx5/core/main.c | 14 ++-- drivers/net/ethernet/mscc/ocelot_flower.c | 24 +++--- drivers/net/ethernet/pensando/ionic/ionic_lif.c | 15 +++- drivers/net/phy/meson-gxl.c | 2 + drivers/net/phy/phylink.c | 5 +- drivers/net/usb/plusb.c | 4 +- drivers/nvmem/core.c | 41 ++++----- drivers/of/address.c | 21 +++-- drivers/pinctrl/aspeed/pinctrl-aspeed.c | 2 +- drivers/pinctrl/intel/pinctrl-intel.c | 16 +++- drivers/pinctrl/mediatek/pinctrl-mt8195.c | 4 +- drivers/pinctrl/pinctrl-single.c | 2 + drivers/spi/spi-dw-core.c | 2 +- drivers/usb/core/quirks.c | 3 + drivers/usb/typec/altmodes/displayport.c | 8 +- fs/btrfs/volumes.c | 22 ++++- fs/btrfs/zlib.c | 2 +- fs/ceph/mds_client.c | 6 ++ fs/cifs/file.c | 4 +- include/linux/hugetlb.h | 6 +- include/uapi/linux/ip.h | 1 + include/uapi/linux/ipv6.h | 1 + kernel/locking/rtmutex.c | 5 +- kernel/trace/trace.c | 3 - mm/gup.c | 2 +- mm/hugetlb.c | 11 ++- mm/memory-failure.c | 2 +- mm/memory_hotplug.c | 2 +- mm/mempolicy.c | 5 +- mm/migrate.c | 7 +- mm/page_alloc.c | 5 +- net/can/j1939/address-claim.c | 40 +++++++++ net/mptcp/subflow.c | 10 ++- net/rds/message.c | 6 +- net/xfrm/xfrm_compat.c | 4 +- net/xfrm/xfrm_input.c | 3 +- sound/pci/hda/patch_realtek.c | 3 + sound/pci/lx6464es/lx_core.c | 11 ++- sound/soc/soc-topology.c | 8 +- sound/synth/emux/emux_nrpn.c | 3 + tools/testing/selftests/net/forwarding/lib.sh | 4 +- 67 files changed, 398 insertions(+), 268 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/67 nvmem: core: add error handling for dev_set_name
From: Gaosheng Cui <[email protected]>
[ Upstream commit 5544e90c81261e82e02bbf7c6015a4b9c8c825ef ]
The type of return value of dev_set_name is int, which may return wrong result, so we add error handling for it to reclaim memory of nvmem resource, and return early when an error occurs.
Stable-dep-of: ab3428cfd9aa ("nvmem: core: fix registration vs use race")
--- drivers/nvmem/core.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/nvmem/core.c +9 -3
@@ -804,18 +804,24 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)switch (config->id) {case NVMEM_DEVID_NONE : -dev_set_name (&nvmem->dev,"%s" , config->name); + rval =dev_set_name (&nvmem->dev,"%s" , config->name);break ;case NVMEM_DEVID_AUTO : -dev_set_name (&nvmem->dev,"%s%d" , config->name, nvmem->id); + rval =dev_set_name (&nvmem->dev,"%s%d" , config->name, nvmem->id);break ;default : -dev_set_name (&nvmem->dev,"%s%d" , + rval =dev_set_name (&nvmem->dev,"%s%d" , config->name ? :"nvmem" , config->name ? config->id : nvmem->id);break ; } +if (rval) { +ida_free (&nvmem_ida, nvmem->id); +kfree (nvmem); +return ERR_PTR (rval); + } + nvmem->read_only =device_property_present (config->dev,"read-only" ) || config->read_only || !nvmem->reg_write;
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 2/67 nvmem: core: fix cleanup after dev_set_name()
In reply to Greg Kroah-HartmanFrom: Russell King (Oracle) <[email protected]>
[ Upstream commit 560181d3ace61825f4ca9dd3481d6c0ee6709fa8 ]
If dev_set_name() fails, we leak nvmem->wp_gpio as the cleanup does not put this. While a minimal fix for this would be to add the gpiod_put() call, we can do better if we split device_register(), and use the tested nvmem_release() cleanup code by initialising the device early, and putting the device.
This results in a slightly larger fix, but results in clear code.
Note: this patch depends on "nvmem: core: initialise nvmem->id early" and "nvmem: core: remove nvmem_config wp_gpio".
Stable-dep-of: ab3428cfd9aa ("nvmem: core: fix registration vs use race")
--- drivers/nvmem/core.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-)
drivers/nvmem/core.c +10 -12
@@ -768,14 +768,18 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) nvmem->id = rval; + nvmem->dev.type = &nvmem_provider_type; + nvmem->dev.bus = &nvmem_bus_type; + nvmem->dev.parent = config->dev; + +device_initialize (&nvmem->dev); +if (!config->ignore_wp) nvmem->wp_gpio =gpiod_get_optional (config->dev,"wp" ,GPIOD_OUT_HIGH );if (IS_ERR (nvmem->wp_gpio)) { -ida_free (&nvmem_ida, nvmem->id); rval =PTR_ERR (nvmem->wp_gpio); -kfree (nvmem); -return ERR_PTR (rval); + goto err_put_device; }kref_init (&nvmem->refcnt);
@@ -787,9 +791,6 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) nvmem->stride = config->stride ?:1 ; nvmem->word_size = config->word_size ?:1 ; nvmem->size = config->size; - nvmem->dev.type = &nvmem_provider_type; - nvmem->dev.bus = &nvmem_bus_type; - nvmem->dev.parent = config->dev; nvmem->root_only = config->root_only; nvmem->priv = config->priv; nvmem->type = config->type;
@@ -816,11 +817,8 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)break ; } -if (rval) { -ida_free (&nvmem_ida, nvmem->id); -kfree (nvmem); -return ERR_PTR (rval); - } +if (rval) + goto err_put_device; nvmem->read_only =device_property_present (config->dev,"read-only" ) || config->read_only || !nvmem->reg_write;
@@ -831,7 +829,7 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)dev_dbg (&nvmem->dev,"Registering nvmem device %s\n" , config->name); - rval =device_register (&nvmem->dev); + rval =device_add (&nvmem->dev);if (rval) goto err_put_device;
Signature · 1 line
2.39.0
Re: [PATCH 5.15 02/67] nvmem: core: fix cleanup after dev_set_name()
drivers/nvmem/core.c struct nvmem_device *nvmem_register(const struct nvmem_config *config) · line 821
Quoted 7 lines · Greg Kroah-Hartman
drivers/nvmem/core.c +2
-5-if (rval) { -ida_free (&nvmem_ida, nvmem->id); -kfree (nvmem); -return ERR_PTR (rval); - } +if (rval) + goto err_put_device;
I can't work out what you've done here - the hunk seems to suggest that you've cherry picked 5544e90c8126 ("nvmem: core: add error handling for dev_set_name") but I can see no evidence of that in my mailbox. This makes it hard to recreate your 5.15 tree to be able to provide you an updated patch for the one that failed.
Please provide a list of patches that you have queued for nvmem from your linux-5.15.y branch.
Thanks.
Signature · 2 lines
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!
Greg Kroah-Hartman
maintainerPATCH 3/67 nvmem: core: fix registration vs use race
In reply to Greg Kroah-HartmanFrom: Russell King (Oracle) <[email protected]>
[ Upstream commit ab3428cfd9aa2f3463ee4b2909b5bb2193bd0c4a ]
The i.MX6 CPU frequency driver sometimes fails to register at boot time due to nvmem_cell_read_u32() sporadically returning -ENOENT.
This happens because there is a window where __nvmem_device_get() in of_nvmem_cell_get() is able to return the nvmem device, but as cells have been setup, nvmem_find_cell_entry_by_node() returns NULL.
The occurs because the nvmem core registration code violates one of the fundamental principles of kernel programming: do not publish data structures before their setup is complete.
Fix this by making nvmem core code conform with this principle.
--- drivers/nvmem/core.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-)
drivers/nvmem/core.c +8 -10
@@ -827,22 +827,16 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) nvmem->dev.groups = nvmem_dev_groups;#endif -dev_dbg (&nvmem->dev,"Registering nvmem device %s\n" , config->name); - - rval =device_add (&nvmem->dev); -if (rval) - goto err_put_device; -if (nvmem->nkeepout) { rval =nvmem_validate_keepouts (nvmem);if (rval) - goto err_device_del; + goto err_put_device; }if (config->compat) { rval =nvmem_sysfs_setup_compat (nvmem, config);if (rval) - goto err_device_del; + goto err_put_device; }if (config->cells) {
@@ -859,6 +853,12 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)if (rval) goto err_remove_cells; +dev_dbg (&nvmem->dev,"Registering nvmem device %s\n" , config->name); + + rval =device_add (&nvmem->dev); +if (rval) + goto err_remove_cells; +blocking_notifier_call_chain (&nvmem_notifier,NVMEM_ADD , nvmem);return nvmem;
@@ -867,8 +867,6 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)nvmem_device_remove_all_cells (nvmem);if (config->compat)nvmem_sysfs_remove_compat (nvmem, config); -err_device_del: -device_del (&nvmem->dev); err_put_device:put_device (&nvmem->dev);
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 4/67 mm/migration: return errno when isolate_huge_page failed
In reply to Greg Kroah-HartmanFrom: Miaohe Lin <[email protected]>
[ Upstream commit 7ce82f4c3f3ead13a9d9498768e3b1a79975c4d8 ]
We might fail to isolate huge page due to e.g. the page is under migration which cleared HPageMigratable. We should return errno in this case rather than always return 1 which could confuse the user, i.e. the caller might think all of the memory is migrated while the hugetlb page is left behind. We make the prototype of isolate_huge_page consistent with isolate_lru_page as suggested by Huang Ying and rename isolate_huge_page to isolate_hugetlb as suggested by Muchun to improve the readability.
Stable-dep-of: 73bdf65ea748 ("migrate: hugetlb: check for hugetlb shared PMD in node migration")
--- include/linux/hugetlb.h | 6 +++--- mm/gup.c | 2 +- mm/hugetlb.c | 11 +++++------ mm/memory-failure.c | 2 +- mm/memory_hotplug.c | 2 +- mm/mempolicy.c | 2 +- mm/migrate.c | 7 ++++--- 7 files changed, 16 insertions(+), 16 deletions(-)
include/linux/hugetlb.h +3 -3
@@ -166,7 +166,7 @@ bool hugetlb_reserve_pages(struct inode *inode, long from, long to, vm_flags_t vm_flags);long hugetlb_unreserve_pages (struct inode *inode,long start,long end,long freed); -bool isolate_huge_page (struct page *page,struct list_head *list); +int isolate_hugetlb (struct page *page,struct list_head *list);int get_hwpoison_huge_page (struct page *page,bool *hugetlb);int get_huge_page_for_hwpoison (unsigned long pfn,int flags);void putback_active_hugepage (struct page *page);
@@ -354,9 +354,9 @@ static inline pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr,return NULL ; } -static inline bool isolate_huge_page (struct page *page,struct list_head *list) +static inline int isolate_hugetlb (struct page *page,struct list_head *list) { -return false; +return -EBUSY ; }static inline int get_hwpoison_huge_page (struct page *page,bool *hugetlb)
mm/gup.c +1 -1
@@ -1877,7 +1877,7 @@ static long check_and_migrate_movable_pages(unsigned long nr_pages,*/ if (!is_pinnable_page (head)) {if (PageHuge (head)) { -if (!isolate_huge_page (head, &movable_page_list)) +if (isolate_hugetlb (head, &movable_page_list)) isolation_error_count++; }else {if (!PageLRU (head) && drain_allow) {
mm/hugetlb.c +5 -6
@@ -2656,8 +2656,7 @@ static int alloc_and_dissolve_huge_page(struct hstate *h, struct page *old_page,* Fail with -EBUSY if not possible. */ spin_unlock_irq (&hugetlb_lock); -if (!isolate_huge_page (old_page, list)) - ret = -EBUSY ; + ret =isolate_hugetlb (old_page, list);spin_lock_irq (&hugetlb_lock); goto free_new; }else if (!HPageFreed (old_page)) {
@@ -2733,7 +2732,7 @@ int isolate_or_dissolve_huge_page(struct page *page, struct list_head *list)if (hstate_is_gigantic (h))return -ENOMEM ; -if (page_count (head) &&isolate_huge_page (head, list)) +if (page_count (head) && !isolate_hugetlb (head, list)) ret =0 ;else if (!page_count (head)) ret =alloc_and_dissolve_huge_page (h, head, list);
@@ -6277,15 +6276,15 @@ follow_huge_pgd(struct mm_struct *mm, unsigned long address, pgd_t *pgd, int flareturn pte_page (*(pte_t *)pgd) + ((address & ~PGDIR_MASK ) >>PAGE_SHIFT ); } -bool isolate_huge_page (struct page *page,struct list_head *list) +int isolate_hugetlb (struct page *page,struct list_head *list) { -bool ret = true; +int ret =0 ;spin_lock_irq (&hugetlb_lock);if (!PageHeadHuge (page) || !HPageMigratable (page) || !get_page_unless_zero (page)) { - ret = false; + ret = -EBUSY ; goto unlock; }ClearHPageMigratable (page);
mm/memory-failure.c +1 -1
@@ -2106,7 +2106,7 @@ static bool isolate_page(struct page *page, struct list_head *pagelist)bool lru =PageLRU (page);if (PageHuge (page)) { - isolated =isolate_huge_page (page, pagelist); + isolated = !isolate_hugetlb (page, pagelist); }else {if (lru) isolated = !isolate_lru_page (page);
mm/memory_hotplug.c +1 -1
@@ -1704,7 +1704,7 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn)if (PageHuge (page)) { pfn =page_to_pfn (head) +compound_nr (head) -1 ; -isolate_huge_page (head, &source); +isolate_hugetlb (head, &source);continue ; }else if (PageTransHuge (page)) pfn =page_to_pfn (head) +thp_nr_pages (page) -1 ;
mm/mempolicy.c +1 -1
@@ -604,7 +604,7 @@ static int queue_pages_hugetlb(pte_t *pte, unsigned long hmask,/* With MPOL_MF_MOVE, we migrate only unshared hugepage. */ if (flags & (MPOL_MF_MOVE_ALL ) || (flags &MPOL_MF_MOVE &&page_mapcount (page) ==1 )) { -if (!isolate_huge_page (page, qp->pagelist) && +if (isolate_hugetlb (page, qp->pagelist) && (flags &MPOL_MF_STRICT ))/* * Failed to isolate page but allow migrating pages
mm/migrate.c +4 -3
@@ -134,7 +134,7 @@ static void putback_movable_page(struct page *page)* * This function shall be used whenever the isolated pageset has been * built from lru, balloon, hugetlbfs page. See isolate_migratepages_range() -* and isolate_huge_page(). +* and isolate_hugetlb(). */ void putback_movable_pages (struct list_head *l) {
@@ -1722,8 +1722,9 @@ static int add_page_for_migration(struct mm_struct *mm, unsigned long addr,if (PageHuge (page)) {if (PageHead (page)) { -isolate_huge_page (page, pagelist); - err =1 ; + err =isolate_hugetlb (page, pagelist); +if (!err) + err =1 ; } }else {struct page *head;
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 5/67 migrate: hugetlb: check for hugetlb shared PMD in node migration
In reply to Greg Kroah-HartmanFrom: Mike Kravetz <[email protected]>
[ Upstream commit 73bdf65ea74857d7fb2ec3067a3cec0e261b1462 ]
migrate_pages/mempolicy semantics state that CAP_SYS_NICE is required to move pages shared with another process to a different node. page_mapcount
Quoted 1 line
1 is being used to determine if a hugetlb page is shared. However, a
hugetlb page will have a mapcount of 1 if mapped by multiple processes via a shared PMD. As a result, hugetlb pages shared by multiple processes and mapped with a shared PMD can be moved by a process without CAP_SYS_NICE.
To fix, check for a shared PMD if mapcount is 1. If a shared PMD is found consider the page shared.
--- mm/mempolicy.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
mm/mempolicy.c +2 -1
@@ -603,7 +603,8 @@ static int queue_pages_hugetlb(pte_t *pte, unsigned long hmask,/* With MPOL_MF_MOVE, we migrate only unshared hugepage. */ if (flags & (MPOL_MF_MOVE_ALL ) || - (flags &MPOL_MF_MOVE &&page_mapcount (page) ==1 )) { + (flags &MPOL_MF_MOVE &&page_mapcount (page) ==1 && + !hugetlb_pmd_shared (pte))) {if (isolate_hugetlb (page, qp->pagelist) && (flags &MPOL_MF_STRICT ))/*
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 6/67 btrfs: limit device extents to the device size
In reply to Greg Kroah-HartmanFrom: Josef Bacik <[email protected]>
commit 3c538de0f2a74d50aff7278c092f88ae59cee688 upstream.
There was a recent regression in btrfs/177 that started happening with the size class patches ("btrfs: introduce size class to block group allocator"). This however isn't a regression introduced by those patches, but rather the bug was uncovered by a change in behavior in these patches. The patches triggered more chunk allocations in the ^free-space-tree case, which uncovered a race with device shrink.
The problem is we will set the device total size to the new size, and use this to find a hole for a device extent. However during shrink we may have device extents allocated past this range, so we could potentially find a hole in a range past our new shrink size. We don't actually limit our found extent to the device size anywhere, we assume that we will not find a hole past our device size. This isn't true with shrink as we're relocating block groups and thus creating holes past the device size.
Fix this by making sure we do not search past the new device size, and if we wander into any device extents that start after our device size simply break from the loop and use whatever hole we've already found.
--- fs/btrfs/volumes.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
fs/btrfs/volumes.c +5 -1
@@ -1646,7 +1646,7 @@ again:if (ret <0 ) goto out; -while (1 ) { +while (search_start < search_end) { l = path->nodes[0 ]; slot = path->slots[0 ];if (slot >=btrfs_header_nritems (l)) {
@@ -1669,6 +1669,9 @@ again:if (key.type !=BTRFS_DEV_EXTENT_KEY ) goto next; +if (key.offset > search_end) +break ; +if (key.offset > search_start) { hole_size = key.offset - search_start; dev_extent_hole_check(device, &search_start, &hole_size,
@@ -1729,6 +1732,7 @@ next:else ret =0 ; +ASSERT (max_hole_start + max_hole_size <= search_end); out:btrfs_free_path (path); *start = max_hole_start;
Greg Kroah-Hartman
maintainerPATCH 7/67 btrfs: zlib: zero-initialize zlib workspace
In reply to Greg Kroah-HartmanFrom: Alexander Potapenko <[email protected]>
commit eadd7deca0ad8a83edb2b894d8326c78e78635d6 upstream.
KMSAN reports uses of uninitialized memory in zlib's longest_match() called on memory originating from zlib_alloc_workspace(). This issue is known by zlib maintainers and is claimed to be harmless, but to be on the safe side we'd better initialize the memory.
--- fs/btrfs/zlib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/zlib.c +1 -1
@@ -63,7 +63,7 @@ struct list_head *zlib_alloc_workspace(u workspacesize =max (zlib_deflate_workspacesize (MAX_WBITS ,MAX_MEM_LEVEL ),zlib_inflate_workspacesize ()); - workspace->strm.workspace =kvmalloc (workspacesize,GFP_KERNEL ); + workspace->strm.workspace =kvzalloc (workspacesize,GFP_KERNEL ); workspace->level = level; workspace->buf =NULL ;/*
Greg Kroah-Hartman
maintainerPATCH 8/67 ALSA: hda/realtek: Add Positivo N14KP6-TG
In reply to Greg Kroah-HartmanFrom: Edson Juliano Drosdeck <[email protected]>
commit 88d18b8896bd98e636b632f805b7e84e61458255 upstream.
Positivo N14KP6-TG (1c6c:1251)
require quirk for enabling headset-mic
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -9335,6 +9335,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1b7d ,0xa831 ,"Ordissimo EVE2 " ,ALC269VB_FIXUP_ORDISSIMO_EVE2 ),/* Also known as Malata PC-B1303 */ SND_PCI_QUIRK (0x1c06 ,0x2013 ,"Lemote A1802" ,ALC269_FIXUP_LEMOTE_A1802 ),SND_PCI_QUIRK (0x1c06 ,0x2015 ,"Lemote A190X" ,ALC269_FIXUP_LEMOTE_A190X ), +SND_PCI_QUIRK (0x1c6c ,0x1251 ,"Positivo N14KP6-TG" ,ALC288_FIXUP_DELL1_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1d05 ,0x1132 ,"TongFang PHxTxX1" ,ALC256_FIXUP_SET_COEF_DEFAULTS ),SND_PCI_QUIRK (0x1d05 ,0x1096 ,"TongFang GMxMRxx" ,ALC269_FIXUP_NO_SHUTUP ), SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP),
Greg Kroah-Hartman
maintainerPATCH 9/67 ALSA: emux: Avoid potential array out-of-bound in snd_emux_xg_control()
In reply to Greg Kroah-HartmanFrom: Artemii Karasev <[email protected]>
commit 6a32425f953b955b4ff82f339d01df0b713caa5d upstream.
snd_emux_xg_control() can be called with an argument 'param' greater than size of 'control' array. It may lead to accessing 'control' array at a wrong index.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- sound/synth/emux/emux_nrpn.c | 3 +++ 1 file changed, 3 insertions(+)
sound/synth/emux/emux_nrpn.c +3 -0
@@ -349,6 +349,9 @@ int snd_emux_xg_control(struct snd_emux_port *port, struct snd_midi_channel *chan, int param) { + if (param >= ARRAY_SIZE(chan->control)) + return -EINVAL; + return send_converted_effect(xg_effects, ARRAY_SIZE(xg_effects), port, chan, param, chan->control[param],
Greg Kroah-Hartman
maintainerPATCH 10/67 ALSA: hda/realtek: Fix the speaker output on Samsung Galaxy Book2 Pro 360
In reply to Greg Kroah-HartmanFrom: Guillaume Pinot <[email protected]>
commit bd401fd730cbcb0717bbc5438f15084db10f9259 upstream.
Samsung Galaxy Book2 Pro 360 (13" 2022 NP930QED-KA1FR) with codec SSID 144d:ca03 requires the same workaround for enabling the speaker amp like other Samsung models with ALC298 codec.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -9164,6 +9164,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x144d ,0xc812 ,"Samsung Notebook Pen S (NT950SBE-X58)" ,ALC298_FIXUP_SAMSUNG_AMP ),SND_PCI_QUIRK (0x144d ,0xc830 ,"Samsung Galaxy Book Ion (NT950XCJ-X716A)" ,ALC298_FIXUP_SAMSUNG_AMP ),SND_PCI_QUIRK (0x144d ,0xc832 ,"Samsung Galaxy Book Flex Alpha (NP730QCJ)" ,ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET ), +SND_PCI_QUIRK (0x144d ,0xca03 ,"Samsung Galaxy Book2 Pro 360 (NP930QED)" ,ALC298_FIXUP_SAMSUNG_AMP ),SND_PCI_QUIRK (0x1458 ,0xfa53 ,"Gigabyte BXBT-2807" ,ALC283_FIXUP_HEADSET_MIC ),SND_PCI_QUIRK (0x1462 ,0xb120 ,"MSI Cubi MS-B120" ,ALC283_FIXUP_HEADSET_MIC ), SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
Greg Kroah-Hartman
maintainerPATCH 11/67 ALSA: hda/realtek: Enable mute/micmute LEDs on HP Elitebook, 645 G9
In reply to Greg Kroah-HartmanFrom: Elvis Angelaccio <[email protected]>
commit 9a6804aa1c92cd28e89e746ace44d5ba101db76c upstream.
The HP Elitebook 645 G9 laptop (with motherboard model 89D2) uses the ALC236 codec and requires the alc236_fixup_hp_mute_led_micmute_vref fixup in order to enable mute/micmute LEDs.
Note: the alc236_fixup_hp_gpio_led fixup, which is used by the Elitebook 640 G9, does not work with the 645 G9.
[ rearranged the entry in SSID order -- tiwai ]
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -9072,6 +9072,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x103c ,0x89aa ,"HP EliteBook 630 G9" ,ALC236_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x89c3 ,"HP" ,ALC285_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x89ca ,"HP" ,ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF ), +SND_PCI_QUIRK (0x103c ,0x89d3 ,"HP EliteBook 645 G9 (MB 89D2)" ,ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF ),SND_PCI_QUIRK (0x103c ,0x8a78 ,"HP Dev One" ,ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST ),SND_PCI_QUIRK (0x103c ,0x8aa0 ,"HP ProBook 440 G9 (MB 8A9E)" ,ALC236_FIXUP_HP_GPIO_LED ), SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED),
Greg Kroah-Hartman
maintainerPATCH 12/67 tracing: Fix poll() and select() do not work on per_cpu trace_pipe and trace_pipe_raw
In reply to Greg Kroah-HartmanFrom: Shiju Jose <[email protected]>
commit 3e46d910d8acf94e5360126593b68bf4fee4c4a1 upstream.
poll() and select() on per_cpu trace_pipe and trace_pipe_raw do not work since kernel 6.1-rc6. This issue is seen after the commit 42fb0a1e84ff525ebe560e2baf9451ab69127e2b ("tracing/ring-buffer: Have polling block on watermark").
This issue is firstly detected and reported, when testing the CXL error events in the rasdaemon and also erified using the test application for poll() and select().
This issue occurs for the per_cpu case, when calling the ring_buffer_poll_wait(), in kernel/trace/ring_buffer.c, with the buffer_percent > 0 and then wait until the percentage of pages are available. The default value set for the buffer_percent is 50 in the kernel/trace/trace.c.
As a fix, allow userspace application could set buffer_percent as 0 through the buffer_percent_fops, so that the task will wake up as soon as data is added to any of the specific cpu buffer.
--- kernel/trace/trace.c | 3 --- 1 file changed, 3 deletions(-)
kernel/trace/trace.c +0 -3
@@ -9089,9 +9089,6 @@ buffer_percent_write(struct file *filp,if (val >100 )return -EINVAL ; -if (!val) - val =1 ; - tr->buffer_percent = val; (*ppos)++;
Greg Kroah-Hartman
maintainerPATCH 13/67 of/address: Return an error when no valid dma-ranges are found
In reply to Greg Kroah-HartmanFrom: Mark Brown <[email protected]>
commit f6933c01e42d2fc83b9133ed755609e4aac6eadd upstream.
Commit 7a8b64d17e35 ("of/address: use range parser for of_dma_get_range") converted the parsing of dma-range properties to use code shared with the PCI range parser. The intent was to introduce no functional changes however in the case where we fail to translate the first resource instead of returning -EINVAL the new code we return 0. Restore the previous behaviour by returning an error if we find no valid ranges, the original code only handled the first range but subsequently support for parsing all supplied ranges was added.
This avoids confusing code using the parsed ranges which doesn't expect to successfully parse ranges but have only a list terminator returned, this fixes breakage with so far as I can tell all DMA for on SoC devices on the Socionext Synquacer platform which has a firmware supplied DT. A bisect identified the original conversion as triggering the issues there.
--- drivers/of/address.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)
drivers/of/address.c +15 -6
@@ -963,8 +963,19 @@ int of_dma_get_range(struct device_node }of_dma_range_parser_init (&parser, node); -for_each_of_range (&parser, &range) +for_each_of_range (&parser, &range) { +if (range.cpu_addr ==OF_BAD_ADDR ) { +pr_err ("translation of DMA address(%llx) to CPU address failed node(%pOF)\n" , + range.bus_addr, node); +continue ; + } num_ranges++; + } + +if (!num_ranges) { + ret = -EINVAL ; + goto out; + } r =kcalloc (num_ranges +1 ,sizeof (*r),GFP_KERNEL );if (!r) {
@@ -973,18 +984,16 @@ int of_dma_get_range(struct device_node }/* -* Record all info in the generic DMA ranges array for struct device. +* Record all info in the generic DMA ranges array for struct device, +* returning an error if we don't find any parsable ranges. */ *map = r;of_dma_range_parser_init (&parser, node);for_each_of_range (&parser, &range) {pr_debug ("dma_addr(%llx) cpu_addr(%llx) size(%llx)\n" , range.bus_addr, range.cpu_addr, range.size); -if (range.cpu_addr ==OF_BAD_ADDR ) { -pr_err ("translation of DMA address(%llx) to CPU address failed node(%pOF)\n" , - range.bus_addr, node); +if (range.cpu_addr ==OF_BAD_ADDR )continue ; - } r->cpu_start = range.cpu_addr; r->dma_start = range.bus_addr; r->size = range.size;
Greg Kroah-Hartman
maintainerPATCH 14/67 can: j1939: do not wait 250 ms if the same addr was already claimed
In reply to Greg Kroah-HartmanFrom: Devid Antonio Filoni <[email protected]>
commit 4ae5e1e97c44f4654516c1d41591a462ed62fa7b upstream.
The ISO 11783-5 standard, in "4.5.2 - Address claim requirements", states:
d) No CF shall begin, or resume, transmission on the network until 250 ms after it has successfully claimed an address except when responding to a request for address-claimed.
But "Figure 6" and "Figure 7" in "4.5.4.2 - Address-claim prioritization" show that the CF begins the transmission after 250 ms from the first AC (address-claimed) message even if it sends another AC message during that time window to resolve the address contention with another CF.
As stated in "4.4.2.3 - Address-claimed message":
In order to successfully claim an address, the CF sending an address claimed message shall not receive a contending claim from another CF for at least 250 ms.
As stated in "4.4.3.2 - NAME management (NM) message":
1) A commanding CF can
d) request that a CF with a specified NAME transmit the address- claimed message with its current NAME.
2) A target CF shall
d) send an address-claimed message in response to a request for a matching NAME
Taking the above arguments into account, the 250 ms wait is requested only during network initialization.
Do not restart the timer on AC message if both the NAME and the address match and so if the address has already been claimed (timer has expired) or the AC message has been sent to resolve the contention with another CF (timer is still running).
--- net/can/j1939/address-claim.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+)
net/can/j1939/address-claim.c +40 -0
@@ -165,6 +165,46 @@ static void j1939_ac_process(struct j193* leaving this function. */ ecu =j1939_ecu_get_by_name_locked (priv, name); + +if (ecu && ecu->addr == skcb->addr.sa) { +/* The ISO 11783-5 standard, in "4.5.2 - Address claim +* requirements", states: +* d) No CF shall begin, or resume, transmission on the +* network until 250 ms after it has successfully claimed +* an address except when responding to a request for +* address-claimed. +* +* But "Figure 6" and "Figure 7" in "4.5.4.2 - Address-claim +* prioritization" show that the CF begins the transmission +* after 250 ms from the first AC (address-claimed) message +* even if it sends another AC message during that time window +* to resolve the address contention with another CF. +* +* As stated in "4.4.2.3 - Address-claimed message": +* In order to successfully claim an address, the CF sending +* an address claimed message shall not receive a contending +* claim from another CF for at least 250 ms. +* +* As stated in "4.4.3.2 - NAME management (NM) message": +* 1) A commanding CF can +* d) request that a CF with a specified NAME transmit +* the address-claimed message with its current NAME. +* 2) A target CF shall +* d) send an address-claimed message in response to a +* request for a matching NAME +* +* Taking the above arguments into account, the 250 ms wait is +* requested only during network initialization. +* +* Do not restart the timer on AC message if both the NAME and +* the address match and so if the address has already been +* claimed (timer has expired) or the AC message has been sent +* to resolve the contention with another CF (timer is still +* running). +*/ + goto out_ecu_put; + } +if (!ecu &&j1939_address_is_unicast (skcb->addr.sa)) ecu =j1939_ecu_create_locked (priv, name);
Greg Kroah-Hartman
maintainerPATCH 15/67 xfrm: compat: change expression for switch in xfrm_xlate64
In reply to Greg Kroah-HartmanFrom: Anastasia Belova <[email protected]>
[ Upstream commit eb6c59b735aa6cca77cdbb59cc69d69a0d63d986 ]
Compare XFRM_MSG_NEWSPDINFO (value from netlink configuration messages enum) with nlh_src->nlmsg_type instead of nlh_src->nlmsg_type - XFRM_MSG_BASE.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- net/xfrm/xfrm_compat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/xfrm/xfrm_compat.c +1 -1
@@ -302,7 +302,7 @@ static int xfrm_xlate64(struct sk_buff *dst, const struct nlmsghdr *nlh_src)nla_for_each_attr (nla, attrs, len, remaining) {int err; -switch (type) { +switch (nlh_src->nlmsg_type) {case XFRM_MSG_NEWSPDINFO : err =xfrm_nla_cpy (dst, nla,nla_len (nla));break ;
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 16/67 IB/hfi1: Restore allocated resources on failed copyout
In reply to Greg Kroah-HartmanFrom: Dean Luick <[email protected]>
[ Upstream commit 6601fc0d15ffc20654e39486f9bef35567106d68 ]
Fix a resource leak if an error occurs.
--- drivers/infiniband/hw/hfi1/file_ops.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/infiniband/hw/hfi1/file_ops.c +5 -2
@@ -1318,12 +1318,15 @@ static int user_exp_rcv_setup(struct hfi1_filedata *fd, unsigned long arg, addr = arg + offsetof(struct hfi1_tid_info , tidcnt);if (copy_to_user ((void __user *)addr, &tinfo.tidcnt,sizeof (tinfo.tidcnt))) -return -EFAULT ; + ret = -EFAULT ; addr = arg + offsetof(struct hfi1_tid_info , length); -if (copy_to_user ((void __user *)addr, &tinfo.length, +if (!ret &©_to_user ((void __user *)addr, &tinfo.length,sizeof (tinfo.length))) ret = -EFAULT ; + +if (ret) +hfi1_user_exp_rcv_invalid (fd, &tinfo); }return ret;
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 17/67 xfrm/compat: prevent potential spectre v1 gadget in xfrm_xlate32_attr()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit b6ee896385380aa621102e8ea402ba12db1cabff ]
int type = nla_type(nla);
if (type > XFRMA_MAX) {
return -EOPNOTSUPP;
}@type is then used as an array index and can be used as a Spectre v1 gadget.
if (nla_len(nla) < compat_policy[type].len) {array_index_nospec() can be used to prevent leaking content of kernel memory to malicious users.
--- net/xfrm/xfrm_compat.c | 2 ++ 1 file changed, 2 insertions(+)
net/xfrm/xfrm_compat.c +2 -0
@@ -5,6 +5,7 @@* Based on code and translator idea by: Florian Westphal <[email protected]> */ #include <linux/compat.h> +#include <linux/nospec.h> #include <linux/xfrm.h> #include <net/xfrm.h>
@@ -437,6 +438,7 @@ static int xfrm_xlate32_attr(void *dst, const struct nlattr *nla,NL_SET_ERR_MSG (extack,"Bad attribute" );return -EOPNOTSUPP ; } + type =array_index_nospec (type,XFRMA_MAX +1 );if (nla_len (nla) < compat_policy[type].len) {NL_SET_ERR_MSG (extack,"Attribute bad length" );return -EOPNOTSUPP ;
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 18/67 IB/IPoIB: Fix legacy IPoIB due to wrong number of queues
In reply to Greg Kroah-HartmanFrom: Dragos Tatulea <[email protected]>
[ Upstream commit e632291a2dbce45a24cddeb5fe28fe71d724ba43 ]
The cited commit creates child PKEY interfaces over netlink will multiple tx and rx queues, but some devices doesn't support more than 1 tx and 1 rx queues. This causes to a crash when traffic is sent over the PKEY interface due to the parent having a single queue but the child having multiple queues.
This patch fixes the number of queues to 1 for legacy IPoIB at the earliest possible point in time.
BUG: kernel NULL pointer dereference, address: 000000000000036b PGD 0 P4D 0 Oops: 0000 [#1] SMP CPU: 4 PID: 209665 Comm: python3 Not tainted 6.1.0_for_upstream_min_debug_2022_12_12_17_02 #1 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 RIP: 0010:kmem_cache_alloc+0xcb/0x450 Code: ce 7e 49 8b 50 08 49 83 78 10 00 4d 8b 28 0f 84 cb 02 00 00 4d 85 ed 0f 84 c2 02 00 00 41 8b 44 24 28 48 8d 4a 01 49 8b 3c 24 <49> 8b 5c 05 00 4c 89 e8 65 48 0f c7 0f 0f 94 c0 84 c0 74 b8 41 8b RSP: 0018:ffff88822acbbab8 EFLAGS: 00010202 RAX: 0000000000000070 RBX: ffff8881c28e3e00 RCX: 00000000064f8dae RDX: 00000000064f8dad RSI: 0000000000000a20 RDI: 0000000000030d00 RBP: 0000000000000a20 R08: ffff8882f5d30d00 R09: ffff888104032f40 R10: ffff88810fade828 R11: 736f6d6570736575 R12: ffff88810081c000 R13: 00000000000002fb R14: ffffffff817fc865 R15: 0000000000000000 FS: 00007f9324ff9700(0000) GS:ffff8882f5d00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000000000000036b CR3: 00000001125af004 CR4: 0000000000370ea0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> skb_clone+0x55/0xd0 ip6_finish_output2+0x3fe/0x690 ip6_finish_output+0xfa/0x310 ip6_send_skb+0x1e/0x60 udp_v6_send_skb+0x1e5/0x420 udpv6_sendmsg+0xb3c/0xe60 ? ip_mc_finish_output+0x180/0x180 ? __switch_to_asm+0x3a/0x60 ? __switch_to_asm+0x34/0x60 sock_sendmsg+0x33/0x40 __sys_sendto+0x103/0x160 ? _copy_to_user+0x21/0x30 ? kvm_clock_get_cycles+0xd/0x10 ? ktime_get_ts64+0x49/0xe0 __x64_sys_sendto+0x25/0x30 do_syscall_64+0x3d/0x90 entry_SYSCALL_64_after_hwframe+0x46/0xb0 RIP: 0033:0x7f9374f1ed14 Code: 42 41 f8 ff 44 8b 4c 24 2c 4c 8b 44 24 20 89 c5 44 8b 54 24 28 48 8b 54 24 18 b8 2c 00 00 00 48 8b 74 24 10 8b
7c 24 08 0f 05 <48> 3d 00 f0 ff ff 77 34 89 ef 48 89 44 24 08 e8 68 41 f8 ff 48 8b
RSP: 002b:00007f9324ff7bd0 EFLAGS: 00000293 ORIG_RAX: 000000000000002c
RAX: ffffffffffffffda RBX: 00007f9324ff7cc8 RCX: 00007f9374f1ed14
RDX: 00000000000002fb RSI: 00007f93000052f0 RDI: 0000000000000030
RBP: 0000000000000000 R08: 00007f9324ff7d40 R09: 000000000000001c
R10: 0000000000000000 R11: 0000000000000293 R12: 0000000000000000
R13: 000000012a05f200 R14: 0000000000000001 R15: 00007f9374d57bdc
</TASK>
--- drivers/infiniband/ulp/ipoib/ipoib_main.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/infiniband/ulp/ipoib/ipoib_main.c +8 -0
@@ -2197,6 +2197,14 @@ int ipoib_intf_init(struct ib_device *hca, u32 port, const char *name, rn->attach_mcast = ipoib_mcast_attach; rn->detach_mcast = ipoib_mcast_detach; rn->hca = hca; + + rc =netif_set_real_num_tx_queues (dev,1 ); +if (rc) + goto out; + + rc =netif_set_real_num_rx_queues (dev,1 ); +if (rc) + goto out; } priv->rn_ops = dev->netdev_ops;
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 19/67 RDMA/irdma: Fix potential NULL-ptr-dereference
In reply to Greg Kroah-HartmanFrom: Nikita Zhandarovich <[email protected]>
[ Upstream commit 5d9745cead1f121974322b94ceadfb4d1e67960e ]
in_dev_get() can return NULL which will cause a failure once idev is dereferenced in in_dev_for_each_ifa_rtnl(). This patch adds a check for NULL value in idev beforehand.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/infiniband/hw/irdma/cm.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/infiniband/hw/irdma/cm.c +3 -0
@@ -1723,6 +1723,9 @@ irdma_add_mqh_4(struct irdma_device *iwdev, struct irdma_cm_info *cm_info,continue ; idev =in_dev_get (ip_dev); +if (!idev) +continue ; +in_dev_for_each_ifa_rtnl (ifa, idev) { ibdev_dbg(&iwdev->ibdev, "CM: Allocating child CM Listener forIP=%pI4, vlan_id=%d, MAC=%pM\n",
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 20/67 RDMA/usnic: use iommu_map_atomic() under spin_lock()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit b7e08a5a63a11627601915473c3b569c1f6c6c06 ]
usnic_uiom_map_sorted_intervals() is called under spin_lock(), iommu_map() might sleep, use iommu_map_atomic() to avoid potential sleep in atomic context.
--- drivers/infiniband/hw/usnic/usnic_uiom.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/infiniband/hw/usnic/usnic_uiom.c +4 -4
@@ -281,8 +281,8 @@ static int usnic_uiom_map_sorted_intervals(struct list_head *intervals, size = pa_end - pa_start +PAGE_SIZE ;usnic_dbg ("va 0x%lx pa %pa size 0x%zx flags 0x%x" , va_start, &pa_start, size, flags); - err =iommu_map (pd->domain, va_start, pa_start, - size, flags); + err =iommu_map_atomic (pd->domain, va_start, + pa_start, size, flags);if (err) {usnic_err ("Failed to map va 0x%lx pa %pa size 0x%zx with err %d\n" , va_start, &pa_start, size, err);
@@ -298,8 +298,8 @@ static int usnic_uiom_map_sorted_intervals(struct list_head *intervals, size = pa - pa_start +PAGE_SIZE ;usnic_dbg ("va 0x%lx pa %pa size 0x%zx flags 0x%x\n" , va_start, &pa_start, size, flags); - err =iommu_map (pd->domain, va_start, pa_start, - size, flags); + err =iommu_map_atomic (pd->domain, va_start, + pa_start, size, flags);if (err) {usnic_err ("Failed to map va 0x%lx pa %pa size 0x%zx with err %d\n" , va_start, &pa_start, size, err);
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 21/67 xfrm: fix bug with DSCP copy to v6 from v4 tunnel
In reply to Greg Kroah-HartmanFrom: Christian Hopps <[email protected]>
[ Upstream commit 6028da3f125fec34425dbd5fec18e85d372b2af6 ]
When copying the DSCP bits for decap-dscp into IPv6 don't assume the outer encap is always IPv6. Instead, as with the inner IPv4 case, copy the DSCP bits from the correctly saved "tos" value in the control block.
--- net/xfrm/xfrm_input.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
net/xfrm/xfrm_input.c +1 -2
@@ -278,8 +278,7 @@ static int xfrm6_remove_tunnel_encap(struct xfrm_state *x, struct sk_buff *skb) goto out;if (x->props.flags &XFRM_STATE_DECAP_DSCP ) -ipv6_copy_dscp (ipv6_get_dsfield (ipv6_hdr (skb)), -ipipv6_hdr (skb)); +ipv6_copy_dscp (XFRM_MODE_SKB_CB (skb)->tos,ipipv6_hdr (skb));if (!(x->props.flags &XFRM_STATE_NOECN ))ipip6_ecn_decapsulate (skb);
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 22/67 net: phylink: move phy_device_free() to correctly release phy device
In reply to Greg Kroah-HartmanFrom: Clément Léger <[email protected]>
[ Upstream commit ce93fdb5f2ca5c9e2a9668411cc39091507f8dc9 ]
After calling fwnode_phy_find_device(), the phy device refcount is incremented. Then, when the phy device is attached to a netdev with phy_attach_direct(), the refcount is also incremented but only decremented in the caller if phy_attach_direct() fails. Move phy_device_free() before the "if" to always release it correctly. Indeed, either phy_attach_direct() failed and we don't want to keep a reference to the phydev or it succeeded and a reference has been taken internally.
--- drivers/net/phy/phylink.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/net/phy/phylink.c +2 -3
@@ -1166,10 +1166,9 @@ int phylink_fwnode_phy_connect(struct phylink *pl, ret =phy_attach_direct (pl->netdev, phy_dev, flags, pl->link_interface); -if (ret) { -phy_device_free (phy_dev); +phy_device_free (phy_dev); +if (ret)return ret; - } ret =phylink_bringup_phy (pl, phy_dev, pl->link_config.interface);if (ret)
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 23/67 bonding: fix error checking in bond_debug_reregister()
In reply to Greg Kroah-HartmanFrom: Qi Zheng <[email protected]>
[ Upstream commit cbe83191d40d8925b7a99969d037d2a0caf69294 ]
Since commit ff9fb72bc077 ("debugfs: return error values, not NULL") changed return value of debugfs_rename() in error cases from %NULL to %ERR_PTR(-ERROR), we should also check error values instead of NULL.
--- drivers/net/bonding/bond_debugfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/bonding/bond_debugfs.c +1 -1
@@ -76,7 +76,7 @@ void bond_debug_reregister(struct bonding *bond) d =debugfs_rename (bonding_debug_root, bond->debug_dir, bonding_debug_root, bond->dev->name); -if (d) { +if (!IS_ERR (d)) { bond->debug_dir = d; }else {netdev_warn (bond->dev,"failed to reregister, so just unregister old one\n" );
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 24/67 net: phy: meson-gxl: use MMD access dummy stubs for GXL, internal PHY
In reply to Greg Kroah-HartmanFrom: Heiner Kallweit <[email protected]>
[ Upstream commit 69ff53e4a4c9498eeed7d1441f68a1481dc69251 ]
Jerome provided the information that also the GXL internal PHY doesn't support MMD register access and EEE. MMD reads return 0xffff, what results in e.g. completely wrong ethtool --show-eee output. Therefore use the MMD dummy stubs.
--- drivers/net/phy/meson-gxl.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/phy/meson-gxl.c +2 -0
@@ -261,6 +261,8 @@ static struct phy_driver meson_gxl_phy[] = { .handle_interrupt = meson_gxl_handle_interrupt, .suspend = genphy_suspend, .resume = genphy_resume, + .read_mmd = genphy_read_mmd_unsupported, + .write_mmd = genphy_write_mmd_unsupported, }, { PHY_ID_MATCH_EXACT(0x01803301), .name = "Meson G12A Internal PHY",
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 25/67 ionic: clean interrupt before enabling queue to avoid credit race
In reply to Greg Kroah-HartmanFrom: Neel Patel <[email protected]>
[ Upstream commit e8797a058466b60fc5a3291b92430c93ba90eaff ]
Clear the interrupt credits before enabling the queue rather than after to be sure that the enabled queue starts at 0 and that we don't wipe away possible credits after enabling the queue.
--- drivers/net/ethernet/pensando/ionic/ionic_lif.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/net/ethernet/pensando/ionic/ionic_lif.c +12 -3
@@ -268,6 +268,7 @@ static int ionic_qcq_enable(struct ionic_qcq *qcq) .oper = IONIC_Q_ENABLE, }, }; +int ret; idev = &lif->ionic->idev; dev = lif->ionic->dev;
@@ -275,16 +276,24 @@ static int ionic_qcq_enable(struct ionic_qcq *qcq)dev_dbg (dev,"q_enable.index %d q_enable.qtype %d\n" , ctx.cmd.q_control.index, ctx.cmd.q_control.type); +if (qcq->flags &IONIC_QCQ_F_INTR ) +ionic_intr_clean (idev->intr_ctrl, qcq->intr.index); + + ret =ionic_adminq_post_wait (lif, &ctx); +if (ret) +return ret; + +if (qcq->napi.poll) +napi_enable (&qcq->napi); +if (qcq->flags &IONIC_QCQ_F_INTR ) {irq_set_affinity_hint (qcq->intr.vector, &qcq->intr.affinity_mask); -napi_enable (&qcq->napi); -ionic_intr_clean (idev->intr_ctrl, qcq->intr.index);ionic_intr_mask (idev->intr_ctrl, qcq->intr.index,IONIC_INTR_MASK_CLEAR ); } -return ionic_adminq_post_wait (lif, &ctx); +return 0 ; }static int ionic_qcq_disable (struct ionic_qcq *qcq,bool send_to_hw)
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 26/67 uapi: add missing ip/ipv6 header dependencies for linux/stddef.h
In reply to Greg Kroah-HartmanFrom: Herton R. Krzesinski <[email protected]>
[ Upstream commit 03702d4d29be4e2510ec80b248dbbde4e57030d9 ]
Since commit 58e0be1ef6118 ("net: use struct_group to copy ip/ipv6 header addresses"), ip and ipv6 headers started to use the __struct_group definition, which is defined at include/uapi/linux/stddef.h. However, linux/stddef.h isn't explicitly included in include/uapi/linux/{ip,ipv6}.h, which breaks build of xskxceiver bpf selftest if you install the uapi headers in the system:
$ make V=1 xskxceiver -C tools/testing/selftests/bpf
...
make: Entering directory '(...)/tools/testing/selftests/bpf'
gcc -g -O0 -rdynamic -Wall -Werror (...)
In file included from xskxceiver.c:79:
/usr/include/linux/ip.h:103:9: error: expected specifier-qualifier-list before ‘__struct_group’
103 | __struct_group(/* no tag */, addrs, /* no attrs */,
| ^~~~~~~~~~~~~~
...Include the missing <linux/stddef.h> dependency in ip.h and do the same for the ipv6.h header.
--- include/uapi/linux/ip.h | 1 + include/uapi/linux/ipv6.h | 1 + 2 files changed, 2 insertions(+)
include/uapi/linux/ip.h +1 -0
@@ -18,6 +18,7 @@#ifndef _UAPI_LINUX_IP_H#define _UAPI_LINUX_IP_H#include <linux/types.h> +#include <linux/stddef.h> #include <asm/byteorder.h> #define IPTOS_TOS_MASK 0x1E
include/uapi/linux/ipv6.h +1 -0
@@ -4,6 +4,7 @@#include <linux/libc-compat.h> #include <linux/types.h> +#include <linux/stddef.h> #include <linux/in6.h> #include <asm/byteorder.h>
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 27/67 ice: Do not use WQ_MEM_RECLAIM flag for workqueue
In reply to Greg Kroah-HartmanFrom: Anirudh Venkataramanan <[email protected]>
[ Upstream commit 4d159f7884f78b1aacb99b4fc37d1e3cb1194e39 ]
When both ice and the irdma driver are loaded, a warning in check_flush_dependency is being triggered. This is due to ice driver workqueue being allocated with the WQ_MEM_RECLAIM flag and the irdma one is not.
According to kernel documentation, this flag should be set if the workqueue will be involved in the kernel's memory reclamation flow. Since it is not, there is no need for the ice driver's WQ to have this flag set so remove it.
Example trace:
[ +0.000004] workqueue: WQ_MEM_RECLAIM ice:ice_service_task [ice] is flushing !WQ_MEM_RECLAIM infiniband:0x0 [ +0.000139] WARNING: CPU: 0 PID: 728 at kernel/workqueue.c:2632 check_flush_dependency+0x178/0x1a0 [ +0.000011] Modules linked in: bonding tls xt_CHECKSUM xt_MASQUERADE xt_conntrack ipt_REJECT nf_reject_ipv4 nft_compat nft_cha
in_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nf_tables nfnetlink bridge stp llc rfkill vfat fat intel_rapl_msr intel _rapl_common isst_if_common skx_edac nfit libnvdimm x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel kvm irqbypass crct1 0dif_pclmul crc32_pclmul ghash_clmulni_intel rapl intel_cstate rpcrdma sunrpc rdma_ucm ib_srpt ib_isert iscsi_target_mod target_ core_mod ib_iser libiscsi scsi_transport_iscsi rdma_cm ib_cm iw_cm iTCO_wdt iTCO_vendor_support ipmi_ssif irdma mei_me ib_uverbs ib_core intel_uncore joydev pcspkr i2c_i801 acpi_ipmi mei lpc_ich i2c_smbus intel_pch_thermal ioatdma ipmi_si acpi_power_meter acpi_pad xfs libcrc32c sd_mod t10_pi crc64_rocksoft crc64 sg ahci ixgbe libahci ice i40e igb crc32c_intel mdio i2c_algo_bit liba ta dca wmi dm_mirror dm_region_hash dm_log dm_mod ipmi_devintf ipmi_msghandler fuse
[ +0.000161] [last unloaded: bonding] [ +0.000006] CPU: 0 PID: 728 Comm: kworker/0:2 Tainted: G S 6.2.0-rc2_next-queue-13jan-00458-gc20aabd57164 #1 [ +0.000006] Hardware name: Intel Corporation S2600WFT/S2600WFT, BIOS SE5C620.86B.02.01.0010.010620200716 01/06/2020 [ +0.000003] Workqueue: ice ice_service_task [ice] [ +0.000127] RIP: 0010:check_flush_dependency+0x178/0x1a0 [ +0.000005] Code: 89 8e 02 01 e8 49 3d 40 00 49 8b 55 18 48 8d 8d d0 00 00 00 48 8d b3 d0 00 00 00 4d 89 e0 48 c7 c7 e0 3b 08 9f e8 bb d3 07 01 <0f> 0b e9 be fe ff ff 80 3d 24 89 8e 02 00 0f 85 6b ff ff ff e9 06 [ +0.000004] RSP: 0018:ffff88810a39f990 EFLAGS: 00010282 [ +0.000005] RAX: 0000000000000000 RBX: ffff888141bc2400 RCX: 0000000000000000 [ +0.000004] RDX: 0000000000000001 RSI: dffffc0000000000 RDI: ffffffffa1213a80 [ +0.000003] RBP: ffff888194bf3400 R08: ffffed117b306112 R09: ffffed117b306112 [ +0.000003] R10: ffff888bd983088b R11: ffffed117b306111 R12: 0000000000000000 [ +0.000003] R13: ffff888111f84d00 R14: ffff88810a3943ac R15: ffff888194bf3400 [ +0.000004] FS: 0000000000000000(0000) GS:ffff888bd9800000(0000) knlGS:0000000000000000 [ +0.000003] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ +0.000003] CR2: 000056035b208b60 CR3: 000000017795e005 CR4: 00000000007706f0 [ +0.000003] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ +0.000003] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ +0.000002] PKRU: 55555554 [ +0.000003] Call Trace: [ +0.000002] <TASK> [ +0.000003] __flush_workqueue+0x203/0x840 [ +0.000006] ? mutex_unlock+0x84/0xd0 [ +0.000008] ? __pfx_mutex_unlock+0x10/0x10 [ +0.000004] ? __pfx___flush_workqueue+0x10/0x10 [ +0.000006] ? mutex_lock+0xa3/0xf0 [ +0.000005] ib_cache_cleanup_one+0x39/0x190 [ib_core] [ +0.000174] __ib_unregister_device+0x84/0xf0 [ib_core] [ +0.000094] ib_unregister_device+0x25/0x30 [ib_core] [ +0.000093] irdma_ib_unregister_device+0x97/0xc0 [irdma] [ +0.000064] ? __pfx_irdma_ib_unregister_device+0x10/0x10 [irdma] [ +0.000059] ? up_write+0x5c/0x90 [ +0.000005] irdma_remove+0x36/0x90 [irdma] [ +0.000062] auxiliary_bus_remove+0x32/0x50 [ +0.000007] device_release_driver_internal+0xfa/0x1c0 [ +0.000005] bus_remove_device+0x18a/0x260 [ +0.000007] device_del+0x2e5/0x650 [ +0.000005] ? __pfx_device_del+0x10/0x10 [ +0.000003] ? mutex_unlock+0x84/0xd0 [ +0.000004] ? __pfx_mutex_unlock+0x10/0x10 [ +0.000004] ? _raw_spin_unlock+0x18/0x40 [ +0.000005] ice_unplug_aux_dev+0x52/0x70 [ice] [ +0.000160] ice_service_task+0x1309/0x14f0 [ice] [ +0.000134] ? __pfx___schedule+0x10/0x10 [ +0.000006] process_one_work+0x3b1/0x6c0 [ +0.000008] worker_thread+0x69/0x670 [ +0.000005] ? __kthread_parkme+0xec/0x110 [ +0.000007] ? __pfx_worker_thread+0x10/0x10 [ +0.000005] kthread+0x17f/0x1b0 [ +0.000005] ? __pfx_kthread+0x10/0x10 [ +0.000004] ret_from_fork+0x29/0x50 [ +0.000009] </TASK>
--- drivers/net/ethernet/intel/ice/ice_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/ice/ice_main.c +1 -1
@@ -5130,7 +5130,7 @@ static int __init ice_module_init(void)pr_info ("%s\n" , ice_driver_string);pr_info ("%s\n" , ice_copyright); - ice_wq =alloc_workqueue ("%s" ,WQ_MEM_RECLAIM ,0 ,KBUILD_MODNAME ); + ice_wq =alloc_workqueue ("%s" ,0 ,0 ,KBUILD_MODNAME );if (!ice_wq) {pr_err ("Failed to create workqueue\n" );return -ENOMEM ;
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 28/67 net: dsa: mt7530: dont change PVC_EG_TAG when CPU port becomes VLAN-aware
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit 0b6d6425103a676e2b6a81f3fd35d7ea4f9b90ec ]
Frank reports that in a mt7530 setup where some ports are standalone and some are in a VLAN-aware bridge, 8021q uppers of the standalone ports lose their VLAN tag on xmit, as seen by the link partner.
This seems to occur because once the other ports join the VLAN-aware bridge, mt7530_port_vlan_filtering() also calls mt7530_port_set_vlan_aware(ds, cpu_dp->index), and this affects the way that the switch processes the traffic of the standalone port.
Relevant is the PVC_EG_TAG bit. The MT7530 documentation says about it:
EG_TAG: Incoming Port Egress Tag VLAN Attribution 0: disabled (system default)
1: consistent (keep the original ingress tag attribute)
My interpretation is that this setting applies on the ingress port, and "disabled" is basically the normal behavior, where the egress tag format of the packet (tagged or untagged) is decided by the VLAN table (MT7530_VLAN_EGRESS_UNTAG or MT7530_VLAN_EGRESS_TAG).
But there is also an option of overriding the system default behavior, and for the egress tagging format of packets to be decided not by the VLAN table, but simply by copying the ingress tag format (if ingress was tagged, egress is tagged; if ingress was untagged, egress is untagged; aka "consistent). This is useful in 2 scenarios:
- VLAN-unaware bridge ports will always encounter a miss in the VLAN table. They should forward a packet as-is, though. So we use "consistent" there. See commit e045124e9399 ("net: dsa: mt7530: fix tagged frames pass-through in VLAN-unaware mode").
- Traffic injected from the CPU port. The operating system is in god mode; if it wants a packet to exit as VLAN-tagged, it sends it as VLAN-tagged. Otherwise it sends it as VLAN-untagged*.
*This is true only if we don't consider the bridge TX forwarding offload feature, which mt7530 doesn't support.
So for now, make the CPU port always stay in "consistent" mode to allow software VLANs to be forwarded to their egress ports with the VLAN tag intact, and not stripped.
--- drivers/net/dsa/mt7530.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-)
drivers/net/dsa/mt7530.c +19 -7
@@ -1290,14 +1290,26 @@ mt7530_port_set_vlan_aware(struct dsa_switch *ds, int port)if (!priv->ports[port].pvid)mt7530_rmw (priv,MT7530_PVC_P (port),ACC_FRM_MASK ,MT7530_VLAN_ACC_TAGGED ); - } -/* Set the port as a user port which is to be able to recognize VID -* from incoming packets before fetching entry within the VLAN table. -*/ -mt7530_rmw (priv,MT7530_PVC_P (port),VLAN_ATTR_MASK |PVC_EG_TAG_MASK , -VLAN_ATTR (MT7530_VLAN_USER ) | -PVC_EG_TAG (MT7530_VLAN_EG_DISABLED )); +/* Set the port as a user port which is to be able to recognize +* VID from incoming packets before fetching entry within the +* VLAN table. +*/ +mt7530_rmw (priv,MT7530_PVC_P (port), +VLAN_ATTR_MASK |PVC_EG_TAG_MASK , +VLAN_ATTR (MT7530_VLAN_USER ) | +PVC_EG_TAG (MT7530_VLAN_EG_DISABLED )); + }else { +/* Also set CPU ports to the "user" VLAN port attribute, to +* allow VLAN classification, but keep the EG_TAG attribute as +* "consistent" (i.o.w. don't change its value) for packets +* received by the switch from the CPU, so that tagged packets +* are forwarded to user ports as tagged, and untagged as +* untagged. +*/ +mt7530_rmw (priv,MT7530_PVC_P (port),VLAN_ATTR_MASK , +VLAN_ATTR (MT7530_VLAN_USER )); + } } static void
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 29/67 net: mscc: ocelot: fix VCAP filters not matching on MAC with "protocol 802.1Q"
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit f964f8399df29d3e3ced77177cf35131cd2491bf ]
Alternative short title: don't instruct the hardware to match on EtherType with "protocol 802.1Q" flower filters. It doesn't work for the reasons detailed below.
With a command such as the following:
tc filter add dev $swp1 ingress chain $(IS1 2) pref 3 \ protocol 802.1Q flower skip_sw vlan_id 200 src_mac $h1_mac \ action vlan modify id 300 \ action goto chain $(IS2 0 0)
the created filter is set by ocelot_flower_parse_key() to be of type OCELOT_VCAP_KEY_ETYPE, and etype is set to {value=0x8100, mask=0xffff}. This gets propagated all the way to is1_entry_set() which commits it to hardware (the VCAP_IS1_HK_ETYPE field of the key). Compare this to the case where src_mac isn't specified - the key type is OCELOT_VCAP_KEY_ANY, and is1_entry_set() doesn't populate VCAP_IS1_HK_ETYPE.
The problem is that for VLAN-tagged frames, the hardware interprets the ETYPE field as holding the encapsulated VLAN protocol. So the above filter will only match those packets which have an encapsulated protocol of 0x8100, rather than all packets with VLAN ID 200 and the given src_mac.
The reason why this is allowed to occur is because, although we have a block of code in ocelot_flower_parse_key() which sets "match_protocol" to false when VLAN keys are present, that code executes too late. There is another block of code, which executes for Ethernet addresses, and has a "goto finished_key_parsing" and skips the VLAN header parsing. By skipping it, "match_protocol" remains with the value it was initialized with, i.e. "true", and "proto" is set to f->common.protocol, or 0x8100.
The concept of ignoring some keys rather than erroring out when they are present but can't be offloaded is dubious in itself, but is present since the initial commit fe3490e6107e ("net: mscc: ocelot: Hardware ofload for tc flower filter"), and it's outside of the scope of this patch to change that.
The problem was introduced when the driver started to interpret the flower filter's protocol, and populate the VCAP filter's ETYPE field based on it.
To fix this, it is sufficient to move the code that parses the VLAN keys earlier than the "goto finished_key_parsing" instruction. This will ensure that if we have a flower filter with both VLAN and Ethernet address keys, it won't match on ETYPE 0x8100, because the VLAN key parsing sets "match_protocol = false".
--- drivers/net/ethernet/mscc/ocelot_flower.c | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/net/ethernet/mscc/ocelot_flower.c +12 -12
@@ -473,6 +473,18 @@ ocelot_flower_parse_key(struct ocelot *ocelot, int port, bool ingress,flow_rule_match_control (rule, &match); } +if (flow_rule_match_key (rule,FLOW_DISSECTOR_KEY_VLAN )) { +struct flow_match_vlan match; + +flow_rule_match_vlan (rule, &match); + filter->key_type =OCELOT_VCAP_KEY_ANY ; + filter->vlan.vid.value = match.key->vlan_id; + filter->vlan.vid.mask = match.mask->vlan_id; + filter->vlan.pcp.value[0 ] = match.key->vlan_priority; + filter->vlan.pcp.mask[0 ] = match.mask->vlan_priority; + match_protocol = false; + } +if (flow_rule_match_key (rule,FLOW_DISSECTOR_KEY_ETH_ADDRS )) {struct flow_match_eth_addrs match;
@@ -605,18 +617,6 @@ ocelot_flower_parse_key(struct ocelot *ocelot, int port, bool ingress, match_protocol = false; } -if (flow_rule_match_key (rule,FLOW_DISSECTOR_KEY_VLAN )) { -struct flow_match_vlan match; - -flow_rule_match_vlan (rule, &match); - filter->key_type =OCELOT_VCAP_KEY_ANY ; - filter->vlan.vid.value = match.key->vlan_id; - filter->vlan.vid.mask = match.mask->vlan_id; - filter->vlan.pcp.value[0 ] = match.key->vlan_priority; - filter->vlan.pcp.mask[0 ] = match.mask->vlan_priority; - match_protocol = false; - } - finished_key_parsing:if (match_protocol && proto !=ETH_P_ALL ) {if (filter->block_id ==VCAP_ES0 ) {
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 30/67 net/mlx5e: Move repeating clear_bit in mlx5e_rx_reporter_err_rq_cqe_recover
In reply to Greg Kroah-HartmanFrom: Maxim Mikityanskiy <[email protected]>
[ Upstream commit e64d71d055ca01fa5054d25b99fb29b98e543a31 ]
The same clear_bit is called in both error and success flows. Move the call to do it only once and remove the out label.
Stable-dep-of: 1e66220948df ("net/mlx5e: Update rx ring hw mtu upon each rx-fcs flag change")
--- drivers/net/ethernet/mellanox/mlx5/core/en/reporter_rx.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en/reporter_rx.c +2 -5
@@ -157,16 +157,13 @@ static int mlx5e_rx_reporter_err_rq_cqe_recover(void *ctx)mlx5e_free_rx_descs (rq); err =mlx5e_rq_to_ready (rq,MLX5_RQC_STATE_ERR ); +clear_bit (MLX5E_RQ_STATE_RECOVERING , &rq->state);if (err) - goto out; +return err; -clear_bit (MLX5E_RQ_STATE_RECOVERING , &rq->state);mlx5e_activate_rq (rq); rq->stats->recover++;return 0 ; -out: -clear_bit (MLX5E_RQ_STATE_RECOVERING , &rq->state); -return err; }static int mlx5e_rx_reporter_timeout_recover (void *ctx)
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 31/67 net/mlx5e: Introduce the mlx5e_flush_rq function
In reply to Greg Kroah-HartmanFrom: Maxim Mikityanskiy <[email protected]>
[ Upstream commit d9ba64deb2f1ad58eb3067c7485518f3e96559ee ]
Add a function to flush an RQ: clean up descriptors, release pages and reset the RQ. This procedure is used by the recovery flow, and it will also be used in a following commit to free some memory when switching a channel to the XSK mode.
Stable-dep-of: 1e66220948df ("net/mlx5e: Update rx ring hw mtu upon each rx-fcs flag change")
--- drivers/net/ethernet/mellanox/mlx5/core/en.h | 2 +- .../mellanox/mlx5/core/en/reporter_rx.c | 23 +-------------- .../net/ethernet/mellanox/mlx5/core/en_main.c | 28 ++++++++++++++++++- 3 files changed, 29 insertions(+), 24 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en.h +1 -1
@@ -1002,7 +1002,7 @@ void mlx5e_activate_priv_channels(struct mlx5e_priv *priv);void mlx5e_deactivate_priv_channels (struct mlx5e_priv *priv);int mlx5e_ptp_rx_manage_fs_ctx (struct mlx5e_priv *priv,void *ctx); -int mlx5e_modify_rq_state (struct mlx5e_rq *rq,int curr_state,int next_state); +int mlx5e_flush_rq (struct mlx5e_rq *rq,int curr_state);void mlx5e_activate_rq (struct mlx5e_rq *rq);void mlx5e_deactivate_rq (struct mlx5e_rq *rq);void mlx5e_activate_icosq (struct mlx5e_icosq *icosq);
drivers/net/ethernet/mellanox/mlx5/core/en/reporter_rx.c +1 -22
@@ -129,34 +129,13 @@ static int mlx5e_rx_reporter_err_icosq_cqe_recover(void *ctx)return err; } -static int mlx5e_rq_to_ready (struct mlx5e_rq *rq,int curr_state) -{ -struct net_device *dev = rq->netdev; -int err; - - err =mlx5e_modify_rq_state (rq, curr_state,MLX5_RQC_STATE_RST ); -if (err) { -netdev_err (dev,"Failed to move rq 0x%x to reset\n" , rq->rqn); -return err; - } - err =mlx5e_modify_rq_state (rq,MLX5_RQC_STATE_RST ,MLX5_RQC_STATE_RDY ); -if (err) { -netdev_err (dev,"Failed to move rq 0x%x to ready\n" , rq->rqn); -return err; - } - -return 0 ; -} -static int mlx5e_rx_reporter_err_rq_cqe_recover (void *ctx) {struct mlx5e_rq *rq = ctx;int err;mlx5e_deactivate_rq (rq); -mlx5e_free_rx_descs (rq); - - err =mlx5e_rq_to_ready (rq,MLX5_RQC_STATE_ERR ); + err =mlx5e_flush_rq (rq,MLX5_RQC_STATE_ERR );clear_bit (MLX5E_RQ_STATE_RECOVERING , &rq->state);if (err)return err;
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +27 -1
@@ -672,7 +672,7 @@ int mlx5e_create_rq(struct mlx5e_rq *rq, struct mlx5e_rq_param *param)return err; } -int mlx5e_modify_rq_state (struct mlx5e_rq *rq,int curr_state,int next_state) +static int mlx5e_modify_rq_state (struct mlx5e_rq *rq,int curr_state,int next_state) {struct mlx5_core_dev *mdev = rq->mdev;
@@ -701,6 +701,32 @@ int mlx5e_modify_rq_state(struct mlx5e_rq *rq, int curr_state, int next_state)return err; } +static int mlx5e_rq_to_ready (struct mlx5e_rq *rq,int curr_state) +{ +struct net_device *dev = rq->netdev; +int err; + + err =mlx5e_modify_rq_state (rq, curr_state,MLX5_RQC_STATE_RST ); +if (err) { +netdev_err (dev,"Failed to move rq 0x%x to reset\n" , rq->rqn); +return err; + } + err =mlx5e_modify_rq_state (rq,MLX5_RQC_STATE_RST ,MLX5_RQC_STATE_RDY ); +if (err) { +netdev_err (dev,"Failed to move rq 0x%x to ready\n" , rq->rqn); +return err; + } + +return 0 ; +} + +int mlx5e_flush_rq (struct mlx5e_rq *rq,int curr_state) +{ +mlx5e_free_rx_descs (rq); + +return mlx5e_rq_to_ready (rq, curr_state); +} +static int mlx5e_modify_rq_scatter_fcs (struct mlx5e_rq *rq,bool enable) {struct mlx5_core_dev *mdev = rq->mdev;
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 32/67 net/mlx5e: Update rx ring hw mtu upon each rx-fcs flag change
In reply to Greg Kroah-HartmanFrom: Adham Faris <[email protected]>
[ Upstream commit 1e66220948df815d7b37e0ff8b4627ce10433738 ]
rq->hw_mtu is used in function en_rx.c/mlx5e_skb_from_cqe_mpwrq_linear() to catch oversized packets. If FCS is concatenated to the end of the packet then the check should be updated accordingly.
Rx rings initialization (mlx5e_init_rxq_rq()) invoked for every new set of channels, as part of mlx5e_safe_switch_params(), unknowingly if it runs with default configuration or not. Current rq->hw_mtu initialization assumes default configuration and ignores params->scatter_fcs_en flag state.
Fix this, by accounting for params->scatter_fcs_en flag state during rq->hw_mtu initialization.
In addition, updating rq->hw_mtu value during ingress traffic might lead to packets drop and oversize_pkts_sw_drop counter increase with no good reason. Hence we remove this optimization and switch the set of channels with a new one, to make sure we don't get false positives on the oversize_pkts_sw_drop counter.
--- .../net/ethernet/mellanox/mlx5/core/en_main.c | 86 ++++--------------- 1 file changed, 15 insertions(+), 71 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +15 -71
@@ -392,7 +392,8 @@ static int mlx5e_init_rxq_rq(struct mlx5e_channel *c, struct mlx5e_params *param rq->icosq = &c->icosq; rq->ix = c->ix; rq->mdev = mdev; - rq->hw_mtu =MLX5E_SW2HW_MTU (params, params->sw_mtu); + rq->hw_mtu = +MLX5E_SW2HW_MTU (params, params->sw_mtu) -ETH_FCS_LEN * !params->scatter_fcs_en; rq->xdpsq = &c->rq_xdpsq; rq->stats = &c->priv->channel_stats[c->ix].rq; rq->ptp_cyc2time =mlx5_rq_ts_translator (mdev);
@@ -727,35 +728,6 @@ int mlx5e_flush_rq(struct mlx5e_rq *rq, int curr_state)return mlx5e_rq_to_ready (rq, curr_state); } -static int mlx5e_modify_rq_scatter_fcs (struct mlx5e_rq *rq,bool enable) -{ -struct mlx5_core_dev *mdev = rq->mdev; - -void *in; -void *rqc; -int inlen; -int err; - - inlen =MLX5_ST_SZ_BYTES (modify_rq_in); - in =kvzalloc (inlen,GFP_KERNEL ); -if (!in) -return -ENOMEM ; - - rqc =MLX5_ADDR_OF (modify_rq_in, in, ctx); - -MLX5_SET (modify_rq_in, in, rq_state,MLX5_RQC_STATE_RDY ); -MLX5_SET64 (modify_rq_in, in, modify_bitmask, -MLX5_MODIFY_RQ_IN_MODIFY_BITMASK_SCATTER_FCS ); -MLX5_SET (rqc, rqc, scatter_fcs, enable); -MLX5_SET (rqc, rqc, state,MLX5_RQC_STATE_RDY ); - - err =mlx5_core_modify_rq (mdev, rq->rqn, in); - -kvfree (in); - -return err; -} -static int mlx5e_modify_rq_vsd (struct mlx5e_rq *rq,bool vsd) {struct mlx5_core_dev *mdev = rq->mdev;
@@ -2876,20 +2848,6 @@ static void mlx5e_cleanup_nic_tx(struct mlx5e_priv *priv)mlx5e_destroy_tises (priv); } -static int mlx5e_modify_channels_scatter_fcs (struct mlx5e_channels *chs,bool enable) -{ -int err =0 ; -int i; - -for (i =0 ; i < chs->num; i++) { - err =mlx5e_modify_rq_scatter_fcs (&chs->c[i]->rq, enable); -if (err) -return err; - } - -return 0 ; -} -static int mlx5e_modify_channels_vsd (struct mlx5e_channels *chs,bool vsd) {int err;
@@ -3401,41 +3359,27 @@ static int mlx5e_set_rx_port_ts(struct mlx5_core_dev *mdev, bool enable)return mlx5_set_ports_check (mdev, in,sizeof (in)); } +static int mlx5e_set_rx_port_ts_wrap (struct mlx5e_priv *priv,void *ctx) +{ +struct mlx5_core_dev *mdev = priv->mdev; +bool enable = *(bool *)ctx; + +return mlx5e_set_rx_port_ts (mdev, enable); +} +static int set_feature_rx_fcs (struct net_device *netdev,bool enable) {struct mlx5e_priv *priv =netdev_priv (netdev);struct mlx5e_channels *chs = &priv->channels; -struct mlx5_core_dev *mdev = priv->mdev; +struct mlx5e_params new_params;int err;mutex_lock (&priv->state_lock); -if (enable) { - err =mlx5e_set_rx_port_ts (mdev, false); -if (err) - goto out; - - chs->params.scatter_fcs_en = true; - err =mlx5e_modify_channels_scatter_fcs (chs, true); -if (err) { - chs->params.scatter_fcs_en = false; -mlx5e_set_rx_port_ts (mdev, true); - } - }else { - chs->params.scatter_fcs_en = false; - err =mlx5e_modify_channels_scatter_fcs (chs, false); -if (err) { - chs->params.scatter_fcs_en = true; - goto out; - } - err =mlx5e_set_rx_port_ts (mdev, true); -if (err) { -mlx5_core_warn (mdev,"Failed to set RX port timestamp %d\n" , err); - err =0 ; - } - } - -out: + new_params = chs->params; + new_params.scatter_fcs_en = enable; + err =mlx5e_safe_switch_params (priv, &new_params, mlx5e_set_rx_port_ts_wrap, + &new_params.scatter_fcs_en, true);mutex_unlock (&priv->state_lock);return err; }
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 33/67 net/mlx5: Bridge, fix ageing of peer FDB entries
In reply to Greg Kroah-HartmanFrom: Vlad Buslov <[email protected]>
[ Upstream commit da0c52426cd23f8728eff72c2b2d2a3eb6b451f5 ]
SWITCHDEV_FDB_ADD_TO_BRIDGE event handler that updates FDB entry 'lastuse' field is only executed for eswitch that owns the entry. However, if peer entry processed packets at least once it will have hardware counter 'used' value greater than entry 'lastuse' from that point on, which will cause FDB entry not being aged out.
Process the event on all eswitch instances.
--- drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.c | 4 ---- drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.c +0 -4
@@ -432,10 +432,6 @@ static int mlx5_esw_bridge_switchdev_event(struct notifier_block *nb,switch (event) {case SWITCHDEV_FDB_ADD_TO_BRIDGE : -/* only handle the event on native eswtich of representor */ -if (!mlx5_esw_bridge_is_local (dev, rep, esw)) -break ; - fdb_info =container_of (info, struct switchdev_notifier_fdb_info, info);
drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c +1 -1
@@ -1270,7 +1270,7 @@ void mlx5_esw_bridge_fdb_update_used(struct net_device *dev, u16 vport_num, u16struct mlx5_esw_bridge *bridge; port =mlx5_esw_bridge_port_lookup (vport_num, esw_owner_vhca_id, br_offloads); -if (!port || port->flags &MLX5_ESW_BRIDGE_PORT_FLAG_PEER ) +if (!port)return ; bridge = port->bridge;
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 34/67 net/mlx5e: IPoIB, Show unknown speed instead of error
In reply to Greg Kroah-HartmanFrom: Dragos Tatulea <[email protected]>
[ Upstream commit 8aa5f171d51c1cb69e5e3106df4dd1a446102823 ]
ethtool is returning an error for unknown speeds for the IPoIB interface:
$ ethtool ib0 netlink error: failed to retrieve link settings netlink error: Invalid argument netlink error: failed to retrieve link settings netlink error: Invalid argument Settings for ib0: Link detected: no
After this change, ethtool will return success and show "unknown speed":
$ ethtool ib0 Settings for ib0: Supported ports: [ ] Supported link modes: Not reported Supported pause frame use: No Supports auto-negotiation: No Supported FEC modes: Not reported Advertised link modes: Not reported Advertised pause frame use: No Advertised auto-negotiation: No Advertised FEC modes: Not reported Speed: Unknown! Duplex: Full Auto-negotiation: off Port: Other PHYAD: 0 Transceiver: internal Link detected: no
--- .../net/ethernet/mellanox/mlx5/core/ipoib/ethtool.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ethtool.c +5 -8
@@ -172,16 +172,16 @@ static inline int mlx5_ptys_rate_enum_to_int(enum mlx5_ptys_rate rate) } } -static int mlx5i_get_speed_settings (u16 ib_link_width_oper,u16 ib_proto_oper) +static u32 mlx5i_get_speed_settings (u16 ib_link_width_oper,u16 ib_proto_oper) {int rate, width; rate =mlx5_ptys_rate_enum_to_int (ib_proto_oper);if (rate <0 ) -return -EINVAL ; +return SPEED_UNKNOWN ; width =mlx5_ptys_width_enum_to_int (ib_link_width_oper);if (width <0 ) -return -EINVAL ; +return SPEED_UNKNOWN ;return rate * width; }
@@ -204,16 +204,13 @@ static int mlx5i_get_link_ksettings(struct net_device *netdev,ethtool_link_ksettings_zero_link_mode (link_ksettings, advertising); speed =mlx5i_get_speed_settings (ib_link_width_oper, ib_proto_oper); -if (speed <0 ) -return -EINVAL ; + link_ksettings->base.speed = speed; + link_ksettings->base.duplex = speed ==SPEED_UNKNOWN ?DUPLEX_UNKNOWN :DUPLEX_FULL ; - link_ksettings->base.duplex =DUPLEX_FULL ; link_ksettings->base.port =PORT_OTHER ; link_ksettings->base.autoneg =AUTONEG_DISABLE ; - link_ksettings->base.speed = speed; -return 0 ; }
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 35/67 net/mlx5: fw_tracer, Clear load bit when freeing string DBs buffers
In reply to Greg Kroah-HartmanFrom: Shay Drory <[email protected]>
[ Upstream commit db561fed6b8fa3878e74d5df6512a4a38152b63e ]
Whenever the driver is reading the string DBs into buffers, the driver is setting the load bit, but the driver never clears this bit. As a result, in case load bit is on and the driver query the device for new string DBs, the driver won't read again the string DBs. Fix it by clearing the load bit when query the device for new string DBs.
--- drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c +1 -0
@@ -64,6 +64,7 @@ static int mlx5_query_mtrc_caps(struct mlx5_fw_tracer *tracer)MLX5_GET (mtrc_cap, out, num_string_trace); tracer->str_db.num_string_db =MLX5_GET (mtrc_cap, out, num_string_db); tracer->owner = !!MLX5_GET (mtrc_cap, out, trace_owner); + tracer->str_db.loaded = false;for (i =0 ; i < tracer->str_db.num_string_db; i++) { mtrc_cap_sp =MLX5_ADDR_OF (mtrc_cap, out, string_db_param[i]);
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 36/67 net/mlx5: fw_tracer, Zero consumer index when reloading the tracer
In reply to Greg Kroah-HartmanFrom: Shay Drory <[email protected]>
[ Upstream commit 184e1e4474dbcfebc4dbd1fa823a329978f25506 ]
When tracer is reloaded, the device will log the traces at the beginning of the log buffer. Also, driver is reading the log buffer in chunks in accordance to the consumer index.
Hence, zero consumer index when reloading the tracer.
--- drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c +1 -1
@@ -757,6 +757,7 @@ static int mlx5_fw_tracer_set_mtrc_conf(struct mlx5_fw_tracer *tracer)if (err)mlx5_core_warn (dev,"FWTracer: Failed to set tracer configurations %d\n" , err); + tracer->buff.consumer_index =0 ;return err; }
@@ -821,7 +822,6 @@ static void mlx5_fw_tracer_ownership_change(struct work_struct *work)mlx5_core_dbg (tracer->dev,"FWTracer: ownership changed, current=(%d)\n" , tracer->owner);if (tracer->owner) { tracer->owner = false; - tracer->buff.consumer_index =0 ;return ; }
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 37/67 net/mlx5: Serialize module cleanup with reload and remove
In reply to Greg Kroah-HartmanFrom: Shay Drory <[email protected]>
[ Upstream commit 8f0d1451ecf7b3bd5a06ffc866c753d0f3ab4683 ]
Currently, remove and reload flows can run in parallel to module cleanup. This design is error prone. For example: aux_drivers callbacks are called from both cleanup and remove flows with different lockings, which can cause a deadlock[1].
Hence, serialize module cleanup with reload and remove.
[1]
cleanup remove
------- ------
auxiliary_driver_unregister();
devl_lock()
auxiliary_device_delete(mlx5e_aux)
device_lock(mlx5e_aux)
devl_lock()
device_lock(mlx5e_aux)--- drivers/net/ethernet/mellanox/mlx5/core/main.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/main.c +7 -7
@@ -1862,7 +1862,7 @@ static int __init mlx5_init(void)mlx5_fpga_ipsec_build_fs_cmds ();mlx5_register_debugfs (); - err =pci_register_driver (&mlx5_core_driver); + err =mlx5e_init ();if (err) goto err_debug;
@@ -1870,16 +1870,16 @@ static int __init mlx5_init(void)if (err) goto err_sf; - err =mlx5e_init (); + err =pci_register_driver (&mlx5_core_driver);if (err) - goto err_en; + goto err_pci;return 0 ; -err_en: +err_pci:mlx5_sf_driver_unregister (); err_sf: -pci_unregister_driver (&mlx5_core_driver); +mlx5e_cleanup (); err_debug:mlx5_unregister_debugfs ();return err;
@@ -1887,9 +1887,9 @@ static int __init mlx5_init(void) static void __exit mlx5_cleanup(void) { -mlx5e_cleanup (); -mlx5_sf_driver_unregister ();pci_unregister_driver (&mlx5_core_driver); +mlx5_sf_driver_unregister (); +mlx5e_cleanup ();mlx5_unregister_debugfs (); }
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 38/67 igc: Add ndo_tx_timeout support
In reply to Greg Kroah-HartmanFrom: Sasha Neftin <[email protected]>
[ Upstream commit 9b275176270efd18f2f4e328b32be1bad34c4c0d ]
On some platforms, 100/1000/2500 speeds seem to have sometimes problems reporting false positive tx unit hang during stressful UDP traffic. Likely other Intel drivers introduce responses to a tx hang. Update the 'tx hang' comparator with the comparison of the head and tail of ring pointers and restore the tx_timeout_factor to the previous value (one).
This can be test by using netperf or iperf3 applications. Example:
iperf3 -s -p 5001
iperf3 -c 192.168.0.2 --udp -p 5001 --time 600 -b 0
netserver -p 16604
netperf -H 192.168.0.2 -l 600 -p 16604 -t UDP_STREAM -- -m 64000
--- drivers/net/ethernet/intel/igc/igc_main.c | 25 +++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/igc/igc_main.c +23 -2
@@ -2892,7 +2892,9 @@ static bool igc_clean_tx_irq(struct igc_q_vector *q_vector, int napi_budget)if (tx_buffer->next_to_watch &&time_after (jiffies, tx_buffer->time_stamp + (adapter->tx_timeout_factor *HZ )) && - !(rd32 (IGC_STATUS ) &IGC_STATUS_TXOFF )) { + !(rd32 (IGC_STATUS ) &IGC_STATUS_TXOFF ) && + (rd32 (IGC_TDH (tx_ring->reg_idx)) != +readl (tx_ring->tail))) {/* detected Tx unit hang */ netdev_err (tx_ring->netdev, "Detected Tx Unit Hang\n"
@@ -5019,6 +5021,24 @@ static int igc_change_mtu(struct net_device *netdev, int new_mtu)return 0 ; } +/** +* igc_tx_timeout - Respond to a Tx Hang +* @netdev: network interface device structure +* @txqueue: queue number that timed out +**/ +static void igc_tx_timeout (struct net_device *netdev, +unsigned int __always_unused txqueue) +{ +struct igc_adapter *adapter =netdev_priv (netdev); +struct igc_hw *hw = &adapter->hw; + +/* Do the reset outside of interrupt context */ + adapter->tx_timeout_count++; +schedule_work (&adapter->reset_task); +wr32 (IGC_EICS , + (adapter->eims_enable_mask & ~adapter->eims_other)); +} +/** * igc_get_stats64 - Get System Network Statistics * @netdev: network interface device structure
@@ -5446,7 +5466,7 @@ static void igc_watchdog_task(struct work_struct *work)case SPEED_100 :case SPEED_1000 :case SPEED_2500 : - adapter->tx_timeout_factor =7 ; + adapter->tx_timeout_factor =1 ;break ; }
@@ -6264,6 +6284,7 @@ static const struct net_device_ops igc_netdev_ops = { .ndo_set_rx_mode = igc_set_rx_mode, .ndo_set_mac_address = igc_set_mac, .ndo_change_mtu = igc_change_mtu, + .ndo_tx_timeout = igc_tx_timeout, .ndo_get_stats64 = igc_get_stats64, .ndo_fix_features = igc_fix_features, .ndo_set_features = igc_set_features,
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 39/67 rds: rds_rm_zerocopy_callback() use list_first_entry()
In reply to Greg Kroah-HartmanFrom: Pietro Borrello <[email protected]>
[ Upstream commit f753a68980cf4b59a80fe677619da2b1804f526d ]
rds_rm_zerocopy_callback() uses list_entry() on the head of a list causing a type confusion.
Use list_first_entry() to actually access the first element of the rs_zcookie_queue list.
--- net/rds/message.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/rds/message.c +3 -3
@@ -104,9 +104,9 @@ static void rds_rm_zerocopy_callback(struct rds_sock *rs,spin_lock_irqsave (&q->lock, flags); head = &q->zcookie_head;if (!list_empty (head)) { - info = list_entry(head, struct rds_msg_zcopy_info, - rs_zcookie_next); -if (info &&rds_zcookie_add (info, cookie)) { + info = list_first_entry(head, struct rds_msg_zcopy_info, + rs_zcookie_next); +if (rds_zcookie_add (info, cookie)) {spin_unlock_irqrestore (&q->lock, flags);kfree (rds_info_from_znotifier (znotif));/* caller invokes rds_wake_sk_sleep() */
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 40/67 selftests: forwarding: lib: quote the sysctl values
In reply to Greg Kroah-HartmanFrom: Hangbin Liu <[email protected]>
[ Upstream commit 3a082086aa200852545cf15159213582c0c80eba ]
When set/restore sysctl value, we should quote the value as some keys may have multi values, e.g. net.ipv4.ping_group_range
--- tools/testing/selftests/net/forwarding/lib.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/testing/selftests/net/forwarding/lib.sh +2 -2
@@ -817,14 +817,14 @@ sysctl_set() local value=$1; shift SYSCTL_ORIG[$key]=$(sysctl -n $key) - sysctl -qw $key=$value + sysctl -qw $key="$value" } sysctl_restore() { local key=$1; shift - sysctl -qw $key=${SYSCTL_ORIG["$key"]} + sysctl -qw $key="${SYSCTL_ORIG[$key]}" } forwarding_enable()
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 41/67 ALSA: pci: lx6464es: fix a debug loop
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 5dac9f8dc25fefd9d928b98f6477ff3daefd73e3 ]
This loop accidentally reuses the "i" iterator for both the inside and the outside loop. The value of MAX_STREAM_BUFFER is 5. I believe that chip->rmh.stat_len is in the 2-12 range. If the value of .stat_len is 4 or more then it will loop exactly one time, but if it's less then it is a forever loop.
It looks like it was supposed to combined into one loop where conditions are checked.
--- sound/pci/lx6464es/lx_core.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
sound/pci/lx6464es/lx_core.c +5 -6
@@ -493,12 +493,11 @@ int lx_buffer_ask(struct lx6464es *chip, u32 pipe, int is_capture,dev_dbg (chip->card->dev,"CMD_08_ASK_BUFFERS: needed %d, freed %d\n" , *r_needed, *r_freed); -for (i =0 ; i <MAX_STREAM_BUFFER ; ++i) { -for (i =0 ; i != chip->rmh.stat_len; ++i) -dev_dbg (chip->card->dev, -" stat[%d]: %x, %x\n" , i, - chip->rmh.stat[i], - chip->rmh.stat[i] &MASK_DATA_SIZE ); +for (i =0 ; i <MAX_STREAM_BUFFER && i < chip->rmh.stat_len; + ++i) { +dev_dbg (chip->card->dev," stat[%d]: %x, %x\n" , i, + chip->rmh.stat[i], + chip->rmh.stat[i] &MASK_DATA_SIZE ); } }
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 42/67 riscv: stacktrace: Fix missing the first frame
In reply to Greg Kroah-HartmanFrom: Liu Shixin <[email protected]>
[ Upstream commit cb80242cc679d6397e77d8a964deeb3ff218d2b5 ]
When running kfence_test, I found some testcases failed like this:
# test_out_of_bounds_read: EXPECTATION FAILED at mm/kfence/kfence_test.c:346 Expected report_matches(&expect) to be true, but is false
not ok 1 - test_out_of_bounds_read
The corresponding call-trace is:
BUG: KFENCE: out-of-bounds read in kunit_try_run_case+0x38/0x84
Out-of-bounds read at 0x(____ptrval____) (32B right of kfence-#10):
kunit_try_run_case+0x38/0x84 kunit_generic_run_threadfn_adapter+0x12/0x1e kthread+0xc8/0xde ret_from_exception+0x0/0xc
The kfence_test using the first frame of call trace to check whether the testcase is succeed or not. Commit 6a00ef449370 ("riscv: eliminate unreliable __builtin_frame_address(1)") skip first frame for all case, which results the kfence_test failed. Indeed, we only need to skip the first frame for case (task==NULL || task==current).
With this patch, the call-trace will be:
BUG: KFENCE: out-of-bounds read in test_out_of_bounds_read+0x88/0x19e
Out-of-bounds read at 0x(____ptrval____) (1B left of kfence-#7):
test_out_of_bounds_read+0x88/0x19e kunit_try_run_case+0x38/0x84 kunit_generic_run_threadfn_adapter+0x12/0x1e kthread+0xc8/0xde ret_from_exception+0x0/0xc
--- arch/riscv/kernel/stacktrace.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/riscv/kernel/stacktrace.c +2 -1
@@ -32,6 +32,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs, fp = (unsigned long )__builtin_frame_address (0 ); sp = sp_in_global; pc = (unsigned long )walk_stackframe; + level =-1 ; }else {/* task blocked in __switch_to */ fp = task->thread.s[0 ];
@@ -43,7 +44,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,unsigned long low, high;struct stackframe *frame; -if (unlikely (!__kernel_text_address (pc) || (level++ >=1 && !fn (arg, pc)))) +if (unlikely (!__kernel_text_address (pc) || (level++ >=0 && !fn (arg, pc))))break ;/* Validate frame pointer */
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 43/67 ASoC: topology: Return -ENOMEM on memory allocation failure
In reply to Greg Kroah-HartmanFrom: Amadeusz Sławiński <[email protected]>
[ Upstream commit c173ee5b2fa6195066674d66d1d7e191010fb1ff ]
When handling error path, ret needs to be set to correct value.
--- sound/soc/soc-topology.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
sound/soc/soc-topology.c +6 -2
@@ -1480,13 +1480,17 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, template.num_kcontrols =le32_to_cpu (w->num_kcontrols); kc =devm_kcalloc (tplg->dev,le32_to_cpu (w->num_kcontrols),sizeof (*kc),GFP_KERNEL ); -if (!kc) +if (!kc) { + ret = -ENOMEM ; goto hdr_err; + } kcontrol_type =devm_kcalloc (tplg->dev,le32_to_cpu (w->num_kcontrols),sizeof (unsigned int ),GFP_KERNEL ); -if (!kcontrol_type) +if (!kcontrol_type) { + ret = -ENOMEM ; goto hdr_err; + }for (i =0 ; i < w->num_kcontrols; i++) { control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos;
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 44/67 pinctrl: mediatek: Fix the drive register definition of some Pins
In reply to Greg Kroah-HartmanFrom: Guodong Liu <[email protected]>
[ Upstream commit 5754a1c98b18009cb3030dc391aa37b77428a0bd ]
The drive adjustment register definition of gpio13 and gpio81 is wrong:
"the start address for the range" of gpio18 is corrected to 0x000, "the start bit for the first register within the range" of gpio81 is corrected to 24.
--- drivers/pinctrl/mediatek/pinctrl-mt8195.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/pinctrl/mediatek/pinctrl-mt8195.c +2 -2
@@ -659,7 +659,7 @@ static const struct mtk_pin_field_calc mt8195_pin_drv_range[] = {PIN_FIELD_BASE (10 ,10 ,4 ,0x010 ,0x10 ,9 ,3 ),PIN_FIELD_BASE (11 ,11 ,4 ,0x000 ,0x10 ,24 ,3 ),PIN_FIELD_BASE (12 ,12 ,4 ,0x010 ,0x10 ,12 ,3 ), -PIN_FIELD_BASE (13 ,13 ,4 ,0x010 ,0x10 ,27 ,3 ), +PIN_FIELD_BASE (13 ,13 ,4 ,0x000 ,0x10 ,27 ,3 ),PIN_FIELD_BASE (14 ,14 ,4 ,0x010 ,0x10 ,15 ,3 ),PIN_FIELD_BASE (15 ,15 ,4 ,0x010 ,0x10 ,0 ,3 ), PIN_FIELD_BASE(16, 16, 4, 0x010, 0x10, 18, 3),
@@ -708,7 +708,7 @@ static const struct mtk_pin_field_calc mt8195_pin_drv_range[] = {PIN_FIELD_BASE (78 ,78 ,3 ,0x000 ,0x10 ,15 ,3 ),PIN_FIELD_BASE (79 ,79 ,3 ,0x000 ,0x10 ,18 ,3 ),PIN_FIELD_BASE (80 ,80 ,3 ,0x000 ,0x10 ,21 ,3 ), -PIN_FIELD_BASE (81 ,81 ,3 ,0x000 ,0x10 ,28 ,3 ), +PIN_FIELD_BASE (81 ,81 ,3 ,0x000 ,0x10 ,24 ,3 ),PIN_FIELD_BASE (82 ,82 ,3 ,0x000 ,0x10 ,27 ,3 ),PIN_FIELD_BASE (83 ,83 ,3 ,0x010 ,0x10 ,0 ,3 ), PIN_FIELD_BASE(84, 84, 3, 0x010, 0x10, 3, 3),
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 45/67 pinctrl: aspeed: Fix confusing types in return value
In reply to Greg Kroah-HartmanFrom: Joel Stanley <[email protected]>
[ Upstream commit 287a344a11f1ebd31055cf9b22c88d7005f108d7 ]
The function signature is int, but we return a bool. Instead return a negative errno as the kerneldoc suggests.
--- drivers/pinctrl/aspeed/pinctrl-aspeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/aspeed/pinctrl-aspeed.c +1 -1
@@ -122,7 +122,7 @@ static int aspeed_disable_sig(struct aspeed_pinmux_data *ctx,int ret =0 ;if (!exprs) -return true; +return -EINVAL ;while (*exprs && !ret) { ret =aspeed_sig_expr_disable (ctx, *exprs);
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 46/67 pinctrl: single: fix potential NULL dereference
In reply to Greg Kroah-HartmanFrom: Maxim Korotkov <[email protected]>
[ Upstream commit d2d73e6d4822140445ad4a7b1c6091e0f5fe703b ]
Added checking of pointer "function" in pcs_set_mux(). pinmux_generic_get_function() can return NULL and the pointer "function" was dereferenced without checking against NULL.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/pinctrl/pinctrl-single.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/pinctrl/pinctrl-single.c +2 -0
@@ -372,6 +372,8 @@ static int pcs_set_mux(struct pinctrl_dev *pctldev, unsigned fselector,if (!pcs->fmask)return 0 ; function =pinmux_generic_get_function (pctldev, fselector); +if (!function) +return -EINVAL ; func = function->data;if (!func)return -EINVAL ;
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 47/67 spi: dw: Fix wrong FIFO level setting for long xfers
In reply to Greg Kroah-HartmanFrom: Serge Semin <[email protected]>
[ Upstream commit c63b8fd14a7db719f8252038a790638728c4eb66 ]
Due to using the u16 type in the min_t() macros the SPI transfer length will be cast to word before participating in the conditional statement implied by the macro. Thus if the transfer length is greater than 64KB the Tx/Rx FIFO threshold level value will be determined by the leftover of the truncated after the type-case length. In the worst case it will cause the dramatical performance drop due to the "Tx FIFO Empty" or "Rx FIFO Full" interrupts triggered on each xfer word sent/received to/from the bus.
The problem can be easily fixed by specifying the unsigned int type in the min_t() macros thus preventing the possible data loss.
--- drivers/spi/spi-dw-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/spi/spi-dw-core.c +1 -1
@@ -357,7 +357,7 @@ static void dw_spi_irq_setup(struct dw_spi *dws)* will be adjusted at the final stage of the IRQ-based SPI transfer * execution so not to lose the leftover of the incoming data. */ - level =min_t (u16, dws->fifo_len /2 , dws->tx_len); + level = min_t(unsigned int, dws->fifo_len / 2, dws->tx_len);dw_writel (dws,DW_SPI_TXFTLR , level);dw_writel (dws,DW_SPI_RXFTLR , level -1 );
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 48/67 pinctrl: intel: Restore the pins that used to be in Direct IRQ mode
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit a8520be3ffef3d25b53bf171a7ebe17ee0154175 ]
If the firmware mangled the register contents too much, check the saved value for the Direct IRQ mode. If it matches, we will restore the pin state.
--- drivers/pinctrl/intel/pinctrl-intel.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
drivers/pinctrl/intel/pinctrl-intel.c +13 -3
@@ -1661,6 +1661,12 @@ const struct intel_pinctrl_soc_data *intel_pinctrl_get_soc_data(struct platform_EXPORT_SYMBOL_GPL (intel_pinctrl_get_soc_data);#ifdef CONFIG_PM_SLEEP +static bool __intel_gpio_is_direct_irq (u32 value) +{ +return (value &PADCFG0_GPIROUTIOXAPIC ) && (value &PADCFG0_GPIOTXDIS ) && + (__intel_gpio_get_gpio_mode (value) ==PADCFG0_PMODE_GPIO ); +} +static bool intel_pinctrl_should_save (struct intel_pinctrl *pctrl,unsigned int pin) {const struct pin_desc *pd =pin_desc_get (pctrl->pctldev, pin);
@@ -1694,8 +1700,7 @@ static bool intel_pinctrl_should_save(struct intel_pinctrl *pctrl, unsigned int* See https://bugzilla.kernel.org/show_bug.cgi?id=214749. */ value =readl (intel_get_padcfg (pctrl, pin,PADCFG0 )); -if ((value &PADCFG0_GPIROUTIOXAPIC ) && (value &PADCFG0_GPIOTXDIS ) && - (__intel_gpio_get_gpio_mode (value) ==PADCFG0_PMODE_GPIO )) +if (__intel_gpio_is_direct_irq (value))return true;return false;
@@ -1825,7 +1830,12 @@ int intel_pinctrl_resume_noirq(struct device *dev)for (i =0 ; i < pctrl->soc->npins; i++) {const struct pinctrl_pin_desc *desc = &pctrl->soc->pins[i]; -if (!intel_pinctrl_should_save (pctrl, desc->number)) +if (!(intel_pinctrl_should_save (pctrl, desc->number) || +/* +* If the firmware mangled the register contents too much, +* check the saved value for the Direct IRQ mode. +*/ +__intel_gpio_is_direct_irq (pads[i].padcfg0)))continue ;intel_restore_padcfg (pctrl, desc->number,PADCFG0 , pads[i].padcfg0);
Signature · 1 line
2.39.0
Greg Kroah-Hartman
maintainerPATCH 49/67 cifs: Fix use-after-free in rdata->read_into_pages()
In reply to Greg Kroah-HartmanFrom: ZhaoLong Wang <[email protected]>
commit aa5465aeca3c66fecdf7efcf554aed79b4c4b211 upstream.
When the network status is unstable, use-after-free may occur when read data from the server.
BUG: KASAN: use-after-free in readpages_fill_pages+0x14c/0x7e0 Call Trace: <TASK> dump_stack_lvl+0x38/0x4c print_report+0x16f/0x4a6 kasan_report+0xb7/0x130 readpages_fill_pages+0x14c/0x7e0 cifs_readv_receive+0x46d/0xa40 cifs_demultiplex_thread+0x121c/0x1490 kthread+0x16b/0x1a0 ret_from_fork+0x2c/0x50 </TASK> Allocated by task 2535: kasan_save_stack+0x22/0x50 kasan_set_track+0x25/0x30 __kasan_kmalloc+0x82/0x90 cifs_readdata_direct_alloc+0x2c/0x110 cifs_readdata_alloc+0x2d/0x60 cifs_readahead+0x393/0xfe0 read_pages+0x12f/0x470 page_cache_ra_unbounded+0x1b1/0x240 filemap_get_pages+0x1c8/0x9a0 filemap_read+0x1c0/0x540 cifs_strict_readv+0x21b/0x240 vfs_read+0x395/0x4b0 ksys_read+0xb8/0x150 do_syscall_64+0x3f/0x90 entry_SYSCALL_64_after_hwframe+0x72/0xdc Freed by task 79: kasan_save_stack+0x22/0x50 kasan_set_track+0x25/0x30 kasan_save_free_info+0x2e/0x50 __kasan_slab_free+0x10e/0x1a0 __kmem_cache_free+0x7a/0x1a0 cifs_readdata_release+0x49/0x60 process_one_work+0x46c/0x760 worker_thread+0x2a4/0x6f0 kthread+0x16b/0x1a0 ret_from_fork+0x2c/0x50 Last potentially related work creation: kasan_save_stack+0x22/0x50 __kasan_record_aux_stack+0x95/0xb0 insert_work+0x2b/0x130 __queue_work+0x1fe/0x660 queue_work_on+0x4b/0x60 smb2_readv_callback+0x396/0x800 cifs_abort_connection+0x474/0x6a0 cifs_reconnect+0x5cb/0xa50 cifs_readv_from_socket.cold+0x22/0x6c cifs_read_page_from_socket+0xc1/0x100 readpages_fill_pages.cold+0x2f/0x46 cifs_readv_receive+0x46d/0xa40 cifs_demultiplex_thread+0x121c/0x1490 kthread+0x16b/0x1a0 ret_from_fork+0x2c/0x50
The following function calls will cause UAF of the rdata pointer.
readpages_fill_pages
cifs_read_page_from_socket
cifs_readv_from_socket
cifs_reconnect
__cifs_reconnect
cifs_abort_connection
mid->callback() --> smb2_readv_callback
queue_work(&rdata->work) # if the worker completes first,
# the rdata is freed
cifs_readv_complete
kref_put
cifs_readdata_release
kfree(rdata) return rdata->... # UAF in readpages_fill_pages()
Similarly, this problem also occurs in the uncache_fill_pages().
Fix this by adjusts the order of condition judgment in the return statement.
--- fs/cifs/file.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/cifs/file.c +2 -2
@@ -3613,7 +3613,7 @@ uncached_fill_pages(struct TCP_Server_In rdata->got_bytes += result; } -return rdata->got_bytes >0 && result != -ECONNABORTED ? +return result != -ECONNABORTED && rdata->got_bytes >0 ? rdata->got_bytes : result; }
@@ -4388,7 +4388,7 @@ readpages_fill_pages(struct TCP_Server_I rdata->got_bytes += result; } -return rdata->got_bytes >0 && result != -ECONNABORTED ? +return result != -ECONNABORTED && rdata->got_bytes >0 ? rdata->got_bytes : result; }
Greg Kroah-Hartman
maintainerPATCH 50/67 net: USB: Fix wrong-direction WARNING in plusb.c
In reply to Greg Kroah-HartmanFrom: Alan Stern <[email protected]>
commit 811d581194f7412eda97acc03d17fc77824b561f upstream.
The syzbot fuzzer detected a bug in the plusb network driver: A zero-length control-OUT transfer was treated as a read instead of a write. In modern kernels this error provokes a WARNING:
usb 1-1: BOGUS control dir, pipe 80000280 doesn't match bRequestType c0
WARNING: CPU: 0 PID: 4645 at drivers/usb/core/urb.c:411 usb_submit_urb+0x14a7/0x1880 drivers/usb/core/urb.c:411 Modules linked in: CPU: 1 PID: 4645 Comm: dhcpcd Not tainted 6.2.0-rc6-syzkaller-00050-g9f266ccaa2f5 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/12/2023 RIP: 0010:usb_submit_urb+0x14a7/0x1880 drivers/usb/core/urb.c:411 ... Call Trace: <TASK> usb_start_wait_urb+0x101/0x4b0 drivers/usb/core/message.c:58 usb_internal_control_msg drivers/usb/core/message.c:102 [inline] usb_control_msg+0x320/0x4a0 drivers/usb/core/message.c:153 __usbnet_read_cmd+0xb9/0x390 drivers/net/usb/usbnet.c:2010 usbnet_read_cmd+0x96/0xf0 drivers/net/usb/usbnet.c:2068 pl_vendor_req drivers/net/usb/plusb.c:60 [inline] pl_set_QuickLink_features drivers/net/usb/plusb.c:75 [inline] pl_reset+0x2f/0xf0 drivers/net/usb/plusb.c:85 usbnet_open+0xcc/0x5d0 drivers/net/usb/usbnet.c:889 __dev_open+0x297/0x4d0 net/core/dev.c:1417 __dev_change_flags+0x587/0x750 net/core/dev.c:8530 dev_change_flags+0x97/0x170 net/core/dev.c:8602 devinet_ioctl+0x15a2/0x1d70 net/ipv4/devinet.c:1147 inet_ioctl+0x33f/0x380 net/ipv4/af_inet.c:979 sock_do_ioctl+0xcc/0x230 net/socket.c:1169 sock_ioctl+0x1f8/0x680 net/socket.c:1286 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:870 [inline] __se_sys_ioctl fs/ioctl.c:856 [inline] __x64_sys_ioctl+0x197/0x210 fs/ioctl.c:856 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x39/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd
The fix is to call usbnet_write_cmd() instead of usbnet_read_cmd() and remove the USB_DIR_IN flag.
--- drivers/net/usb/plusb.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/net/usb/plusb.c +1 -3
@@ -57,9 +57,7 @@static inline int pl_vendor_req (struct usbnet *dev,u8 req,u8 val,u8 index) { -return usbnet_read_cmd (dev, req, -USB_DIR_IN |USB_TYPE_VENDOR | -USB_RECIP_DEVICE , +return usbnet_write_cmd (dev, req,USB_TYPE_VENDOR |USB_RECIP_DEVICE , val, index,NULL ,0 ); }
Greg Kroah-Hartman
maintainerPATCH 51/67 mptcp: be careful on subflow status propagation on errors
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
commit 1249db44a102d9d3541ed7798d4b01ffdcf03524 upstream.
Currently the subflow error report callback unconditionally propagates the fallback subflow status to the owning msk.
If the msk is already orphaned, the above prevents the code from correctly tracking the msk moving to the TCP_CLOSE state and doing the appropriate cleanup.
All the above causes increasing memory usage over time and sporadic self-tests failures.
There is a great deal of infrastructure trying to propagate correctly the fallback subflow status to the owning mptcp socket, e.g. via mptcp_subflow_eof() and subflow_sched_work_if_closed():
in the error propagation path we need only to cope with unorphaned sockets.
--- net/mptcp/subflow.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
net/mptcp/subflow.c +9 -1
@@ -1284,6 +1284,7 @@ void __mptcp_error_report(struct sock *smptcp_for_each_subflow (msk, subflow) {struct sock *ssk =mptcp_subflow_tcp_sock (subflow);int err =sock_error (ssk); +int ssk_state;if (!err)continue ;
@@ -1294,7 +1295,14 @@ void __mptcp_error_report(struct sock *sif (sk->sk_state !=TCP_SYN_SENT && !__mptcp_check_fallback (msk))continue ; -inet_sk_state_store (sk,inet_sk_state_load (ssk)); +/* We need to propagate only transition to CLOSE state. +* Orphaned socket will see such state change via +* subflow_sched_work_if_closed() and that path will properly +* destroy the msk as needed. +*/ + ssk_state =inet_sk_state_load (ssk); +if (ssk_state ==TCP_CLOSE && !sock_flag (sk,SOCK_DEAD )) +inet_sk_state_store (sk, ssk_state); sk->sk_err = -err;/* This barrier is coupled with smp_rmb() in mptcp_poll() */
Greg Kroah-Hartman
maintainerPATCH 52/67 btrfs: free device in btrfs_close_devices for a single device filesystem
In reply to Greg Kroah-HartmanFrom: Anand Jain <[email protected]>
commit 5f58d783fd7823b2c2d5954d1126e702f94bfc4c upstream.
We have this check to make sure we don't accidentally add older devices that may have disappeared and re-appeared with an older generation from being added to an fs_devices (such as a replace source device). This makes sense, we don't want stale disks in our file system. However for single disks this doesn't really make sense.
I've seen this in testing, but I was provided a reproducer from a project that builds btrfs images on loopback devices. The loopback device gets cached with the new generation, and then if it is re-used to generate a new file system we'll fail to mount it because the new fs is "older" than what we have in cache.
Fix this by freeing the cache when closing the device for a single device filesystem. This will ensure that the mount command passed device path is scanned successfully during the next mount.
--- fs/btrfs/volumes.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
fs/btrfs/volumes.c +15 -1
@@ -409,6 +409,7 @@ void btrfs_free_device(struct btrfs_devistatic void free_fs_devices (struct btrfs_fs_devices *fs_devices) {struct btrfs_device *device; +WARN_ON (fs_devices->opened);while (!list_empty (&fs_devices->devices)) { device = list_entry(fs_devices->devices.next,
@@ -1221,9 +1222,22 @@ void btrfs_close_devices(struct btrfs_fsmutex_lock (&uuid_mutex);close_fs_devices (fs_devices); -if (!fs_devices->opened) +if (!fs_devices->opened) {list_splice_init (&fs_devices->seed_list, &list); +/* +* If the struct btrfs_fs_devices is not assembled with any +* other device, it can be re-initialized during the next mount +* without the needing device-scan step. Therefore, it can be +* fully freed. +*/ +if (fs_devices->num_devices ==1 ) { +list_del (&fs_devices->fs_list); +free_fs_devices (fs_devices); + } + } + +list_for_each_entry_safe (fs_devices, tmp, &list, seed_list) {close_fs_devices (fs_devices);list_del (&fs_devices->seed_list);
Greg Kroah-Hartman
maintainerPATCH 53/67 usb: core: add quirk for Alcor Link AK9563 smartcard reader
In reply to Greg Kroah-HartmanFrom: Mark Pearson <[email protected]>
commit 303e724d7b1e1a0a93daf0b1ab5f7c4f53543b34 upstream.
The Alcor Link AK9563 smartcard reader used on some Lenovo platforms doesn't work. If LPM is enabled the reader will provide an invalid usb config descriptor. Added quirk to disable LPM.
Verified fix on Lenovo P16 G1 and T14 G3
--- drivers/usb/core/quirks.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/core/quirks.c +3 -0
@@ -526,6 +526,9 @@ static const struct usb_device_id usb_qu/* DJI CineSSD */ { USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM }, + /* Alcor Link AK9563 SC Reader used in 2022 Lenovo ThinkPads */ + { USB_DEVICE(0x2ce3, 0x9563), .driver_info = USB_QUIRK_NO_LPM }, + /* DELL USB GEN2 */ { USB_DEVICE(0x413c, 0xb062), .driver_info = USB_QUIRK_NO_LPM | USB_QUIRK_RESET_RESUME },
Greg Kroah-Hartman
maintainerPATCH 54/67 usb: typec: altmodes/displayport: Fix probe pin assign check
In reply to Greg Kroah-HartmanFrom: Prashant Malani <[email protected]>
commit 54e5c00a4eb0a4c663445b245f641bbfab142430 upstream.
While checking Pin Assignments of the port and partner during probe, we don't take into account whether the peripheral is a plug or receptacle.
This manifests itself in a mode entry failure on certain docks and dongles with captive cables. For instance, the Startech.com Type-C to DP dongle (Model #CDP2DP) advertises its DP VDO as 0x405. This would fail the Pin Assignment compatibility check, despite it supporting Pin Assignment C as a UFP.
Update the check to use the correct DP Pin Assign macros that take the peripheral's receptacle bit into account.
--- drivers/usb/typec/altmodes/displayport.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/usb/typec/altmodes/displayport.c +4 -4
@@ -533,10 +533,10 @@ int dp_altmode_probe(struct typec_altmod/* FIXME: Port can only be DFP_U. */ /* Make sure we have compatiple pin configurations */ -if (!(DP_CAP_DFP_D_PIN_ASSIGN (port->vdo) & -DP_CAP_UFP_D_PIN_ASSIGN (alt->vdo)) && - !(DP_CAP_UFP_D_PIN_ASSIGN (port->vdo) & -DP_CAP_DFP_D_PIN_ASSIGN (alt->vdo))) +if (!(DP_CAP_PIN_ASSIGN_DFP_D (port->vdo) & +DP_CAP_PIN_ASSIGN_UFP_D (alt->vdo)) && + !(DP_CAP_PIN_ASSIGN_UFP_D (port->vdo) & +DP_CAP_PIN_ASSIGN_DFP_D (alt->vdo)))return -ENODEV ; ret =sysfs_create_group (&alt->dev.kobj, &dp_altmode_group);
Greg Kroah-Hartman
maintainerPATCH 55/67 clk: ingenic: jz4760: Update M/N/OD calculation algorithm
In reply to Greg Kroah-HartmanFrom: Paul Cercueil <[email protected]>
commit ecfb9f404771dde909ce7743df954370933c3be2 upstream.
The previous algorithm was pretty broken.
- The inner loop had a '(m > m_max)' condition, and the value of 'm' would increase in each iteration;
- Each iteration would actually multiply 'm' by two, so it is not needed to re-compute the whole equation at each iteration;
- It would loop until (m & 1) == 0, which means it would loop at most once.
- The outer loop would divide the 'n' value by two at the end of each iteration. This meant that for a 12 MHz parent clock and a 1.2 GHz requested clock, it would first try n=12, then n=6, then n=3, then n=1, none of which would work; the only valid value is n=2 in this case.
Simplify this algorithm with a single for loop, which decrements 'n' after each iteration, addressing all of the above problems.
--- drivers/clk/ingenic/jz4760-cgu.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-)
drivers/clk/ingenic/jz4760-cgu.c +8 -10
@@ -58,7 +58,7 @@ jz4760_cgu_calc_m_n_od(const struct ingenic_cgu_pll_info *pll_info, unsigned long rate, unsigned long parent_rate, unsigned int *pm, unsigned int *pn, unsigned int *pod) { - unsigned int m, n, od, m_max = (1 << pll_info->m_bits) - 2; + unsigned int m, n, od, m_max = (1 << pll_info->m_bits) - 1;/* The frequency after the N divider must be between 1 and 50 MHz. */ n = parent_rate / (1 *MHZ );
@@ -66,19 +66,17 @@ jz4760_cgu_calc_m_n_od(const struct ingenic_cgu_pll_info *pll_info,/* The N divider must be >= 2. */ n =clamp_val (n,2 ,1 << pll_info->n_bits); -for (;; n >>=1 ) { - od = (unsigned int )-1 ; + rate /=MHZ ; + parent_rate /=MHZ ; -do { - m = (rate /MHZ ) * (1 << ++od) * n / (parent_rate /MHZ ); - }while ((m > m_max || m &1 ) && (od <4 )); - -if (od <4 && m >=4 && m <= m_max) -break ; +for (m = m_max; m >= m_max && n >=2 ; n--) { + m = rate * n / parent_rate; + od = m &1 ; + m <<= od; } *pm = m; - *pn = n; + *pn = n +1 ; *pod =1 << od; }
Signature · 1 line
2.39.1
Greg Kroah-Hartman
maintainerPATCH 56/67 ceph: flush cap releases when the session is flushed
In reply to Greg Kroah-HartmanFrom: Xiubo Li <[email protected]>
commit e7d84c6a1296d059389f7342d9b4b7defb518d3a upstream.
MDS expects the completed cap release prior to responding to the session flush for cache drop.
--- fs/ceph/mds_client.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/ceph/mds_client.c +6 -0
@@ -3543,6 +3543,12 @@ static void handle_session(struct ceph_mbreak ;case CEPH_SESSION_FLUSHMSG : +/* flush cap releases */ +spin_lock (&session->s_cap_lock); +if (session->s_num_cap_releases) +ceph_flush_cap_releases (mdsc, session); +spin_unlock (&session->s_cap_lock); +send_flushmsg_ack (mdsc, session, seq);break ;
Greg Kroah-Hartman
maintainerPATCH 57/67 riscv: Fixup race condition on PG_dcache_clean in flush_icache_pte
In reply to Greg Kroah-HartmanFrom: Guo Ren <[email protected]>
commit 950b879b7f0251317d26bae0687e72592d607532 upstream.
In commit 588a513d3425 ("arm64: Fix race condition on PG_dcache_clean in __sync_icache_dcache()"), we found RISC-V has the same issue as the previous arm64. The previous implementation didn't guarantee the correct sequence of operations, which means flush_icache_all() hasn't been called when the PG_dcache_clean was set. That would cause a risk of page synchronization.
--- arch/riscv/mm/cacheflush.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/riscv/mm/cacheflush.c +3 -1
@@ -85,7 +85,9 @@ void flush_icache_pte(pte_t pte) {struct page *page =pte_page (pte); -if (!test_and_set_bit (PG_dcache_clean, &page->flags)) +if (!test_bit (PG_dcache_clean, &page->flags)) {flush_icache_all (); +set_bit (PG_dcache_clean, &page->flags); + } }#endif /* CONFIG_MMU */
Greg Kroah-Hartman
maintainerPATCH 58/67 powerpc/64s/interrupt: Fix interrupt exit race with security mitigation switch
In reply to Greg Kroah-HartmanFrom: Nicholas Piggin <[email protected]>
commit 2ea31e2e62bbc4d11c411eeb36f1b02841dbcab1 upstream.
The RFI and STF security mitigation options can flip the interrupt_exit_not_reentrant static branch condition concurrently with the interrupt exit code which tests that branch.
Interrupt exit tests this condition to set MSR[EE|RI] for exit, then again in the case a soft-masked interrupt is found pending, to recover the MSR so the interrupt can be replayed before attempting to exit again. If the condition changes between these two tests, the MSR and irq soft-mask state will become corrupted, leading to warnings and possible crashes. For example, if the branch is initially true then false, MSR[EE] will be 0 but PACA_IRQ_HARD_DIS clear and EE may not get enabled, leading to warnings in irq_64.c.
--- arch/powerpc/kernel/interrupt.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/powerpc/kernel/interrupt.c +4 -2
@@ -53,16 +53,18 @@ static inline bool exit_must_hard_disabl*/ static notrace __always_inline bool prep_irq_for_enabled_exit(bool restartable) { +bool must_hard_disable = (exit_must_hard_disable () || !restartable); +/* This must be done with RI=1 because tracing may touch vmaps */ trace_hardirqs_on (); -if (exit_must_hard_disable () || !restartable) +if (must_hard_disable)__hard_EE_RI_disable ();#ifdef CONFIG_PPC64 /* This pattern matches prep_irq_for_idle */ if (unlikely (lazy_irq_pending_nocheck ())) { -if (exit_must_hard_disable () || !restartable) { +if (must_hard_disable) { local_paca->irq_happened |=PACA_IRQ_HARD_DIS ;__hard_RI_enable (); }
Greg Kroah-Hartman
maintainerPATCH 59/67 rtmutex: Ensure that the top waiter is always woken up
In reply to Greg Kroah-HartmanFrom: Wander Lairson Costa <[email protected]>
commit db370a8b9f67ae5f17e3d5482493294467784504 upstream.
Let L1 and L2 be two spinlocks.
Let T1 be a task holding L1 and blocked on L2. T1, currently, is the top waiter of L2.
Let T2 be the task holding L2.
Let T3 be a task trying to acquire L1.
The following events will lead to a state in which the wait queue of L2 isn't empty, but no task actually holds the lock.
T1 T2 T3 == == ==
spin_lock(L1)
| raw_spin_lock(L1->wait_lock)
| rtlock_slowlock_locked(L1)
| | task_blocks_on_rt_mutex(L1, T3)
| | | orig_waiter->lock = L1
| | | orig_waiter->task = T3
| | | raw_spin_unlock(L1->wait_lock)
| | | rt_mutex_adjust_prio_chain(T1, L1, L2, orig_waiter, T3)
spin_unlock(L2) | | | |
| rt_mutex_slowunlock(L2) | | | |
| | raw_spin_lock(L2->wait_lock) | | | |
| | wakeup(T1) | | | |
| | raw_spin_unlock(L2->wait_lock) | | | |
| | | | waiter = T1->pi_blocked_on
| | | | waiter == rt_mutex_top_waiter(L2)
| | | | waiter->task == T1
| | | | raw_spin_lock(L2->wait_lock)
| | | | dequeue(L2, waiter)
| | | | update_prio(waiter, T1)
| | | | enqueue(L2, waiter)
| | | | waiter != rt_mutex_top_waiter(L2)
| | | | L2->owner == NULL
| | | | wakeup(T1)
| | | | raw_spin_unlock(L2->wait_lock)T1 wakes up
T1 != top_waiter(L2)schedule_rtlock()
If the deadline of T1 is updated before the call to update_prio(), and the new deadline is greater than the deadline of the second top waiter, then after the requeue, T1 is no longer the top waiter, and the wrong task is woken up which will then go back to sleep because it is not the top waiter.
This can be reproduced in PREEMPT_RT with stress-ng:
while true; do
stress-ng --sched deadline --sched-period 1000000000 \
--sched-runtime 800000000 --sched-deadline \
1000000000 --mmapfork 23 -t 20done
A similar issue was pointed out by Thomas versus the cases where the top waiter drops out early due to a signal or timeout, which is a general issue for all regular rtmutex use cases, e.g. futex.
The problematic code is in rt_mutex_adjust_prio_chain():
// Save the top waiter before dequeue/enqueue
prerequeue_top_waiter = rt_mutex_top_waiter(lock);
rt_mutex_dequeue(lock, waiter);
waiter_update_prio(waiter, task);
rt_mutex_enqueue(lock, waiter);
// Lock has no owner?
if (!rt_mutex_owner(lock)) {
// Top waiter changed ----> if (prerequeue_top_waiter != rt_mutex_top_waiter(lock))
----> wake_up_state(waiter->task, waiter->wake_state);
This only takes the case into account where @waiter is the new top waiter due to the requeue operation.
But it fails to handle the case where @waiter is not longer the top waiter due to the requeue operation.
Ensure that the new top waiter is woken up so in all cases so it can take over the ownerless lock.
[ tglx: Amend changelog, add Fixes tag ]
--- kernel/locking/rtmutex.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/locking/rtmutex.c +3 -2
@@ -855,8 +855,9 @@ static int __sched rt_mutex_adjust_prio_* then we need to wake the new top waiter up to try * to get the lock. */ -if (prerequeue_top_waiter !=rt_mutex_top_waiter (lock)) -wake_up_state (waiter->task, waiter->wake_state); + top_waiter =rt_mutex_top_waiter (lock); +if (prerequeue_top_waiter != top_waiter) +wake_up_state (top_waiter->task, top_waiter->wake_state);raw_spin_unlock_irq (&lock->wait_lock);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 60/67 arm64: dts: meson-gx: Make mmc host controller interrupts level-sensitive
In reply to Greg Kroah-HartmanFrom: Heiner Kallweit <[email protected]>
commit 66e45351f7d6798751f98001d1fcd572024d87f0 upstream.
The usage of edge-triggered interrupts lead to lost interrupts under load, see [0]. This was confirmed to be fixed by using level-triggered interrupts.
The report was about SDIO. However, as the host controller is the same for SD and MMC, apply the change to all mmc controller instances.
[0] https://www.spinics.net/lists/linux-mmc/msg73991.html
--- arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/amlogic/meson-gx.dtsi +3 -3
@@ -602,21 +602,21 @@ sd_emmc_a: mmc@70000 { compatible = "amlogic,meson-gx-mmc", "amlogic,meson-gxbb-mmc"; reg = <0x0 0x70000 0x0 0x800>; - interrupts = <GIC_SPI 216 IRQ_TYPE_EDGE_RISING>; + interrupts = <GIC_SPI 216 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; }; sd_emmc_b: mmc@72000 { compatible = "amlogic,meson-gx-mmc", "amlogic,meson-gxbb-mmc"; reg = <0x0 0x72000 0x0 0x800>; - interrupts = <GIC_SPI 217 IRQ_TYPE_EDGE_RISING>; + interrupts = <GIC_SPI 217 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; }; sd_emmc_c: mmc@74000 { compatible = "amlogic,meson-gx-mmc", "amlogic,meson-gxbb-mmc"; reg = <0x0 0x74000 0x0 0x800>; - interrupts = <GIC_SPI 218 IRQ_TYPE_EDGE_RISING>; + interrupts = <GIC_SPI 218 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; }; };
Greg Kroah-Hartman
maintainerPATCH 61/67 arm64: dts: meson-g12-common: Make mmc host controller interrupts level-sensitive
In reply to Greg Kroah-HartmanFrom: Heiner Kallweit <[email protected]>
commit ac8db4cceed218cca21c84f9d75ce88182d8b04f upstream.
The usage of edge-triggered interrupts lead to lost interrupts under load, see [0]. This was confirmed to be fixed by using level-triggered interrupts.
The report was about SDIO. However, as the host controller is the same for SD and MMC, apply the change to all mmc controller instances.
[0] https://www.spinics.net/lists/linux-mmc/msg73991.html
--- arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +3 -3
@@ -2330,7 +2330,7 @@ sd_emmc_a: sd@ffe03000 { compatible = "amlogic,meson-axg-mmc"; reg = <0x0 0xffe03000 0x0 0x800>; - interrupts = <GIC_SPI 189 IRQ_TYPE_EDGE_RISING>; + interrupts = <GIC_SPI 189 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; clocks = <&clkc CLKID_SD_EMMC_A>, <&clkc CLKID_SD_EMMC_A_CLK0>,
@@ -2342,7 +2342,7 @@ sd_emmc_b: sd@ffe05000 { compatible = "amlogic,meson-axg-mmc"; reg = <0x0 0xffe05000 0x0 0x800>; - interrupts = <GIC_SPI 190 IRQ_TYPE_EDGE_RISING>; + interrupts = <GIC_SPI 190 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; clocks = <&clkc CLKID_SD_EMMC_B>, <&clkc CLKID_SD_EMMC_B_CLK0>,
@@ -2354,7 +2354,7 @@ sd_emmc_c: mmc@ffe07000 { compatible = "amlogic,meson-axg-mmc"; reg = <0x0 0xffe07000 0x0 0x800>; - interrupts = <GIC_SPI 191 IRQ_TYPE_EDGE_RISING>; + interrupts = <GIC_SPI 191 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; clocks = <&clkc CLKID_SD_EMMC_C>, <&clkc CLKID_SD_EMMC_C_CLK0>,
Greg Kroah-Hartman
maintainerPATCH 62/67 arm64: dts: meson-axg: Make mmc host controller interrupts level-sensitive
In reply to Greg Kroah-HartmanFrom: Heiner Kallweit <[email protected]>
commit d182bcf300772d8b2e5f43e47fa0ebda2b767cc4 upstream.
The usage of edge-triggered interrupts lead to lost interrupts under load, see [0]. This was confirmed to be fixed by using level-triggered interrupts.
The report was about SDIO. However, as the host controller is the same for SD and MMC, apply the change to all mmc controller instances.
[0] https://www.spinics.net/lists/linux-mmc/msg73991.html
--- arch/arm64/boot/dts/amlogic/meson-axg.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/amlogic/meson-axg.dtsi +2 -2
@@ -1885,7 +1885,7 @@ sd_emmc_b: sd@5000 { compatible = "amlogic,meson-axg-mmc"; reg = <0x0 0x5000 0x0 0x800>; - interrupts = <GIC_SPI 217 IRQ_TYPE_EDGE_RISING>; + interrupts = <GIC_SPI 217 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; clocks = <&clkc CLKID_SD_EMMC_B>, <&clkc CLKID_SD_EMMC_B_CLK0>,
@@ -1897,7 +1897,7 @@ sd_emmc_c: mmc@7000 { compatible = "amlogic,meson-axg-mmc"; reg = <0x0 0x7000 0x0 0x800>; - interrupts = <GIC_SPI 218 IRQ_TYPE_EDGE_RISING>; + interrupts = <GIC_SPI 218 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; clocks = <&clkc CLKID_SD_EMMC_C>, <&clkc CLKID_SD_EMMC_C_CLK0>,
Greg Kroah-Hartman
maintainerPATCH 63/67 Fix page corruption caused by racy check in __free_pages
In reply to Greg Kroah-HartmanFrom: David Chen <[email protected]>
commit 462a8e08e0e6287e5ce13187257edbf24213ed03 upstream.
When we upgraded our kernel, we started seeing some page corruption like the following consistently:
BUG: Bad page state in process ganesha.nfsd pfn:1304ca page:0000000022261c55 refcount:0 mapcount:-128 mapping:0000000000000000 index:0x0 pfn:0x1304ca flags: 0x17ffffc0000000() raw: 0017ffffc0000000 ffff8a513ffd4c98 ffffeee24b35ec08 0000000000000000 raw: 0000000000000000 0000000000000001 00000000ffffff7f 0000000000000000 page dumped because: nonzero mapcount CPU: 0 PID: 15567 Comm: ganesha.nfsd Kdump: loaded Tainted: P B O 5.10.158-1.nutanix.20221209.el7.x86_64 #1 Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 04/05/2016 Call Trace: dump_stack+0x74/0x96 bad_page.cold+0x63/0x94 check_new_page_bad+0x6d/0x80 rmqueue+0x46e/0x970 get_page_from_freelist+0xcb/0x3f0 ? _cond_resched+0x19/0x40 __alloc_pages_nodemask+0x164/0x300 alloc_pages_current+0x87/0xf0 skb_page_frag_refill+0x84/0x110 ...
Sometimes, it would also show up as corruption in the free list pointer and cause crashes.
After bisecting the issue, we found the issue started from commit e320d3012d25 ("mm/page_alloc.c: fix freeing non-compound pages"):
if (put_page_testzero(page)) free_the_page(page, order); else if (!PageHead(page)) while (order-- > 0) free_the_page(page + (1 << order), order);
So the problem is the check PageHead is racy because at this point we already dropped our reference to the page. So even if we came in with compound page, the page can already be freed and PageHead can return false and we will end up freeing all the tail pages causing double free.
--- mm/page_alloc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
mm/page_alloc.c +4 -1
@@ -5490,9 +5490,12 @@ EXPORT_SYMBOL(get_zeroed_page);*/ void __free_pages (struct page *page,unsigned int order) { +/* get PageHead before we drop reference */ +int head =PageHead (page); +if (put_page_testzero (page))free_the_page (page, order); -else if (!PageHead (page)) +else if (!head)while (order-- >0 )free_the_page (page + (1 << order), order); }
Greg Kroah-Hartman
maintainerPATCH 64/67 drm/amdgpu/fence: Fix oops due to non-matching drm_sched init/fini
In reply to Greg Kroah-HartmanFrom: Guilherme G. Piccoli <[email protected]>
commit 5ad7bbf3dba5c4a684338df1f285080f2588b535 upstream.
Currently amdgpu calls drm_sched_fini() from the fence driver sw fini routine - such function is expected to be called only after the respective init function - drm_sched_init() - was executed successfully.
Happens that we faced a driver probe failure in the Steam Deck recently, and the function drm_sched_fini() was called even without its counter-part had been previously called, causing the following oops:
amdgpu: probe of 0000:04:00.0 failed with error -110
BUG: kernel NULL pointer dereference, address: 0000000000000090 PGD 0 P4D 0 Oops: 0002 [#1] PREEMPT SMP NOPTI CPU: 0 PID: 609 Comm: systemd-udevd Not tainted 6.2.0-rc3-gpiccoli #338 Hardware name: Valve Jupiter/Jupiter, BIOS F7A0113 11/04/2022 RIP: 0010:drm_sched_fini+0x84/0xa0 [gpu_sched] [...] Call Trace: <TASK> amdgpu_fence_driver_sw_fini+0xc8/0xd0 [amdgpu] amdgpu_device_fini_sw+0x2b/0x3b0 [amdgpu] amdgpu_driver_release_kms+0x16/0x30 [amdgpu] devm_drm_dev_init_release+0x49/0x70 [...]
To prevent that, check if the drm_sched was properly initialized for a given ring before calling its fini counter-part.
Notice ideally we'd use sched.ready for that; such field is set as the latest thing on drm_sched_init(). But amdgpu seems to "override" the meaning of such field - in the above oops for example, it was a GFX ring causing the crash, and the sched.ready field was set to true in the ring init routine, regardless of the state of the DRM scheduler. Hence, we ended-up using sched.ops as per Christian's suggestion [0], and also removed the no_scheduler check [1].
[0] https://lore.kernel.org/amd-gfx/[email protected]/
[1] https://lore.kernel.org/amd-gfx/[email protected]/
--- drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +7 -1
@@ -579,7 +579,13 @@ void amdgpu_fence_driver_sw_fini(structif (!ring || !ring->fence_drv.initialized)continue ; -if (!ring->no_scheduler) +/* +* Notice we check for sched.ops since there's some +* override on the meaning of sched.ready by amdgpu. +* The natural check would be sched.ready, which is +* set as drm_sched_init() finishes... +*/ +if (ring->sched.ops)drm_sched_fini (&ring->sched);for (j =0 ; j <= ring->fence_drv.num_fences_mask; ++j)
Greg Kroah-Hartman
maintainerPATCH 65/67 drm/i915: Initialize the obj flags for shmem objects
In reply to Greg Kroah-HartmanFrom: Aravind Iddamsetty <[email protected]>
commit 44e4c5684fcc82d8f099656c4ea39d9571e2a8ac upstream.
Obj flags for shmem objects is not being set correctly. Fixes in setting BO_ALLOC_USER flag which applies to shmem objs as well.
v2: Add fixes tag (Tvrtko, Matt A)
--- drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/i915/gem/i915_gem_shmem.c +1 -1
@@ -533,7 +533,7 @@ static int shmem_object_init(struct intemapping_set_gfp_mask (mapping, mask);GEM_BUG_ON (!(mapping_gfp_mask (mapping) & __GFP_RECLAIM)); -i915_gem_object_init (obj, &i915_gem_shmem_ops, &lock_class,0 ); +i915_gem_object_init (obj, &i915_gem_shmem_ops, &lock_class, flags); obj->mem_flags |=I915_BO_FLAG_STRUCT_PAGE ; obj->write_domain =I915_GEM_DOMAIN_CPU ; obj->read_domains =I915_GEM_DOMAIN_CPU ;
Greg Kroah-Hartman
maintainerPATCH 66/67 drm/i915: Fix VBT DSI DVO port handling
In reply to Greg Kroah-HartmanFrom: Ville Syrjälä <[email protected]>
commit 6a7ff131f17f44c593173c5ee30e2c03ef211685 upstream.
Turns out modern (icl+) VBTs still declare their DSI ports as MIPI-A and MIPI-C despite the PHYs now being A and B. Remap appropriately to allow the panels declared as MIPI-C to work.
--- drivers/gpu/drm/i915/display/intel_bios.c | 33 ++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-)
drivers/gpu/drm/i915/display/intel_bios.c +23 -10
@@ -1820,6 +1820,22 @@ static enum port dvo_port_to_port(struct dvo_port); } +static enum port +dsi_dvo_port_to_port (struct drm_i915_private *i915,u8 dvo_port) +{ +switch (dvo_port) { +case DVO_PORT_MIPIA : +return PORT_A ; +case DVO_PORT_MIPIC : +if (DISPLAY_VER (i915) >=11 ) +return PORT_B ; +else +return PORT_C ; +default : +return PORT_NONE ; + } +} +static int parse_bdb_230_dp_max_link_rate (const int vbt_max_link_rate) {switch (vbt_max_link_rate) {
@@ -2733,19 +2749,16 @@ bool intel_bios_is_dsi_present(struct dr dvo_port = child->dvo_port; -if (dvo_port ==DVO_PORT_MIPIA || - (dvo_port ==DVO_PORT_MIPIB &&DISPLAY_VER (i915) >=11 ) || - (dvo_port ==DVO_PORT_MIPIC &&DISPLAY_VER (i915) <11 )) { -if (port) - *port = dvo_port -DVO_PORT_MIPIA ; -return true; - }else if (dvo_port ==DVO_PORT_MIPIB || - dvo_port ==DVO_PORT_MIPIC || - dvo_port ==DVO_PORT_MIPID ) { +if (dsi_dvo_port_to_port (i915, dvo_port) ==PORT_NONE ) {drm_dbg_kms (&i915->drm,"VBT has unsupported DSI port %c\n" ,port_name (dvo_port -DVO_PORT_MIPIA )); +continue ; } + +if (port) + *port =dsi_dvo_port_to_port (i915, dvo_port); +return true; }return false;
@@ -2830,7 +2843,7 @@ bool intel_bios_get_dsc_params(struct inif (!(child->device_type &DEVICE_TYPE_MIPI_OUTPUT ))continue ; -if (child->dvo_port -DVO_PORT_MIPIA == encoder->port) { +if (dsi_dvo_port_to_port (i915, child->dvo_port) == encoder->port) {if (!devdata->dsc)return false;
Greg Kroah-Hartman
maintainerPATCH 67/67 nvmem: core: fix return value
In reply to Greg Kroah-HartmanFrom: Russell King (Oracle) <[email protected]>
commit 0c4862b1c1465e473bc961a02765490578bf5c20 upstream.
Dan Carpenter points out that the return code was not set in commit 60c8b4aebd8e ("nvmem: core: fix cleanup after dev_set_name()"), but this is not the only issue - we also need to zero wp_gpio to prevent gpiod_put() being called on an error value.
--- drivers/nvmem/core.c | 1 + 1 file changed, 1 insertion(+)
drivers/nvmem/core.c +1 -0
@@ -779,6 +779,7 @@ struct nvmem_device *nvmem_register(cons GPIOD_OUT_HIGH);if (IS_ERR (nvmem->wp_gpio)) { rval =PTR_ERR (nvmem->wp_gpio); + nvmem->wp_gpio =NULL ; goto err_put_device; }
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.94 release. There are 67 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Feb 2023 14:46:51 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.94-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit kernels, build tested on BMIPS_GENERIC:
Signature · 1 line
Florian
Quoted 9 lines
This is the start of the stable review cycle for the 5.15.94 release. There are 67 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Feb 2023 14:46:51 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.94-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my x86_64 and ARM64 test systems. No errors or regressions.
Thanks.
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.94 release. There are 67 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Feb 2023 14:46:51 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.94-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.94 release. There are 67 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.
Successfully cross-compiled for arm64 (bcm2711_defconfig, GCC 10.2.0) and powerpc (ps3_defconfig, GCC 12.2.0).
Signature · 1 line
An old man doll... just what I always wanted! - Clara
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.94 release. There are 67 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Feb 2023 14:46:51 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.94-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
## Build
* kernel: 5.15.94-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-5.15.y
* git commit: 2bf3e29e9db2a8b1c8bc73dab34b09b09991ad11
* git describe: v5.15.93-68-g2bf3e29e9db2
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.15.y/build/v5.15.93-68-g2bf3e29e9db2
## Test Regressions (compared to v5.15.93)
## Metric Regressions (compared to v5.15.93)
## Test Fixes (compared to v5.15.93)
## Metric Fixes (compared to v5.15.93)
## Test result summary
total: 162222, pass: 135364, fail: 4592, skip: 21911, xfail: 355
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 149 total, 148 passed, 1 failed
* arm64: 49 total, 47 passed, 2 failed
* i386: 39 total, 35 passed, 4 failed
* mips: 31 total, 29 passed, 2 failed
* parisc: 8 total, 8 passed, 0 failed
* powerpc: 34 total, 32 passed, 2 failed
* riscv: 14 total, 14 passed, 0 failed
* s390: 16 total, 14 passed, 2 failed
* sh: 14 total, 12 passed, 2 failed
* sparc: 8 total, 8 passed, 0 failed
* x86_64: 42 total, 40 passed, 2 failed
## Test suites summary
* boot
* fwts
* igt-gpu-tools
* kselftest-android
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers-dma-buf
* kselftest-efivarfs
* kselftest-filesystems
* kselftest-filesystems-binderfs
* kselftest-firmware
* kselftest-fpu
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-kvm
* kselftest-lib
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-net
* kselftest-net-forwarding
* kselftest-net-mptcp
* kselftest-netfilter
* kselftest-nsfs
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-splice
* kselftest-static_keys
* kselftest-sync
* kselftest-sysctl
* kselftest-tc-testing
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-vm
* kselftest-x86
* kselftest-zram
* kunit
* kvm-unit-tests
* libgpiod
* libhugetlbfs
* log-parser-boot
* log-parser-test
* ltp-cap_bounds
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-filecaps
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-fsx
* ltp-hugetlb
* ltp-io
* ltp-ipc
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-open-posix-tests
* ltp-pty
* ltp-sched
* ltp-securebits
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* network-basic-tests
* packetdrill
* perf
* rcutorture
* v4l2-compliance
* vdso
--
Linaro LKFT
https://lkft.linaro.org
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.94 release. There are 67 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Feb 2023 14:46:51 +0000. Anything received after that time might be too late.
Build test (gcc version 12.2.1 20230210):
mips: 62 configs -> no failure
arm: 99 configs -> no failure
arm64: 3 configs -> no failurex86_64: 4 configs -> no failure
alpha allmodconfig -> no failure
csky allmodconfig -> no failure
powerpc allmodconfig -> no failure
riscv allmodconfig -> no failure
s390 allmodconfig -> no failure
xtensa allmodconfig -> no failure
Boot test:x86_64: Booted on my test laptop. No regression.x86_64: Booted on qemu. No regression. [1]
arm64: Booted on rpi4b (4GB model). No regression. [2]
mips: Booted on ci20 board. No regression. [3]
[1]. https://openqa.qa.codethink.co.uk/tests/2852
[2]. https://openqa.qa.codethink.co.uk/tests/2858
[3]. https://openqa.qa.codethink.co.uk/tests/2860
Signature · 2 lines
Regards Sudip
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.94 release. There are 67 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Feb 2023 14:46:51 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.94-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.94 release. There are 67 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Feb 2023 14:46:51 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.94-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v5.15:
11 builds: 11 pass, 0 fail
28 boots: 28 pass, 0 fail
114 tests: 114 pass, 0 failLinux version: 5.15.94-rc1-g2bf3e29e9db2
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Jon