5.15.76-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 5.15.76-rc1 review
This is the start of the stable review cycle for the 5.15.76 release. There are 79 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 29 Oct 2022 16:50:35 +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.76-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.76-rc1
Seth Jenkins <[email protected]>
mm: /proc/pid/smaps_rollup: fix no vma's null-deref
Avri Altman <[email protected]>
mmc: core: Add SD card quirk for broken discard
Nick Desaulniers <[email protected]>
Makefile.debug: re-enable debug info for .S files
Nathan Chancellor <[email protected]>
x86/Kconfig: Drop check for -mabi=ms for CONFIG_EFI_STUB
Werner Sembach <[email protected]>
ACPI: video: Force backlight native for more TongFang devices
Rob Herring <[email protected]>
perf: Skip and warn on unknown format 'configN' attrs
Prathamesh Shete <[email protected]>
mmc: sdhci-tegra: Use actual clock rate for SW tuning correction
Steven Rostedt (Google) <[email protected]>
tracing: Do not free snapshot if tracer is on cmdline
sunliming <[email protected]>
tracing: Simplify conditional compilation code in tracing_set_tracer()
Namjae Jeon <[email protected]>
ksmbd: fix incorrect handling of iterate_dir
Namjae Jeon <[email protected]>
ksmbd: handle smb2 query dir request for OutputBufferLength that is too small
Peter Collingbourne <[email protected]>
arm64: mte: move register initialization to C
Alexander Aring <[email protected]>
fs: dlm: fix invalid derefence of sb_lvbptr
Jerry Snitselaar <[email protected]>
iommu/vt-d: Clean up si_domain in the init_dmars() error path
Charlotte Tan <[email protected]>
iommu/vt-d: Allow NVS regions in arch_rmrr_sanity_check()
Felix Riemann <[email protected]>
net: phy: dp83822: disable MDI crossover status change interrupt
Eric Dumazet <[email protected]>
net: sched: fix race condition in qdisc_graft()
Yang Yingliang <[email protected]>
net: hns: fix possible memory leak in hnae_ae_register()
Yang Yingliang <[email protected]>
wwan_hwsim: fix possible memory leak in wwan_hwsim_dev_new()
Pieter Jansen van Vuuren <[email protected]>
sfc: include vport_id in filter spec hash and equal()
Zhengchao Shao <[email protected]>
net: sched: sfb: fix null pointer access issue when sfb_init() fails
Zhengchao Shao <[email protected]>
net: sched: delete duplicate cleanup of backlog and qlen
Zhengchao Shao <[email protected]>
net: sched: cake: fix null pointer access issue when cake_init() fails
Sagi Grimberg <[email protected]>
nvmet: fix workqueue MEM_RECLAIM flushing dependency
Serge Semin <[email protected]>
nvme-hwmon: kmalloc the NVME SMART log buffer
Christoph Hellwig <[email protected]>
nvme-hwmon: consistently ignore errors from nvme_hwmon_init
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: relax NFTA_SET_ELEM_KEY_END set flags requirements
Brett Creeley <[email protected]>
ionic: catch NULL pointer issue on reconfig
Eric Dumazet <[email protected]>
net: hsr: avoid possible NULL deref in skb_clone()
Genjian Zhang <[email protected]>
dm: remove unnecessary assignment statement in alloc_dev()
Zhang Xiaoxu <[email protected]>
cifs: Fix xid leak in cifs_ses_add_channel()
Zhang Xiaoxu <[email protected]>
cifs: Fix xid leak in cifs_flock()
Zhang Xiaoxu <[email protected]>
cifs: Fix xid leak in cifs_copy_file_range()
Zhang Xiaoxu <[email protected]>
cifs: Fix xid leak in cifs_create()
Kuniyuki Iwashima <[email protected]>
udp: Update reuse->has_conns under reuseport_lock.
Rafael Mendonca <[email protected]>
scsi: lpfc: Fix memory leak in lpfc_create_port()
Shenwei Wang <[email protected]>
net: phylink: add mac_managed_pm in phylink_config structure
Harini Katakam <[email protected]>
net: phy: dp83867: Extend RX strap quirk for SGMII mode
Xiaobo Liu <[email protected]>
net/atm: fix proc_mpc_write incorrect return value
Jonathan Cooper <[email protected]>
sfc: Change VF mac via PF as first preference if available.
José Expósito <[email protected]>
HID: magicmouse: Do not set BTN_MOUSE on double report
Jan Sokolowski <[email protected]>
i40e: Fix DMA mappings leak
Alexander Potapenko <[email protected]>
tipc: fix an information leak in tipc_topsrv_kern_subscr
Mark Tomlinson <[email protected]>
tipc: Fix recognition of trial period
Tony Luck <[email protected]>
ACPI: extlog: Handle multiple records
Maxime Ripard <[email protected]>
drm/vc4: Add module dependency on hdmi-codec
Filipe Manana <[email protected]>
btrfs: fix processing of delayed tree block refs during backref walking
Filipe Manana <[email protected]>
btrfs: fix processing of delayed data refs during backref walking
Zhang Rui <[email protected]>
x86/topology: Fix duplicated core ID within a package
Zhang Rui <[email protected]>
x86/topology: Fix multiple packages shown on a single-package system
Bryan O'Donoghue <[email protected]>
media: venus: dec: Handle the case where find_format fails
Sean Young <[email protected]>
media: mceusb: set timeout to at least timeout provided
Sakari Ailus <[email protected]>
media: ipu3-imgu: Fix NULL pointer dereference in active selection access
Eric Ren <[email protected]>
KVM: arm64: vgic: Fix exit condition in scan_its_table()
Alexander Graf <[email protected]>
kvm: Add support for arch compat vm ioctls
Rik van Riel <[email protected]>
mm,hugetlb: take hugetlb_lock before decrementing h->resv_huge_pages
Alex Deucher <[email protected]>
drm/amdgpu: fix sdma doorbell init ordering on APUs
Fabien Parent <[email protected]>
cpufreq: qcom: fix memory leak in error path
Babu Moger <[email protected]>
x86/resctrl: Fix min_cbm_bits for AMD
Kai-Heng Feng <[email protected]>
ata: ahci: Match EM_MAX_SLOTS with SATA_PMP_MAX_PORTS
Alexander Stein <[email protected]>
ata: ahci-imx: Fix MODULE_ALIAS
Zhang Rui <[email protected]>
hwmon/coretemp: Handle large core ID value
Borislav Petkov <[email protected]>
x86/microcode/AMD: Apply the patch early on every logical thread
Jon Hunter <[email protected]>
cpufreq: tegra194: Fix module loading
Bryan O'Donoghue <[email protected]>
i2c: qcom-cci: Fix ordering of pm_runtime_xx and i2c_add_adapter
Fabien Parent <[email protected]>
cpufreq: qcom: fix writes in read-only memory region
GONG, Ruiqi <[email protected]>
selinux: enable use of both GFP_KERNEL and GFP_ATOMIC in convert_context()
Joseph Qi <[email protected]>
ocfs2: fix BUG when iput after ocfs2_mknod fails
Joseph Qi <[email protected]>
ocfs2: clear dinode links count in case of error
Qu Wenruo <[email protected]>
btrfs: enhance unsupported compat RO flags handling
Adrian Hunter <[email protected]>
perf/x86/intel/pt: Relax address filter validation
James Morse <[email protected]>
arm64: errata: Remove AES hwcap for COMPAT tasks
Michael Grzeschik <[email protected]>
usb: gadget: uvc: improve sg exit condition
Michael Grzeschik <[email protected]>
usb: gadget: uvc: giveback vb2 buffer on req complete
Michael Grzeschik <[email protected]>
usb: gadget: uvc: rework uvcg_queue_next_buffer to uvcg_complete_buffer
Michael Grzeschik <[email protected]>
usb: gadget: uvc: use on returned header len in video_encode_isoc_sg
Michael Grzeschik <[email protected]>
usb: gadget: uvc: consistently use define for headerlen
Anshuman Khandual <[email protected]>
arm64/mm: Consolidate TCR_EL1 fields
Jean-Francois Le Fillatre <[email protected]>
r8152: add PID for the Lenovo OneLink+ Dock
-------------
Diffstat:
Documentation/arm64/silicon-errata.rst | 4 ++ Makefile | 8 +-- arch/arm64/Kconfig | 16 ++++++ arch/arm64/include/asm/mte.h | 5 ++ arch/arm64/include/asm/pgtable-hwdef.h | 2 + arch/arm64/include/asm/sysreg.h | 4 -- arch/arm64/kernel/cpu_errata.c | 16 ++++++ arch/arm64/kernel/cpufeature.c | 17 ++++++- arch/arm64/kernel/mte.c | 51 +++++++++++++++++++ arch/arm64/kernel/suspend.c | 2 + arch/arm64/kvm/vgic/vgic-its.c | 5 +- arch/arm64/mm/proc.S | 48 +++--------------- arch/arm64/tools/cpucaps | 1 + arch/x86/Kconfig | 1 - arch/x86/events/intel/pt.c | 63 ++++++++++++++++++----- arch/x86/include/asm/iommu.h | 4 +- arch/x86/kernel/cpu/microcode/amd.c | 16 ++++-- arch/x86/kernel/cpu/resctrl/core.c | 8 +-- arch/x86/kernel/cpu/topology.c | 16 ++++-- drivers/acpi/acpi_extlog.c | 33 +++++++----- drivers/acpi/video_detect.c | 64 +++++++++++++++++++++++ drivers/ata/ahci.h | 2 +- drivers/ata/ahci_imx.c | 2 +- drivers/cpufreq/qcom-cpufreq-nvmem.c | 10 ++-- drivers/cpufreq/tegra194-cpufreq.c | 1 + drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 5 -- drivers/gpu/drm/amd/amdgpu/soc15.c | 21 ++++++++ drivers/gpu/drm/vc4/vc4_drv.c | 1 + drivers/hid/hid-magicmouse.c | 2 +- drivers/hwmon/coretemp.c | 56 +++++++++++++++------ drivers/i2c/busses/i2c-qcom-cci.c | 13 +++-- drivers/iommu/intel/iommu.c | 5 ++ drivers/md/dm.c | 1 - drivers/media/platform/qcom/venus/vdec.c | 2 + drivers/media/rc/mceusb.c | 2 +- drivers/mmc/core/block.c | 7 ++- drivers/mmc/core/card.h | 6 +++ drivers/mmc/core/quirks.h | 6 +++ drivers/mmc/host/sdhci-tegra.c | 2 +- drivers/net/ethernet/hisilicon/hns/hnae.c | 4 +- drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 3 -- drivers/net/ethernet/intel/i40e/i40e_main.c | 16 +++--- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 13 ++--- drivers/net/ethernet/intel/i40e/i40e_txrx.h | 1 - drivers/net/ethernet/intel/i40e/i40e_xsk.c | 67 ++++++++++++++++++++++--- drivers/net/ethernet/intel/i40e/i40e_xsk.h | 2 +- drivers/net/ethernet/pensando/ionic/ionic_lif.c | 12 +++-- drivers/net/ethernet/sfc/ef10.c | 58 +++++++++------------ drivers/net/ethernet/sfc/filter.h | 3 +- drivers/net/ethernet/sfc/rx_common.c | 10 ++-- drivers/net/phy/dp83822.c | 3 +- drivers/net/phy/dp83867.c | 8 +++ drivers/net/phy/phylink.c | 3 ++ drivers/net/usb/cdc_ether.c | 7 +++ drivers/net/usb/r8152.c | 3 ++ drivers/net/wwan/wwan_hwsim.c | 2 +- drivers/nvme/host/core.c | 6 ++- drivers/nvme/host/hwmon.c | 32 ++++++++---- drivers/nvme/target/core.c | 2 +- drivers/scsi/lpfc/lpfc_init.c | 7 +-- drivers/staging/media/ipu3/ipu3-v4l2.c | 31 ++++++------ drivers/usb/gadget/function/uvc.h | 5 +- drivers/usb/gadget/function/uvc_queue.c | 15 +----- drivers/usb/gadget/function/uvc_queue.h | 2 +- drivers/usb/gadget/function/uvc_video.c | 35 ++++++++----- drivers/usb/gadget/function/uvc_video.h | 2 - fs/btrfs/backref.c | 46 +++++++++++------ fs/btrfs/block-group.c | 11 +++- fs/btrfs/super.c | 9 ++++ fs/cifs/cifsfs.c | 7 ++- fs/cifs/dir.c | 6 ++- fs/cifs/file.c | 11 ++-- fs/cifs/sess.c | 1 + fs/dlm/lock.c | 2 +- fs/ksmbd/smb2pdu.c | 24 +++++---- fs/ocfs2/namei.c | 23 ++++----- fs/proc/task_mmu.c | 2 +- include/linux/kvm_host.h | 2 + include/linux/mmc/card.h | 1 + include/linux/phylink.h | 2 + include/net/sch_generic.h | 1 - include/net/sock_reuseport.h | 11 ++-- kernel/trace/trace.c | 12 ++--- mm/hugetlb.c | 2 +- net/atm/mpoa_proc.c | 3 +- net/core/sock_reuseport.c | 16 ++++++ net/hsr/hsr_forward.c | 12 ++--- net/ipv4/datagram.c | 2 +- net/ipv4/udp.c | 2 +- net/ipv6/datagram.c | 2 +- net/ipv6/udp.c | 2 +- net/netfilter/nf_tables_api.c | 5 +- net/sched/sch_api.c | 5 +- net/sched/sch_atm.c | 1 - net/sched/sch_cake.c | 4 ++ net/sched/sch_cbq.c | 1 - net/sched/sch_choke.c | 2 - net/sched/sch_drr.c | 2 - net/sched/sch_dsmark.c | 2 - net/sched/sch_etf.c | 3 -- net/sched/sch_ets.c | 2 - net/sched/sch_fq_codel.c | 2 - net/sched/sch_fq_pie.c | 3 -- net/sched/sch_hfsc.c | 2 - net/sched/sch_htb.c | 2 - net/sched/sch_multiq.c | 1 - net/sched/sch_prio.c | 2 - net/sched/sch_qfq.c | 2 - net/sched/sch_red.c | 2 - net/sched/sch_sfb.c | 5 +- net/sched/sch_skbprio.c | 3 -- net/sched/sch_taprio.c | 2 - net/sched/sch_tbf.c | 2 - net/sched/sch_teql.c | 1 - net/tipc/discover.c | 2 +- net/tipc/topsrv.c | 2 +- security/selinux/ss/services.c | 5 +- security/selinux/ss/sidtab.c | 4 +- security/selinux/ss/sidtab.h | 2 +- tools/perf/util/parse-events.c | 3 ++ tools/perf/util/pmu.c | 17 +++++++ tools/perf/util/pmu.h | 2 + tools/perf/util/pmu.l | 2 - tools/perf/util/pmu.y | 15 ++---- virt/kvm/kvm_main.c | 11 ++++ 125 files changed, 808 insertions(+), 405 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/79 r8152: add PID for the Lenovo OneLink+ Dock
From: Jean-Francois Le Fillatre <[email protected]>
commit 1bd3a383075c64d638e65d263c9267b08ee7733c upstream.
The Lenovo OneLink+ Dock contains an RTL8153 controller that behaves as a broken CDC device by default. Add the custom Lenovo PID to the r8152 driver to support it properly.
Also, systems compatible with this dock provide a BIOS option to enable MAC address passthrough (as per Lenovo document "ThinkPad Docking Solutions 2017"). Add the custom PID to the MAC passthrough list too.
Tested on a ThinkPad 13 1st gen with the expected results:
passthrough disabled: Invalid header when reading pass-thru MAC addr passthrough enabled: Using pass-thru MAC addr XX:XX:XX:XX:XX:XX
--- drivers/net/usb/cdc_ether.c | 7 +++++++ drivers/net/usb/r8152.c | 3 +++ 2 files changed, 10 insertions(+)
drivers/net/usb/cdc_ether.c +7 -0
@@ -776,6 +776,13 @@ static const struct usb_device_id produc },#endif +/* Lenovo ThinkPad OneLink+ Dock (based on Realtek RTL8153) */ +{ +USB_DEVICE_AND_INTERFACE_INFO (LENOVO_VENDOR_ID ,0x3054 ,USB_CLASS_COMM , + USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), + .driver_info =0 , +}, + /* ThinkPad USB-C Dock (based on Realtek RTL8153) */ { USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3062, USB_CLASS_COMM,
drivers/net/usb/r8152.c +3 -0
@@ -770,6 +770,7 @@ enum rtl8152_flags { RX_EPROTO, }; +#define DEVICE_ID_THINKPAD_ONELINK_PLUS_DOCK 0x3054#define DEVICE_ID_THINKPAD_THUNDERBOLT3_DOCK_GEN2 0x3082#define DEVICE_ID_THINKPAD_USB_C_DOCK_GEN2 0xa387
@@ -9651,6 +9652,7 @@ static int rtl8152_probe(struct usb_inteif (le16_to_cpu (udev->descriptor.idVendor) ==VENDOR_ID_LENOVO ) {switch (le16_to_cpu (udev->descriptor.idProduct)) { +case DEVICE_ID_THINKPAD_ONELINK_PLUS_DOCK :case DEVICE_ID_THINKPAD_THUNDERBOLT3_DOCK_GEN2 :case DEVICE_ID_THINKPAD_USB_C_DOCK_GEN2 : tp->lenovo_macpassthru =1 ;
@@ -9809,6 +9811,7 @@ static const struct usb_device_id rtl815REALTEK_USB_DEVICE (VENDOR_ID_MICROSOFT ,0x0927 ),REALTEK_USB_DEVICE (VENDOR_ID_SAMSUNG ,0xa101 ),REALTEK_USB_DEVICE (VENDOR_ID_LENOVO ,0x304f ), +REALTEK_USB_DEVICE (VENDOR_ID_LENOVO ,0x3054 ),REALTEK_USB_DEVICE (VENDOR_ID_LENOVO ,0x3062 ),REALTEK_USB_DEVICE (VENDOR_ID_LENOVO ,0x3069 ), REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3082),
Greg Kroah-Hartman
maintainerPATCH 2/79 arm64/mm: Consolidate TCR_EL1 fields
In reply to Greg Kroah-HartmanFrom: Anshuman Khandual <[email protected]>
commit e921da6bc7cac5f0e8458fe5df18ae08eb538f54 upstream.
This renames and moves SYS_TCR_EL1_TCMA1 and SYS_TCR_EL1_TCMA0 definitions into pgtable-hwdef.h thus consolidating all TCR fields in a single header. This does not cause any functional change.
--- arch/arm64/include/asm/pgtable-hwdef.h | 2 ++ arch/arm64/include/asm/sysreg.h | 4 ---- arch/arm64/mm/proc.S | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-)
arch/arm64/include/asm/pgtable-hwdef.h +2 -0
@@ -273,6 +273,8 @@#define TCR_NFD1 (UL(1) << 54)#define TCR_E0PD0 (UL(1) << 55)#define TCR_E0PD1 (UL(1) << 56) +#define TCR_TCMA0 (UL(1) << 57) +#define TCR_TCMA1 (UL(1) << 58)/* * TTBR.
arch/arm64/include/asm/sysreg.h +0 -4
@@ -1094,10 +1094,6 @@#define CPACR_EL1_ZEN_EL0EN (BIT(17))/* enable EL0 access, if EL1EN set */ #define CPACR_EL1_ZEN (CPACR_EL1_ZEN_EL1EN | CPACR_EL1_ZEN_EL0EN) -/* TCR EL1 Bit Definitions */ -#define SYS_TCR_EL1_TCMA1 (BIT(58)) -#define SYS_TCR_EL1_TCMA0 (BIT(57)) -/* GCR_EL1 Definitions */ #define SYS_GCR_EL1_RRND (BIT(16))#define SYS_GCR_EL1_EXCL_MASK 0xffffUL
arch/arm64/mm/proc.S +1 -1
@@ -46,7 +46,7 @@ #endif #ifdef CONFIG_KASAN_HW_TAGS -#define TCR_MTE_FLAGS SYS_TCR_EL1_TCMA1 | TCR_TBI1 | TCR_TBID1 +#define TCR_MTE_FLAGS TCR_TCMA1 | TCR_TBI1 | TCR_TBID1 #else /* * The mte_zero_clear_page_tags() implementation uses DC GZVA, which relies on
Greg Kroah-Hartman
maintainerPATCH 3/79 usb: gadget: uvc: consistently use define for headerlen
In reply to Greg Kroah-HartmanFrom: Michael Grzeschik <[email protected]>
commit 859c675d84d488e2f9b515c713ea890c9f045f0c upstream.
The uvc request headerlen of 2 was defined as UVCG_REQUEST_HEADER_LEN in commit e81e7f9a0eb9 ("usb: gadget: uvc: add scatter gather support"). We missed to use it consistently. This patch fixes that.
--- drivers/usb/gadget/function/uvc.h | 4 +++- drivers/usb/gadget/function/uvc_video.c | 6 +++--- drivers/usb/gadget/function/uvc_video.h | 2 -- 3 files changed, 6 insertions(+), 6 deletions(-)
drivers/usb/gadget/function/uvc.h +3 -1
@@ -69,6 +69,8 @@ extern unsigned int uvc_gadget_trace_par#define UVC_MAX_REQUEST_SIZE 64#define UVC_MAX_EVENTS 4 +#define UVCG_REQUEST_HEADER_LEN 2 +/* ------------------------------------------------------------------------ * Structures */
@@ -77,7 +79,7 @@ struct uvc_request {u8 *req_buffer;struct uvc_video *video;struct sg_table sgt; -u8 header[2 ]; +u8 header[UVCG_REQUEST_HEADER_LEN ]; };struct uvc_video {
drivers/usb/gadget/function/uvc_video.c +3 -3
@@ -33,7 +33,7 @@ uvc_video_encode_header(struct uvc_videoif (buf->bytesused - video->queue.buf_used <= len -UVCG_REQUEST_HEADER_LEN ) data[1 ] |=UVC_STREAM_EOF ; -return 2 ; +return UVCG_REQUEST_HEADER_LEN ; } static int
@@ -302,8 +302,8 @@ uvc_video_alloc_requests(struct uvc_videlist_add_tail (&video->ureq[i].req->list, &video->req_free);/* req_size/PAGE_SIZE + 1 for overruns and + 1 for header */ sg_alloc_table (&video->ureq[i].sgt, -DIV_ROUND_UP (req_size -2 ,PAGE_SIZE ) +2 , -GFP_KERNEL ); +DIV_ROUND_UP (req_size -UVCG_REQUEST_HEADER_LEN , +PAGE_SIZE ) +2 ,GFP_KERNEL ); } video->req_size = req_size;
drivers/usb/gadget/function/uvc_video.h +0 -2
@@ -12,8 +12,6 @@#ifndef __UVC_VIDEO_H__#define __UVC_VIDEO_H__ -#define UVCG_REQUEST_HEADER_LEN 2 -struct uvc_video ;int uvcg_video_enable (struct uvc_video *video,int enable);
Greg Kroah-Hartman
maintainerPATCH 4/79 usb: gadget: uvc: use on returned header len in video_encode_isoc_sg
In reply to Greg Kroah-HartmanFrom: Michael Grzeschik <[email protected]>
commit f262ce66d40cc6858d1fcb11e7b7f960448a4f38 upstream.
The function uvc_video_encode_header function returns the number of bytes used for the header. We change the video_encode_isoc_sg function to use the returned header_len rather than UVCG_REQUEST_HEADER_LEN and make the encode function more flexible.
--- drivers/usb/gadget/function/uvc_video.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/usb/gadget/function/uvc_video.c +6 -6
@@ -104,22 +104,22 @@ uvc_video_encode_isoc_sg(struct usb_requunsigned int len = video->req_size;unsigned int sg_left, part =0 ;unsigned int i; -int ret; +int header_len; sg = ureq->sgt.sgl;sg_init_table (sg, ureq->sgt.nents);/* Init the header. */ - ret =uvc_video_encode_header (video, buf, ureq->header, + header_len =uvc_video_encode_header (video, buf, ureq->header, video->req_size); -sg_set_buf (sg, ureq->header,UVCG_REQUEST_HEADER_LEN ); - len -= ret; +sg_set_buf (sg, ureq->header, header_len); + len -= header_len;if (pending <= len) len = pending; req->length = (len == pending) ? - len +UVCG_REQUEST_HEADER_LEN : video->req_size; + len + header_len : video->req_size;/* Init the pending sgs with payload */ sg =sg_next (sg);
@@ -148,7 +148,7 @@ uvc_video_encode_isoc_sg(struct usb_requ req->num_sgs = i +1 ; req->length -= len; - video->queue.buf_used += req->length -UVCG_REQUEST_HEADER_LEN ; + video->queue.buf_used += req->length - header_len;if (buf->bytesused == video->queue.buf_used || !buf->sg) { video->queue.buf_used =0 ;
Greg Kroah-Hartman
maintainerPATCH 5/79 usb: gadget: uvc: rework uvcg_queue_next_buffer to uvcg_complete_buffer
In reply to Greg Kroah-HartmanFrom: Michael Grzeschik <[email protected]>
commit 61aa709ca58a0dbeeb817bfa9230c1a92979f2c6 upstream.
The function uvcg_queue_next_buffer is used different than its name suggests. The return value nextbuf is never used by any caller. This patch reworks the function to its actual purpose, by removing the unused code and renaming it. The function name uvcg_complete_buffer makes it more clear that it is actually marking the current video buffer as complete.
--- drivers/usb/gadget/function/uvc_queue.c | 13 ++----------- drivers/usb/gadget/function/uvc_queue.h | 2 +- drivers/usb/gadget/function/uvc_video.c | 6 +++--- 3 files changed, 6 insertions(+), 15 deletions(-)
drivers/usb/gadget/function/uvc_queue.c +2 -11
@@ -335,24 +335,17 @@ int uvcg_queue_enable(struct uvc_video_q }/* called with &queue_irqlock held.. */ -struct uvc_buffer *uvcg_queue_next_buffer (struct uvc_video_queue *queue, +void uvcg_complete_buffer (struct uvc_video_queue *queue,struct uvc_buffer *buf) { -struct uvc_buffer *nextbuf; -if ((queue->flags &UVC_QUEUE_DROP_INCOMPLETE ) && buf->length != buf->bytesused) { buf->state =UVC_BUF_STATE_QUEUED ;vb2_set_plane_payload (&buf->buf.vb2_buf,0 ,0 ); -return buf; +return ; }list_del (&buf->queue); -if (!list_empty (&queue->irqqueue)) - nextbuf = list_first_entry(&queue->irqqueue, struct uvc_buffer, - queue); -else - nextbuf =NULL ; buf->buf.field =V4L2_FIELD_NONE ; buf->buf.sequence = queue->sequence++;
@@ -360,8 +353,6 @@ struct uvc_buffer *uvcg_queue_next_buffevb2_set_plane_payload (&buf->buf.vb2_buf,0 , buf->bytesused);vb2_buffer_done (&buf->buf.vb2_buf,VB2_BUF_STATE_DONE ); - -return nextbuf; }struct uvc_buffer *uvcg_queue_head (struct uvc_video_queue *queue)
drivers/usb/gadget/function/uvc_queue.h +1 -1
@@ -93,7 +93,7 @@ void uvcg_queue_cancel(struct uvc_video_int uvcg_queue_enable (struct uvc_video_queue *queue,int enable); -struct uvc_buffer *uvcg_queue_next_buffer (struct uvc_video_queue *queue, +void uvcg_complete_buffer (struct uvc_video_queue *queue,struct uvc_buffer *buf);struct uvc_buffer *uvcg_queue_head (struct uvc_video_queue *queue);
drivers/usb/gadget/function/uvc_video.c +3 -3
@@ -83,7 +83,7 @@ uvc_video_encode_bulk(struct usb_requestif (buf->bytesused == video->queue.buf_used) { video->queue.buf_used =0 ; buf->state =UVC_BUF_STATE_DONE ; -uvcg_queue_next_buffer (&video->queue, buf); +uvcg_complete_buffer (&video->queue, buf); video->fid ^=UVC_STREAM_FID ; video->payload_size =0 ;
@@ -154,7 +154,7 @@ uvc_video_encode_isoc_sg(struct usb_requ video->queue.buf_used =0 ; buf->state =UVC_BUF_STATE_DONE ; buf->offset =0 ; -uvcg_queue_next_buffer (&video->queue, buf); +uvcg_complete_buffer (&video->queue, buf); video->fid ^=UVC_STREAM_FID ; } }
@@ -181,7 +181,7 @@ uvc_video_encode_isoc(struct usb_requestif (buf->bytesused == video->queue.buf_used) { video->queue.buf_used =0 ; buf->state =UVC_BUF_STATE_DONE ; -uvcg_queue_next_buffer (&video->queue, buf); +uvcg_complete_buffer (&video->queue, buf); video->fid ^=UVC_STREAM_FID ; } }
Greg Kroah-Hartman
maintainerPATCH 6/79 usb: gadget: uvc: giveback vb2 buffer on req complete
In reply to Greg Kroah-HartmanFrom: Michael Grzeschik <[email protected]>
commit 9b969f93bcef9b3d9e92f1810e22bbd6c344a0e5 upstream.
On uvc_video_encode_isoc_sg the mapped vb2 buffer is returned to early. Only after the last usb_request worked with the buffer it is allowed to give it back to vb2. This patch fixes that.
--- drivers/usb/gadget/function/uvc.h | 1 + drivers/usb/gadget/function/uvc_queue.c | 2 -- drivers/usb/gadget/function/uvc_video.c | 11 ++++++++++- 3 files changed, 11 insertions(+), 3 deletions(-)
drivers/usb/gadget/function/uvc.h +1 -0
@@ -80,6 +80,7 @@ struct uvc_request {struct uvc_video *video;struct sg_table sgt;u8 header[UVCG_REQUEST_HEADER_LEN ]; +struct uvc_buffer *last_buf; };struct uvc_video {
drivers/usb/gadget/function/uvc_queue.c +0 -2
@@ -345,8 +345,6 @@ void uvcg_complete_buffer(struct uvc_vidreturn ; } -list_del (&buf->queue); - buf->buf.field =V4L2_FIELD_NONE ; buf->buf.sequence = queue->sequence++; buf->buf.vb2_buf.timestamp =ktime_get_ns ();
drivers/usb/gadget/function/uvc_video.c +10 -1
@@ -83,6 +83,7 @@ uvc_video_encode_bulk(struct usb_requestif (buf->bytesused == video->queue.buf_used) { video->queue.buf_used =0 ; buf->state =UVC_BUF_STATE_DONE ; +list_del (&buf->queue);uvcg_complete_buffer (&video->queue, buf); video->fid ^=UVC_STREAM_FID ;
@@ -154,8 +155,9 @@ uvc_video_encode_isoc_sg(struct usb_requ video->queue.buf_used =0 ; buf->state =UVC_BUF_STATE_DONE ; buf->offset =0 ; -uvcg_complete_buffer (&video->queue, buf); +list_del (&buf->queue); video->fid ^=UVC_STREAM_FID ; + ureq->last_buf = buf; } }
@@ -181,6 +183,7 @@ uvc_video_encode_isoc(struct usb_requestif (buf->bytesused == video->queue.buf_used) { video->queue.buf_used =0 ; buf->state =UVC_BUF_STATE_DONE ; +list_del (&buf->queue);uvcg_complete_buffer (&video->queue, buf); video->fid ^=UVC_STREAM_FID ; }
@@ -231,6 +234,11 @@ uvc_video_complete(struct usb_ep *ep, stuvcg_queue_cancel (queue,0 ); } +if (ureq->last_buf) { +uvcg_complete_buffer (&video->queue, ureq->last_buf); + ureq->last_buf =NULL ; + } +spin_lock_irqsave (&video->req_lock, flags);list_add_tail (&req->list, &video->req_free);spin_unlock_irqrestore (&video->req_lock, flags);
@@ -298,6 +306,7 @@ uvc_video_alloc_requests(struct uvc_vide video->ureq[i].req->complete = uvc_video_complete; video->ureq[i].req->context = &video->ureq[i]; video->ureq[i].video = video; + video->ureq[i].last_buf =NULL ;list_add_tail (&video->ureq[i].req->list, &video->req_free);/* req_size/PAGE_SIZE + 1 for overruns and + 1 for header */
Greg Kroah-Hartman
maintainerPATCH 7/79 usb: gadget: uvc: improve sg exit condition
In reply to Greg Kroah-HartmanFrom: Michael Grzeschik <[email protected]>
commit aef11279888c00e1841a3533a35d279285af3a51 upstream.
The exit condition to quit iterating over the sg_list, while encoding the sg entries, has to consider the case that the dma_len of the entry could be zero. This patch takes this condition to account.
--- drivers/usb/gadget/function/uvc_video.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/function/uvc_video.c +1 -1
@@ -126,7 +126,7 @@ uvc_video_encode_isoc_sg(struct usb_requ sg =sg_next (sg);for_each_sg (sg, iter, ureq->sgt.nents -1 , i) { -if (!len || !buf->sg) +if (!len || !buf->sg || !sg_dma_len (buf->sg))break ; sg_left =sg_dma_len (buf->sg) - buf->offset;
Greg Kroah-Hartman
maintainerPATCH 8/79 arm64: errata: Remove AES hwcap for COMPAT tasks
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit 44b3834b2eed595af07021b1c64e6f9bc396398b upstream.
Cortex-A57 and Cortex-A72 have an erratum where an interrupt that occurs between a pair of AES instructions in aarch32 mode may corrupt the ELR. The task will subsequently produce the wrong AES result.
The AES instructions are part of the cryptographic extensions, which are optional. User-space software will detect the support for these instructions from the hwcaps. If the platform doesn't support these instructions a software implementation should be used.
Remove the hwcap bits on affected parts to indicate user-space should not use the AES instructions.
--- Documentation/arm64/silicon-errata.rst | 4 ++++ arch/arm64/Kconfig | 16 ++++++++++++++++ arch/arm64/kernel/cpu_errata.c | 16 ++++++++++++++++ arch/arm64/kernel/cpufeature.c | 14 +++++++++++++- arch/arm64/tools/cpucaps | 1 + 5 files changed, 50 insertions(+), 1 deletion(-)
Documentation/arm64/silicon-errata.rst +4 -0
@@ -78,10 +78,14 @@ stable kernels. +----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A57 | #1319537 | ARM64_ERRATUM_1319367 | +----------------+-----------------+-----------------+-----------------------------+ +| ARM | Cortex-A57 | #1742098 | ARM64_ERRATUM_1742098 | ++----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A72 | #853709 | N/A | +----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A72 | #1319367 | ARM64_ERRATUM_1319367 | +----------------+-----------------+-----------------+-----------------------------+ +| ARM | Cortex-A72 | #1655431 | ARM64_ERRATUM_1742098 | ++----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A73 | #858921 | ARM64_ERRATUM_858921 | +----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A76 | #1188873,1418040| ARM64_ERRATUM_1418040 |
arch/arm64/Kconfig +16 -0
@@ -487,6 +487,22 @@ config ARM64_ERRATUM_834220 If unsure, say Y. +config ARM64_ERRATUM_1742098 + bool "Cortex-A57/A72: 1742098: ELR recorded incorrectly on interrupt taken between cryptographic instructions in a sequence" + depends on COMPAT + default y + help + This option removes the AES hwcap for aarch32 user-space to + workaround erratum 1742098 on Cortex-A57 and Cortex-A72. + + Affected parts may corrupt the AES state if an interrupt is + taken between a pair of AES instructions. These instructions + are only present if the cryptography extensions are present. + All software should have a fallback implementation for CPUs + that don't implement the cryptography extensions. + + If unsure, say Y. + config ARM64_ERRATUM_845719 bool "Cortex-A53: 845719: a load might read incorrect data" depends on COMPAT
arch/arm64/kernel/cpu_errata.c +16 -0
@@ -355,6 +355,14 @@ static const struct midr_range erratum_1 };#endif +#ifdef CONFIG_ARM64_ERRATUM_1742098 +static struct midr_range broken_aarch32_aes[] = { +MIDR_RANGE (MIDR_CORTEX_A57 ,0 ,1 ,0xf ,0xf ), +MIDR_ALL_VERSIONS (MIDR_CORTEX_A72 ), + {}, +}; +#endif + const struct arm64_cpu_capabilities arm64_errata[] = {#ifdef CONFIG_ARM64_WORKAROUND_CLEAN_CACHE {
@@ -565,6 +573,14 @@ const struct arm64_cpu_capabilities arm6 CAP_MIDR_RANGE(MIDR_CORTEX_A510, 0, 0, 1, 1) },#endif +#ifdef CONFIG_ARM64_ERRATUM_1742098 + { + .desc = "ARM erratum 1742098", + .capability = ARM64_WORKAROUND_1742098, + CAP_MIDR_RANGE_LIST(broken_aarch32_aes), + .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM, + }, +#endif { } };
arch/arm64/kernel/cpufeature.c +13 -1
@@ -79,6 +79,7 @@#include <asm/cpufeature.h> #include <asm/cpu_ops.h> #include <asm/fpsimd.h> +#include <asm/hwcap.h> #include <asm/insn.h> #include <asm/kvm_host.h> #include <asm/mmu_context.h>
@@ -1915,6 +1916,14 @@ static void cpu_enable_mte(struct arm64_ }#endif /* CONFIG_ARM64_MTE */ +static void elf_hwcap_fixup (void ) +{ +#ifdef CONFIG_ARM64_ERRATUM_1742098 +if (cpus_have_const_cap (ARM64_WORKAROUND_1742098 )) + compat_elf_hwcap2 &= ~COMPAT_HWCAP2_AES ; +#endif /* ARM64_ERRATUM_1742098 */ +} +#ifdef CONFIG_KVM static bool is_kvm_protected_mode (const struct arm64_cpu_capabilities *entry,int __unused) {
@@ -2942,8 +2951,10 @@ void __init setup_cpu_features(void)setup_system_capabilities ();setup_elf_hwcaps (arm64_elf_hwcaps); -if (system_supports_32bit_el0 ()) +if (system_supports_32bit_el0 ()) {setup_elf_hwcaps (compat_elf_hwcaps); +elf_hwcap_fixup (); + }if (system_uses_ttbr0_pan ())pr_info ("emulated: Privileged Access Never (PAN) using TTBR0_EL1 switching\n" );
@@ -2995,6 +3006,7 @@ static int enable_mismatched_32bit_el0(u cpu_active_mask);get_cpu_device (lucky_winner)->offline_disabled = true;setup_elf_hwcaps (compat_elf_hwcaps); +elf_hwcap_fixup ();pr_info ("Asymmetric 32-bit EL0 support detected on CPU %u; CPU hot-unplug disabled on CPU %u\n" , cpu, lucky_winner);return 0 ;
arch/arm64/tools/cpucaps +1 -0
@@ -54,6 +54,7 @@ WORKAROUND_1418040 WORKAROUND_1463225 WORKAROUND_1508412 WORKAROUND_1542419 +WORKAROUND_1742098 WORKAROUND_2457168 WORKAROUND_CAVIUM_23154 WORKAROUND_CAVIUM_27456
Greg Kroah-Hartman
maintainerPATCH 9/79 perf/x86/intel/pt: Relax address filter validation
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
commit c243cecb58e3905baeace8827201c14df8481e2a upstream.
The requirement for 64-bit address filters is that they are canonical addresses. In other respects any address range is allowed which would include user space addresses.
That can be useful for tracing virtual machine guests because address filtering can be used to advantage in place of current privilege level (CPL) filtering.
--- arch/x86/events/intel/pt.c | 63 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 13 deletions(-)
arch/x86/events/intel/pt.c +50 -13
@@ -13,6 +13,8 @@#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt#include <linux/types.h> +#include <linux/bits.h> +#include <linux/limits.h> #include <linux/slab.h> #include <linux/device.h>
@@ -1348,11 +1350,37 @@ static void pt_addr_filters_fini(struct event->hw.addr_filters =NULL ; } -static inline bool valid_kernel_ip (unsigned long ip) +#ifdef CONFIG_X86_64 +static u64 canonical_address (u64 vaddr,u8 vaddr_bits) { -return virt_addr_valid (ip) &&kernel_ip (ip); +return ((s64 )vaddr << (64 - vaddr_bits)) >> (64 - vaddr_bits); } +static u64 is_canonical_address (u64 vaddr,u8 vaddr_bits) +{ +return canonical_address (vaddr, vaddr_bits) == vaddr; +} + +/* Clamp to a canonical address greater-than-or-equal-to the address given */ +static u64 clamp_to_ge_canonical_addr (u64 vaddr,u8 vaddr_bits) +{ +return is_canonical_address (vaddr, vaddr_bits) ? + vaddr : + -BIT_ULL (vaddr_bits -1 ); +} + +/* Clamp to a canonical address less-than-or-equal-to the address given */ +static u64 clamp_to_le_canonical_addr (u64 vaddr,u8 vaddr_bits) +{ +return is_canonical_address (vaddr, vaddr_bits) ? + vaddr : +BIT_ULL (vaddr_bits -1 ) -1 ; +} +#else +#define clamp_to_ge_canonical_addr (x, y) (x) +#define clamp_to_le_canonical_addr (x, y) (x) +#endif +static int pt_event_addr_filters_validate (struct list_head *filters) {struct perf_addr_filter *filter;
@@ -1367,14 +1395,6 @@ static int pt_event_addr_filters_validat filter->action == PERF_ADDR_FILTER_ACTION_START) return -EOPNOTSUPP; -if (!filter->path.dentry) { -if (!valid_kernel_ip (filter->offset)) -return -EINVAL ; - -if (!valid_kernel_ip (filter->offset + filter->size)) -return -EINVAL ; - } -if (++range >intel_pt_validate_hw_cap (PT_CAP_num_address_ranges))return -EOPNOTSUPP ; }
@@ -1398,9 +1418,26 @@ static void pt_event_addr_filters_sync(sif (filter->path.dentry && !fr[range].start) { msr_a = msr_b =0 ; }else { -/* apply the offset */ - msr_a = fr[range].start; - msr_b = msr_a + fr[range].size -1 ; +unsigned long n = fr[range].size -1 ; +unsigned long a = fr[range].start; +unsigned long b; + +if (a >ULONG_MAX - n) + b =ULONG_MAX ; +else + b = a + n; +/* +* Apply the offset. 64-bit addresses written to the +* MSRs must be canonical, but the range can encompass +* non-canonical addresses. Since software cannot +* execute at non-canonical addresses, adjusting to +* canonical addresses does not affect the result of the +* address filter. +*/ + msr_a =clamp_to_ge_canonical_addr (a, boot_cpu_data.x86_virt_bits); + msr_b =clamp_to_le_canonical_addr (b, boot_cpu_data.x86_virt_bits); +if (msr_b < msr_a) + msr_a = msr_b =0 ; } filters->filter[range].msr_a = msr_a;
Greg Kroah-Hartman
maintainerPATCH 10/79 btrfs: enhance unsupported compat RO flags handling
In reply to Greg Kroah-HartmanFrom: Qu Wenruo <[email protected]>
commit 81d5d61454c365718655cfc87d8200c84e25d596 upstream.
Currently there are two corner cases not handling compat RO flags correctly:
- Remount
We can still mount the fs RO with compat RO flags, then remount it RW. We should not allow any write into a fs with unsupported RO flags.
- Still try to search block group items
In fact, behavior/on-disk format change to extent tree should not need a full incompat flag.
And since we can ensure fs with unsupported RO flags never got any writes (with above case fixed), then we can even skip block group items search at mount time.
This patch will enhance the unsupported RO compat flags by:
- Reject read-write remount if there are unsupported RO compat flags
- Go dummy block group items directly for unsupported RO compat flags In fact, only changes to chunk/subvolume/root/csum trees should go incompat flags.
The latter part should allow future change to extent tree to be compat RO flags.
Thus this patch also needs to be backported to all stable trees.
--- fs/btrfs/block-group.c | 11 ++++++++++- fs/btrfs/super.c | 9 +++++++++ 2 files changed, 19 insertions(+), 1 deletion(-)
fs/btrfs/block-group.c +10 -1
@@ -2139,7 +2139,16 @@ int btrfs_read_block_groups(struct btrfsint need_clear =0 ;u64 cache_gen; -if (!info->extent_root) +/* +* Either no extent root (with ibadroots rescue option) or we have +* unsupported RO options. The fs can never be mounted read-write, so no +* need to waste time searching block group items. +* +* This also allows new extent tree related changes to be RO compat, +* no need for a full incompat flag. +*/ +if (!info->extent_root || (btrfs_super_compat_ro_flags (info->super_copy) & + ~BTRFS_FEATURE_COMPAT_RO_SUPP ))return fill_dummy_bgs (info); key.objectid =0 ;
fs/btrfs/super.c +9 -0
@@ -2048,6 +2048,15 @@ static int btrfs_remount(struct super_bl ret = -EINVAL ; goto restore; } +if (btrfs_super_compat_ro_flags (fs_info->super_copy) & + ~BTRFS_FEATURE_COMPAT_RO_SUPP ) { +btrfs_err (fs_info, +"can not remount read-write due to unsupported optional flags 0x%llx" , +btrfs_super_compat_ro_flags (fs_info->super_copy) & + ~BTRFS_FEATURE_COMPAT_RO_SUPP ); + ret = -EINVAL ; + goto restore; + }if (fs_info->fs_devices->rw_devices ==0 ) { ret = -EACCES ; goto restore;
Greg Kroah-Hartman
maintainerPATCH 11/79 ocfs2: clear dinode links count in case of error
In reply to Greg Kroah-HartmanFrom: Joseph Qi <[email protected]>
commit 28f4821b1b53e0649706912e810c6c232fc506f9 upstream.
In ocfs2_mknod(), if error occurs after dinode successfully allocated, ocfs2 i_links_count will not be 0.
So even though we clear inode i_nlink before iput in error handling, it still won't wipe inode since we'll refresh inode from dinode during inode lock. So just like clear inode i_nlink, we clear ocfs2 i_links_count as well. Also do the same change for ocfs2_symlink().
--- fs/ocfs2/namei.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
fs/ocfs2/namei.c +10 -2
@@ -231,6 +231,7 @@ static int ocfs2_mknod(struct user_nameshandle_t *handle =NULL ;struct ocfs2_super *osb;struct ocfs2_dinode *dirfe; +struct ocfs2_dinode *fe =NULL ;struct buffer_head *new_fe_bh =NULL ;struct inode *inode =NULL ;struct ocfs2_alloc_context *inode_ac =NULL ;
@@ -381,6 +382,7 @@ static int ocfs2_mknod(struct user_names goto leave; } + fe = (struct ocfs2_dinode *) new_fe_bh->b_data;if (S_ISDIR (mode)) { status =ocfs2_fill_new_dir (osb, handle, dir, inode, new_fe_bh, data_ac, meta_ac);
@@ -453,8 +455,11 @@ roll_back: leave:if (status <0 && did_quota_inode)dquot_free_inode (inode); -if (handle) +if (handle) { +if (status <0 && fe) +ocfs2_set_links_count (fe,0 );ocfs2_commit_trans (osb, handle); + }ocfs2_inode_unlock (dir,1 );if (did_block_signals)
@@ -2027,8 +2032,11 @@ bail: ocfs2_clusters_to_bytes(osb->sb, 1));if (status <0 && did_quota_inode)dquot_free_inode (inode); -if (handle) +if (handle) { +if (status <0 && fe) +ocfs2_set_links_count (fe,0 );ocfs2_commit_trans (osb, handle); + }ocfs2_inode_unlock (dir,1 );if (did_block_signals)
Greg Kroah-Hartman
maintainerPATCH 12/79 ocfs2: fix BUG when iput after ocfs2_mknod fails
In reply to Greg Kroah-HartmanFrom: Joseph Qi <[email protected]>
commit 759a7c6126eef5635506453e9b9d55a6a3ac2084 upstream.
Commit b1529a41f777 "ocfs2: should reclaim the inode if '__ocfs2_mknod_locked' returns an error" tried to reclaim the claimed inode if __ocfs2_mknod_locked() fails later. But this introduce a race, the freed bit may be reused immediately by another thread, which will update dinode, e.g. i_generation. Then iput this inode will lead to BUG:inode->i_generation != le32_to_cpu(fe->i_generation)
We could make this inode as bad, but we did want to do operations like wipe in some cases. Since the claimed inode bit can only affect that an dinode is missing and will return back after fsck, it seems not a big problem. So just leave it as is by revert the reclaim logic.
--- fs/ocfs2/namei.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-)
fs/ocfs2/namei.c +1 -10
@@ -636,18 +636,9 @@ static int ocfs2_mknod_locked(struct ocfreturn status; } - status =__ocfs2_mknod_locked (dir, inode, dev, new_fe_bh, +return __ocfs2_mknod_locked (dir, inode, dev, new_fe_bh, parent_fe_bh, handle, inode_ac, fe_blkno, suballoc_loc, suballoc_bit); -if (status <0 ) { -u64 bg_blkno =ocfs2_which_suballoc_group (fe_blkno, suballoc_bit); -int tmp =ocfs2_free_suballoc_bits (handle, inode_ac->ac_inode, - inode_ac->ac_bh, suballoc_bit, bg_blkno,1 ); -if (tmp) -mlog_errno (tmp); - } - -return status; } static int ocfs2_mkdir(struct user_namespace *mnt_userns,
Greg Kroah-Hartman
maintainerPATCH 13/79 selinux: enable use of both GFP_KERNEL and GFP_ATOMIC in convert_context()
In reply to Greg Kroah-HartmanFrom: GONG, Ruiqi <[email protected]>
commit abe3c631447dcd1ba7af972fe6f054bee6f136fa upstream.
The following warning was triggered on a hardware environment:
SELinux: Converting 162 SID table entries...
BUG: sleeping function called from invalid context at
__might_sleep+0x60/0x74 0x0
in_atomic(): 1, irqs_disabled(): 128, non_block: 0, pid: 5943, name: tar
CPU: 7 PID: 5943 Comm: tar Tainted: P O 5.10.0 #1
Call trace:
dump_backtrace+0x0/0x1c8
show_stack+0x18/0x28
dump_stack+0xe8/0x15c
___might_sleep+0x168/0x17c
__might_sleep+0x60/0x74
__kmalloc_track_caller+0xa0/0x7dc
kstrdup+0x54/0xac
convert_context+0x48/0x2e4
sidtab_context_to_sid+0x1c4/0x36c
security_context_to_sid_core+0x168/0x238
security_context_to_sid_default+0x14/0x24
inode_doinit_use_xattr+0x164/0x1e4
inode_doinit_with_dentry+0x1c0/0x488
selinux_d_instantiate+0x20/0x34
security_d_instantiate+0x70/0xbc
d_splice_alias+0x4c/0x3c0
ext4_lookup+0x1d8/0x200 [ext4]
__lookup_slow+0x12c/0x1e4
walk_component+0x100/0x200
path_lookupat+0x88/0x118
filename_lookup+0x98/0x130
user_path_at_empty+0x48/0x60
vfs_statx+0x84/0x140
vfs_fstatat+0x20/0x30
__se_sys_newfstatat+0x30/0x74
__arm64_sys_newfstatat+0x1c/0x2c
el0_svc_common.constprop.0+0x100/0x184
do_el0_svc+0x1c/0x2c
el0_svc+0x20/0x34
el0_sync_handler+0x80/0x17c
el0_sync+0x13c/0x140
SELinux: Context system_u:object_r:pssp_rsyslog_log_t:s0:c0 is
not valid (left unmapped).It was found that within a critical section of spin_lock_irqsave in sidtab_context_to_sid(), convert_context() (hooked by sidtab_convert_params.func) might cause the process to sleep via allocating memory with GFP_KERNEL, which is problematic.
As Ondrej pointed out [1], convert_context()/sidtab_convert_params.func has another caller sidtab_convert_tree(), which is okay with GFP_KERNEL. Therefore, fix this problem by adding a gfp_t argument for convert_context()/sidtab_convert_params.func and pass GFP_KERNEL/_ATOMIC properly in individual callers.
--- security/selinux/ss/services.c | 5 +++-- security/selinux/ss/sidtab.c | 4 ++-- security/selinux/ss/sidtab.h | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-)
security/selinux/ss/services.c +3 -2
@@ -2021,7 +2021,8 @@ static inline int convert_context_handle* in `newc'. Verify that the context is valid * under the new policy. */ -static int convert_context (struct context *oldc,struct context *newc,void *p) +static int convert_context (struct context *oldc,struct context *newc,void *p, +gfp_t gfp_flags) {struct convert_context_args *args;struct ocontext *oc;
@@ -2035,7 +2036,7 @@ static int convert_context(struct contex args = p;if (oldc->str) { - s =kstrdup (oldc->str,GFP_KERNEL ); + s =kstrdup (oldc->str, gfp_flags);if (!s)return -ENOMEM ;
security/selinux/ss/sidtab.c +2 -2
@@ -325,7 +325,7 @@ int sidtab_context_to_sid(struct sidtab } rc = convert->func (context, &dst_convert->context, - convert->args); + convert->args,GFP_ATOMIC );if (rc) {context_destroy (&dst->context); goto out_unlock;
@@ -404,7 +404,7 @@ static int sidtab_convert_tree(union sidwhile (i <SIDTAB_LEAF_ENTRIES && *pos < count) { rc = convert->func (&esrc->ptr_leaf->entries[i].context, &edst->ptr_leaf->entries[i].context, - convert->args); + convert->args,GFP_KERNEL );if (rc)return rc; (*pos)++;
security/selinux/ss/sidtab.h +1 -1
@@ -65,7 +65,7 @@ struct sidtab_isid_entry { };struct sidtab_convert_params { -int (*func)(struct context *oldc,struct context *newc,void *args); +int (*func)(struct context *oldc,struct context *newc,void *args,gfp_t gfp_flags);void *args;struct sidtab *target; };
Greg Kroah-Hartman
maintainerPATCH 14/79 cpufreq: qcom: fix writes in read-only memory region
In reply to Greg Kroah-HartmanFrom: Fabien Parent <[email protected]>
commit 01039fb8e90c9cb684430414bff70cea9eb168c5 upstream.
This commit fixes a kernel oops because of a write in some read-only memory:
[ 9.068287] Unable to handle kernel write to read-only memory at virtual address ffff800009240ad8 ..snip.. [ 9.138790] Internal error: Oops: 9600004f [#1] PREEMPT SMP ..snip.. [ 9.269161] Call trace: [ 9.276271] __memcpy+0x5c/0x230 [ 9.278531] snprintf+0x58/0x80 [ 9.282002] qcom_cpufreq_msm8939_name_version+0xb4/0x190 [ 9.284869] qcom_cpufreq_probe+0xc8/0x39c ..snip..
The following line defines a pointer that point to a char buffer stored in read-only memory:
char *pvs_name = "speedXX-pvsXX-vXX";
This pointer is meant to hold a template "speedXX-pvsXX-vXX" where the XX values get overridden by the qcom_cpufreq_krait_name_version function. Since the template is actually stored in read-only memory, when the function executes the following call we get an oops:
snprintf(*pvs_name, sizeof("speedXX-pvsXX-vXX"), "speed%d-pvs%d-v%d",
speed, pvs, pvs_ver);To fix this issue, we instead store the template name onto the stack by using the following syntax:
char pvs_name_buffer[] = "speedXX-pvsXX-vXX";
Because the pvs_name needs to be able to be assigned to NULL, the template buffer is stored in the pvs_name_buffer and not under the pvs_name variable.
--- drivers/cpufreq/qcom-cpufreq-nvmem.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/cpufreq/qcom-cpufreq-nvmem.c +2 -1
@@ -264,7 +264,8 @@ static int qcom_cpufreq_probe(struct plastruct nvmem_cell *speedbin_nvmem;struct device_node *np;struct device *cpu_dev; -char *pvs_name ="speedXX-pvsXX-vXX" ; +char pvs_name_buffer[] ="speedXX-pvsXX-vXX" ; +char *pvs_name = pvs_name_buffer;unsigned cpu;const struct of_device_id *match;int ret;
Greg Kroah-Hartman
maintainerPATCH 15/79 i2c: qcom-cci: Fix ordering of pm_runtime_xx and i2c_add_adapter
In reply to Greg Kroah-HartmanFrom: Bryan O'Donoghue <[email protected]>
commit 61775d54d674ff8ec3658495e0dbc537227dc5c1 upstream.
When we compile-in the CCI along with the imx412 driver and run on the RB5 we see that i2c_add_adapter() causes the probe of the imx412 driver to happen.
This probe tries to perform an i2c xfer() and the xfer() in i2c-qcom-cci.c fails on pm_runtime_get() because the i2c-qcom-cci.c::probe() function has not completed to pm_runtime_enable(dev).
Fix this sequence by ensuring pm_runtime_xxx() calls happen prior to adding the i2c adapter.
--- drivers/i2c/busses/i2c-qcom-cci.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
drivers/i2c/busses/i2c-qcom-cci.c +8 -5
@@ -638,6 +638,11 @@ static int cci_probe(struct platform_devif (ret <0 ) goto error; +pm_runtime_set_autosuspend_delay (dev,MSEC_PER_SEC ); +pm_runtime_use_autosuspend (dev); +pm_runtime_set_active (dev); +pm_runtime_enable (dev); +for (i =0 ; i < cci->data->num_masters; i++) {if (!cci->master[i].cci)continue ;
@@ -649,14 +654,12 @@ static int cci_probe(struct platform_dev } } -pm_runtime_set_autosuspend_delay (dev,MSEC_PER_SEC ); -pm_runtime_use_autosuspend (dev); -pm_runtime_set_active (dev); -pm_runtime_enable (dev); -return 0 ; error_i2c: +pm_runtime_disable (dev); +pm_runtime_dont_use_autosuspend (dev); +for (--i ; i >=0 ; i--) {if (cci->master[i].cci) {i2c_del_adapter (&cci->master[i].adap);
Greg Kroah-Hartman
maintainerPATCH 16/79 cpufreq: tegra194: Fix module loading
In reply to Greg Kroah-HartmanFrom: Jon Hunter <[email protected]>
commit 1dcaf30725c32b26daa70d22083999972ab99c29 upstream.
When the Tegra194 CPUFREQ driver is built as a module it is not automatically loaded as expected on Tegra194 devices. Populate the MODULE_DEVICE_TABLE to fix this.
--- drivers/cpufreq/tegra194-cpufreq.c | 1 + 1 file changed, 1 insertion(+)
drivers/cpufreq/tegra194-cpufreq.c +1 -0
@@ -279,6 +279,7 @@ static struct cpufreq_driver tegra194_cp .init = tegra194_cpufreq_init, .attr = cpufreq_generic_attr, }; +MODULE_DEVICE_TABLE (of, tegra194_cpufreq_of_match);static void tegra194_cpufreq_free_resources (void ) {
Greg Kroah-Hartman
maintainerPATCH 17/79 x86/microcode/AMD: Apply the patch early on every logical thread
In reply to Greg Kroah-HartmanFrom: Borislav Petkov <[email protected]>
commit e7ad18d1169c62e6c78c01ff693fd362d9d65278 upstream.
Currently, the patch application logic checks whether the revision needs to be applied on each logical CPU (SMT thread). Therefore, on SMT designs where the microcode engine is shared between the two threads, the application happens only on one of them as that is enough to update the shared microcode engine.
However, there are microcode patches which do per-thread modification, see Link tag below.
Therefore, drop the revision check and try applying on each thread. This is what the BIOS does too so this method is very much tested.
Btw, change only the early paths. On the late loading paths, there's no point in doing per-thread modification because if is it some case like in the bugzilla below - removing a CPUID flag - the kernel cannot go and un-use features it has detected are there early. For that, one should use early loading anyway.
[ bp: Fixes does not contain the oldest commit which did check for
equality but that is good enough. ]
--- arch/x86/kernel/cpu/microcode/amd.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
arch/x86/kernel/cpu/microcode/amd.c +13 -3
@@ -440,7 +440,13 @@ apply_microcode_early_amd(u32 cpuid_1_eareturn ret;native_rdmsr (MSR_AMD64_PATCH_LEVEL , rev, dummy); -if (rev >= mc->hdr.patch_id) + +/* +* Allow application of the same revision to pick up SMT-specific +* changes even if the revision of the other SMT thread is already +* up-to-date. +*/ +if (rev > mc->hdr.patch_id)return ret;if (!__apply_microcode_amd (mc)) {
@@ -522,8 +528,12 @@ void load_ucode_amd_ap(unsigned int cpuinative_rdmsr (MSR_AMD64_PATCH_LEVEL , rev, dummy); -/* Check whether we have saved a new patch already: */ -if (*new_rev && rev < mc->hdr.patch_id) { +/* +* Check whether a new patch has been saved already. Also, allow application of +* the same revision in order to pick up SMT-thread-specific configuration even +* if the sibling SMT thread already has an up-to-date revision. +*/ +if (*new_rev && rev <= mc->hdr.patch_id) {if (!__apply_microcode_amd (mc)) { *new_rev = mc->hdr.patch_id;return ;
Greg Kroah-Hartman
maintainerPATCH 18/79 hwmon/coretemp: Handle large core ID value
In reply to Greg Kroah-HartmanFrom: Zhang Rui <[email protected]>
commit 7108b80a542b9d65e44b36d64a700a83658c0b73 upstream.
The coretemp driver supports up to a hard-coded limit of 128 cores.
Today, the driver can not support a core with an ID above that limit. Yet, the encoding of core ID's is arbitrary (BIOS APIC-ID) and so they may be sparse and they may be large.
Update the driver to map arbitrary core ID numbers into appropriate array indexes so that 128 cores can be supported, no matter the encoding of core ID's.
--- drivers/hwmon/coretemp.c | 56 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 15 deletions(-)
drivers/hwmon/coretemp.c +41 -15
@@ -46,9 +46,6 @@ MODULE_PARM_DESC(tjmax, "TjMax value in#define TOTAL_ATTRS (MAX_CORE_ATTRS + 1)#define MAX_CORE_DATA (NUM_REAL_CORES + BASE_SYSFS_ATTR_NO) -#define TO_CORE_ID (cpu) (cpu_data(cpu).cpu_core_id) -#define TO_ATTR_NO (cpu) (TO_CORE_ID(cpu) + BASE_SYSFS_ATTR_NO) -#ifdef CONFIG_SMP #define for_each_sibling (i, cpu) \ for_each_cpu(i, topology_sibling_cpumask(cpu))
@@ -91,6 +88,8 @@ struct temp_data {struct platform_data {struct device *hwmon_dev;u16 pkg_id; +u16 cpu_map[NUM_REAL_CORES ]; +struct ida ida;struct cpumask cpumask;struct temp_data *core_data[MAX_CORE_DATA ];struct device_attribute name_attr;
@@ -441,7 +440,7 @@ static struct temp_data *init_temp_data(MSR_IA32_THERM_STATUS ; tdata->is_pkg_data = pkg_flag; tdata->cpu = cpu; - tdata->cpu_core_id =TO_CORE_ID (cpu); + tdata->cpu_core_id =topology_core_id (cpu); tdata->attr_size =MAX_CORE_ATTRS ;mutex_init (&tdata->update_lock);return tdata;
@@ -454,7 +453,7 @@ static int create_core_data(struct platfstruct platform_data *pdata =platform_get_drvdata (pdev);struct cpuinfo_x86 *c = &cpu_data (cpu);u32 eax, edx; -int err, attr_no; +int err, index, attr_no;/* * Find attr number for sysfs:
@@ -462,14 +461,26 @@ static int create_core_data(struct platf* The attr number is always core id + 2 * The Pkgtemp will always show up as temp1_*, if available */ - attr_no = pkg_flag ?PKG_SYSFS_ATTR_NO :TO_ATTR_NO (cpu); +if (pkg_flag) { + attr_no =PKG_SYSFS_ATTR_NO ; + }else { + index =ida_alloc (&pdata->ida,GFP_KERNEL ); +if (index <0 ) +return index; + pdata->cpu_map[index] =topology_core_id (cpu); + attr_no = index +BASE_SYSFS_ATTR_NO ; + } -if (attr_no >MAX_CORE_DATA -1 ) -return -ERANGE ; +if (attr_no >MAX_CORE_DATA -1 ) { + err = -ERANGE ; + goto ida_free; + } tdata =init_temp_data (cpu, pkg_flag); -if (!tdata) -return -ENOMEM ; +if (!tdata) { + err = -ENOMEM ; + goto ida_free; + }/* Test if we can access the status register */ err =rdmsr_safe_on_cpu (cpu, tdata->status_reg, &eax, &edx);
@@ -505,6 +516,9 @@ static int create_core_data(struct platf exit_free: pdata->core_data[attr_no] =NULL ;kfree (tdata); +ida_free: +if (!pkg_flag) +ida_free (&pdata->ida, index);return err; }
@@ -524,6 +538,9 @@ static void coretemp_remove_core(structkfree (pdata->core_data[indx]); pdata->core_data[indx] =NULL ; + +if (indx >=BASE_SYSFS_ATTR_NO ) +ida_free (&pdata->ida, indx -BASE_SYSFS_ATTR_NO ); }static int coretemp_probe (struct platform_device *pdev)
@@ -537,6 +554,7 @@ static int coretemp_probe(struct platforreturn -ENOMEM ; pdata->pkg_id = pdev->id; +ida_init (&pdata->ida);platform_set_drvdata (pdev, pdata); pdata->hwmon_dev = devm_hwmon_device_register_with_groups(dev, DRVNAME,
@@ -553,6 +571,7 @@ static int coretemp_remove(struct platfoif (pdata->core_data[i])coretemp_remove_core (pdata, i); +ida_destroy (&pdata->ida);return 0 ; }
@@ -647,7 +666,7 @@ static int coretemp_cpu_offline(unsignedstruct platform_device *pdev =coretemp_get_pdev (cpu);struct platform_data *pd;struct temp_data *tdata; -int indx, target; +int i, indx =-1 , target;/* * Don't execute this on suspend as the device remove locks
@@ -660,12 +679,19 @@ static int coretemp_cpu_offline(unsignedif (!pdev)return 0 ; -/* The core id is too big, just return */ - indx =TO_ATTR_NO (cpu); -if (indx >MAX_CORE_DATA -1 ) + pd =platform_get_drvdata (pdev); + +for (i =0 ; i <NUM_REAL_CORES ; i++) { +if (pd->cpu_map[i] ==topology_core_id (cpu)) { + indx = i +BASE_SYSFS_ATTR_NO ; +break ; + } + } + +/* Too many cores and this core is not populated, just return */ +if (indx <0 )return 0 ; - pd =platform_get_drvdata (pdev); tdata = pd->core_data[indx];cpumask_clear_cpu (cpu, &pd->cpumask);
Greg Kroah-Hartman
maintainerPATCH 19/79 ata: ahci-imx: Fix MODULE_ALIAS
In reply to Greg Kroah-HartmanFrom: Alexander Stein <[email protected]>
commit 979556f1521a835a059de3b117b9c6c6642c7d58 upstream.
'ahci:' is an invalid prefix, preventing the module from autoloading. Fix this by using the 'platform:' prefix and DRV_NAME.
--- drivers/ata/ahci_imx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/ata/ahci_imx.c +1 -1
@@ -1230,4 +1230,4 @@ module_platform_driver(imx_ahci_driver);MODULE_DESCRIPTION ("Freescale i.MX AHCI SATA platform driver" );MODULE_AUTHOR ("Richard Zhu <[email protected]>" );MODULE_LICENSE ("GPL" ); -MODULE_ALIAS ("ahci:imx" ); +MODULE_ALIAS ("platform:" DRV_NAME );
Greg Kroah-Hartman
maintainerPATCH 20/79 ata: ahci: Match EM_MAX_SLOTS with SATA_PMP_MAX_PORTS
In reply to Greg Kroah-HartmanFrom: Kai-Heng Feng <[email protected]>
commit 1e41e693f458eef2d5728207dbd327cd3b16580a upstream.
UBSAN complains about array-index-out-of-bounds:
[ 1.980703] kernel: UBSAN: array-index-out-of-bounds in /build/linux-9H675w/linux-5.15.0/drivers/ata/libahci.c:968:41 [ 1.980709] kernel: index 15 is out of range for type 'ahci_em_priv [8]' [ 1.980713] kernel: CPU: 0 PID: 209 Comm: scsi_eh_8 Not tainted 5.15.0-25-generic #25-Ubuntu [ 1.980716] kernel: Hardware name: System manufacturer System Product Name/P5Q3, BIOS 1102 06/11/2010 [ 1.980718] kernel: Call Trace: [ 1.980721] kernel: <TASK> [ 1.980723] kernel: show_stack+0x52/0x58 [ 1.980729] kernel: dump_stack_lvl+0x4a/0x5f [ 1.980734] kernel: dump_stack+0x10/0x12 [ 1.980736] kernel: ubsan_epilogue+0x9/0x45 [ 1.980739] kernel: __ubsan_handle_out_of_bounds.cold+0x44/0x49 [ 1.980742] kernel: ahci_qc_issue+0x166/0x170 [libahci] [ 1.980748] kernel: ata_qc_issue+0x135/0x240 [ 1.980752] kernel: ata_exec_internal_sg+0x2c4/0x580 [ 1.980754] kernel: ? vprintk_default+0x1d/0x20 [ 1.980759] kernel: ata_exec_internal+0x67/0xa0 [ 1.980762] kernel: sata_pmp_read+0x8d/0xc0 [ 1.980765] kernel: sata_pmp_read_gscr+0x3c/0x90 [ 1.980768] kernel: sata_pmp_attach+0x8b/0x310 [ 1.980771] kernel: ata_eh_revalidate_and_attach+0x28c/0x4b0 [ 1.980775] kernel: ata_eh_recover+0x6b6/0xb30 [ 1.980778] kernel: ? ahci_do_hardreset+0x180/0x180 [libahci] [ 1.980783] kernel: ? ahci_stop_engine+0xb0/0xb0 [libahci] [ 1.980787] kernel: ? ahci_do_softreset+0x290/0x290 [libahci] [ 1.980792] kernel: ? trace_event_raw_event_ata_eh_link_autopsy_qc+0xe0/0xe0 [ 1.980795] kernel: sata_pmp_eh_recover.isra.0+0x214/0x560 [ 1.980799] kernel: sata_pmp_error_handler+0x23/0x40 [ 1.980802] kernel: ahci_error_handler+0x43/0x80 [libahci] [ 1.980806] kernel: ata_scsi_port_error_handler+0x2b1/0x600 [ 1.980810] kernel: ata_scsi_error+0x9c/0xd0 [ 1.980813] kernel: scsi_error_handler+0xa1/0x180 [ 1.980817] kernel: ? scsi_unjam_host+0x1c0/0x1c0 [ 1.980820] kernel: kthread+0x12a/0x150 [ 1.980823] kernel: ? set_kthread_struct+0x50/0x50 [ 1.980826] kernel: ret_from_fork+0x22/0x30 [ 1.980831] kernel: </TASK>
This happens because sata_pmp_init_links() initialize link->pmp up to SATA_PMP_MAX_PORTS while em_priv is declared as 8 elements array.
I can't find the maximum Enclosure Management ports specified in AHCI spec v1.3.1, but "12.2.1 LED message type" states that "Port Multiplier Information" can utilize 4 bits, which implies it can support up to 16 ports. Hence, use SATA_PMP_MAX_PORTS as EM_MAX_SLOTS to resolve the issue.
--- drivers/ata/ahci.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/ata/ahci.h +1 -1
@@ -254,7 +254,7 @@ enum {PCS_7 =0x94 ,/* 7+ port PCS (Denverton) */ /* em constants */ -EM_MAX_SLOTS =8 , +EM_MAX_SLOTS =SATA_PMP_MAX_PORTS , EM_MAX_RETRY = 5,/* em_ctl bits */
Greg Kroah-Hartman
maintainerPATCH 21/79 x86/resctrl: Fix min_cbm_bits for AMD
In reply to Greg Kroah-HartmanFrom: Babu Moger <[email protected]>
commit 67bf6493449b09590f9f71d7df29efb392b12d25 upstream.
AMD systems support zero CBM (capacity bit mask) for cache allocation. That is reflected in rdt_init_res_defs_amd() by:
r->cache.arch_has_empty_bitmaps = true;
However given the unified code in cbm_validate(), checking for:
val == 0 && !arch_has_empty_bitmaps
is not enough because of another check in cbm_validate():
if ((zero_bit - first_bit) < r->cache.min_cbm_bits)
The default value of r->cache.min_cbm_bits = 1.
Leading to:
$ cd /sys/fs/resctrl
$ mkdir foo
$ cd foo
$ echo L3:0=0 > schemata
-bash: echo: write error: Invalid argument
$ cat /sys/fs/resctrl/info/last_cmd_status
Need at least 1 bits in the maskInitialize the min_cbm_bits to 0 for AMD. Also, remove the default setting of min_cbm_bits and initialize it separately.
After the fix:
$ cd /sys/fs/resctrl
$ mkdir foo
$ cd foo
$ echo L3:0=0 > schemata
$ cat /sys/fs/resctrl/info/last_cmd_status
ok--- arch/x86/kernel/cpu/resctrl/core.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
arch/x86/kernel/cpu/resctrl/core.c +2 -6
@@ -66,9 +66,6 @@ struct rdt_hw_resource rdt_resources_all .rid = RDT_RESOURCE_L3, .name = "L3", .cache_level = 3, - .cache = { - .min_cbm_bits = 1, - }, .domains = domain_init(RDT_RESOURCE_L3), .parse_ctrlval = parse_cbm, .format_str = "%d=%0*x",
@@ -83,9 +80,6 @@ struct rdt_hw_resource rdt_resources_all .rid = RDT_RESOURCE_L2, .name = "L2", .cache_level = 2, - .cache = { - .min_cbm_bits = 1, - }, .domains = domain_init(RDT_RESOURCE_L2), .parse_ctrlval = parse_cbm, .format_str = "%d=%0*x",
@@ -877,6 +871,7 @@ static __init void rdt_init_res_defs_int r->cache.arch_has_sparse_bitmaps = false; r->cache.arch_has_empty_bitmaps = false; r->cache.arch_has_per_cpu_cfg = false; + r->cache.min_cbm_bits =1 ; }else if (r->rid ==RDT_RESOURCE_MBA ) { hw_res->msr_base =MSR_IA32_MBA_THRTL_BASE ; hw_res->msr_update = mba_wrmsr_intel;
@@ -897,6 +892,7 @@ static __init void rdt_init_res_defs_amd r->cache.arch_has_sparse_bitmaps = true; r->cache.arch_has_empty_bitmaps = true; r->cache.arch_has_per_cpu_cfg = true; + r->cache.min_cbm_bits =0 ; }else if (r->rid ==RDT_RESOURCE_MBA ) { hw_res->msr_base =MSR_IA32_MBA_BW_BASE ; hw_res->msr_update = mba_wrmsr_amd;
Greg Kroah-Hartman
maintainerPATCH 22/79 cpufreq: qcom: fix memory leak in error path
In reply to Greg Kroah-HartmanFrom: Fabien Parent <[email protected]>
commit 9f42cf54403a42cb092636804d2628d8ecf71e75 upstream.
If for some reason the speedbin length is incorrect, then there is a memory leak in the error path because we never free the speedbin buffer. This commit fixes the error path to always free the speedbin buffer.
--- drivers/cpufreq/qcom-cpufreq-nvmem.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/cpufreq/qcom-cpufreq-nvmem.c +5 -2
@@ -215,6 +215,7 @@ static int qcom_cpufreq_krait_name_versiint speed =0 , pvs =0 , pvs_ver =0 ;u8 *speedbin;size_t len; +int ret =0 ; speedbin =nvmem_cell_read (speedbin_nvmem, &len);
@@ -232,7 +233,8 @@ static int qcom_cpufreq_krait_name_versibreak ;default :dev_err (cpu_dev,"Unable to read nvmem data. Defaulting to 0!\n" ); -return -ENODEV ; + ret = -ENODEV ; + goto len_error; } snprintf(*pvs_name, sizeof("speedXX-pvsXX-vXX"), "speed%d-pvs%d-v%d",
@@ -240,8 +242,9 @@ static int qcom_cpufreq_krait_name_versi drv->versions = (1 << speed); +len_error:kfree (speedbin); -return 0 ; +return ret; }static const struct qcom_cpufreq_match_data match_data_kryo = {
Greg Kroah-Hartman
maintainerPATCH 23/79 drm/amdgpu: fix sdma doorbell init ordering on APUs
In reply to Greg Kroah-HartmanFrom: Alex Deucher <[email protected]>
commit 50b0e4d4da09fa501e722af886f97e60a4f820d6 upstream.
Commit 8795e182b02d ("PCI/portdrv: Don't disable AER reporting in get_port_device_capability()") uncovered a bug in amdgpu that required a reordering of the driver
init sequence to avoid accessing a special register on the GPU
before it was properly set up leading to an PCI AER error. This
reordering uncovered a different hw programming ordering dependency
in some APUs where the SDMA doorbells need to be programmed before
the GFX doorbells. To fix this, move the SDMA doorbell programming
back into the soc15 common code, but use the actual doorbell range
values directly rather than the values stored in the ring structure
since those will not be initialized at this point.
This is a partial revert, but with the doorbell assignment fixed so the proper doorbell index is set before it's used.
--- drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 5 ----- drivers/gpu/drm/amd/amdgpu/soc15.c | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +0 -5
@@ -1507,11 +1507,6 @@ static int sdma_v4_0_start(struct amdgpuWREG32_SDMA (i, mmSDMA0_CNTL, temp);if (!amdgpu_sriov_vf (adev)) { - ring = &adev->sdma.instance[i].ring; - adev->nbio.funcs->sdma_doorbell_range (adev, i, - ring->use_doorbell, ring->doorbell_index, - adev->doorbell_index.sdma_doorbell_range); -/* unhalt engine */ temp =RREG32_SDMA (i, mmSDMA0_F32_CNTL); temp =REG_SET_FIELD (temp,SDMA0_F32_CNTL ,HALT ,0 );
drivers/gpu/drm/amd/amdgpu/soc15.c +21 -0
@@ -1416,6 +1416,20 @@ static int soc15_common_sw_fini(void *hareturn 0 ; } +static void soc15_sdma_doorbell_range_init (struct amdgpu_device *adev) +{ +int i; + +/* sdma doorbell range is programed by hypervisor */ +if (!amdgpu_sriov_vf (adev)) { +for (i =0 ; i < adev->sdma.num_instances; i++) { + adev->nbio.funcs->sdma_doorbell_range (adev, i, + true, adev->doorbell_index.sdma_engine[i] <<1 , + adev->doorbell_index.sdma_doorbell_range); + } + } +} +static int soc15_common_hw_init (void *handle) {struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -1435,6 +1449,13 @@ static int soc15_common_hw_init(void *ha/* enable the doorbell aperture */ soc15_enable_doorbell_aperture (adev, true); +/* HW doorbell routing policy: doorbell writing not +* in SDMA/IH/MM/ACV range will be routed to CP. So +* we need to init SDMA doorbell range prior +* to CP ip block init and ring test. IH already +* happens before CP. +*/ +soc15_sdma_doorbell_range_init (adev);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 24/79 mm,hugetlb: take hugetlb_lock before decrementing h->resv_huge_pages
In reply to Greg Kroah-HartmanFrom: Rik van Riel <[email protected]>
commit 12df140f0bdfae5dcfc81800970dd7f6f632e00c upstream.
The h->*_huge_pages counters are protected by the hugetlb_lock, but alloc_huge_page has a corner case where it can decrement the counter outside of the lock.
This could lead to a corrupted value of h->resv_huge_pages, which we have observed on our systems.
Take the hugetlb_lock before decrementing h->resv_huge_pages to avoid a potential race.
--- mm/hugetlb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/hugetlb.c +1 -1
@@ -2813,11 +2813,11 @@ struct page *alloc_huge_page(struct vm_a page =alloc_buddy_huge_page_with_mpol (h, vma, addr);if (!page) goto out_uncharge_cgroup; +spin_lock_irq (&hugetlb_lock);if (!avoid_reserve &&vma_has_reserves (vma, gbl_chg)) {SetHPageRestoreReserve (page); h->resv_huge_pages--; } -spin_lock_irq (&hugetlb_lock);list_add (&page->lru, &h->hugepage_activelist);/* Fall through */ }
Greg Kroah-Hartman
maintainerPATCH 25/79 kvm: Add support for arch compat vm ioctls
In reply to Greg Kroah-HartmanFrom: Alexander Graf <[email protected]>
commit ed51862f2f57cbce6fed2d4278cfe70a490899fd upstream.
We will introduce the first architecture specific compat vm ioctl in the next patch. Add all necessary boilerplate to allow architectures to override compat vm ioctls when necessary.
Message-Id: <[email protected]>
--- include/linux/kvm_host.h | 2 ++ virt/kvm/kvm_main.c | 11 +++++++++++ 2 files changed, 13 insertions(+)
include/linux/kvm_host.h +2 -0
@@ -1124,6 +1124,8 @@ int kvm_vm_ioctl_enable_cap(struct kvm * struct kvm_enable_cap *cap);long kvm_arch_vm_ioctl (struct file *filp,unsigned int ioctl,unsigned long arg); +long kvm_arch_vm_compat_ioctl (struct file *filp,unsigned int ioctl, +unsigned long arg);int kvm_arch_vcpu_ioctl_get_fpu (struct kvm_vcpu *vcpu,struct kvm_fpu *fpu);int kvm_arch_vcpu_ioctl_set_fpu (struct kvm_vcpu *vcpu,struct kvm_fpu *fpu);
virt/kvm/kvm_main.c +11 -0
@@ -4609,6 +4609,12 @@ struct compat_kvm_clear_dirty_log { }; }; +long __weak kvm_arch_vm_compat_ioctl (struct file *filp,unsigned int ioctl, +unsigned long arg) +{ +return -ENOTTY ; +} +static long kvm_vm_compat_ioctl (struct file *filp,unsigned int ioctl,unsigned long arg) {
@@ -4617,6 +4623,11 @@ static long kvm_vm_compat_ioctl(struct fif (kvm->mm != current->mm || kvm->vm_bugged)return -EIO ; + + r =kvm_arch_vm_compat_ioctl (filp, ioctl, arg); +if (r != -ENOTTY ) +return r; +switch (ioctl) {#ifdef CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT case KVM_CLEAR_DIRTY_LOG : {
Greg Kroah-Hartman
maintainerPATCH 26/79 KVM: arm64: vgic: Fix exit condition in scan_its_table()
In reply to Greg Kroah-HartmanFrom: Eric Ren <[email protected]>
commit c000a2607145d28b06c697f968491372ea56c23a upstream.
With some PCIe topologies, restoring a guest fails while parsing the ITS device tables.
Reproducer hints:
1. Create ARM virt VM with pxb-pcie bus which adds extra host bridges, with qemu command like:
``` -device pxb-pcie,bus_nr=8,id=pci.x,numa_node=0,bus=pcie.0 \ -device pcie-root-port,..,bus=pci.x \ ... -device pxb-pcie,bus_nr=37,id=pci.y,numa_node=1,bus=pcie.0 \ -device pcie-root-port,..,bus=pci.y \ ... ```
2. Ensure the guest uses 2-level device table
3. Perform VM migration which calls save/restore device tables
In that setup, we get a big "offset" between 2 device_ids, which makes unsigned "len" round up a big positive number, causing the scan loop to continue with a bad GPA. For example:
1. L1 table has 2 entries;
2. and we are now scanning at L2 table entry index 2075 (pointed to by L1 first entry)
3. if next device id is 9472, we will get a big offset: 7397;
4. with unsigned 'len', 'len -= offset * esz', len will underflow to a positive number, mistakenly into next iteration with a bad GPA; (It should break out of the current L2 table scanning, and jump into the next L1 table entry)
5. that bad GPA fails the guest read.
Fix it by stopping the L2 table scan when the next device id is outside of the current table, allowing the scan to continue from the next L1 table entry.
Thanks to Eric Auger for the fix suggestion.
--- arch/arm64/kvm/vgic/vgic-its.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/arm64/kvm/vgic/vgic-its.c +4 -1
@@ -2096,7 +2096,7 @@ static int scan_its_table(struct vgic_itmemset (entry,0 , esz); -while (len >0 ) { +while (true) {int next_offset;size_t byte_offset;
@@ -2109,6 +2109,9 @@ static int scan_its_table(struct vgic_itreturn next_offset; byte_offset = next_offset * esz; +if (byte_offset >= len) +break ; + id += next_offset; gpa += byte_offset; len -= byte_offset;
Greg Kroah-Hartman
maintainerPATCH 27/79 media: ipu3-imgu: Fix NULL pointer dereference in active selection access
In reply to Greg Kroah-HartmanFrom: Sakari Ailus <[email protected]>
commit b9eb3ab6f30bf32f7326909f17949ccb11bab514 upstream.
What the IMGU driver did was that it first acquired the pointers to active and try V4L2 subdev state, and only then figured out which one to use.
The problem with that approach and a later patch (see Fixes: tag) is that as sd_state argument to v4l2_subdev_get_try_crop() et al is NULL, there is now an attempt to dereference that.
Fix this.
Also rewrap lines a little.
--- drivers/staging/media/ipu3/ipu3-v4l2.c | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-)
drivers/staging/media/ipu3/ipu3-v4l2.c +14 -17
@@ -192,33 +192,30 @@ static int imgu_subdev_get_selection(strstruct v4l2_subdev_state *sd_state, struct v4l2_subdev_selection *sel) { - struct v4l2_rect *try_sel, *r; -struct imgu_v4l2_subdev *imgu_sd =container_of (sd, - struct imgu_v4l2_subdev, - subdev); + struct imgu_v4l2_subdev *imgu_sd = + container_of(sd, struct imgu_v4l2_subdev, subdev);if (sel->pad !=IMGU_NODE_IN )return -EINVAL ;switch (sel->target) {case V4L2_SEL_TGT_CROP : - try_sel =v4l2_subdev_get_try_crop (sd, sd_state, sel->pad); - r = &imgu_sd->rect.eff; -break ; +if (sel->which ==V4L2_SUBDEV_FORMAT_TRY ) + sel->r = *v4l2_subdev_get_try_crop (sd, sd_state, + sel->pad); +else + sel->r = imgu_sd->rect.eff; +return 0 ;case V4L2_SEL_TGT_COMPOSE : - try_sel =v4l2_subdev_get_try_compose (sd, sd_state, sel->pad); - r = &imgu_sd->rect.bds; -break ; +if (sel->which ==V4L2_SUBDEV_FORMAT_TRY ) + sel->r = *v4l2_subdev_get_try_compose (sd, sd_state, + sel->pad); +else + sel->r = imgu_sd->rect.bds; +return 0 ;default :return -EINVAL ; } - -if (sel->which ==V4L2_SUBDEV_FORMAT_TRY ) - sel->r = *try_sel; -else - sel->r = *r; - -return 0 ; } static int imgu_subdev_set_selection(struct v4l2_subdev *sd,
Greg Kroah-Hartman
maintainerPATCH 28/79 media: mceusb: set timeout to at least timeout provided
In reply to Greg Kroah-HartmanFrom: Sean Young <[email protected]>
commit 20b794ddce475ed012deb365000527c17b3e93e6 upstream.
By rounding down, the actual timeout can be lower than requested. As a result, long spaces just below the requested timeout can be incorrectly reported as timeout and truncated.
--- drivers/media/rc/mceusb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/rc/mceusb.c +1 -1
@@ -1077,7 +1077,7 @@ static int mceusb_set_timeout(struct rc_struct mceusb_dev *ir = dev->priv;unsigned int units; - units =DIV_ROUND_CLOSEST (timeout,MCE_TIME_UNIT ); + units =DIV_ROUND_UP (timeout,MCE_TIME_UNIT ); cmdbuf[2 ] = units >>8 ; cmdbuf[3 ] = units;
Greg Kroah-Hartman
maintainerPATCH 29/79 media: venus: dec: Handle the case where find_format fails
In reply to Greg Kroah-HartmanFrom: Bryan O'Donoghue <[email protected]>
commit 06a2da340f762addc5935bf851d95b14d4692db2 upstream.
Debugging the decoder on msm8916 I noticed the vdec probe was crashing if the fmt pointer was NULL.
A similar fix from Colin Ian King found by Coverity was implemented for the encoder. Implement the same fix on the decoder.
--- drivers/media/platform/qcom/venus/vdec.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/media/platform/qcom/venus/vdec.c +2 -0
@@ -158,6 +158,8 @@ vdec_try_fmt_common(struct venus_inst *ielse return NULL ; fmt =find_format (inst, pixmp->pixelformat, f->type); +if (!fmt) +return NULL ; } pixmp->width = clamp(pixmp->width, frame_width_min(inst),
Greg Kroah-Hartman
maintainerPATCH 30/79 x86/topology: Fix multiple packages shown on a single-package system
In reply to Greg Kroah-HartmanFrom: Zhang Rui <[email protected]>
commit 2b12a7a126d62bdbd81f4923c21bf6e9a7fbd069 upstream.
CPUID.1F/B does not enumerate Package level explicitly, instead, all the APIC-ID bits above the enumerated levels are assumed to be package ID bits.
Current code gets package ID by shifting out all the APIC-ID bits that Linux supports, rather than shifting out all the APIC-ID bits that CPUID.1F enumerates. This introduces problems when CPUID.1F enumerates a level that Linux does not support.
For example, on a single package AlderLake-N, there are 2 Ecore Modules with 4 atom cores in each module. Linux does not support the Module level and interprets the Module ID bits as package ID and erroneously reports a multi module system as a multi-package system.
Fix this by using APIC-ID bits above all the CPUID.1F enumerated levels as package ID.
[ dhansen: spelling fix ]
--- arch/x86/kernel/cpu/topology.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
arch/x86/kernel/cpu/topology.c +10 -4
@@ -96,6 +96,7 @@ int detect_extended_topology(struct cpuiunsigned int ht_mask_width, core_plus_mask_width, die_plus_mask_width;unsigned int core_select_mask, core_level_siblings;unsigned int die_select_mask, die_level_siblings; +unsigned int pkg_mask_width;bool die_level_present = false;int leaf;
@@ -111,10 +112,10 @@ int detect_extended_topology(struct cpui core_level_siblings = smp_num_siblings =LEVEL_MAX_SIBLINGS (ebx); core_plus_mask_width = ht_mask_width =BITS_SHIFT_NEXT_LEVEL (eax); die_level_siblings =LEVEL_MAX_SIBLINGS (ebx); - die_plus_mask_width =BITS_SHIFT_NEXT_LEVEL (eax); + pkg_mask_width = die_plus_mask_width =BITS_SHIFT_NEXT_LEVEL (eax); sub_index =1 ; - do { +while (true) {cpuid_count (leaf, sub_index, &eax, &ebx, &ecx, &edx);/*
@@ -132,8 +133,13 @@ int detect_extended_topology(struct cpui die_plus_mask_width =BITS_SHIFT_NEXT_LEVEL (eax); } +if (LEAFB_SUBTYPE (ecx) !=INVALID_TYPE ) + pkg_mask_width =BITS_SHIFT_NEXT_LEVEL (eax); +else +break ; + sub_index++; - }while (LEAFB_SUBTYPE (ecx) !=INVALID_TYPE ); + } core_select_mask = (~(-1 << core_plus_mask_width)) >> ht_mask_width; die_select_mask = (~(-1 << die_plus_mask_width)) >>
@@ -148,7 +154,7 @@ int detect_extended_topology(struct cpui } c->phys_proc_id = apic->phys_pkg_id (c->initial_apicid, - die_plus_mask_width); + pkg_mask_width);/* * Reinit the apicid, now that we have extended initial_apicid. */
Greg Kroah-Hartman
maintainerPATCH 31/79 x86/topology: Fix duplicated core ID within a package
In reply to Greg Kroah-HartmanFrom: Zhang Rui <[email protected]>
commit 71eac7063698b7d7b8fafb1683ac24a034541141 upstream.
Today, core ID is assumed to be unique within each package.
But an AlderLake-N platform adds a Module level between core and package, Linux excludes the unknown modules bits from the core ID, resulting in duplicate core ID's.
To keep core ID unique within a package, Linux must include all APIC-ID bits for known or unknown levels above the core and below the package in the core ID.
It is important to understand that core ID's have always come directly from the APIC-ID encoding, which comes from the BIOS. Thus there is no guarantee that they start at 0, or that they are contiguous. As such, naively using them for array indexes can be problematic.
[ dhansen: un-known -> unknown ]
--- arch/x86/kernel/cpu/topology.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/cpu/topology.c +1 -1
@@ -141,7 +141,7 @@ int detect_extended_topology(struct cpui sub_index++; } - core_select_mask = (~(-1 << core_plus_mask_width)) >> ht_mask_width; + core_select_mask = (~(-1 << pkg_mask_width)) >> ht_mask_width; die_select_mask = (~(-1 << die_plus_mask_width)) >> core_plus_mask_width;
Greg Kroah-Hartman
maintainerPATCH 32/79 btrfs: fix processing of delayed data refs during backref walking
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
[ Upstream commit 4fc7b57228243d09c0d878873bf24fa64a90fa01 ]
When processing delayed data references during backref walking and we are using a share context (we are being called through fiemap), whenever we find a delayed data reference for an inode different from the one we are interested in, then we immediately exit and consider the data extent as shared. This is wrong, because:
1) This might be a DROP reference that will cancel out a reference in the extent tree;
2) Even if it's an ADD reference, it may be followed by a DROP reference that cancels it out.
In either case we should not exit immediately.
Fix this by never exiting when we find a delayed data reference for another inode - instead add the reference and if it does not cancel out other delayed reference, we will exit early when we call extent_is_shared() after processing all delayed references. If we find a drop reference, then signal the code that processes references from the extent tree (add_inline_refs() and add_keyed_refs()) to not exit immediately if it finds there a reference for another inode, since we have delayed drop references that may cancel it out. In this later case we exit once we don't have references in the rb trees that cancel out each other and have two references for different inodes.
Example reproducer for case 1):
$ cat test-1.sh #!/bin/bash
DEV=/dev/sdj
MNT=/mnt/sdj
mkfs.btrfs -f $DEV
mount $DEV $MNT
xfs_io -f -c "pwrite 0 64K" $MNT/foo cp --reflink=always $MNT/foo $MNT/bar
echo
echo "fiemap after cloning:"
xfs_io -c "fiemap -v" $MNT/foo
rm -f $MNT/bar
echo
echo "fiemap after removing file bar:"
xfs_io -c "fiemap -v" $MNT/foo
umount $MNT
Running it before this patch, the extent is still listed as shared, it has the flag 0x2000 (FIEMAP_EXTENT_SHARED) set:
$ ./test-1.sh
fiemap after cloning:
/mnt/sdj/foo:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [0..127]: 26624..26751 128 0x2001 fiemap after removing file bar:
/mnt/sdj/foo:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [0..127]: 26624..26751 128 0x2001
Example reproducer for case 2):
$ cat test-2.sh #!/bin/bash
DEV=/dev/sdj
MNT=/mnt/sdj
mkfs.btrfs -f $DEV
mount $DEV $MNT
xfs_io -f -c "pwrite 0 64K" $MNT/foo cp --reflink=always $MNT/foo $MNT/bar
# Flush delayed references to the extent tree and commit current
# transaction. sync
echo
echo "fiemap after cloning:"
xfs_io -c "fiemap -v" $MNT/foo
rm -f $MNT/bar
echo
echo "fiemap after removing file bar:"
xfs_io -c "fiemap -v" $MNT/foo
umount $MNT
Running it before this patch, the extent is still listed as shared, it has the flag 0x2000 (FIEMAP_EXTENT_SHARED) set:
$ ./test-2.sh
fiemap after cloning:
/mnt/sdj/foo:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [0..127]: 26624..26751 128 0x2001 fiemap after removing file bar:
/mnt/sdj/foo:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [0..127]: 26624..26751 128 0x2001
After this patch, after deleting bar in both tests, the extent is not reported with the 0x2000 flag anymore, it gets only the flag 0x1 (which is FIEMAP_EXTENT_LAST):
$ ./test-1.sh
fiemap after cloning:
/mnt/sdj/foo:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [0..127]: 26624..26751 128 0x2001 fiemap after removing file bar:
/mnt/sdj/foo:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [0..127]: 26624..26751 128 0x1
$ ./test-2.sh
fiemap after cloning:
/mnt/sdj/foo:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [0..127]: 26624..26751 128 0x2001 fiemap after removing file bar:
/mnt/sdj/foo:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [0..127]: 26624..26751 128 0x1
These tests will later be converted to a test case for fstests.
--- fs/btrfs/backref.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-)
fs/btrfs/backref.c +24 -9
@@ -138,6 +138,7 @@ struct share_check {u64 root_objectid;u64 inum;int share_count; +bool have_delayed_delete_refs; };static inline int extent_is_shared (struct share_check *sc)
@@ -882,13 +883,22 @@ static int add_delayed_refs(const struct btrfs_fs_info *fs_info, key.offset = ref->offset;/* -* Found a inum that doesn't match our known inum, we -* know it's shared. +* If we have a share check context and a reference for +* another inode, we can't exit immediately. This is +* because even if this is a BTRFS_ADD_DELAYED_REF +* reference we may find next a BTRFS_DROP_DELAYED_REF +* which cancels out this ADD reference. +* +* If this is a DROP reference and there was no previous +* ADD reference, then we need to signal that when we +* process references from the extent tree (through +* add_inline_refs() and add_keyed_refs()), we should +* not exit early if we find a reference for another +* inode, because one of the delayed DROP references +* may cancel that reference in the extent tree. */ -if (sc && sc->inum && ref->objectid != sc->inum) { - ret =BACKREF_FOUND_SHARED ; - goto out; - } +if (sc && count <0 ) + sc->have_delayed_delete_refs = true; ret = add_indirect_ref(fs_info, preftrees, ref->root, &key, 0, node->bytenr, count, sc,
@@ -918,7 +928,7 @@ static int add_delayed_refs(const struct btrfs_fs_info *fs_info, }if (!ret) ret =extent_is_shared (sc); -out: +spin_unlock (&head->lock);return ret; }
@@ -1021,7 +1031,8 @@ static int add_inline_refs(const struct btrfs_fs_info *fs_info, key.type =BTRFS_EXTENT_DATA_KEY ; key.offset =btrfs_extent_data_ref_offset (leaf, dref); -if (sc && sc->inum && key.objectid != sc->inum) { +if (sc && sc->inum && key.objectid != sc->inum && + !sc->have_delayed_delete_refs) { ret =BACKREF_FOUND_SHARED ;break ; }
@@ -1031,6 +1042,7 @@ static int add_inline_refs(const struct btrfs_fs_info *fs_info, ret =add_indirect_ref (fs_info, preftrees, root, &key,0 , bytenr, count, sc,GFP_NOFS ); +break ; }default :
@@ -1120,7 +1132,8 @@ static int add_keyed_refs(struct btrfs_fs_info *fs_info, key.type =BTRFS_EXTENT_DATA_KEY ; key.offset =btrfs_extent_data_ref_offset (leaf, dref); -if (sc && sc->inum && key.objectid != sc->inum) { +if (sc && sc->inum && key.objectid != sc->inum && + !sc->have_delayed_delete_refs) { ret =BACKREF_FOUND_SHARED ;break ; }
@@ -1547,6 +1560,7 @@ int btrfs_check_shared(struct btrfs_root *root, u64 inum, u64 bytenr, .root_objectid = root->root_key.objectid, .inum = inum, .share_count = 0, + .have_delayed_delete_refs = false, };ulist_init (roots);
@@ -1581,6 +1595,7 @@ int btrfs_check_shared(struct btrfs_root *root, u64 inum, u64 bytenr,break ; bytenr = node->val; shared.share_count =0 ; + shared.have_delayed_delete_refs = false;cond_resched (); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 33/79 btrfs: fix processing of delayed tree block refs during backref walking
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
[ Upstream commit 943553ef9b51db303ab2b955c1025261abfdf6fb ]
During backref walking, when processing a delayed reference with a type of BTRFS_TREE_BLOCK_REF_KEY, we have two bugs there:
1) We are accessing the delayed references extent_op, and its key, without the protection of the delayed ref head's lock;
2) If there's no extent op for the delayed ref head, we end up with an uninitialized key in the stack, variable 'tmp_op_key', and then pass it to add_indirect_ref(), which adds the reference to the indirect refs rb tree.
This is wrong, because indirect references should have a NULL key when we don't have access to the key, and in that case they should be added to the indirect_missing_keys rb tree and not to the indirect rb tree.
This means that if have BTRFS_TREE_BLOCK_REF_KEY delayed ref resulting from freeing an extent buffer, therefore with a count of -1, it will not cancel out the corresponding reference we have in the extent tree (with a count of 1), since both references end up in different rb trees.
When using fiemap, where we often need to check if extents are shared through shared subtrees resulting from snapshots, it means we can incorrectly report an extent as shared when it's no longer shared. However this is temporary because after the transaction is committed the extent is no longer reported as shared, as running the delayed reference results in deleting the tree block reference from the extent tree.
Outside the fiemap context, the result is unpredictable, as the key was not initialized but it's used when navigating the rb trees to insert and search for references (prelim_ref_compare()), and we expect all references in the indirect rb tree to have valid keys.
The following reproducer triggers the second bug:
$ cat test.sh #!/bin/bash
DEV=/dev/sdj
MNT=/mnt/sdj
mkfs.btrfs -f $DEV
mount -o compress $DEV $MNT
# With a compressed 128M file we get a tree height of 2 (level 1 root). xfs_io -f -c "pwrite -b 1M 0 128M" $MNT/foo
btrfs subvolume snapshot $MNT $MNT/snap
# Fiemap should output 0x2008 in the flags column. # 0x2000 means shared extent
# 0x8 means encoded extent (because it's compressed) echo
echo "fiemap after snapshot, range [120M, 120M + 128K):" xfs_io -c "fiemap -v 120M 128K" $MNT/foo
echo
# Overwrite one extent and fsync to flush delalloc and COW a new path
# in the snapshot's tree. # # After this we have a BTRFS_DROP_DELAYED_REF delayed ref of type # BTRFS_TREE_BLOCK_REF_KEY with a count of -1 for every COWed extent # buffer in the path. # # In the extent tree we have inline references of type # BTRFS_TREE_BLOCK_REF_KEY, with a count of 1, for the same extent # buffers, so they should cancel each other, and the extent buffers in # the fs tree should no longer be considered as shared. # echo "Overwriting file range [120M, 120M + 128K)..." xfs_io -c "pwrite -b 128K 120M 128K" $MNT/snap/foo xfs_io -c "fsync" $MNT/snap/foo
# Fiemap should output 0x8 in the flags column. The extent in the range # [120M, 120M + 128K) is no longer shared, it's now exclusive to the fs
# tree. echo echo "fiemap after overwrite range [120M, 120M + 128K):" xfs_io -c "fiemap -v 120M 128K" $MNT/foo echo
umount $MNT
Running it before this patch:
$ ./test.sh (...) wrote 134217728/134217728 bytes at offset 0 128 MiB, 128 ops; 0.1152 sec (1.085 GiB/sec and 1110.5809 ops/sec) Create a snapshot of '/mnt/sdj' in '/mnt/sdj/snap'
fiemap after snapshot, range [120M, 120M + 128K):
/mnt/sdj/foo:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [245760..246015]: 34304..34559 256 0x2008
Overwriting file range [120M, 120M + 128K)...
wrote 131072/131072 bytes at offset 125829120
128 KiB, 1 ops; 0.0001 sec (683.060 MiB/sec and 5464.4809 ops/sec)
fiemap after overwrite range [120M, 120M + 128K):
/mnt/sdj/foo:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [245760..246015]: 34304..34559 256 0x2008
The extent in the range [120M, 120M + 128K) is still reported as shared (0x2000 bit set) after overwriting that range and flushing delalloc, which is not correct - an entire path was COWed in the snapshot's tree and the extent is now only referenced by the original fs tree.
Running it after this patch:
$ ./test.sh (...) wrote 134217728/134217728 bytes at offset 0 128 MiB, 128 ops; 0.1198 sec (1.043 GiB/sec and 1068.2067 ops/sec) Create a snapshot of '/mnt/sdj' in '/mnt/sdj/snap'
fiemap after snapshot, range [120M, 120M + 128K):
/mnt/sdj/foo:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [245760..246015]: 34304..34559 256 0x2008
Overwriting file range [120M, 120M + 128K)...
wrote 131072/131072 bytes at offset 125829120
128 KiB, 1 ops; 0.0001 sec (694.444 MiB/sec and 5555.5556 ops/sec)
fiemap after overwrite range [120M, 120M + 128K):
/mnt/sdj/foo:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [245760..246015]: 34304..34559 256 0x8
Now the extent is not reported as shared anymore.
So fix this by passing a NULL key pointer to add_indirect_ref() when processing a delayed reference for a tree block if there's no extent op for our delayed ref head with a defined key. Also access the extent op only after locking the delayed ref head's lock.
The reproducer will be converted later to a test case for fstests.
--- fs/btrfs/backref.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
fs/btrfs/backref.c +7 -6
@@ -819,16 +819,11 @@ static int add_delayed_refs(const struct btrfs_fs_info *fs_info, struct preftrees *preftrees, struct share_check *sc) { struct btrfs_delayed_ref_node *node; -struct btrfs_delayed_extent_op *extent_op = head->extent_op;struct btrfs_key key; -struct btrfs_key tmp_op_key;struct rb_node *n;int count;int ret =0 ; -if (extent_op && extent_op->update_key) -btrfs_disk_key_to_cpu (&tmp_op_key, &extent_op->key); -spin_lock (&head->lock); for (n = rb_first_cached(&head->ref_tree); n; n = rb_next(n)) { node = rb_entry(n, struct btrfs_delayed_ref_node,
@@ -854,10 +849,16 @@ static int add_delayed_refs(const struct btrfs_fs_info *fs_info,case BTRFS_TREE_BLOCK_REF_KEY : {/* NORMAL INDIRECT METADATA backref */ struct btrfs_delayed_tree_ref *ref; +struct btrfs_key *key_ptr =NULL ; + +if (head->extent_op && head->extent_op->update_key) { +btrfs_disk_key_to_cpu (&key, &head->extent_op->key); + key_ptr = &key; + } ref =btrfs_delayed_node_to_tree_ref (node); ret =add_indirect_ref (fs_info, preftrees, ref->root, - &tmp_op_key, ref->level +1 , + key_ptr, ref->level +1 , node->bytenr, count, sc,GFP_ATOMIC );break ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 34/79 drm/vc4: Add module dependency on hdmi-codec
In reply to Greg Kroah-HartmanFrom: Maxime Ripard <[email protected]>
[ Upstream commit d1c0b7de4dfa5505cf7a1d6220aa72aace4435d0 ]
The VC4 HDMI controller driver relies on the HDMI codec ASoC driver. In order to set it up properly, in vc4_hdmi_audio_init(), our HDMI driver will register a device matching the HDMI codec driver, and then register an ASoC card using that codec.
However, if vc4 is compiled as a module, chances are that the hdmi-codec driver will be too. In such a case, the module loader will have a very narrow window to load the module between the device registration and the card registration.
If it fails to load the module in time, the card registration will fail with EPROBE_DEFER, and we'll abort the audio initialisation, unregistering the HDMI codec device in the process.
The next time the bind callback will be run, it's likely that we end up missing that window again, effectively preventing vc4 to probe entirely.
In order to prevent this, we can create a soft dependency of the vc4 driver on the HDMI codec one so that we're sure the HDMI codec will be loaded before the VC4 module is, and thus we'll never end up in the previous situation.
--- drivers/gpu/drm/vc4/vc4_drv.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/vc4/vc4_drv.c +1 -0
@@ -397,6 +397,7 @@ module_init(vc4_drm_register);module_exit (vc4_drm_unregister);MODULE_ALIAS ("platform:vc4-drm" ); +MODULE_SOFTDEP ("pre: snd-soc-hdmi-codec" );MODULE_DESCRIPTION ("Broadcom VC4 DRM Driver" );MODULE_AUTHOR ("Eric Anholt <[email protected]>" );MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 35/79 ACPI: extlog: Handle multiple records
In reply to Greg Kroah-HartmanFrom: Tony Luck <[email protected]>
[ Upstream commit f6ec01da40e4139b41179f046044ee7c4f6370dc ]
If there is no user space consumer of extlog_mem trace records, then Linux properly handles multiple error records in an ELOG block
extlog_print() print_extlog_rcd() __print_extlog_rcd() cper_estatus_print() apei_estatus_for_each_section()
But the other code path hard codes looking for a single record to output a trace record.
Fix by using the same apei_estatus_for_each_section() iterator to step over all records.
--- drivers/acpi/acpi_extlog.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-)
drivers/acpi/acpi_extlog.c +20 -13
@@ -12,6 +12,7 @@#include <linux/ratelimit.h> #include <linux/edac.h> #include <linux/ras.h> +#include <acpi/ghes.h> #include <asm/cpu.h> #include <asm/mce.h>
@@ -138,8 +139,8 @@ static int extlog_print(struct notifier_block *nb, unsigned long val,int cpu = mce->extcpu;struct acpi_hest_generic_status *estatus, *tmp;struct acpi_hest_generic_data *gdata; -const guid_t *fru_id = &guid_null; -char *fru_text ="" ; +const guid_t *fru_id; +char *fru_text;guid_t *sec_type;static u32 err_seq;
@@ -160,17 +161,23 @@ static int extlog_print(struct notifier_block *nb, unsigned long val,/* log event via trace */ err_seq++; - gdata = (struct acpi_hest_generic_data *)(tmp +1 ); -if (gdata->validation_bits &CPER_SEC_VALID_FRU_ID ) - fru_id = (guid_t *)gdata->fru_id; -if (gdata->validation_bits &CPER_SEC_VALID_FRU_TEXT ) - fru_text = gdata->fru_text; - sec_type = (guid_t *)gdata->section_type; -if (guid_equal (sec_type, &CPER_SEC_PLATFORM_MEM )) { -struct cper_sec_mem_err *mem = (void *)(gdata +1 ); -if (gdata->error_data_length >=sizeof (*mem)) -trace_extlog_mem_event (mem, err_seq, fru_id, fru_text, - (u8 )gdata->error_severity); +apei_estatus_for_each_section (tmp, gdata) { +if (gdata->validation_bits &CPER_SEC_VALID_FRU_ID ) + fru_id = (guid_t *)gdata->fru_id; +else + fru_id = &guid_null; +if (gdata->validation_bits &CPER_SEC_VALID_FRU_TEXT ) + fru_text = gdata->fru_text; +else + fru_text ="" ; + sec_type = (guid_t *)gdata->section_type; +if (guid_equal (sec_type, &CPER_SEC_PLATFORM_MEM )) { +struct cper_sec_mem_err *mem = (void *)(gdata +1 ); + +if (gdata->error_data_length >=sizeof (*mem)) +trace_extlog_mem_event (mem, err_seq, fru_id, fru_text, + (u8 )gdata->error_severity); + } } out:
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 36/79 tipc: Fix recognition of trial period
In reply to Greg Kroah-HartmanFrom: Mark Tomlinson <[email protected]>
[ Upstream commit 28be7ca4fcfd69a2d52aaa331adbf9dbe91f9e6e ]
The trial period exists until jiffies is after addr_trial_end. But as jiffies will eventually overflow, just using time_after will eventually give incorrect results. As the node address is set once the trial period ends, this can be used to know that we are not in the trial period.
--- net/tipc/discover.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/tipc/discover.c +1 -1
@@ -148,8 +148,8 @@ static bool tipc_disc_addr_trial_msg(struct tipc_discoverer *d, {struct net *net = d->net;struct tipc_net *tn =tipc_net (net); -bool trial =time_before (jiffies, tn->addr_trial_end);u32 self =tipc_own_addr (net); +bool trial =time_before (jiffies, tn->addr_trial_end) && !self;if (mtyp ==DSC_TRIAL_FAIL_MSG ) {if (!trial)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 37/79 tipc: fix an information leak in tipc_topsrv_kern_subscr
In reply to Greg Kroah-HartmanFrom: Alexander Potapenko <[email protected]>
[ Upstream commit 777ecaabd614d47c482a5c9031579e66da13989a ]
Use a 8-byte write to initialize sub.usr_handle in tipc_topsrv_kern_subscr(), otherwise four bytes remain uninitialized when issuing setsockopt(..., SOL_TIPC, ...).
This resulted in an infoleak reported by KMSAN when the packet was received:
=====================================================
BUG: KMSAN: kernel-infoleak in copyout+0xbc/0x100 lib/iov_iter.c:169 instrument_copy_to_user ./include/linux/instrumented.h:121 copyout+0xbc/0x100 lib/iov_iter.c:169 _copy_to_iter+0x5c0/0x20a0 lib/iov_iter.c:527 copy_to_iter ./include/linux/uio.h:176 simple_copy_to_iter+0x64/0xa0 net/core/datagram.c:513 __skb_datagram_iter+0x123/0xdc0 net/core/datagram.c:419 skb_copy_datagram_iter+0x58/0x200 net/core/datagram.c:527 skb_copy_datagram_msg ./include/linux/skbuff.h:3903 packet_recvmsg+0x521/0x1e70 net/packet/af_packet.c:3469 ____sys_recvmsg+0x2c4/0x810 net/socket.c:? ___sys_recvmsg+0x217/0x840 net/socket.c:2743 __sys_recvmsg net/socket.c:2773 __do_sys_recvmsg net/socket.c:2783 __se_sys_recvmsg net/socket.c:2780 __x64_sys_recvmsg+0x364/0x540 net/socket.c:2780 do_syscall_x64 arch/x86/entry/common.c:50 do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd arch/x86/entry/entry_64.S:120
...
Uninit was stored to memory at:
tipc_sub_subscribe+0x42d/0xb50 net/tipc/subscr.c:156 tipc_conn_rcv_sub+0x246/0x620 net/tipc/topsrv.c:375 tipc_topsrv_kern_subscr+0x2e8/0x400 net/tipc/topsrv.c:579 tipc_group_create+0x4e7/0x7d0 net/tipc/group.c:190 tipc_sk_join+0x2a8/0x770 net/tipc/socket.c:3084 tipc_setsockopt+0xae5/0xe40 net/tipc/socket.c:3201 __sys_setsockopt+0x87f/0xdc0 net/socket.c:2252 __do_sys_setsockopt net/socket.c:2263 __se_sys_setsockopt net/socket.c:2260 __x64_sys_setsockopt+0xe0/0x160 net/socket.c:2260 do_syscall_x64 arch/x86/entry/common.c:50 do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd arch/x86/entry/entry_64.S:120
Local variable sub created at:
tipc_topsrv_kern_subscr+0x57/0x400 net/tipc/topsrv.c:562 tipc_group_create+0x4e7/0x7d0 net/tipc/group.c:190
Bytes 84-87 of 88 are uninitialized
Memory access of size 88 starts at ffff88801ed57cd0 Data copied to user address 0000000020000400
...
=====================================================
--- net/tipc/topsrv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/tipc/topsrv.c +1 -1
@@ -568,7 +568,7 @@ bool tipc_topsrv_kern_subscr(struct net *net, u32 port, u32 type, u32 lower, sub.seq.upper = upper; sub.timeout =TIPC_WAIT_FOREVER ; sub.filter = filter; - *(u32 *)&sub.usr_handle = port; + *(u64 *)&sub.usr_handle = (u64 )port; con =tipc_conn_alloc (tipc_topsrv (net));if (IS_ERR (con))
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 38/79 i40e: Fix DMA mappings leak
In reply to Greg Kroah-HartmanFrom: Jan Sokolowski <[email protected]>
[ Upstream commit aae425efdfd1b1d8452260a3cb49344ebf20b1f5 ]
During reallocation of RX buffers, new DMA mappings are created for those buffers.
steps for reproduction:
while :
do
for ((i=0; i<=8160; i=i+32))
do
ethtool -G enp130s0f0 rx $i tx $i
sleep 0.5
ethtool -g enp130s0f0
done
done
This resulted in crash:
i40e 0000:01:00.1: Unable to allocate memory for the Rx descriptor ring, size=65536 Driver BUG
WARNING: CPU: 0 PID: 4300 at net/core/xdp.c:141 xdp_rxq_info_unreg+0x43/0x50 Call Trace: i40e_free_rx_resources+0x70/0x80 [i40e] i40e_set_ringparam+0x27c/0x800 [i40e] ethnl_set_rings+0x1b2/0x290 genl_family_rcv_msg_doit.isra.15+0x10f/0x150 genl_family_rcv_msg+0xb3/0x160 ? rings_fill_reply+0x1a0/0x1a0 genl_rcv_msg+0x47/0x90 ? genl_family_rcv_msg+0x160/0x160 netlink_rcv_skb+0x4c/0x120 genl_rcv+0x24/0x40 netlink_unicast+0x196/0x230 netlink_sendmsg+0x204/0x3d0 sock_sendmsg+0x4c/0x50 __sys_sendto+0xee/0x160 ? handle_mm_fault+0xbe/0x1e0 ? syscall_trace_enter+0x1d3/0x2c0 __x64_sys_sendto+0x24/0x30 do_syscall_64+0x5b/0x1a0 entry_SYSCALL_64_after_hwframe+0x65/0xca RIP: 0033:0x7f5eac8b035b Missing register, driver bug WARNING: CPU: 0 PID: 4300 at net/core/xdp.c:119 xdp_rxq_info_unreg_mem_model+0x69/0x140 Call Trace: xdp_rxq_info_unreg+0x1e/0x50 i40e_free_rx_resources+0x70/0x80 [i40e] i40e_set_ringparam+0x27c/0x800 [i40e] ethnl_set_rings+0x1b2/0x290 genl_family_rcv_msg_doit.isra.15+0x10f/0x150 genl_family_rcv_msg+0xb3/0x160 ? rings_fill_reply+0x1a0/0x1a0 genl_rcv_msg+0x47/0x90 ? genl_family_rcv_msg+0x160/0x160 netlink_rcv_skb+0x4c/0x120 genl_rcv+0x24/0x40 netlink_unicast+0x196/0x230 netlink_sendmsg+0x204/0x3d0 sock_sendmsg+0x4c/0x50 __sys_sendto+0xee/0x160 ? handle_mm_fault+0xbe/0x1e0 ? syscall_trace_enter+0x1d3/0x2c0 __x64_sys_sendto+0x24/0x30 do_syscall_64+0x5b/0x1a0 entry_SYSCALL_64_after_hwframe+0x65/0xca RIP: 0033:0x7f5eac8b035b
This was caused because of new buffers with different RX ring count should substitute older ones, but those buffers were freed in i40e_configure_rx_ring and reallocated again with i40e_alloc_rx_bi, thus kfree on rx_bi caused leak of already mapped DMA.
Fix this by reallocating ZC with rx_bi_zc struct when BPF program loads. Additionally reallocate back to rx_bi when BPF program unloads.
If BPF program is loaded/unloaded and XSK pools are created, reallocate RX queues accordingly in XSP_SETUP_XSK_POOL handler.
--- .../net/ethernet/intel/i40e/i40e_ethtool.c | 3 - drivers/net/ethernet/intel/i40e/i40e_main.c | 16 +++-- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 13 ++-- drivers/net/ethernet/intel/i40e/i40e_txrx.h | 1 - drivers/net/ethernet/intel/i40e/i40e_xsk.c | 67 ++++++++++++++++--- drivers/net/ethernet/intel/i40e/i40e_xsk.h | 2 +- 6 files changed, 74 insertions(+), 28 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_ethtool.c +0 -3
@@ -2081,9 +2081,6 @@ static int i40e_set_ringparam(struct net_device *netdev,*/ rx_rings[i].tail = hw->hw_addr +I40E_PRTGEN_STATUS ; err =i40e_setup_rx_descriptors (&rx_rings[i]); -if (err) - goto rx_unwind; - err =i40e_alloc_rx_bi (&rx_rings[i]);if (err) goto rx_unwind;
drivers/net/ethernet/intel/i40e/i40e_main.c +9 -7
@@ -3421,12 +3421,8 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)if (ring->vsi->type ==I40E_VSI_MAIN )xdp_rxq_info_unreg_mem_model (&ring->xdp_rxq); -kfree (ring->rx_bi); ring->xsk_pool =i40e_xsk_pool (ring);if (ring->xsk_pool) { - ret =i40e_alloc_rx_bi_zc (ring); -if (ret) -return ret; ring->rx_buf_len =xsk_pool_get_rx_frame_size (ring->xsk_pool);/* For AF_XDP ZC, we disallow packets to span on
@@ -3444,9 +3440,6 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring) ring->queue_index); }else { - ret =i40e_alloc_rx_bi (ring); -if (ret) -return ret; ring->rx_buf_len = vsi->rx_buf_len;if (ring->vsi->type ==I40E_VSI_MAIN ) { ret = xdp_rxq_info_reg_mem_model(&ring->xdp_rxq,
@@ -13161,6 +13154,14 @@ static int i40e_xdp_setup(struct i40e_vsi *vsi, struct bpf_prog *prog,i40e_reset_and_rebuild (pf, true, true); } +if (!i40e_enabled_xdp_vsi (vsi) && prog) { +if (i40e_realloc_rx_bi_zc (vsi, true)) +return -ENOMEM ; + }else if (i40e_enabled_xdp_vsi (vsi) && !prog) { +if (i40e_realloc_rx_bi_zc (vsi, false)) +return -ENOMEM ; + } +for (i =0 ; i < vsi->num_queue_pairs; i++)WRITE_ONCE (vsi->rx_rings[i]->xdp_prog, vsi->xdp_prog);
@@ -13393,6 +13394,7 @@ int i40e_queue_pair_disable(struct i40e_vsi *vsi, int queue_pair)i40e_queue_pair_disable_irq (vsi, queue_pair); err =i40e_queue_pair_toggle_rings (vsi, queue_pair, false/* off */ ); +i40e_clean_rx_ring (vsi->rx_rings[queue_pair]);i40e_queue_pair_toggle_napi (vsi, queue_pair, false/* off */ );i40e_queue_pair_clean_rings (vsi, queue_pair);i40e_queue_pair_reset_stats (vsi, queue_pair);
drivers/net/ethernet/intel/i40e/i40e_txrx.c +5 -8
@@ -1459,14 +1459,6 @@ int i40e_setup_tx_descriptors(struct i40e_ring *tx_ring)return -ENOMEM ; } -int i40e_alloc_rx_bi (struct i40e_ring *rx_ring) -{ -unsigned long sz =sizeof (*rx_ring->rx_bi) * rx_ring->count; - - rx_ring->rx_bi =kzalloc (sz,GFP_KERNEL ); -return rx_ring->rx_bi ?0 : -ENOMEM ; -} -static void i40e_clear_rx_bi (struct i40e_ring *rx_ring) {memset (rx_ring->rx_bi,0 ,sizeof (*rx_ring->rx_bi) * rx_ring->count);
@@ -1597,6 +1589,11 @@ int i40e_setup_rx_descriptors(struct i40e_ring *rx_ring) rx_ring->xdp_prog = rx_ring->vsi->xdp_prog; + rx_ring->rx_bi = +kcalloc (rx_ring->count,sizeof (*rx_ring->rx_bi),GFP_KERNEL ); +if (!rx_ring->rx_bi) +return -ENOMEM ; +return 0 ; }
drivers/net/ethernet/intel/i40e/i40e_txrx.h +0 -1
@@ -466,7 +466,6 @@ int __i40e_maybe_stop_tx(struct i40e_ring *tx_ring, int size);bool __i40e_chk_linearize (struct sk_buff *skb);int i40e_xdp_xmit (struct net_device *dev,int n,struct xdp_frame **frames,u32 flags); -int i40e_alloc_rx_bi (struct i40e_ring *rx_ring);/** * i40e_get_head - Retrieve head from head writeback
drivers/net/ethernet/intel/i40e/i40e_xsk.c +59 -8
91 lines not on this page · raw message
drivers/net/ethernet/intel/i40e/i40e_xsk.h +1 -1
@@ -33,7 +33,7 @@ int i40e_clean_rx_irq_zc(struct i40e_ring *rx_ring, int budget);bool i40e_clean_xdp_tx_irq (struct i40e_vsi *vsi,struct i40e_ring *tx_ring);int i40e_xsk_wakeup (struct net_device *dev,u32 queue_id,u32 flags); -int i40e_alloc_rx_bi_zc (struct i40e_ring *rx_ring); +int i40e_realloc_rx_bi_zc (struct i40e_vsi *vsi,bool zc);void i40e_clear_rx_bi_zc (struct i40e_ring *rx_ring);#endif /* _I40E_XSK_H_ */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 39/79 HID: magicmouse: Do not set BTN_MOUSE on double report
In reply to Greg Kroah-HartmanFrom: José Expósito <[email protected]>
[ Upstream commit bb5f0c855dcfc893ae5ed90e4c646bde9e4498bf ]
Under certain conditions the Magic Trackpad can group 2 reports in a single packet. The packet is split and the raw event function is invoked recursively for each part.
However, after processing each part, the BTN_MOUSE status is updated, sending multiple click events. [1]
Return after processing double reports to avoid this issue.
--- drivers/hid/hid-magicmouse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hid/hid-magicmouse.c +1 -1
@@ -478,7 +478,7 @@ static int magicmouse_raw_event(struct hid_device *hdev,magicmouse_raw_event (hdev, report, data +2 , data[1 ]);magicmouse_raw_event (hdev, report, data +2 + data[1 ], size -2 - data[1 ]); -break ; +return 0 ;default :return 0 ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 40/79 sfc: Change VF mac via PF as first preference if available.
In reply to Greg Kroah-HartmanFrom: Jonathan Cooper <[email protected]>
[ Upstream commit a8aed7b35becfd21f22a77c7014029ea837b018f ]
Changing a VF's mac address through the VF (rather than via the PF) fails with EPERM because the latter part of efx_ef10_set_mac_address attempts to change the vport mac address list as the VF. Even with this fixed it still fails with EBUSY because the vadaptor is still assigned on the VF - the vadaptor reassignment must be within a section where the VF has torn down its state.
A major reason this has broken is because we have two functions that ostensibly do the same thing - have a PF and VF cooperate to change a VF mac address. Rather than do this, if we are changing the mac of a VF that has a link to the PF in the same VM then simply call sriov_set_vf_mac instead, which is a proven working function that does that.
If there is no PF available, or that fails non-fatally, then attempt to change the VF's mac address as we would a PF, without updating the PF's data.
Test case:
Create a VF:
echo 1 > /sys/class/net/<if>/device/sriov_numvfs
Set the mac address of the VF directly:
ip link set <vf> addr 00:11:22:33:44:55
Set the MAC address of the VF via the PF:
ip link set <pf> vf 0 mac 00:11:22:33:44:66
Without this patch the last command will fail with ENOENT.
--- drivers/net/ethernet/sfc/ef10.c | 58 ++++++++++++++------------------- 1 file changed, 24 insertions(+), 34 deletions(-)
drivers/net/ethernet/sfc/ef10.c +24 -34
@@ -3271,6 +3271,30 @@ static int efx_ef10_set_mac_address(struct efx_nic *efx)bool was_enabled = efx->port_enabled;int rc; +#ifdef CONFIG_SFC_SRIOV +/* If this function is a VF and we have access to the parent PF, +* then use the PF control path to attempt to change the VF MAC address. +*/ +if (efx->pci_dev->is_virtfn && efx->pci_dev->physfn) { +struct efx_nic *efx_pf =pci_get_drvdata (efx->pci_dev->physfn); +struct efx_ef10_nic_data *nic_data = efx->nic_data; +u8 mac[ETH_ALEN ]; + +/* net_dev->dev_addr can be zeroed by efx_net_stop in +* efx_ef10_sriov_set_vf_mac, so pass in a copy. +*/ +ether_addr_copy (mac, efx->net_dev->dev_addr); + + rc =efx_ef10_sriov_set_vf_mac (efx_pf, nic_data->vf_index, mac); +if (!rc) +return 0 ; + +netif_dbg (efx, drv, efx->net_dev, +"Updating VF mac via PF failed (%d), setting directly\n" , + rc); + } +#endif +efx_device_detach_sync (efx);efx_net_stop (efx->net_dev);
@@ -3293,40 +3317,6 @@ static int efx_ef10_set_mac_address(struct efx_nic *efx)efx_net_open (efx->net_dev);efx_device_attach_if_not_resetting (efx); -#ifdef CONFIG_SFC_SRIOV -if (efx->pci_dev->is_virtfn && efx->pci_dev->physfn) { -struct efx_ef10_nic_data *nic_data = efx->nic_data; -struct pci_dev *pci_dev_pf = efx->pci_dev->physfn; - -if (rc == -EPERM ) { -struct efx_nic *efx_pf; - -/* Switch to PF and change MAC address on vport */ - efx_pf =pci_get_drvdata (pci_dev_pf); - - rc =efx_ef10_sriov_set_vf_mac (efx_pf, - nic_data->vf_index, - efx->net_dev->dev_addr); - }else if (!rc) { -struct efx_nic *efx_pf =pci_get_drvdata (pci_dev_pf); -struct efx_ef10_nic_data *nic_data = efx_pf->nic_data; -unsigned int i; - -/* MAC address successfully changed by VF (with MAC -* spoofing) so update the parent PF if possible. -*/ -for (i =0 ; i < efx_pf->vf_count; ++i) { -struct ef10_vf *vf = nic_data->vf + i; - -if (vf->efx == efx) { -ether_addr_copy (vf->mac, - efx->net_dev->dev_addr); -return 0 ; - } - } - } - } else -#endif if (rc == -EPERM ) {netif_err (efx, drv, efx->net_dev, "Cannot change MAC address; use sfboot to enable"
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 41/79 net/atm: fix proc_mpc_write incorrect return value
In reply to Greg Kroah-HartmanFrom: Xiaobo Liu <[email protected]>
[ Upstream commit d8bde3bf7f82dac5fc68a62c2816793a12cafa2a ]
Then the input contains '\0' or '\n', proc_mpc_write has read them, so the return value needs +1.
--- net/atm/mpoa_proc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/atm/mpoa_proc.c +2 -1
@@ -219,11 +219,12 @@ static ssize_t proc_mpc_write(struct file *file, const char __user *buff,if (!page)return -ENOMEM ; -for (p = page, len =0 ; len < nbytes; p++, len++) { +for (p = page, len =0 ; len < nbytes; p++) {if (get_user (*p, buff++)) {free_page ((unsigned long )page);return -EFAULT ; } + len +=1 ;if (*p =='\0' || *p =='\n' )break ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 42/79 net: phy: dp83867: Extend RX strap quirk for SGMII mode
In reply to Greg Kroah-HartmanFrom: Harini Katakam <[email protected]>
[ Upstream commit 0c9efbd5c50c64ead434960a404c9c9a097b0403 ]
When RX strap in HW is not set to MODE 3 or 4, bit 7 and 8 in CF4 register should be set. The former is already handled in dp83867_config_init; add the latter in SGMII specific initialization.
--- drivers/net/phy/dp83867.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/net/phy/dp83867.c +8 -0
@@ -791,6 +791,14 @@ static int dp83867_config_init(struct phy_device *phydev)else val &= ~DP83867_SGMII_TYPE ;phy_write_mmd (phydev,DP83867_DEVADDR ,DP83867_SGMIICTL , val); + +/* This is a SW workaround for link instability if RX_CTRL is +* not strapped to mode 3 or 4 in HW. This is required for SGMII +* in addition to clearing bit 7, handled above. +*/ +if (dp83867->rxctrl_strap_quirk) +phy_set_bits_mmd (phydev,DP83867_DEVADDR ,DP83867_CFG4 , +BIT (8 )); } val =phy_read (phydev,DP83867_CFG3 );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 43/79 net: phylink: add mac_managed_pm in phylink_config structure
In reply to Greg Kroah-HartmanFrom: Shenwei Wang <[email protected]>
[ Upstream commit 96de900ae78e7dbedc937fd91bafe2934579c65a ]
The recent commit
'commit 744d23c71af3 ("net: phy: Warn about incorrect mdio_bus_phy_resume() state")'
requires the MAC driver explicitly tell the phy driver who is managing the PM, otherwise you will see warning during resume stage.
Add a boolean property in the phylink_config structure so that the MAC driver can use it to tell the PHY driver if it wants to manage the PM.
--- drivers/net/phy/phylink.c | 3 +++ include/linux/phylink.h | 2 ++ 2 files changed, 5 insertions(+)
drivers/net/phy/phylink.c +3 -0
@@ -1050,6 +1050,9 @@ static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy,if (phy_interrupt_is_valid (phy))phy_request_interrupt (phy); +if (pl->config->mac_managed_pm) + phy->mac_managed_pm = true; +return 0 ; }
include/linux/phylink.h +2 -0
@@ -64,6 +64,7 @@ enum phylink_op_type {* @pcs_poll: MAC PCS cannot provide link change interrupt * @poll_fixed_state: if true, starts link_poll, * if MAC link is at %MLO_AN_FIXED mode. +* @mac_managed_pm: if true, indicate the MAC driver is responsible for PHY PM. * @ovr_an_inband: if true, override PCS to MLO_AN_INBAND * @get_fixed_state: callback to execute to determine the fixed link state, * if MAC link is at %MLO_AN_FIXED mode.
@@ -73,6 +74,7 @@ struct phylink_config {enum phylink_op_type type;bool pcs_poll;bool poll_fixed_state; +bool mac_managed_pm;bool ovr_an_inband;void (*get_fixed_state)(struct phylink_config *config,struct phylink_link_state *state);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 44/79 scsi: lpfc: Fix memory leak in lpfc_create_port()
In reply to Greg Kroah-HartmanFrom: Rafael Mendonca <[email protected]>
[ Upstream commit dc8e483f684a24cc06e1d5fa958b54db58855093 ]
Commit 5e633302ace1 ("scsi: lpfc: vmid: Add support for VMID in mailbox command") introduced allocations for the VMID resources in lpfc_create_port() after the call to scsi_host_alloc(). Upon failure on the VMID allocations, the new code would branch to the 'out' label, which returns NULL without unwinding anything, thus skipping the call to scsi_host_put().
Fix the problem by creating a separate label 'out_free_vmid' to unwind the VMID resources and make the 'out_put_shost' label call only scsi_host_put(), as was done before the introduction of allocations for VMID.
--- drivers/scsi/lpfc/lpfc_init.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/scsi/lpfc/lpfc_init.c +4 -3
@@ -4666,7 +4666,7 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev) rc =lpfc_vmid_res_alloc (phba, vport);if (rc) - goto out; + goto out_put_shost;/* Initialize all internally managed lists. */ INIT_LIST_HEAD (&vport->fc_nodes);
@@ -4684,16 +4684,17 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev) error =scsi_add_host_with_dma (shost, dev, &phba->pcidev->dev);if (error) - goto out_put_shost; + goto out_free_vmid;spin_lock_irq (&phba->port_list_lock);list_add_tail (&vport->listentry, &phba->port_list);spin_unlock_irq (&phba->port_list_lock);return vport; -out_put_shost: +out_free_vmid:kfree (vport->vmid);bitmap_free (vport->vmid_priority_range); +out_put_shost:scsi_host_put (shost); out:return NULL ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 45/79 udp: Update reuse->has_conns under reuseport_lock.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 69421bf98482d089e50799f45e48b25ce4a8d154 ]
When we call connect() for a UDP socket in a reuseport group, we have to update sk->sk_reuseport_cb->has_conns to 1. Otherwise, the kernel could select a unconnected socket wrongly for packets sent to the connected socket.
However, the current way to set has_conns is illegal and possible to trigger that problem. reuseport_has_conns() changes has_conns under rcu_read_lock(), which upgrades the RCU reader to the updater. Then, it must do the update under the updater's lock, reuseport_lock, but it doesn't for now.
For this reason, there is a race below where we fail to set has_conns resulting in the wrong socket selection. To avoid the race, let's split the reader and updater with proper locking.
cpu1 cpu2
+----+ +----+
__ip[46]_datagram_connect() reuseport_grow() . . |- reuseport_has_conns(sk, true) |- more_reuse = __reuseport_alloc(more_socks_size) | . | | |- rcu_read_lock() | |- reuse = rcu_dereference(sk->sk_reuseport_cb) | | | | | /* reuse->has_conns == 0 here */ | | |- more_reuse->has_conns = reuse->has_conns | |- reuse->has_conns = 1 | /* more_reuse->has_conns SHOULD BE 1 HERE */ | | | | | |- rcu_assign_pointer(reuse->socks[i]->sk_reuseport_cb, | | | more_reuse) | `- rcu_read_unlock() `- kfree_rcu(reuse, rcu) | |- sk->sk_state = TCP_ESTABLISHED
Note the likely(reuse) in reuseport_has_conns_set() is always true, but we put the test there for ease of review. [0]
For the record, usually, sk_reuseport_cb is changed under lock_sock(). The only exception is reuseport_grow() & TCP reqsk migration case.
1) shutdown() TCP listener, which is moved into the latter part of
reuse->socks[] to migrate reqsk.
2) New listen() overflows reuse->socks[] and call reuseport_grow().
3) reuse->max_socks overflows u16 with the new listener.
4) reuseport_grow() pops the old shutdown()ed listener from the array
and update its sk->sk_reuseport_cb as NULL without lock_sock().
shutdown()ed TCP sk->sk_reuseport_cb can be changed without lock_sock(), but, reuseport_has_conns_set() is called only for UDP under lock_sock(), so likely(reuse) never be false in reuseport_has_conns_set().
[0]: https://lore.kernel.org/netdev/CANn89iLja=eQHbsM_Ta2sQF0tOGU8vAGrh_izRuuHjuO1ouUag@mail.gmail.com/
--- include/net/sock_reuseport.h | 11 +++++------ net/core/sock_reuseport.c | 16 ++++++++++++++++ net/ipv4/datagram.c | 2 +- net/ipv4/udp.c | 2 +- net/ipv6/datagram.c | 2 +- net/ipv6/udp.c | 2 +- 6 files changed, 25 insertions(+), 10 deletions(-)
include/net/sock_reuseport.h +5 -6
@@ -43,21 +43,20 @@ struct sock *reuseport_migrate_sock(struct sock *sk,extern int reuseport_attach_prog (struct sock *sk,struct bpf_prog *prog);extern int reuseport_detach_prog (struct sock *sk); -static inline bool reuseport_has_conns (struct sock *sk,bool set) +static inline bool reuseport_has_conns (struct sock *sk) {struct sock_reuseport *reuse;bool ret = false;rcu_read_lock (); reuse =rcu_dereference (sk->sk_reuseport_cb); -if (reuse) { -if (set) - reuse->has_conns =1 ; - ret = reuse->has_conns; - } +if (reuse && reuse->has_conns) + ret = true;rcu_read_unlock ();return ret; } +void reuseport_has_conns_set (struct sock *sk); +#endif /* _SOCK_REUSEPORT_H */
net/core/sock_reuseport.c +16 -0
@@ -21,6 +21,22 @@ static DEFINE_IDA(reuseport_ida);static int reuseport_resurrect (struct sock *sk,struct sock_reuseport *old_reuse,struct sock_reuseport *reuse,bool bind_inany); +void reuseport_has_conns_set (struct sock *sk) +{ +struct sock_reuseport *reuse; + +if (!rcu_access_pointer (sk->sk_reuseport_cb)) +return ; + +spin_lock_bh (&reuseport_lock); + reuse =rcu_dereference_protected (sk->sk_reuseport_cb, +lockdep_is_held (&reuseport_lock)); +if (likely (reuse)) + reuse->has_conns =1 ; +spin_unlock_bh (&reuseport_lock); +} +EXPORT_SYMBOL (reuseport_has_conns_set); +static int reuseport_sock_index (struct sock *sk,const struct sock_reuseport *reuse,bool closed)
net/ipv4/datagram.c +1 -1
@@ -70,7 +70,7 @@ int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len } inet->inet_daddr = fl4->daddr; inet->inet_dport = usin->sin_port; -reuseport_has_conns (sk, true); +reuseport_has_conns_set (sk); sk->sk_state =TCP_ESTABLISHED ;sk_set_txhash (sk); inet->inet_id =prandom_u32 ();
net/ipv4/udp.c +1 -1
@@ -446,7 +446,7 @@ static struct sock *udp4_lib_lookup2(struct net *net, result =lookup_reuseport (net, sk, skb, saddr, sport, daddr, hnum);/* Fall back to scoring if group has connections */ -if (result && !reuseport_has_conns (sk, false)) +if (result && !reuseport_has_conns (sk))return result; result = result ? : sk;
net/ipv6/datagram.c +1 -1
@@ -256,7 +256,7 @@ int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, goto out; } -reuseport_has_conns (sk, true); +reuseport_has_conns_set (sk); sk->sk_state =TCP_ESTABLISHED ;sk_set_txhash (sk); out:
net/ipv6/udp.c +1 -1
@@ -180,7 +180,7 @@ static struct sock *udp6_lib_lookup2(struct net *net, result =lookup_reuseport (net, sk, skb, saddr, sport, daddr, hnum);/* Fall back to scoring if group has connections */ -if (result && !reuseport_has_conns (sk, false)) +if (result && !reuseport_has_conns (sk))return result; result = result ? : sk;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 46/79 cifs: Fix xid leak in cifs_create()
In reply to Greg Kroah-HartmanFrom: Zhang Xiaoxu <[email protected]>
[ Upstream commit fee0fb1f15054bb6a0ede452acb42da5bef4d587 ]
If the cifs already shutdown, we should free the xid before return, otherwise, the xid will be leaked.
--- fs/cifs/dir.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/cifs/dir.c +4 -2
@@ -538,8 +538,10 @@ int cifs_create(struct user_namespace *mnt_userns, struct inode *inode,cifs_dbg (FYI ,"cifs_create parent inode = 0x%p name is: %pd and dentry = 0x%p\n" , inode, direntry, direntry); -if (unlikely (cifs_forced_shutdown (CIFS_SB (inode->i_sb)))) -return -EIO ; +if (unlikely (cifs_forced_shutdown (CIFS_SB (inode->i_sb)))) { + rc = -EIO ; + goto out_free_xid; + } tlink =cifs_sb_tlink (CIFS_SB (inode->i_sb)); rc =PTR_ERR (tlink);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 47/79 cifs: Fix xid leak in cifs_copy_file_range()
In reply to Greg Kroah-HartmanFrom: Zhang Xiaoxu <[email protected]>
[ Upstream commit 9a97df404a402fe1174d2d1119f87ff2a0ca2fe9 ]
If the file is used by swap, before return -EOPNOTSUPP, should free the xid, otherwise, the xid will be leaked.
--- fs/cifs/cifsfs.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
fs/cifs/cifsfs.c +5 -2
@@ -1263,8 +1263,11 @@ static ssize_t cifs_copy_file_range(struct file *src_file, loff_t off,ssize_t rc;struct cifsFileInfo *cfile = dst_file->private_data; -if (cfile->swapfile) -return -EOPNOTSUPP ; +if (cfile->swapfile) { + rc = -EOPNOTSUPP ; +free_xid (xid); +return rc; + } rc =cifs_file_copychunk_range (xid, src_file, off, dst_file, destoff, len, flags);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 48/79 cifs: Fix xid leak in cifs_flock()
In reply to Greg Kroah-HartmanFrom: Zhang Xiaoxu <[email protected]>
[ Upstream commit 575e079c782b9862ec2626403922d041a42e6ed6 ]
If not flock, before return -ENOLCK, should free the xid, otherwise, the xid will be leaked.
--- fs/cifs/file.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
fs/cifs/file.c +7 -4
@@ -1806,11 +1806,13 @@ int cifs_flock(struct file *file, int cmd, struct file_lock *fl)struct cifsFileInfo *cfile;__u32 type; - rc = -EACCES ; xid =get_xid (); -if (!(fl->fl_flags &FL_FLOCK )) -return -ENOLCK ; +if (!(fl->fl_flags &FL_FLOCK )) { + rc = -ENOLCK ; +free_xid (xid); +return rc; + } cfile = (struct cifsFileInfo *)file->private_data; tcon =tlink_tcon (cfile->tlink);
@@ -1829,8 +1831,9 @@ int cifs_flock(struct file *file, int cmd, struct file_lock *fl)* if no lock or unlock then nothing to do since we do not * know what it is */ + rc = -EOPNOTSUPP ;free_xid (xid); -return -EOPNOTSUPP ; +return rc; } rc = cifs_setlk(file, fl, type, wait_flag, posix_lck, lock, unlock,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 49/79 cifs: Fix xid leak in cifs_ses_add_channel()
In reply to Greg Kroah-HartmanFrom: Zhang Xiaoxu <[email protected]>
[ Upstream commit e909d054bdea75ef1ec48c18c5936affdaecbb2c ]
Before return, should free the xid, otherwise, the xid will be leaked.
--- fs/cifs/sess.c | 1 + 1 file changed, 1 insertion(+)
fs/cifs/sess.c +1 -0
@@ -320,6 +320,7 @@ cifs_ses_add_channel(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,if (rc && chan->server)cifs_put_tcp_session (chan->server,0 ); +free_xid (xid);return rc; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 50/79 dm: remove unnecessary assignment statement in alloc_dev()
In reply to Greg Kroah-HartmanFrom: Genjian Zhang <[email protected]>
[ Upstream commit 99f4f5bcb975527508eb7a5e3e34bdb91d576746 ]
--- drivers/md/dm.c | 1 - 1 file changed, 1 deletion(-)
drivers/md/dm.c +0 -1
@@ -1797,7 +1797,6 @@ static struct mapped_device *alloc_dev(int minor) md->disk->first_minor = minor; md->disk->minors =1 ; md->disk->fops = &dm_blk_dops; - md->disk->queue = md->queue; md->disk->private_data = md;sprintf (md->disk->disk_name,"dm-%d" , minor);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 51/79 net: hsr: avoid possible NULL deref in skb_clone()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit d8b57135fd9ffe9a5b445350a686442a531c5339 ]
syzbot got a crash [1] in skb_clone(), caused by a bug in hsr_get_untagged_frame().
When/if create_stripped_skb_hsr() returns NULL, we must not attempt to call skb_clone().
While we are at it, replace a WARN_ONCE() by netdev_warn_once().
[1]
general protection fault, probably for non-canonical address 0xdffffc000000000f: 0000 [#1] PREEMPT SMP KASAN KASAN: null-ptr-deref in range [0x0000000000000078-0x000000000000007f] CPU: 1 PID: 754 Comm: syz-executor.0 Not tainted 6.0.0-syzkaller-02734-g0326074ff465 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/22/2022 RIP: 0010:skb_clone+0x108/0x3c0 net/core/skbuff.c:1641 Code: 93 02 00 00 49 83 7c 24 28 00 0f 85 e9 00 00 00 e8 5d 4a 29 fa 4c 8d 75 7e 48 b8 00 00 00 00 00 fc ff df 4c 89 f2 48 c1 ea 03 <0f> b6 04 02 4c 89 f2 83 e2 07 38 d0 7f 08 84 c0 0f 85 9e 01 00 00 RSP: 0018:ffffc90003ccf4e0 EFLAGS: 00010207
RAX: dffffc0000000000 RBX: ffffc90003ccf5f8 RCX: ffffc9000c24b000
RDX: 000000000000000f RSI: ffffffff8751cb13 RDI: 0000000000000000
RBP: 0000000000000000 R08: 00000000000000f0 R09: 0000000000000140
R10: fffffbfff181d972 R11: 0000000000000000 R12: ffff888161fc3640
R13: 0000000000000a20 R14: 000000000000007e R15: ffffffff8dc5f620
FS: 00007feb621e4700(0000) GS:ffff8880b9b00000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007feb621e3ff8 CR3: 00000001643a9000 CR4: 00000000003506e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace: <TASK> hsr_get_untagged_frame+0x4e/0x610 net/hsr/hsr_forward.c:164 hsr_forward_do net/hsr/hsr_forward.c:461 [inline] hsr_forward_skb+0xcca/0x1d50 net/hsr/hsr_forward.c:623 hsr_handle_frame+0x588/0x7c0 net/hsr/hsr_slave.c:69 __netif_receive_skb_core+0x9fe/0x38f0 net/core/dev.c:5379 __netif_receive_skb_one_core+0xae/0x180 net/core/dev.c:5483 __netif_receive_skb+0x1f/0x1c0 net/core/dev.c:5599 netif_receive_skb_internal net/core/dev.c:5685 [inline] netif_receive_skb+0x12f/0x8d0 net/core/dev.c:5744 tun_rx_batched+0x4ab/0x7a0 drivers/net/tun.c:1544 tun_get_user+0x2686/0x3a00 drivers/net/tun.c:1995 tun_chr_write_iter+0xdb/0x200 drivers/net/tun.c:2025 call_write_iter include/linux/fs.h:2187 [inline] new_sync_write fs/read_write.c:491 [inline] vfs_write+0x9e9/0xdd0 fs/read_write.c:584 ksys_write+0x127/0x250 fs/read_write.c:637 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd
--- net/hsr/hsr_forward.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
net/hsr/hsr_forward.c +6 -6
@@ -108,15 +108,15 @@ struct sk_buff *hsr_get_untagged_frame(struct hsr_frame_info *frame, struct hsr_port *port) {if (!frame->skb_std) { -if (frame->skb_hsr) { +if (frame->skb_hsr) frame->skb_std =create_stripped_skb_hsr (frame->skb_hsr, frame); - }else { -/* Unexpected */ -WARN_ONCE (1 ,"%s:%d: Unexpected frame received (port_src %s)\n" , - __FILE__, __LINE__, port->dev->name); +else +netdev_warn_once (port->dev, +"Unexpected frame received in hsr_get_untagged_frame()\n" ); + +if (!frame->skb_std)return NULL ; - } }return skb_clone (frame->skb_std,GFP_ATOMIC );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 52/79 ionic: catch NULL pointer issue on reconfig
In reply to Greg Kroah-HartmanFrom: Brett Creeley <[email protected]>
[ Upstream commit aa1d7e1267c12e07d979aa34c613716a89029db2 ]
It's possible that the driver will dereference a qcq that doesn't exist when calling ionic_reconfigure_queues(), which causes a page fault BUG.
If a reduction in the number of queues is followed by a different reconfig such as changing the ring size, the driver can hit a NULL pointer when trying to clean up non-existent queues.
Fix this by checking to make sure both the qcqs array and qcq entry exists bofore trying to use and free the entry.
--- drivers/net/ethernet/pensando/ionic/ionic_lif.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/net/ethernet/pensando/ionic/ionic_lif.c +8 -4
@@ -2880,11 +2880,15 @@ int ionic_reconfigure_queues(struct ionic_lif *lif,* than the full array, but leave the qcq shells in place */ for (i = lif->nxqs; i < lif->ionic->ntxqs_per_lif; i++) { - lif->txqcqs[i]->flags &= ~IONIC_QCQ_F_INTR ; -ionic_qcq_free (lif, lif->txqcqs[i]); +if (lif->txqcqs && lif->txqcqs[i]) { + lif->txqcqs[i]->flags &= ~IONIC_QCQ_F_INTR ; +ionic_qcq_free (lif, lif->txqcqs[i]); + } - lif->rxqcqs[i]->flags &= ~IONIC_QCQ_F_INTR ; -ionic_qcq_free (lif, lif->rxqcqs[i]); +if (lif->rxqcqs && lif->rxqcqs[i]) { + lif->rxqcqs[i]->flags &= ~IONIC_QCQ_F_INTR ; +ionic_qcq_free (lif, lif->rxqcqs[i]); + } }if (err)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 53/79 netfilter: nf_tables: relax NFTA_SET_ELEM_KEY_END set flags requirements
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 96df8360dbb435cc69f7c3c8db44bf8b1c24cd7b ]
Otherwise EINVAL is bogusly reported to userspace when deleting a set element. NFTA_SET_ELEM_KEY_END does not need to be set in case of:
- insertion: if not present, start key is used as end key.
- deletion: only start key needs to be specified, end key is ignored.
Hence, relax the sanity check.
--- net/netfilter/nf_tables_api.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/netfilter/nf_tables_api.c +3 -2
@@ -5720,8 +5720,9 @@ static bool nft_setelem_valid_key_end(const struct nft_set *set, (NFT_SET_CONCAT | NFT_SET_INTERVAL)) { if (flags & NFT_SET_ELEM_INTERVAL_END) return false; - if (!nla[NFTA_SET_ELEM_KEY_END] && - !(flags & NFT_SET_ELEM_CATCHALL)) + + if (nla[NFTA_SET_ELEM_KEY_END] && + flags & NFT_SET_ELEM_CATCHALL) return false; } else {if (nla[NFTA_SET_ELEM_KEY_END ])
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 54/79 nvme-hwmon: consistently ignore errors from nvme_hwmon_init
In reply to Greg Kroah-HartmanFrom: Christoph Hellwig <[email protected]>
[ Upstream commit 6b8cf94005187952f794c0c4ed3920a1e8accfa3 ]
An NVMe controller works perfectly fine even when the hwmon initialization fails. Stop returning errors that do not come from a controller reset from nvme_hwmon_init to handle this case consistently.
Stable-dep-of: c94b7f9bab22 ("nvme-hwmon: kmalloc the NVME SMART log buffer")
--- drivers/nvme/host/core.c | 6 +++++- drivers/nvme/host/hwmon.c | 13 ++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-)
drivers/nvme/host/core.c +5 -1
@@ -3088,8 +3088,12 @@ int nvme_init_ctrl_finish(struct nvme_ctrl *ctrl)return ret;if (!ctrl->identified && !nvme_discovery_ctrl (ctrl)) { +/* +* Do not return errors unless we are in a controller reset, +* the controller works perfectly fine without hwmon. +*/ ret =nvme_hwmon_init (ctrl); -if (ret <0 ) +if (ret == -EINTR )return ret; }
drivers/nvme/host/hwmon.c +8 -5
@@ -230,7 +230,7 @@ int nvme_hwmon_init(struct nvme_ctrl *ctrl) data =kzalloc (sizeof (*data),GFP_KERNEL );if (!data) -return 0 ; +return -ENOMEM ; data->ctrl = ctrl;mutex_init (&data->read_lock);
@@ -238,8 +238,7 @@ int nvme_hwmon_init(struct nvme_ctrl *ctrl) err =nvme_hwmon_get_smart_log (data);if (err) {dev_warn (dev,"Failed to read smart log (error %d)\n" , err); -kfree (data); -return err; + goto err_free_data; } hwmon = hwmon_device_register_with_info(dev, "nvme",
@@ -247,11 +246,15 @@ int nvme_hwmon_init(struct nvme_ctrl *ctrl) NULL);if (IS_ERR (hwmon)) {dev_warn (dev,"Failed to instantiate hwmon device\n" ); -kfree (data); -return PTR_ERR (hwmon); + err =PTR_ERR (hwmon); + goto err_free_data; } ctrl->hwmon_device = hwmon;return 0 ; + +err_free_data: +kfree (data); +return err; }void nvme_hwmon_exit (struct nvme_ctrl *ctrl)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 55/79 nvme-hwmon: kmalloc the NVME SMART log buffer
In reply to Greg Kroah-HartmanFrom: Serge Semin <[email protected]>
[ Upstream commit c94b7f9bab22ac504f9153767676e659988575ad ]
Recent commit 52fde2c07da6 ("nvme: set dma alignment to dword") has caused a regression on our platform.
It turned out that the nvme_get_log() method invocation caused the nvme_hwmon_data structure instance corruption. In particular the nvme_hwmon_data.ctrl pointer was overwritten either with zeros or with garbage. After some research we discovered that the problem happened even before the actual NVME DMA execution, but during the buffer mapping. Since our platform is DMA-noncoherent, the mapping implied the cache-line invalidations or write-backs depending on the DMA-direction parameter. In case of the NVME SMART log getting the DMA was performed from-device-to-memory, thus the cache-invalidation was activated during the buffer mapping. Since the log-buffer isn't cache-line aligned, the cache-invalidation caused the neighbour data to be discarded. The neighbouring data turned to be the data surrounding the buffer in the framework of the nvme_hwmon_data structure.
In order to fix that we need to make sure that the whole log-buffer is defined within the cache-line-aligned memory region so the cache-invalidation procedure wouldn't involve the adjacent data. One of the option to guarantee that is to kmalloc the DMA-buffer [1]. Seeing the rest of the NVME core driver prefer that method it has been chosen to fix this problem too.
Note after a deeper researches we found out that the denoted commit wasn't a root cause of the problem. It just revealed the invalidity by activating the DMA-based NVME SMART log getting performed in the framework of the NVME hwmon driver. The problem was here since the initial commit of the driver.
[1] Documentation/core-api/dma-api-howto.rst
--- drivers/nvme/host/hwmon.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-)
drivers/nvme/host/hwmon.c +16 -7
@@ -12,7 +12,7 @@struct nvme_hwmon_data {struct nvme_ctrl *ctrl; -struct nvme_smart_log log; +struct nvme_smart_log *log;struct mutex read_lock; };
@@ -60,14 +60,14 @@ static int nvme_set_temp_thresh(struct nvme_ctrl *ctrl, int sensor, bool under,static int nvme_hwmon_get_smart_log (struct nvme_hwmon_data *data) {return nvme_get_log (data->ctrl,NVME_NSID_ALL ,NVME_LOG_SMART ,0 , -NVME_CSI_NVM , &data->log,sizeof (data->log),0 ); +NVME_CSI_NVM , data->log,sizeof (*data->log),0 ); }static int nvme_hwmon_read (struct device *dev,enum hwmon_sensor_types type,u32 attr,int channel,long *val) {struct nvme_hwmon_data *data =dev_get_drvdata (dev); -struct nvme_smart_log *log = &data->log; +struct nvme_smart_log *log = data->log;int temp;int err;
@@ -163,7 +163,7 @@ static umode_t nvme_hwmon_is_visible(const void *_data,case hwmon_temp_max:case hwmon_temp_min:if ((!channel && data->ctrl->wctemp) || - (channel && data->log.temp_sensor[channel -1 ])) { + (channel && data->log->temp_sensor[channel -1 ])) {if (data->ctrl->quirks &NVME_QUIRK_NO_TEMP_THRESH_CHANGE )return 0444 ;
@@ -176,7 +176,7 @@ static umode_t nvme_hwmon_is_visible(const void *_data,break ;case hwmon_temp_input:case hwmon_temp_label: -if (!channel || data->log.temp_sensor[channel -1 ]) +if (!channel || data->log->temp_sensor[channel -1 ])return 0444 ;break ;default :
@@ -232,13 +232,19 @@ int nvme_hwmon_init(struct nvme_ctrl *ctrl)if (!data)return -ENOMEM ; + data->log =kzalloc (sizeof (*data->log),GFP_KERNEL ); +if (!data->log) { + err = -ENOMEM ; + goto err_free_data; + } + data->ctrl = ctrl;mutex_init (&data->read_lock); err =nvme_hwmon_get_smart_log (data);if (err) {dev_warn (dev,"Failed to read smart log (error %d)\n" , err); - goto err_free_data; + goto err_free_log; } hwmon = hwmon_device_register_with_info(dev, "nvme",
@@ -247,11 +253,13 @@ int nvme_hwmon_init(struct nvme_ctrl *ctrl)if (IS_ERR (hwmon)) {dev_warn (dev,"Failed to instantiate hwmon device\n" ); err =PTR_ERR (hwmon); - goto err_free_data; + goto err_free_log; } ctrl->hwmon_device = hwmon;return 0 ; +err_free_log: +kfree (data->log); err_free_data:kfree (data);return err;
@@ -265,6 +273,7 @@ void nvme_hwmon_exit(struct nvme_ctrl *ctrl)hwmon_device_unregister (ctrl->hwmon_device); ctrl->hwmon_device =NULL ; +kfree (data->log);kfree (data); } }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 56/79 nvmet: fix workqueue MEM_RECLAIM flushing dependency
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
[ Upstream commit ddd2b8de9f85b388925e7dc46b3890fc1a0d8d24 ]
The keep alive timer needs to stay on nvmet_wq, and not modified to reschedule on the system_wq.
This fixes a warning:
------------[ cut here ]------------ workqueue: WQ_MEM_RECLAIM nvmet-wq:nvmet_rdma_release_queue_work [nvmet_rdma] is flushing !WQ_MEM_RECLAIM events:nvmet_keep_alive_timer [nvmet] WARNING: CPU: 3 PID: 1086 at kernel/workqueue.c:2628 check_flush_dependency+0x16c/0x1e0
--- drivers/nvme/target/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvme/target/core.c +1 -1
@@ -1168,7 +1168,7 @@ static void nvmet_start_ctrl(struct nvmet_ctrl *ctrl)* reset the keep alive timer when the controller is enabled. */ if (ctrl->kato) -mod_delayed_work (system_wq, &ctrl->ka_work, ctrl->kato *HZ ); +mod_delayed_work (nvmet_wq, &ctrl->ka_work, ctrl->kato *HZ ); }static void nvmet_clear_ctrl (struct nvmet_ctrl *ctrl)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 57/79 net: sched: cake: fix null pointer access issue when cake_init() fails
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit 51f9a8921ceacd7bf0d3f47fa867a64988ba1dcb ]
When the default qdisc is cake, if the qdisc of dev_queue fails to be inited during mqprio_init(), cake_reset() is invoked to clear resources. In this case, the tins is NULL, and it will cause gpf issue.
The process is as follows:qdisc_create_dflt()
cake_init() q->tins = kvcalloc(...) --->failed, q->tins is NULL ... qdisc_put() ... cake_reset() ... cake_dequeue_one() b = &q->tins[...] --->q->tins is NULL
The following is the Call Trace information:
general protection fault, probably for non-canonical address 0xdffffc0000000000: 0000 [#1] PREEMPT SMP KASAN KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] RIP: 0010:cake_dequeue_one+0xc9/0x3c0 Call Trace: <TASK> cake_reset+0xb1/0x140 qdisc_reset+0xed/0x6f0 qdisc_destroy+0x82/0x4c0 qdisc_put+0x9e/0xb0 qdisc_create_dflt+0x2c3/0x4a0 mqprio_init+0xa71/0x1760 qdisc_create+0x3eb/0x1000 tc_modify_qdisc+0x408/0x1720 rtnetlink_rcv_msg+0x38e/0xac0 netlink_rcv_skb+0x12d/0x3a0 netlink_unicast+0x4a2/0x740 netlink_sendmsg+0x826/0xcc0 sock_sendmsg+0xc5/0x100 ____sys_sendmsg+0x583/0x690 ___sys_sendmsg+0xe8/0x160 __sys_sendmsg+0xbf/0x160 do_syscall_64+0x35/0x80 entry_SYSCALL_64_after_hwframe+0x46/0xb0 RIP: 0033:0x7f89e5122d04 </TASK>
--- net/sched/sch_cake.c | 4 ++++ 1 file changed, 4 insertions(+)
net/sched/sch_cake.c +4 -0
@@ -2224,8 +2224,12 @@ static struct sk_buff *cake_dequeue(struct Qdisc *sch)static void cake_reset (struct Qdisc *sch) { +struct cake_sched_data *q =qdisc_priv (sch);u32 c; +if (!q->tins) +return ; +for (c =0 ; c <CAKE_MAX_TINS ; c++)cake_clear_tin (sch, c); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 58/79 net: sched: delete duplicate cleanup of backlog and qlen
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit c19d893fbf3f2f8fa864ae39652c7fee939edde2 ]
qdisc_reset() is clearing qdisc->q.qlen and qdisc->qstats.backlog _after_ calling qdisc->ops->reset. There is no need to clear them again in the specific reset function.
Stable-dep-of: 2a3fc78210b9 ("net: sched: sfb: fix null pointer access issue when sfb_init() fails")
--- include/net/sch_generic.h | 1 - net/sched/sch_atm.c | 1 - net/sched/sch_cbq.c | 1 - net/sched/sch_choke.c | 2 -- net/sched/sch_drr.c | 2 -- net/sched/sch_dsmark.c | 2 -- net/sched/sch_etf.c | 3 --- net/sched/sch_ets.c | 2 -- net/sched/sch_fq_codel.c | 2 -- net/sched/sch_fq_pie.c | 3 --- net/sched/sch_hfsc.c | 2 -- net/sched/sch_htb.c | 2 -- net/sched/sch_multiq.c | 1 - net/sched/sch_prio.c | 2 -- net/sched/sch_qfq.c | 2 -- net/sched/sch_red.c | 2 -- net/sched/sch_sfb.c | 2 -- net/sched/sch_skbprio.c | 3 --- net/sched/sch_taprio.c | 2 -- net/sched/sch_tbf.c | 2 -- net/sched/sch_teql.c | 1 - 21 files changed, 40 deletions(-)
include/net/sch_generic.h +0 -1
@@ -1177,7 +1177,6 @@ static inline void __qdisc_reset_queue(struct qdisc_skb_head *qh)static inline void qdisc_reset_queue (struct Qdisc *sch) {__qdisc_reset_queue (&sch->q); - sch->qstats.backlog =0 ; } static inline struct Qdisc *qdisc_replace(struct Qdisc *sch, struct Qdisc *new,
net/sched/sch_atm.c +0 -1
@@ -576,7 +576,6 @@ static void atm_tc_reset(struct Qdisc *sch)pr_debug ("atm_tc_reset(sch %p,[qdisc %p])\n" , sch, p);list_for_each_entry (flow, &p->flows, list)qdisc_reset (flow->q); - sch->q.qlen =0 ; }static void atm_tc_destroy (struct Qdisc *sch)
net/sched/sch_cbq.c +0 -1
@@ -1053,7 +1053,6 @@ cbq_reset(struct Qdisc *sch) cl->cpriority = cl->priority; } } - sch->q.qlen =0 ; }
net/sched/sch_choke.c +0 -2
@@ -315,8 +315,6 @@ static void choke_reset(struct Qdisc *sch)rtnl_qdisc_drop (skb, sch); } - sch->q.qlen =0 ; - sch->qstats.backlog =0 ;if (q->tab)memset (q->tab,0 , (q->tab_mask +1 ) *sizeof (struct sk_buff *)); q->head = q->tail =0 ;
net/sched/sch_drr.c +0 -2
@@ -444,8 +444,6 @@ static void drr_reset_qdisc(struct Qdisc *sch)qdisc_reset (cl->qdisc); } } - sch->qstats.backlog =0 ; - sch->q.qlen =0 ; }static void drr_destroy_qdisc (struct Qdisc *sch)
net/sched/sch_dsmark.c +0 -2
@@ -409,8 +409,6 @@ static void dsmark_reset(struct Qdisc *sch)pr_debug ("%s(sch %p,[qdisc %p])\n" , __func__, sch, p);if (p->q)qdisc_reset (p->q); - sch->qstats.backlog =0 ; - sch->q.qlen =0 ; }static void dsmark_destroy (struct Qdisc *sch)
net/sched/sch_etf.c +0 -3
@@ -445,9 +445,6 @@ static void etf_reset(struct Qdisc *sch)timesortedlist_clear (sch);__qdisc_reset_queue (&sch->q); - sch->qstats.backlog =0 ; - sch->q.qlen =0 ; - q->last =0 ; }
net/sched/sch_ets.c +0 -2
@@ -722,8 +722,6 @@ static void ets_qdisc_reset(struct Qdisc *sch) }for (band =0 ; band < q->nbands; band++)qdisc_reset (q->classes[band].qdisc); - sch->qstats.backlog =0 ; - sch->q.qlen =0 ; }static void ets_qdisc_destroy (struct Qdisc *sch)
net/sched/sch_fq_codel.c +0 -2
@@ -347,8 +347,6 @@ static void fq_codel_reset(struct Qdisc *sch)codel_vars_init (&flow->cvars); }memset (q->backlogs,0 , q->flows_cnt *sizeof (u32)); - sch->q.qlen =0 ; - sch->qstats.backlog =0 ; q->memory_usage =0 ; }
net/sched/sch_fq_pie.c +0 -3
@@ -521,9 +521,6 @@ static void fq_pie_reset(struct Qdisc *sch)INIT_LIST_HEAD (&flow->flowchain);pie_vars_init (&flow->vars); } - - sch->q.qlen =0 ; - sch->qstats.backlog =0 ; }static void fq_pie_destroy (struct Qdisc *sch)
net/sched/sch_hfsc.c +0 -2
@@ -1485,8 +1485,6 @@ hfsc_reset_qdisc(struct Qdisc *sch) } q->eligible =RB_ROOT ;qdisc_watchdog_cancel (&q->watchdog); - sch->qstats.backlog =0 ; - sch->q.qlen =0 ; } static void
net/sched/sch_htb.c +0 -2
@@ -1008,8 +1008,6 @@ static void htb_reset(struct Qdisc *sch) }qdisc_watchdog_cancel (&q->watchdog);__qdisc_reset_queue (&q->direct_queue); - sch->q.qlen =0 ; - sch->qstats.backlog =0 ;memset (q->hlevel,0 ,sizeof (q->hlevel));memset (q->row_mask,0 ,sizeof (q->row_mask)); }
net/sched/sch_multiq.c +0 -1
@@ -152,7 +152,6 @@ multiq_reset(struct Qdisc *sch)for (band =0 ; band < q->bands; band++)qdisc_reset (q->queues[band]); - sch->q.qlen =0 ; q->curband =0 ; }
net/sched/sch_prio.c +0 -2
@@ -135,8 +135,6 @@ prio_reset(struct Qdisc *sch)for (prio =0 ; prio < q->bands; prio++)qdisc_reset (q->queues[prio]); - sch->qstats.backlog =0 ; - sch->q.qlen =0 ; }static int prio_offload (struct Qdisc *sch,struct tc_prio_qopt *qopt)
net/sched/sch_qfq.c +0 -2
@@ -1459,8 +1459,6 @@ static void qfq_reset_qdisc(struct Qdisc *sch)qdisc_reset (cl->qdisc); } } - sch->qstats.backlog =0 ; - sch->q.qlen =0 ; }static void qfq_destroy_qdisc (struct Qdisc *sch)
net/sched/sch_red.c +0 -2
@@ -176,8 +176,6 @@ static void red_reset(struct Qdisc *sch)struct red_sched_data *q =qdisc_priv (sch);qdisc_reset (q->qdisc); - sch->qstats.backlog =0 ; - sch->q.qlen =0 ;red_restart (&q->vars); }
net/sched/sch_sfb.c +0 -2
@@ -456,8 +456,6 @@ static void sfb_reset(struct Qdisc *sch)struct sfb_sched_data *q =qdisc_priv (sch);qdisc_reset (q->qdisc); - sch->qstats.backlog =0 ; - sch->q.qlen =0 ; q->slot =0 ; q->double_buffering = false;sfb_zero_all_buckets (q);
net/sched/sch_skbprio.c +0 -3
@@ -213,9 +213,6 @@ static void skbprio_reset(struct Qdisc *sch)struct skbprio_sched_data *q =qdisc_priv (sch);int prio; - sch->qstats.backlog =0 ; - sch->q.qlen =0 ; -for (prio =0 ; prio <SKBPRIO_MAX_PRIORITY ; prio++)__skb_queue_purge (&q->qdiscs[prio]);
net/sched/sch_taprio.c +0 -2
@@ -1637,8 +1637,6 @@ static void taprio_reset(struct Qdisc *sch)if (q->qdiscs[i])qdisc_reset (q->qdiscs[i]); } - sch->qstats.backlog =0 ; - sch->q.qlen =0 ; }static void taprio_destroy (struct Qdisc *sch)
net/sched/sch_tbf.c +0 -2
@@ -316,8 +316,6 @@ static void tbf_reset(struct Qdisc *sch)struct tbf_sched_data *q =qdisc_priv (sch);qdisc_reset (q->qdisc); - sch->qstats.backlog =0 ; - sch->q.qlen =0 ; q->t_c =ktime_get_ns (); q->tokens = q->buffer; q->ptokens = q->mtu;
net/sched/sch_teql.c +0 -1
@@ -124,7 +124,6 @@ teql_reset(struct Qdisc *sch)struct teql_sched_data *dat =qdisc_priv (sch);skb_queue_purge (&dat->q); - sch->q.qlen =0 ; } static void
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 59/79 net: sched: sfb: fix null pointer access issue when sfb_init() fails
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit 2a3fc78210b9f0e85372a2435368962009f480fc ]
When the default qdisc is sfb, if the qdisc of dev_queue fails to be inited during mqprio_init(), sfb_reset() is invoked to clear resources. In this case, the q->qdisc is NULL, and it will cause gpf issue.
The process is as follows:qdisc_create_dflt()
sfb_init() tcf_block_get() --->failed, q->qdisc is NULL ... qdisc_put() ... sfb_reset() qdisc_reset(q->qdisc) --->q->qdisc is NULL ops = qdisc->ops
The following is the Call Trace information:
general protection fault, probably for non-canonical address 0xdffffc0000000003: 0000 [#1] PREEMPT SMP KASAN KASAN: null-ptr-deref in range [0x0000000000000018-0x000000000000001f] RIP: 0010:qdisc_reset+0x2b/0x6f0 Call Trace: <TASK> sfb_reset+0x37/0xd0 qdisc_reset+0xed/0x6f0 qdisc_destroy+0x82/0x4c0 qdisc_put+0x9e/0xb0 qdisc_create_dflt+0x2c3/0x4a0 mqprio_init+0xa71/0x1760 qdisc_create+0x3eb/0x1000 tc_modify_qdisc+0x408/0x1720 rtnetlink_rcv_msg+0x38e/0xac0 netlink_rcv_skb+0x12d/0x3a0 netlink_unicast+0x4a2/0x740 netlink_sendmsg+0x826/0xcc0 sock_sendmsg+0xc5/0x100 ____sys_sendmsg+0x583/0x690 ___sys_sendmsg+0xe8/0x160 __sys_sendmsg+0xbf/0x160 do_syscall_64+0x35/0x80 entry_SYSCALL_64_after_hwframe+0x46/0xb0 RIP: 0033:0x7f2164122d04 </TASK>
--- net/sched/sch_sfb.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/sched/sch_sfb.c +2 -1
@@ -455,7 +455,8 @@ static void sfb_reset(struct Qdisc *sch) {struct sfb_sched_data *q =qdisc_priv (sch); -qdisc_reset (q->qdisc); +if (likely (q->qdisc)) +qdisc_reset (q->qdisc); q->slot =0 ; q->double_buffering = false;sfb_zero_all_buckets (q);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 60/79 sfc: include vport_id in filter spec hash and equal()
In reply to Greg Kroah-HartmanFrom: Pieter Jansen van Vuuren <[email protected]>
[ Upstream commit c2bf23e4a5af37a4d77901d9ff14c50a269f143d ]
Filters on different vports are qualified by different implicit MACs and/or VLANs, so shouldn't be considered equal even if their other match fields are identical.
--- drivers/net/ethernet/sfc/filter.h | 3 ++- drivers/net/ethernet/sfc/rx_common.c | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-)
drivers/net/ethernet/sfc/filter.h +2 -1
@@ -157,7 +157,8 @@ struct efx_filter_spec { u32 flags:6; u32 dmaq_id:12;u32 rss_context; -__be16 outer_vid__aligned(4) ;/* allow jhash2() of match values */ +u32 vport_id; +__be16 outer_vid;__be16 inner_vid;u8 loc_mac[ETH_ALEN ];u8 rem_mac[ETH_ALEN ];
drivers/net/ethernet/sfc/rx_common.c +5 -5
@@ -676,17 +676,17 @@ bool efx_filter_spec_equal(const struct efx_filter_spec *left, (EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_TX)))return false; -return memcmp (&left->outer_vid, &right->outer_vid, +return memcmp (&left->vport_id, &right->vport_id,sizeof (struct efx_filter_spec ) - - offsetof(struct efx_filter_spec , outer_vid)) ==0 ; + offsetof(struct efx_filter_spec , vport_id)) ==0 ; }u32 efx_filter_spec_hash (const struct efx_filter_spec *spec) { -BUILD_BUG_ON (offsetof(struct efx_filter_spec , outer_vid) &3 ); -return jhash2 ((const u32 *)&spec->outer_vid, +BUILD_BUG_ON (offsetof(struct efx_filter_spec , vport_id) &3 ); +return jhash2 ((const u32 *)&spec->vport_id, (sizeof (struct efx_filter_spec ) - - offsetof(struct efx_filter_spec , outer_vid)) /4 , + offsetof(struct efx_filter_spec , vport_id)) /4 ,0 ); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 61/79 wwan_hwsim: fix possible memory leak in wwan_hwsim_dev_new()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit 258ad2fe5ede773625adfda88b173f4123e59f45 ]
Inject fault while probing module, if device_register() fails, but the refcount of kobject is not decreased to 0, the name allocated in dev_set_name() is leaked. Fix this by calling put_device(), so that name can be freed in callback function kobject_cleanup().
unreferenced object 0xffff88810152ad20 (size 8):
comm "modprobe", pid 252, jiffies 4294849206 (age 22.713s) hex dump (first 8 bytes):
68 77 73 69 6d 30 00 ff hwsim0..
backtrace:
[<000000009c3504ed>] __kmalloc_node_track_caller+0x44/0x1b0
[<00000000c0228a5e>] kvasprintf+0xb5/0x140
[<00000000cff8c21f>] kvasprintf_const+0x55/0x180
[<0000000055a1e073>] kobject_set_name_vargs+0x56/0x150
[<000000000a80b139>] dev_set_name+0xab/0xe0--- drivers/net/wwan/wwan_hwsim.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wwan/wwan_hwsim.c +1 -1
@@ -310,7 +310,7 @@ static struct wwan_hwsim_dev *wwan_hwsim_dev_new(void)return ERR_PTR (err); err_free_dev: -kfree (dev); +put_device (&dev->dev);return ERR_PTR (err); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 62/79 net: hns: fix possible memory leak in hnae_ae_register()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit ff2f5ec5d009844ec28f171123f9e58750cef4bf ]
Inject fault while probing module, if device_register() fails, but the refcount of kobject is not decreased to 0, the name allocated in dev_set_name() is leaked. Fix this by calling put_device(), so that name can be freed in callback function kobject_cleanup().
unreferenced object 0xffff00c01aba2100 (size 128):
comm "systemd-udevd", pid 1259, jiffies 4294903284 (age 294.152s) hex dump (first 32 bytes):
68 6e 61 65 30 00 00 00 18 21 ba 1a c0 00 ff ff hnae0....!......
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<0000000034783f26>] slab_post_alloc_hook+0xa0/0x3e0
[<00000000748188f2>] __kmem_cache_alloc_node+0x164/0x2b0
[<00000000ab0743e8>] __kmalloc_node_track_caller+0x6c/0x390
[<000000006c0ffb13>] kvasprintf+0x8c/0x118
[<00000000fa27bfe1>] kvasprintf_const+0x60/0xc8
[<0000000083e10ed7>] kobject_set_name_vargs+0x3c/0xc0
[<000000000b87affc>] dev_set_name+0x7c/0xa0
[<000000003fd8fe26>] hnae_ae_register+0xcc/0x190 [hnae]
[<00000000fe97edc9>] hns_dsaf_ae_init+0x9c/0x108 [hns_dsaf]
[<00000000c36ff1eb>] hns_dsaf_probe+0x548/0x748 [hns_dsaf]--- drivers/net/ethernet/hisilicon/hns/hnae.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/hisilicon/hns/hnae.c +3 -1
@@ -419,8 +419,10 @@ int hnae_ae_register(struct hnae_ae_dev *hdev, struct module *owner) hdev->cls_dev.release = hnae_release; (void )dev_set_name (&hdev->cls_dev,"hnae%d" , hdev->id); ret =device_register (&hdev->cls_dev); -if (ret) +if (ret) { +put_device (&hdev->cls_dev);return ret; + }__module_get (THIS_MODULE );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 63/79 net: sched: fix race condition in qdisc_graft()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit ebda44da44f6f309d302522b049f43d6f829f7aa ]
We had one syzbot report [1] in syzbot queue for a while. I was waiting for more occurrences and/or a repro but Dmitry Vyukov spotted the issue right away.
<quoting Dmitry>qdisc_graft() drops reference to qdisc in notify_and_destroy while it's still assigned to dev->qdisc
</quoting>
Indeed, RCU rules are clear when replacing a data structure. The visible pointer (dev->qdisc in this case) must be updated to the new object _before_ RCU grace period is started (qdisc_put(old) in this case).
[1]
BUG: KASAN: use-after-free in __tcf_qdisc_find.part.0+0xa3a/0xac0 net/sched/cls_api.c:1066 Read of size 4 at addr ffff88802065e038 by task syz-executor.4/21027 CPU: 0 PID: 21027 Comm: syz-executor.4 Not tainted 6.0.0-rc3-syzkaller-00363-g7726d4c3e60b #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 08/26/2022 Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0xcd/0x134 lib/dump_stack.c:106 print_address_description mm/kasan/report.c:317 [inline] print_report.cold+0x2ba/0x719 mm/kasan/report.c:433 kasan_report+0xb1/0x1e0 mm/kasan/report.c:495 __tcf_qdisc_find.part.0+0xa3a/0xac0 net/sched/cls_api.c:1066 __tcf_qdisc_find net/sched/cls_api.c:1051 [inline] tc_new_tfilter+0x34f/0x2200 net/sched/cls_api.c:2018 rtnetlink_rcv_msg+0x955/0xca0 net/core/rtnetlink.c:6081 netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2501 netlink_unicast_kernel net/netlink/af_netlink.c:1319 [inline] netlink_unicast+0x543/0x7f0 net/netlink/af_netlink.c:1345 netlink_sendmsg+0x917/0xe10 net/netlink/af_netlink.c:1921 sock_sendmsg_nosec net/socket.c:714 [inline] sock_sendmsg+0xcf/0x120 net/socket.c:734 ____sys_sendmsg+0x6eb/0x810 net/socket.c:2482 ___sys_sendmsg+0x110/0x1b0 net/socket.c:2536 __sys_sendmsg+0xf3/0x1c0 net/socket.c:2565 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd RIP: 0033:0x7f5efaa89279 Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f5efbc31168 EFLAGS: 00000246 ORIG_RAX: 000000000000002e RAX: ffffffffffffffda RBX: 00007f5efab9bf80 RCX: 00007f5efaa89279 RDX: 0000000000000000 RSI: 0000000020000140 RDI: 0000000000000005 RBP: 00007f5efaae32e9 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 R13: 00007f5efb0cfb1f R14: 00007f5efbc31300 R15: 0000000000022000 </TASK> Allocated by task 21027: kasan_save_stack+0x1e/0x40 mm/kasan/common.c:38 kasan_set_track mm/kasan/common.c:45 [inline] set_alloc_info mm/kasan/common.c:437 [inline] ____kasan_kmalloc mm/kasan/common.c:516 [inline] ____kasan_kmalloc mm/kasan/common.c:475 [inline] __kasan_kmalloc+0xa9/0xd0 mm/kasan/common.c:525 kmalloc_node include/linux/slab.h:623 [inline] kzalloc_node include/linux/slab.h:744 [inline] qdisc_alloc+0xb0/0xc50 net/sched/sch_generic.c:938 qdisc_create_dflt+0x71/0x4a0 net/sched/sch_generic.c:997 attach_one_default_qdisc net/sched/sch_generic.c:1152 [inline] netdev_for_each_tx_queue include/linux/netdevice.h:2437 [inline] attach_default_qdiscs net/sched/sch_generic.c:1170 [inline] dev_activate+0x760/0xcd0 net/sched/sch_generic.c:1229 __dev_open+0x393/0x4d0 net/core/dev.c:1441 __dev_change_flags+0x583/0x750 net/core/dev.c:8556 rtnl_configure_link+0xee/0x240 net/core/rtnetlink.c:3189 rtnl_newlink_create net/core/rtnetlink.c:3371 [inline] __rtnl_newlink+0x10b8/0x17e0 net/core/rtnetlink.c:3580 rtnl_newlink+0x64/0xa0 net/core/rtnetlink.c:3593 rtnetlink_rcv_msg+0x43a/0xca0 net/core/rtnetlink.c:6090 netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2501 netlink_unicast_kernel net/netlink/af_netlink.c:1319 [inline] netlink_unicast+0x543/0x7f0 net/netlink/af_netlink.c:1345 netlink_sendmsg+0x917/0xe10 net/netlink/af_netlink.c:1921 sock_sendmsg_nosec net/socket.c:714 [inline] sock_sendmsg+0xcf/0x120 net/socket.c:734 ____sys_sendmsg+0x6eb/0x810 net/socket.c:2482 ___sys_sendmsg+0x110/0x1b0 net/socket.c:2536 __sys_sendmsg+0xf3/0x1c0 net/socket.c:2565 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd Freed by task 21020: kasan_save_stack+0x1e/0x40 mm/kasan/common.c:38 kasan_set_track+0x21/0x30 mm/kasan/common.c:45 kasan_set_free_info+0x20/0x30 mm/kasan/generic.c:370 ____kasan_slab_free mm/kasan/common.c:367 [inline] ____kasan_slab_free+0x166/0x1c0 mm/kasan/common.c:329 kasan_slab_free include/linux/kasan.h:200 [inline] slab_free_hook mm/slub.c:1754 [inline] slab_free_freelist_hook+0x8b/0x1c0 mm/slub.c:1780 slab_free mm/slub.c:3534 [inline] kfree+0xe2/0x580 mm/slub.c:4562 rcu_do_batch kernel/rcu/tree.c:2245 [inline] rcu_core+0x7b5/0x1890 kernel/rcu/tree.c:2505 __do_softirq+0x1d3/0x9c6 kernel/softirq.c:571 Last potentially related work creation: kasan_save_stack+0x1e/0x40 mm/kasan/common.c:38 __kasan_record_aux_stack+0xbe/0xd0 mm/kasan/generic.c:348 call_rcu+0x99/0x790 kernel/rcu/tree.c:2793 qdisc_put+0xcd/0xe0 net/sched/sch_generic.c:1083 notify_and_destroy net/sched/sch_api.c:1012 [inline] qdisc_graft+0xeb1/0x1270 net/sched/sch_api.c:1084 tc_modify_qdisc+0xbb7/0x1a00 net/sched/sch_api.c:1671 rtnetlink_rcv_msg+0x43a/0xca0 net/core/rtnetlink.c:6090 netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2501 netlink_unicast_kernel net/netlink/af_netlink.c:1319 [inline] netlink_unicast+0x543/0x7f0 net/netlink/af_netlink.c:1345 netlink_sendmsg+0x917/0xe10 net/netlink/af_netlink.c:1921 sock_sendmsg_nosec net/socket.c:714 [inline] sock_sendmsg+0xcf/0x120 net/socket.c:734 ____sys_sendmsg+0x6eb/0x810 net/socket.c:2482 ___sys_sendmsg+0x110/0x1b0 net/socket.c:2536 __sys_sendmsg+0xf3/0x1c0 net/socket.c:2565 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd Second to last potentially related work creation: kasan_save_stack+0x1e/0x40 mm/kasan/common.c:38 __kasan_record_aux_stack+0xbe/0xd0 mm/kasan/generic.c:348 kvfree_call_rcu+0x74/0x940 kernel/rcu/tree.c:3322 neigh_destroy+0x431/0x630 net/core/neighbour.c:912 neigh_release include/net/neighbour.h:454 [inline] neigh_cleanup_and_release+0x1f8/0x330 net/core/neighbour.c:103 neigh_del net/core/neighbour.c:225 [inline] neigh_remove_one+0x37d/0x460 net/core/neighbour.c:246 neigh_forced_gc net/core/neighbour.c:276 [inline] neigh_alloc net/core/neighbour.c:447 [inline] ___neigh_create+0x18b5/0x29a0 net/core/neighbour.c:642 ip6_finish_output2+0xfb8/0x1520 net/ipv6/ip6_output.c:125 __ip6_finish_output net/ipv6/ip6_output.c:195 [inline] ip6_finish_output+0x690/0x1160 net/ipv6/ip6_output.c:206 NF_HOOK_COND include/linux/netfilter.h:296 [inline] ip6_output+0x1ed/0x540 net/ipv6/ip6_output.c:227 dst_output include/net/dst.h:451 [inline] NF_HOOK include/linux/netfilter.h:307 [inline] NF_HOOK include/linux/netfilter.h:301 [inline] mld_sendpack+0xa09/0xe70 net/ipv6/mcast.c:1820 mld_send_cr net/ipv6/mcast.c:2121 [inline] mld_ifc_work+0x71c/0xdc0 net/ipv6/mcast.c:2653 process_one_work+0x991/0x1610 kernel/workqueue.c:2289 worker_thread+0x665/0x1080 kernel/workqueue.c:2436 kthread+0x2e4/0x3a0 kernel/kthread.c:376 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:306 The buggy address belongs to the object at ffff88802065e000
which belongs to the cache kmalloc-1k of size 1024 The buggy address is located 56 bytes inside of 1024-byte region [ffff88802065e000, ffff88802065e400)
The buggy address belongs to the physical page: page:ffffea0000819600 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x20658 head:ffffea0000819600 order:3 compound_mapcount:0 compound_pincount:0 flags: 0xfff00000010200(slab|head|node=0|zone=1|lastcpupid=0x7ff) raw: 00fff00000010200 0000000000000000 dead000000000001 ffff888011841dc0 raw: 0000000000000000 0000000000100010 00000001ffffffff 0000000000000000 page dumped because: kasan: bad access detected page_owner tracks the page as allocated page last allocated via order 3, migratetype Unmovable, gfp_mask 0xd20c0(__GFP_IO|__GFP_FS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC), pid 3523, tgid 3523 (sshd), ts 41495190986, free_ts 41417713212 prep_new_page mm/page_alloc.c:2532 [inline] get_page_from_freelist+0x109b/0x2ce0 mm/page_alloc.c:4283 __alloc_pages+0x1c7/0x510 mm/page_alloc.c:5515 alloc_pages+0x1a6/0x270 mm/mempolicy.c:2270 alloc_slab_page mm/slub.c:1824 [inline] allocate_slab+0x27e/0x3d0 mm/slub.c:1969 new_slab mm/slub.c:2029 [inline] ___slab_alloc+0x7f1/0xe10 mm/slub.c:3031 __slab_alloc.constprop.0+0x4d/0xa0 mm/slub.c:3118 slab_alloc_node mm/slub.c:3209 [inline] __kmalloc_node_track_caller+0x2f2/0x380 mm/slub.c:4955 kmalloc_reserve net/core/skbuff.c:358 [inline] __alloc_skb+0xd9/0x2f0 net/core/skbuff.c:430 alloc_skb_fclone include/linux/skbuff.h:1307 [inline] tcp_stream_alloc_skb+0x38/0x580 net/ipv4/tcp.c:861 tcp_sendmsg_locked+0xc36/0x2f80 net/ipv4/tcp.c:1325 tcp_sendmsg+0x2b/0x40 net/ipv4/tcp.c:1483 inet_sendmsg+0x99/0xe0 net/ipv4/af_inet.c:819 sock_sendmsg_nosec net/socket.c:714 [inline] sock_sendmsg+0xcf/0x120 net/socket.c:734 sock_write_iter+0x291/0x3d0 net/socket.c:1108 call_write_iter include/linux/fs.h:2187 [inline] new_sync_write fs/read_write.c:491 [inline] vfs_write+0x9e9/0xdd0 fs/read_write.c:578 ksys_write+0x1e8/0x250 fs/read_write.c:631 page last free stack trace: reset_page_owner include/linux/page_owner.h:24 [inline] free_pages_prepare mm/page_alloc.c:1449 [inline] free_pcp_prepare+0x5e4/0xd20 mm/page_alloc.c:1499 free_unref_page_prepare mm/page_alloc.c:3380 [inline] free_unref_page+0x19/0x4d0 mm/page_alloc.c:3476 __unfreeze_partials+0x17c/0x1a0 mm/slub.c:2548 qlink_free mm/kasan/quarantine.c:168 [inline] qlist_free_all+0x6a/0x170 mm/kasan/quarantine.c:187 kasan_quarantine_reduce+0x180/0x200 mm/kasan/quarantine.c:294 __kasan_slab_alloc+0xa2/0xc0 mm/kasan/common.c:447 kasan_slab_alloc include/linux/kasan.h:224 [inline] slab_post_alloc_hook mm/slab.h:727 [inline] slab_alloc_node mm/slub.c:3243 [inline] slab_alloc mm/slub.c:3251 [inline] __kmem_cache_alloc_lru mm/slub.c:3258 [inline] kmem_cache_alloc+0x267/0x3b0 mm/slub.c:3268 kmem_cache_zalloc include/linux/slab.h:723 [inline] alloc_buffer_head+0x20/0x140 fs/buffer.c:2974 alloc_page_buffers+0x280/0x790 fs/buffer.c:829 create_empty_buffers+0x2c/0xee0 fs/buffer.c:1558 ext4_block_write_begin+0x1004/0x1530 fs/ext4/inode.c:1074 ext4_da_write_begin+0x422/0xae0 fs/ext4/inode.c:2996 generic_perform_write+0x246/0x560 mm/filemap.c:3738 ext4_buffered_write_iter+0x15b/0x460 fs/ext4/file.c:270 ext4_file_write_iter+0x44a/0x1660 fs/ext4/file.c:679 call_write_iter include/linux/fs.h:2187 [inline] new_sync_write fs/read_write.c:491 [inline] vfs_write+0x9e9/0xdd0 fs/read_write.c:578
--- net/sched/sch_api.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/sched/sch_api.c +3 -2
@@ -1081,12 +1081,13 @@ static int qdisc_graft(struct net_device *dev, struct Qdisc *parent, skip:if (!ingress) { -notify_and_destroy (net, skb, n, classid, -rtnl_dereference (dev->qdisc), new); + old =rtnl_dereference (dev->qdisc);if (new && !new->ops->attach)qdisc_refcount_inc (new);rcu_assign_pointer (dev->qdisc, new ? : &noop_qdisc); +notify_and_destroy (net, skb, n, classid, old, new); +if (new && new->ops->attach) new->ops->attach (new); }else {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 64/79 net: phy: dp83822: disable MDI crossover status change interrupt
In reply to Greg Kroah-HartmanFrom: Felix Riemann <[email protected]>
[ Upstream commit 7f378c03aa4952507521174fb0da7b24a9ad0be6 ]
If the cable is disconnected the PHY seems to toggle between MDI and MDI-X modes. With the MDI crossover status interrupt active this causes roughly 10 interrupts per second.
As the crossover status isn't checked by the driver, the interrupt can be disabled to reduce the interrupt load.
--- drivers/net/phy/dp83822.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/phy/dp83822.c +1 -2
@@ -253,8 +253,7 @@ static int dp83822_config_intr(struct phy_device *phydev) DP83822_EEE_ERROR_CHANGE_INT_EN);if (!dp83822->fx_enabled) - misr_status |=DP83822_MDI_XOVER_INT_EN | -DP83822_ANEG_ERR_INT_EN | + misr_status |=DP83822_ANEG_ERR_INT_EN |DP83822_WOL_PKT_INT_EN ; err =phy_write (phydev,MII_DP83822_MISR2 , misr_status);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 65/79 iommu/vt-d: Allow NVS regions in arch_rmrr_sanity_check()
In reply to Greg Kroah-HartmanFrom: Charlotte Tan <[email protected]>
[ Upstream commit 5566e68d829f5d87670d5984c1c2ccb4c518405f ]
arch_rmrr_sanity_check() warns if the RMRR is not covered by an ACPI Reserved region, but it seems like it should accept an NVS region as well. The ACPI spec
https://uefi.org/specs/ACPI/6.5/15_System_Address_Map_Interfaces.html
uses similar wording for "Reserved" and "NVS" region types; for NVS regions it says "This range of addresses is in use or reserved by the system and must not be used by the operating system."
There is an old comment on this mailing list that also suggests NVS regions should pass the arch_rmrr_sanity_check() test:
The warnings come from arch_rmrr_sanity_check() since it checks whether the region is E820_TYPE_RESERVED. However, if the purpose of the check is to detect RMRR has regions that may be used by OS as free memory, isn't E820_TYPE_NVS safe, too?
This patch overlaps with another proposed patch that would add the region type to the log since sometimes the bug reporter sees this log on the console but doesn't know to include the kernel log:
https://lore.kernel.org/lkml/[email protected]/
Here's an example of the "Firmware Bug" apparent false positive (wrapped for line length):
DMAR: [Firmware Bug]: No firmware reserved region can cover this RMRR
[0x000000006f760000-0x000000006f762fff], contact BIOS vendor for
fixes
DMAR: [Firmware Bug]: Your BIOS is broken; bad RMRR
[0x000000006f760000-0x000000006f762fff]This is the snippet from the e820 table:
BIOS-e820: [mem 0x0000000068bff000-0x000000006ebfefff] reserved
BIOS-e820: [mem 0x000000006ebff000-0x000000006f9fefff] ACPI NVS
BIOS-e820: [mem 0x000000006f9ff000-0x000000006fffefff] ACPI data
--- arch/x86/include/asm/iommu.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/x86/include/asm/iommu.h +3 -1
@@ -17,8 +17,10 @@ arch_rmrr_sanity_check(struct acpi_dmar_reserved_memory *rmrr) {u64 start = rmrr->base_address;u64 end = rmrr->end_address +1 ; +int entry_type; -if (e820__mapped_all (start, end,E820_TYPE_RESERVED )) + entry_type =e820__get_entry_type (start, end); +if (entry_type ==E820_TYPE_RESERVED || entry_type ==E820_TYPE_NVS )return 0 ; pr_err(FW_BUG "No firmware reserved region can cover this RMRR [%#018Lx-%#018Lx], contact BIOS vendor for fixes\n",
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 66/79 iommu/vt-d: Clean up si_domain in the init_dmars() error path
In reply to Greg Kroah-HartmanFrom: Jerry Snitselaar <[email protected]>
[ Upstream commit 620bf9f981365c18cc2766c53d92bf8131c63f32 ]
A splat from kmem_cache_destroy() was seen with a kernel prior to commit ee2653bbe89d ("iommu/vt-d: Remove domain and devinfo mempool") when there was a failure in init_dmars(), because the iommu_domain cache still had objects. While the mempool code is now gone, there still is a leak of the si_domain memory if init_dmars() fails. So clean up si_domain in the init_dmars() error path.
--- drivers/iommu/intel/iommu.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/iommu/intel/iommu.c +5 -0
@@ -2761,6 +2761,7 @@ static int __init si_domain_init(int hw)if (md_domain_init (si_domain,DEFAULT_DOMAIN_ADDRESS_WIDTH )) {domain_exit (si_domain); + si_domain =NULL ;return -EFAULT ; }
@@ -3397,6 +3398,10 @@ static int __init init_dmars(void)disable_dmar_iommu (iommu);free_dmar_iommu (iommu); } +if (si_domain) { +domain_exit (si_domain); + si_domain =NULL ; + }kfree (g_iommus);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH v3 75/79 ACPI: video: Force backlight native for more TongFang devices
In reply to Greg Kroah-HartmanFrom: Werner Sembach <[email protected]>
commit 3dbc80a3e4c55c4a5b89ef207bed7b7de36157b4 upstream.
This commit is very different from the upstream commit! It fixes the same issue by adding more quirks, rather then the general fix from the 6.1 kernel, because the general fix from the 6.1 kernel is part of a larger refactoring of the backlight code which is not suitable for the stable series.
As described in "ACPI: video: Drop NL5x?U, PF4NU1F and PF5?U?? acpi_backlight=native quirks" (10212754a0d2) the upstream commit "ACPI:
video: Make backlight class device registration a separate step (v2)" (3dbc80a3e4c5) makes these quirks unnecessary. However as mentioned in this bugtracker ticket https://bugzilla.kernel.org/show_bug.cgi?id=215683#c17
the upstream fix is part of a larger patchset that is overall too complex for stable.
The TongFang GKxNRxx, GMxNGxx, GMxZGxx, and GMxRGxx / TUXEDO Stellaris/Polaris Gen 1-4, have the same problem as the Clevo NL5xRU and NL5xNU / TUXEDO Aura 15 Gen1 and Gen2:
They have a working native and video interface for screen backlight. However the default detection mechanism first registers the video interface before unregistering it again and switching to the native interface during boot. This results in a dangling SBIOS request for backlight change for some reason, causing the backlight to switch to ~2% once per boot on the first power cord connect or disconnect event. Setting the native interface explicitly circumvents this buggy behaviour by avoiding the unregistering process.
--- drivers/acpi/video_detect.c | 64 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+)
drivers/acpi/video_detect.c +64 -0
@@ -501,6 +501,70 @@ static const struct dmi_system_id video_ }, },/* +* More Tongfang devices with the same issue as the Clevo NL5xRU and +* NL5xNU/TUXEDO Aura 15 Gen1 and Gen2. See the description above. +*/ + { + .callback = video_detect_force_native, + .ident = "TongFang GKxNRxx", + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "GKxNRxx"), + }, + }, + { + .callback = video_detect_force_native, + .ident = "TongFang GKxNRxx", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), + DMI_MATCH(DMI_BOARD_NAME, "POLARIS1501A1650TI"), + }, + }, + { + .callback = video_detect_force_native, + .ident = "TongFang GKxNRxx", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), + DMI_MATCH(DMI_BOARD_NAME, "POLARIS1501A2060"), + }, + }, + { + .callback = video_detect_force_native, + .ident = "TongFang GKxNRxx", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), + DMI_MATCH(DMI_BOARD_NAME, "POLARIS1701A1650TI"), + }, + }, + { + .callback = video_detect_force_native, + .ident = "TongFang GKxNRxx", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), + DMI_MATCH(DMI_BOARD_NAME, "POLARIS1701A2060"), + }, + }, + { + .callback = video_detect_force_native, + .ident = "TongFang GMxNGxx", + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "GMxNGxx"), + }, + }, + { + .callback = video_detect_force_native, + .ident = "TongFang GMxZGxx", + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "GMxZGxx"), + }, + }, + { + .callback = video_detect_force_native, + .ident = "TongFang GMxRGxx", + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "GMxRGxx"), + }, + }, + /* * Desktops which falsely report a backlight and which our heuristics * for this do not catch. */
Greg Kroah-Hartman
maintainerPATCH 67/79 fs: dlm: fix invalid derefence of sb_lvbptr
In reply to Greg Kroah-HartmanFrom: Alexander Aring <[email protected]>
[ Upstream commit 7175e131ebba47afef47e6ac4d5bab474d1e6e49 ]
I experience issues when putting a lkbsb on the stack and have sb_lvbptr field to a dangled pointer while not using DLM_LKF_VALBLK. It will crash with the following kernel message, the dangled pointer is here 0xdeadbeef as example:
[ 102.749317] BUG: unable to handle page fault for address: 00000000deadbeef [ 102.749320] #PF: supervisor read access in kernel mode [ 102.749323] #PF: error_code(0x0000) - not-present page [ 102.749325] PGD 0 P4D 0 [ 102.749332] Oops: 0000 [#1] PREEMPT SMP PTI [ 102.749336] CPU: 0 PID: 1567 Comm: lock_torture_wr Tainted: G W 5.19.0-rc3+ #1565 [ 102.749343] Hardware name: Red Hat KVM/RHEL-AV, BIOS 1.16.0-2.module+el8.7.0+15506+033991b0 04/01/2014 [ 102.749344] RIP: 0010:memcpy_erms+0x6/0x10 [ 102.749353] Code: cc cc cc cc eb 1e 0f 1f 00 48 89 f8 48 89 d1 48 c1 e9 03 83 e2 07 f3 48 a5 89 d1 f3 a4 c3 66 0f 1f 44 00 00 48 89 f8 48 89 d1 <f3> a4 c3 0f 1f 80 00 00 00 00 48 89 f8 48 83 fa 20 72 7e 40 38 fe [ 102.749355] RSP: 0018:ffff97a58145fd08 EFLAGS: 00010202 [ 102.749358] RAX: ffff901778b77070 RBX: 0000000000000000 RCX: 0000000000000040 [ 102.749360] RDX: 0000000000000040 RSI: 00000000deadbeef RDI: ffff901778b77070 [ 102.749362] RBP: ffff97a58145fd10 R08: ffff901760b67a70 R09: 0000000000000001 [ 102.749364] R10: ffff9017008e2cb8 R11: 0000000000000001 R12: ffff901760b67a70 [ 102.749366] R13: ffff901760b78f00 R14: 0000000000000003 R15: 0000000000000001 [ 102.749368] FS: 0000000000000000(0000) GS:ffff901876e00000(0000) knlGS:0000000000000000 [ 102.749372] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 102.749374] CR2: 00000000deadbeef CR3: 000000017c49a004 CR4: 0000000000770ef0 [ 102.749376] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 102.749378] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 102.749379] PKRU: 55555554 [ 102.749381] Call Trace: [ 102.749382] <TASK> [ 102.749383] ? send_args+0xb2/0xd0 [ 102.749389] send_common+0xb7/0xd0 [ 102.749395] _unlock_lock+0x2c/0x90 [ 102.749400] unlock_lock.isra.56+0x62/0xa0 [ 102.749405] dlm_unlock+0x21e/0x330 [ 102.749411] ? lock_torture_stats+0x80/0x80 [dlm_locktorture] [ 102.749416] torture_unlock+0x5a/0x90 [dlm_locktorture] [ 102.749419] ? preempt_count_sub+0xba/0x100 [ 102.749427] lock_torture_writer+0xbd/0x150 [dlm_locktorture] [ 102.786186] kthread+0x10a/0x130 [ 102.786581] ? kthread_complete_and_exit+0x20/0x20 [ 102.787156] ret_from_fork+0x22/0x30 [ 102.787588] </TASK> [ 102.787855] Modules linked in: dlm_locktorture torture rpcsec_gss_krb5 intel_rapl_msr intel_rapl_common kvm_intel iTCO_wdt iTCO_vendor_support kvm vmw_vsock_virtio_transport qxl irqbypass vmw_vsock_virtio_transport_common drm_ttm_helper crc32_pclmul joydev crc32c_intel ttm vsock virtio_scsi virtio_balloon snd_pcm drm_kms_helper virtio_console snd_timer snd drm soundcore syscopyarea i2c_i801 sysfillrect sysimgblt i2c_smbus pcspkr fb_sys_fops lpc_ich serio_raw [ 102.792536] CR2: 00000000deadbeef [ 102.792930] ---[ end trace 0000000000000000 ]---
This patch fixes the issue by checking also on DLM_LKF_VALBLK on exflags is set when copying the lvbptr array instead of if it's just null which fixes for me the issue.
I think this patch can fix other dlm users as well, depending how they handle the init, freeing memory handling of sb_lvbptr and don't set DLM_LKF_VALBLK for some dlm_lock() calls. It might a there could be a hidden issue all the time. However with checking on DLM_LKF_VALBLK the user always need to provide a sb_lvbptr non-null value. There might be more intelligent handling between per ls lvblen, DLM_LKF_VALBLK and non-null to report the user the way how DLM API is used is wrong but can be added for later, this will only fix the current behaviour.
--- fs/dlm/lock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/dlm/lock.c +1 -1
@@ -3632,7 +3632,7 @@ static void send_args(struct dlm_rsb *r,case DLM_MSG_REQUEST_REPLY :case DLM_MSG_CONVERT_REPLY :case DLM_MSG_GRANT : -if (!lkb->lkb_lvbptr) +if (!lkb->lkb_lvbptr || !(lkb->lkb_exflags &DLM_LKF_VALBLK ))break ;memcpy (ms->m_extra, lkb->lkb_lvbptr, r->res_ls->ls_lvblen);break ;
Greg Kroah-Hartman
maintainerPATCH 68/79 arm64: mte: move register initialization to C
In reply to Greg Kroah-HartmanFrom: Peter Collingbourne <[email protected]>
[ Upstream commit 973b9e37330656dec719ede508e4dc40e5c2d80c ]
If FEAT_MTE2 is disabled via the arm64.nomte command line argument on a CPU that claims to support FEAT_MTE2, the kernel will use Tagged Normal in the MAIR. If we interpret arm64.nomte to mean that the CPU does not in fact implement FEAT_MTE2, setting the system register like this may lead to UNSPECIFIED behavior. Fix it by arranging for MAIR to be set in the C function cpu_enable_mte which is called based on the sanitized version of the system register.
There is no need for the rest of the MTE-related system register initialization to happen from assembly, with the exception of TCR_EL1, which must be set to include at least TBI1 because the secondary CPUs access KASan-allocated data structures early. Therefore, make the TCR_EL1 initialization unconditional and move the rest of the initialization to cpu_enable_mte so that we no longer have a dependency on the unsanitized ID register value.
--- arch/arm64/include/asm/mte.h | 5 ++++ arch/arm64/kernel/cpufeature.c | 3 +- arch/arm64/kernel/mte.c | 51 ++++++++++++++++++++++++++++++++++ arch/arm64/kernel/suspend.c | 2 ++ arch/arm64/mm/proc.S | 46 ++++-------------------------- 5 files changed, 65 insertions(+), 42 deletions(-)
arch/arm64/include/asm/mte.h +5 -0
@@ -40,7 +40,9 @@ void mte_sync_tags(pte_t old_pte, pte_t pte);void mte_copy_page_tags (void *kto,const void *kfrom);void mte_thread_init_user (void );void mte_thread_switch (struct task_struct *next); +void mte_cpu_setup (void );void mte_suspend_enter (void ); +void mte_suspend_exit (void );long set_mte_ctrl (struct task_struct *task,unsigned long arg);long get_mte_ctrl (struct task_struct *task); int mte_ptrace_copy_tags(struct task_struct *child, long request,
@@ -69,6 +71,9 @@ static inline void mte_thread_switch(struct task_struct *next)static inline void mte_suspend_enter (void ) { } +static inline void mte_suspend_exit (void ) +{ +}static inline long set_mte_ctrl (struct task_struct *task,unsigned long arg) {return 0 ;
arch/arm64/kernel/cpufeature.c +2 -1
@@ -1903,7 +1903,8 @@ static void bti_enable(const struct arm64_cpu_capabilities *__unused)static void cpu_enable_mte (struct arm64_cpu_capabilities const *cap) {sysreg_clear_set (sctlr_el1,0 , SCTLR_ELx_ATA |SCTLR_EL1_ATA0 ); -isb (); + +mte_cpu_setup ();/* * Clear the tags in the zero page. This needs to be done via the
arch/arm64/kernel/mte.c +51 -0
63 lines not on this page · raw message
arch/arm64/kernel/suspend.c +2 -0
@@ -43,6 +43,8 @@ void notrace __cpu_suspend_exit(void) {unsigned int cpu =smp_processor_id (); +mte_suspend_exit (); +/* * We are resuming from reset with the idmap active in TTBR0_EL1. * We must uninstall the idmap and restore the expected MMU
arch/arm64/mm/proc.S +5 -41
68 lines not on this page · raw message
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 69/79 ksmbd: handle smb2 query dir request for OutputBufferLength that is too small
In reply to Greg Kroah-HartmanFrom: Namjae Jeon <[email protected]>
[ Upstream commit 65ca7a3ffff811d6c0d4342d467c381257d566d4 ]
We found the issue that ksmbd return STATUS_NO_MORE_FILES response even though there are still dentries that needs to be read while file read/write test using framtest utils.
windows client send smb2 query dir request included OutputBufferLength(128) that is too small to contain even one entry. This patch make ksmbd immediately returns OutputBufferLength of response as zero to client.
Stable-dep-of: 88541cb414b7 ("ksmbd: fix incorrect handling of iterate_dir")
--- fs/ksmbd/smb2pdu.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
fs/ksmbd/smb2pdu.c +9 -1
@@ -3962,6 +3962,12 @@ int smb2_query_dir(struct ksmbd_work *work)set_ctx_actor (&dir_fp->readdir_data.ctx, __query_dir); rc =iterate_dir (dir_fp->filp, &dir_fp->readdir_data.ctx); +/* +* req->OutputBufferLength is too small to contain even one entry. +* In this case, it immediately returns OutputBufferLength 0 to client. +*/ +if (!d_info.out_buf_len && !d_info.num_entry) + goto no_buf_len;if (rc ==0 )restart_ctx (&dir_fp->readdir_data.ctx);if (rc == -ENOSPC )
@@ -3988,10 +3994,12 @@ int smb2_query_dir(struct ksmbd_work *work) rsp->Buffer[0 ] =0 ;inc_rfc1001_len (rsp_org,9 ); }else { +no_buf_len: ((struct file_directory_info *) ((char *)rsp->Buffer + d_info.last_entry_offset)) ->NextEntryOffset =0 ; - d_info.data_count -= d_info.last_entry_off_align; +if (d_info.data_count >= d_info.last_entry_off_align) + d_info.data_count -= d_info.last_entry_off_align; rsp->StructureSize =cpu_to_le16 (9 ); rsp->OutputBufferOffset =cpu_to_le16 (72 );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 70/79 ksmbd: fix incorrect handling of iterate_dir
In reply to Greg Kroah-HartmanFrom: Namjae Jeon <[email protected]>
[ Upstream commit 88541cb414b7a2450c45fc9c131b37b5753b7679 ]
if iterate_dir() returns non-negative value, caller has to treat it as normal and check there is any error while populating dentry information. ksmbd doesn't have to do anything because ksmbd already checks too small OutputBufferLength to store one file information.
And because ctx->pos is set to file->f_pos when iterative_dir is called, remove restart_ctx(). And if iterate_dir() return -EIO, which mean directory entry is corrupted, return STATUS_FILE_CORRUPT_ERROR error response.
This patch fixes some failure of SMB2_QUERY_DIRECTORY, which happens when ntfs3 is local filesystem.
--- fs/ksmbd/smb2pdu.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-)
fs/ksmbd/smb2pdu.c +4 -10
@@ -3803,11 +3803,6 @@ static int __query_dir(struct dir_context *ctx, const char *name, int namlen,return 0 ; } -static void restart_ctx (struct dir_context *ctx) -{ - ctx->pos =0 ; -} -static int verify_info_level (int info_level) {switch (info_level) {
@@ -3921,7 +3916,6 @@ int smb2_query_dir(struct ksmbd_work *work)if (srch_flag &SMB2_REOPEN || srch_flag &SMB2_RESTART_SCANS ) {ksmbd_debug (SMB ,"Restart directory scan\n" );generic_file_llseek (dir_fp->filp,0 ,SEEK_SET ); -restart_ctx (&dir_fp->readdir_data.ctx); }memset (&d_info,0 ,sizeof (struct ksmbd_dir_info ));
@@ -3968,11 +3962,9 @@ int smb2_query_dir(struct ksmbd_work *work)*/ if (!d_info.out_buf_len && !d_info.num_entry) goto no_buf_len; -if (rc ==0 ) -restart_ctx (&dir_fp->readdir_data.ctx); -if (rc == -ENOSPC ) +if (rc >0 || rc == -ENOSPC ) rc =0 ; -if (rc) +else if (rc) goto err_out; d_info.wptr = d_info.rptr;
@@ -4029,6 +4021,8 @@ int smb2_query_dir(struct ksmbd_work *work) rsp->hdr.Status =STATUS_NO_MEMORY ; else if (rc == -EFAULT) rsp->hdr.Status = STATUS_INVALID_INFO_CLASS; + else if (rc == -EIO) + rsp->hdr.Status = STATUS_FILE_CORRUPT_ERROR;if (!rsp->hdr.Status) rsp->hdr.Status =STATUS_UNEXPECTED_IO_ERROR ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 71/79 tracing: Simplify conditional compilation code in tracing_set_tracer()
In reply to Greg Kroah-HartmanFrom: sunliming <[email protected]>
[ Upstream commit f4b0d318097e45cbac5e14976f8bb56aa2cef504 ]
Two conditional compilation directives "#ifdef CONFIG_TRACER_MAX_TRACE" are used consecutively, and no other code in between. Simplify conditional the compilation code and only use one "#ifdef CONFIG_TRACER_MAX_TRACE".
Stable-dep-of: a541a9559bb0 ("tracing: Do not free snapshot if tracer is on cmdline")
--- kernel/trace/trace.c | 2 -- 1 file changed, 2 deletions(-)
kernel/trace/trace.c +0 -2
@@ -6416,9 +6416,7 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf)synchronize_rcu ();free_snapshot (tr); } -#endif -#ifdef CONFIG_TRACER_MAX_TRACE if (t->use_max_tr && !had_max_tr) { ret =tracing_alloc_snapshot_instance (tr);if (ret <0 )
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 72/79 tracing: Do not free snapshot if tracer is on cmdline
In reply to Greg Kroah-HartmanFrom: Steven Rostedt (Google) <[email protected]>
[ Upstream commit a541a9559bb0a8ecc434de01d3e4826c32e8bb53 ]
The ftrace_boot_snapshot and alloc_snapshot cmdline options allocate the snapshot buffer at boot up for use later. The ftrace_boot_snapshot in particular requires the snapshot to be allocated because it will take a snapshot at the end of boot up allowing to see the traces that happened during boot so that it's not lost when user space takes over.
When a tracer is registered (started) there's a path that checks if it requires the snapshot buffer or not, and if it does not and it was allocated it will do a synchronization and free the snapshot buffer.
This is only required if the previous tracer was using it for "max latency" snapshots, as it needs to make sure all max snapshots are complete before freeing. But this is only needed if the previous tracer was using the snapshot buffer for latency (like irqoff tracer and friends). But it does not make sense to free it, if the previous tracer was not using it, and the snapshot was allocated by the cmdline parameters. This basically takes away the point of allocating it in the first place!
Note, the allocated snapshot worked fine for just trace events, but fails when a tracer is enabled on the cmdline.
Further investigation, this goes back even further and it does not require a tracer on the cmdline to fail. Simply enable snapshots and then enable a tracer, and it will remove the snapshot.
--- kernel/trace/trace.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
kernel/trace/trace.c +6 -4
@@ -6399,12 +6399,12 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf)if (tr->current_trace->reset) tr->current_trace->reset (tr); +#ifdef CONFIG_TRACER_MAX_TRACE + had_max_tr = tr->current_trace->use_max_tr; +/* Current trace needs to be nop_trace before synchronize_rcu */ tr->current_trace = &nop_trace; -#ifdef CONFIG_TRACER_MAX_TRACE - had_max_tr = tr->allocated_snapshot; -if (had_max_tr && !t->use_max_tr) {/* * We need to make sure that the update_max_tr sees that
@@ -6417,11 +6417,13 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf) free_snapshot(tr); } -if (t->use_max_tr && !had_max_tr) { +if (t->use_max_tr && !tr->allocated_snapshot) { ret =tracing_alloc_snapshot_instance (tr);if (ret <0 ) goto out; } +#else + tr->current_trace = &nop_trace;#endif if (t->init) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 73/79 mmc: sdhci-tegra: Use actual clock rate for SW tuning correction
In reply to Greg Kroah-HartmanFrom: Prathamesh Shete <[email protected]>
[ Upstream commit b78870e7f41534cc719c295d1f8809aca93aeeab ]
Ensure tegra_host member "curr_clk_rate" holds the actual clock rate instead of requested clock rate for proper use during tuning correction algorithm. Actual clk rate may not be the same as the requested clk frequency depending on the parent clock source set. Tuning correction algorithm depends on certain parameters which are sensitive to current clk rate. If the host clk is selected instead of the actual clock rate, tuning correction algorithm may end up applying invalid correction, which could result in errors
--- drivers/mmc/host/sdhci-tegra.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mmc/host/sdhci-tegra.c +1 -1
@@ -762,7 +762,7 @@ static void tegra_sdhci_set_clock(struct sdhci_host *host, unsigned int clock)*/ host_clk = tegra_host->ddr_signaling ? clock *2 : clock;clk_set_rate (pltfm_host->clk, host_clk); - tegra_host->curr_clk_rate = host_clk; + tegra_host->curr_clk_rate =clk_get_rate (pltfm_host->clk);if (tegra_host->ddr_signaling) host->max_clk = host_clk;else
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 74/79 perf: Skip and warn on unknown format configN attrs
In reply to Greg Kroah-HartmanFrom: Rob Herring <[email protected]>
[ Upstream commit e552b7be12ed62357df84392efa525ecb01910fb ]
If the kernel exposes a new perf_event_attr field in a format attr, perf will return an error stating the specified PMU can't be found. For example, a format attr with 'config3:0-63' causes an error as config3 is unknown to perf. This causes a compatibility issue between a newer kernel with older perf tool.
Before this change with a kernel adding 'config3' I get:
$ perf record -e arm_spe// -- true
event syntax error: 'arm_spe//'
\___ Cannot find PMU `arm_spe'. Missing kernel support?
Run 'perf list' for a list of valid events Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list
available events
After this change, I get:
$ perf record -e arm_spe// -- true WARNING: 'arm_spe_0' format 'inv_event_filter' requires 'perf_event_attr::config3' which is not supported by this version of perf! [ perf record: Woken up 2 times to write data ] [ perf record: Captured and wrote 0.091 MB perf.data ]
To support unknown configN formats, rework the YACC implementation to pass any config[0-9]+ format to perf_pmu__new_format() to handle with a warning.
--- tools/perf/util/parse-events.c | 3 +++ tools/perf/util/pmu.c | 17 +++++++++++++++++ tools/perf/util/pmu.h | 2 ++ tools/perf/util/pmu.l | 2 -- tools/perf/util/pmu.y | 15 ++++----------- 5 files changed, 26 insertions(+), 13 deletions(-)
tools/perf/util/parse-events.c +3 -0
@@ -373,6 +373,9 @@ __add_event(struct list_head *list, intstruct perf_cpu_map *cpus = pmu ?perf_cpu_map__get (pmu->cpus) : cpu_list ?perf_cpu_map__new (cpu_list) :NULL ; +if (pmu) +perf_pmu__warn_invalid_formats (pmu); +if (pmu && attr->type ==PERF_TYPE_RAW )perf_pmu__warn_invalid_config (pmu, attr->config, name);
tools/perf/util/pmu.c +17 -0
@@ -1048,6 +1048,23 @@ err:return NULL ; } +void perf_pmu__warn_invalid_formats (struct perf_pmu *pmu) +{ +struct perf_pmu_format *format; + +/* fake pmu doesn't have format list */ +if (pmu == &perf_pmu__fake) +return ; + +list_for_each_entry (format, &pmu->format, list) +if (format->value >=PERF_PMU_FORMAT_VALUE_CONFIG_END ) { +pr_warning ("WARNING: '%s' format '%s' requires 'perf_event_attr::config%d'" +"which is not supported by this version of perf!\n" , + pmu->name, format->name, format->value); +return ; + } +} +static struct perf_pmu *pmu_find (const char *name) {struct perf_pmu *pmu;
tools/perf/util/pmu.h +2 -0
@@ -17,6 +17,7 @@ enum {PERF_PMU_FORMAT_VALUE_CONFIG ,PERF_PMU_FORMAT_VALUE_CONFIG1 ,PERF_PMU_FORMAT_VALUE_CONFIG2 , + PERF_PMU_FORMAT_VALUE_CONFIG_END, };#define PERF_PMU_FORMAT_BITS 64
@@ -135,6 +136,7 @@ int perf_pmu__caps_parse(struct perf_pmuvoid perf_pmu__warn_invalid_config (struct perf_pmu *pmu,__u64 config,char *name); +void perf_pmu__warn_invalid_formats (struct perf_pmu *pmu);bool perf_pmu__has_hybrid (void );int perf_pmu__match (char *pattern,char *name,char *tok);
tools/perf/util/pmu.l +0 -2
@@ -27,8 +27,6 @@ num_dec [0-9]+ {num_dec} { return value(10); } config { return PP_CONFIG; } -config1 { return PP_CONFIG1; } -config2 { return PP_CONFIG2; } - { return '-'; } : { return ':'; } , { return ','; }
tools/perf/util/pmu.y +4 -11
@@ -20,7 +20,7 @@ do { \ %} -%token PP_CONFIG PP_CONFIG1 PP_CONFIG2 +%token PP_CONFIG %token PP_VALUE PP_ERROR %type <num> PP_VALUE %type <bits> bit_term
@@ -47,18 +47,11 @@ PP_CONFIG ':' bits $3)); } | -PP_CONFIG1 ':' bits +PP_CONFIG PP_VALUE ':' bits { ABORT_ON(perf_pmu__new_format(format, name, - PERF_PMU_FORMAT_VALUE_CONFIG1, - $3)); -} -| -PP_CONFIG2 ':' bits -{ - ABORT_ON(perf_pmu__new_format(format, name, - PERF_PMU_FORMAT_VALUE_CONFIG2, - $3)); + $2, + $4)); } bits:
Greg Kroah-Hartman
maintainerPATCH 76/79 x86/Kconfig: Drop check for -mabi=ms for CONFIG_EFI_STUB
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
commit 33806e7cb8d50379f55c3e8f335e91e1b359dc7b upstream.
A recent change in LLVM made CONFIG_EFI_STUB unselectable because it no longer pretends to support -mabi=ms, breaking the dependency in Kconfig. Lack of CONFIG_EFI_STUB can prevent kernels from booting via EFI in certain circumstances.
This check was added by
8f24f8c2fc82 ("efi/libstub: Annotate firmware routines as __efiapi")
to ensure that __attribute__((ms_abi)) was available, as -mabi=ms is not actually used in any cflags.
According to the GCC documentation, this attribute has been supported since GCC 4.4.7. The kernel currently requires GCC 5.1 so this check is not necessary; even when that change landed in 5.6, the kernel required GCC 4.9 so it was unnecessary then as well.
Clang supports __attribute__((ms_abi)) for all versions that are supported for building the kernel so no additional check is needed. Remove the 'depends on' line altogether to allow CONFIG_EFI_STUB to be selected when CONFIG_EFI is enabled, regardless of compiler.
--- arch/x86/Kconfig | 1 - 1 file changed, 1 deletion(-)
arch/x86/Kconfig +0 -1
@@ -1926,7 +1926,6 @@ config EFI config EFI_STUB bool "EFI stub support" depends on EFI && !X86_USE_3DNOW - depends on $(cc-option,-mabi=ms) || X86_32 select RELOCATABLE help This kernel feature allows a bzImage to be loaded directly
Greg Kroah-Hartman
maintainerPATCH 77/79 Makefile.debug: re-enable debug info for .S files
In reply to Greg Kroah-HartmanFrom: Nick Desaulniers <[email protected]>
This is _not_ an upstream commit and just for 5.15.y only. It is based on commit 32ef9e5054ec0321b9336058c58ec749e9c6b0fe upstream.
Alexey reported that the fraction of unknown filename instances in kallsyms grew from ~0.3% to ~10% recently; Bill and Greg tracked it down to assembler defined symbols, which regressed as a result of:
commit b8a9092330da ("Kbuild: do not emit debug info for assembly with LLVM_IAS=1")
In that commit, I allude to restoring debug info for assembler defined symbols in a follow up patch, but it seems I forgot to do so in
commit a66049e2cf0e ("Kbuild: make DWARF version a choice")
--- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
Makefile +3 -1
@@ -870,7 +870,9 @@ else DEBUG_CFLAGS += -g endif -ifndef CONFIG_AS_IS_LLVM +ifdef CONFIG_AS_IS_LLVM +KBUILD_AFLAGS += -g +else KBUILD_AFLAGS += -Wa,-gdwarf-2 endif
Greg Kroah-Hartman
maintainerPATCH 78/79 mmc: core: Add SD card quirk for broken discard
In reply to Greg Kroah-HartmanFrom: Avri Altman <[email protected]>
commit 07d2872bf4c864eb83d034263c155746a2fb7a3b upstream.
Some SD-cards from Sandisk that are SDA-6.0 compliant reports they supports discard, while they actually don't. This might cause mk2fs to fail while trying to format the card and revert it to a read-only mode.
To fix this problem, let's add a card quirk (MMC_QUIRK_BROKEN_SD_DISCARD) to indicate that we shall fall-back to use the legacy erase command instead.
--- drivers/mmc/core/block.c | 7 ++++++- drivers/mmc/core/card.h | 6 ++++++ drivers/mmc/core/quirks.h | 6 ++++++ include/linux/mmc/card.h | 1 + 4 files changed, 19 insertions(+), 1 deletion(-)
drivers/mmc/core/block.c +6 -1
@@ -1107,6 +1107,11 @@ static void mmc_blk_issue_discard_rq(str nr =blk_rq_sectors (req); do { + unsigned int erase_arg = card->erase_arg; + + if (mmc_card_broken_sd_discard(card)) + erase_arg = SD_ERASE_ARG; + err = 0; if (card->quirks & MMC_QUIRK_INAND_CMD38) { err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
@@ -1117,7 +1122,7 @@ static void mmc_blk_issue_discard_rq(str card->ext_csd.generic_cmd6_time); }if (!err) - err =mmc_erase (card, from, nr, card->erase_arg); + err =mmc_erase (card, from, nr, erase_arg); }while (err == -EIO && !mmc_blk_reset (md, card->host, type));if (err) status =BLK_STS_IOERR ;
drivers/mmc/core/card.h +6 -0
@@ -70,6 +70,7 @@ struct mmc_fixup {#define EXT_CSD_REV_ANY (-1u)#define CID_MANFID_SANDISK 0x2 +#define CID_MANFID_SANDISK_SD 0x3#define CID_MANFID_ATP 0x9#define CID_MANFID_TOSHIBA 0x11#define CID_MANFID_MICRON 0x13
@@ -222,4 +223,9 @@ static inline int mmc_card_broken_hpi(co return c->quirks & MMC_QUIRK_BROKEN_HPI; } +static inline int mmc_card_broken_sd_discard (const struct mmc_card *c) +{ +return c->quirks &MMC_QUIRK_BROKEN_SD_DISCARD ; +} +#endif
drivers/mmc/core/quirks.h +6 -0
@@ -99,6 +99,12 @@ static const struct mmc_fixup __maybe_unMMC_FIXUP ("V10016" ,CID_MANFID_KINGSTON ,CID_OEMID_ANY , add_quirk_mmc,MMC_QUIRK_TRIM_BROKEN ), +/* +* Some SD cards reports discard support while they don't +*/ +MMC_FIXUP (CID_NAME_ANY ,CID_MANFID_SANDISK_SD ,0x5344 , add_quirk_sd, +MMC_QUIRK_BROKEN_SD_DISCARD ), + END_FIXUP };
include/linux/mmc/card.h +1 -0
@@ -292,6 +292,7 @@ struct mmc_card {#define MMC_QUIRK_BROKEN_IRQ_POLLING (1<<11)/* Polling SDIO_CCCR_INTx could create a fake interrupt */ #define MMC_QUIRK_TRIM_BROKEN (1<<12)/* Skip trim */ #define MMC_QUIRK_BROKEN_HPI (1<<13)/* Disable broken HPI support */ +#define MMC_QUIRK_BROKEN_SD_DISCARD (1<<14)/* Disable broken SD discard support */ bool reenable_cmdq;/* Re-enable Command Queue */
Greg Kroah-Hartman
maintainerPATCH 79/79 mm: /proc/pid/smaps_rollup: fix no vmas null-deref
In reply to Greg Kroah-HartmanFrom: Seth Jenkins <[email protected]>
Commit 258f669e7e88 ("mm: /proc/pid/smaps_rollup: convert to single value seq_file") introduced a null-deref if there are no vma's in the task in show_smaps_rollup.
--- fs/proc/task_mmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/proc/task_mmu.c +1 -1
@@ -951,7 +951,7 @@ static int show_smaps_rollup(struct seq_ vma = vma->vm_next; } -show_vma_header_prefix (m, priv->mm->mmap->vm_start, +show_vma_header_prefix (m, priv->mm->mmap ? priv->mm->mmap->vm_start :0 , last_vma_end,0 ,0 ,0 ,0 );seq_pad (m,' ' );seq_puts (m,"[rollup]\n" );
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.76 release. There are 79 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 29 Oct 2022 16:50:35 +0000. Anything received after that time might be too late.
Building arm64:allmodconfig ... failed
--------------
Error log:
In file included from drivers/cpufreq/tegra194-cpufreq.c:10:drivers/cpufreq/tegra194-cpufreq.c:282:25: error: 'tegra194_cpufreq_of_match' undeclared here (not in a function); did you mean 'tegra194_cpufreq_data'?
282 | MODULE_DEVICE_TABLE(of, tegra194_cpufreq_of_match);
| ^~~~~~~~~~~~~~~~~~~~~~~~~include/linux/module.h:244:15: note: in definition of macro 'MODULE_DEVICE_TABLE'
244 | extern typeof(name) __mod_##type##__##name##_device_table \
| ^~~~include/linux/module.h:244:21: error: conflicting types for '__mod_of__tegra194_cpufreq_of_match_device_table'; have 'const struct of_device_id[2]'
244 | extern typeof(name) __mod_##type##__##name##_device_table \
| ^~~~~~drivers/cpufreq/tegra194-cpufreq.c:417:1: note: in expansion of macro 'MODULE_DEVICE_TABLE'
417 | MODULE_DEVICE_TABLE(of, tegra194_cpufreq_of_match);
| ^~~~~~~~~~~~~~~~~~~include/linux/module.h:244:21: note: previous declaration of '__mod_of__tegra194_cpufreq_of_match_device_table' with type 'int'
244 | extern typeof(name) __mod_##type##__##name##_device_table \
| ^~~~~~drivers/cpufreq/tegra194-cpufreq.c:282:1: note: in expansion of macro 'MODULE_DEVICE_TABLE'
282 | MODULE_DEVICE_TABLE(of, tegra194_cpufreq_of_match);
| ^~~~~~~~~~~~~~~~~~~make[3]: [scripts/Makefile.build:289: drivers/cpufreq/tegra194-cpufreq.o] Error 1 (ignored)
ERROR: modpost: missing MODULE_LICENSE() in drivers/cpufreq/tegra194-cpufreq.o make[2]: [scripts/Makefile.modpost:133: modules-only.symvers] Error 1 (ignored)
I don't know what exactly happened, but commit b281adc68db8 ("cpufreq:
tegra194: Fix module loading") introduces a second MODULE_DEVICE_TABLE at the wrong location, causing the build failure.
Guenter
Greg Kroah-Hartman
maintainerQuoted 31 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.76 release. There are 79 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 29 Oct 2022 16:50:35 +0000. Anything received after that time might be too late.
Building arm64:allmodconfig ... failed
--------------
Error log:
In file included fromdrivers/cpufreq/tegra194-cpufreq.c:10:drivers/cpufreq/tegra194-cpufreq.c:282:25: error: 'tegra194_cpufreq_of_match' undeclared here (not in a function); did you mean 'tegra194_cpufreq_data'?282 | MODULE_DEVICE_TABLE(of, tegra194_cpufreq_of_match); | ^~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/module.h:244:15: note: in definition of macro 'MODULE_DEVICE_TABLE'
244 | extern typeof(name) __mod_##type##__##name##_device_table \
| ^~~~include/linux/module.h:244:21: error: conflicting types for '__mod_of__tegra194_cpufreq_of_match_device_table'; have 'const struct of_device_id[2]'
244 | extern typeof(name) __mod_##type##__##name##_device_table \
| ^~~~~~drivers/cpufreq/tegra194-cpufreq.c:417:1: note: in expansion of macro 'MODULE_DEVICE_TABLE'417 | MODULE_DEVICE_TABLE(of, tegra194_cpufreq_of_match); | ^~~~~~~~~~~~~~~~~~~
include/linux/module.h:244:21: note: previous declaration of '__mod_of__tegra194_cpufreq_of_match_device_table' with type 'int'
244 | extern typeof(name) __mod_##type##__##name##_device_table \
| ^~~~~~drivers/cpufreq/tegra194-cpufreq.c:282:1: note: in expansion of macro 'MODULE_DEVICE_TABLE'282 | MODULE_DEVICE_TABLE(of, tegra194_cpufreq_of_match); | ^~~~~~~~~~~~~~~~~~~
Quoted 7 lines
make[3]: [
scripts/Makefile.build:289:drivers/cpufreq/tegra194-cpufreq.o] Error 1 (ignored)
ERROR: modpost: missingMODULE_LICENSE()indrivers/cpufreq/tegra194-cpufreq.omake[2]: [scripts/Makefile.modpost:133: modules-only.symvers] Error 1 (ignored)I don't know what exactly happened, but commit
b281adc68db8("cpufreq:
tegra194: Fix module loading") introduces a secondMODULE_DEVICE_TABLEat the wrong location, causing the build failure.
Ah, the "Fixes:" tag was wrong in the original commit in Linus's tree. It should have said:
which removed the existing MODULE_DEVICE_TABLE() entry.
So only kernels newer than 5.19 need this. I'll go drop it from the 5.10.y and 5.15.y queues, thanks!
greg k-h
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.76 release. There are 79 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.1.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.76 release. There are 79 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 29 Oct 2022 16:50:35 +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.76-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.
NOTE:
As other reported arm64 allmodconfig builds failed [1].
[1] https://builds.tuxbuild.com/2GjYlZaXK7ZwRlerOgTwH1deWP9/
## Build
* kernel: 5.15.76-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-5.15.y
* git commit: 5ea1b40eb20832f02b922538e861382e148832e5
* git describe: v5.15.75-80-g5ea1b40eb208
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.15.y/build/v5.15.75-80-g5ea1b40eb208
## No Test Regressions (compared to v5.15.74-531-g98108584d385)
## No Metric Regressions (compared to v5.15.74-531-g98108584d385)
## No Test Fixes (compared to v5.15.74-531-g98108584d385)
## No Metric Fixes (compared to v5.15.74-531-g98108584d385)
## Test result summary
total: 149983, pass: 126822, fail: 3787, skip: 18858, xfail: 516
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 140 total, 139 passed, 1 failed
* arm64: 46 total, 44 passed, 2 failed
* i386: 36 total, 34 passed, 2 failed
* mips: 26 total, 26 passed, 0 failed
* parisc: 6 total, 6 passed, 0 failed
* powerpc: 30 total, 30 passed, 0 failed
* riscv: 9 total, 9 passed, 0 failed
* s390: 12 total, 12 passed, 0 failed
* sh: 12 total, 12 passed, 0 failed
* sparc: 5 total, 5 passed, 0 failed
* x86_64: 38 total, 36 passed, 2 failed
## Test suites summary
* fwts
* igt-gpu-tools
* kselftest-android
* kselftest-arm64
* kselftest-arm64/arm64.btitest.bti_c_func
* kselftest-arm64/arm64.btitest.bti_j_func
* kselftest-arm64/arm64.btitest.bti_jc_func
* kselftest-arm64/arm64.btitest.bti_none_func
* kselftest-arm64/arm64.btitest.nohint_func
* kselftest-arm64/arm64.btitest.paciasp_func
* kselftest-arm64/arm64.nobtitest.bti_c_func
* kselftest-arm64/arm64.nobtitest.bti_j_func
* kselftest-arm64/arm64.nobtitest.bti_jc_func
* kselftest-arm64/arm64.nobtitest.bti_none_func
* kselftest-arm64/arm64.nobtitest.nohint_func
* kselftest-arm64/arm64.nobtitest.paciasp_func
* 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
* perf/Zstd-perf.data-compression
* 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.76 release. There are 79 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 29 Oct 2022 16:50:35 +0000. Anything received after that time might be too late.
Build test (gcc version 12.2.1 20221016):
mips: 62 configs -> no failure
arm: 99 configs -> no failure
arm64: 3 configs -> 1 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
Note:
1) arm64 allmodconfig fails with the error:
In file included from drivers/cpufreq/tegra194-cpufreq.c:10:drivers/cpufreq/tegra194-cpufreq.c:282:25: error: 'tegra194_cpufreq_of_match' undeclared here (not in a function); did you mean 'tegra194_cpufreq_data'?
282 | MODULE_DEVICE_TABLE(of, tegra194_cpufreq_of_match);
| ^~~~~~~~~~~~~~~~~~~~~~~~~./include/linux/module.h:244:15: note: in definition of macro 'MODULE_DEVICE_TABLE'
244 | extern typeof(name) __mod_##type##__##name##_device_table \
| ^~~~./include/linux/module.h:244:21: error: conflicting types for '__mod_of__tegra194_cpufreq_of_match_device_table'; have 'const struct of_device_id[2]'
244 | extern typeof(name) __mod_##type##__##name##_device_table \
| ^~~~~~drivers/cpufreq/tegra194-cpufreq.c:417:1: note: in expansion of macro 'MODULE_DEVICE_TABLE'
417 | MODULE_DEVICE_TABLE(of, tegra194_cpufreq_of_match);
| ^~~~~~~~~~~~~~~~~~~./include/linux/module.h:244:21: note: previous declaration of '__mod_of__tegra194_cpufreq_of_match_device_table' with type 'int'
244 | extern typeof(name) __mod_##type##__##name##_device_table \
| ^~~~~~drivers/cpufreq/tegra194-cpufreq.c:282:1: note: in expansion of macro 'MODULE_DEVICE_TABLE'
282 | MODULE_DEVICE_TABLE(of, tegra194_cpufreq_of_match);
| ^~~~~~~~~~~~~~~~~~~Same error as v5.10.y, should be for b281adc68db8 ("cpufreq: tegra194: Fix module loading").
2) Already reported by others:/bin/sh: 1: ./scripts/pahole-flags.sh: Permission denied
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]
[1]. https://openqa.qa.codethink.co.uk/tests/2051
[2]. https://openqa.qa.codethink.co.uk/tests/2054
Signature · 2 lines
Regards Sudip
Quoted 8 lines · Sudip Mukherjee (Codethink)
Hi Greg,
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.76 release. There are 79 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.
<snip>
Quoted 4 lines
2) Already reported by others:
/bin/sh: 1:./scripts/pahole-flags.sh: Permission denied
Ignore the "pahole-flags.sh: Permission denied" please, its only in 5.10.y
Signature · 2 lines
Regards Sudip
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.76 release. There are 79 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 29 Oct 2022 16:50:35 +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.76-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.76-rc1-g5ea1b40eb208
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