Linux 5.15.76
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.15.76 kernel.
All users of the 5.15 kernel series must upgrade.
The updated 5.15.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.15.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/arm64/silicon-errata.rst | 4 + Makefile | 6 +- 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/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 +++ 124 files changed, 806 insertions(+), 404 deletions(-)
Adrian Hunter (1):
perf/x86/intel/pt: Relax address filter validation
Alex Deucher (1):
drm/amdgpu: fix sdma doorbell init ordering on APUs
Alexander Aring (1):
fs: dlm: fix invalid derefence of sb_lvbptr
Alexander Graf (1):
kvm: Add support for arch compat vm ioctls
Alexander Potapenko (1):
tipc: fix an information leak in tipc_topsrv_kern_subscr
Alexander Stein (1):
ata: ahci-imx: Fix MODULE_ALIAS
Anshuman Khandual (1):
arm64/mm: Consolidate TCR_EL1 fields
Avri Altman (1):
mmc: core: Add SD card quirk for broken discard
Babu Moger (1):
x86/resctrl: Fix min_cbm_bits for AMD
Borislav Petkov (1):
x86/microcode/AMD: Apply the patch early on every logical thread
Brett Creeley (1):
ionic: catch NULL pointer issue on reconfig
Bryan O'Donoghue (2):
i2c: qcom-cci: Fix ordering of pm_runtime_xx and i2c_add_adapter
media: venus: dec: Handle the case where find_format fails
Charlotte Tan (1):
iommu/vt-d: Allow NVS regions in arch_rmrr_sanity_check()
Christoph Hellwig (1):
nvme-hwmon: consistently ignore errors from nvme_hwmon_init
Eric Dumazet (2):
net: hsr: avoid possible NULL deref in skb_clone()
net: sched: fix race condition in qdisc_graft()
Eric Ren (1):
KVM: arm64: vgic: Fix exit condition in scan_its_table()
Fabien Parent (2):
cpufreq: qcom: fix writes in read-only memory region
cpufreq: qcom: fix memory leak in error path
Felix Riemann (1):
net: phy: dp83822: disable MDI crossover status change interrupt
Filipe Manana (2):
btrfs: fix processing of delayed data refs during backref walking
btrfs: fix processing of delayed tree block refs during backref walking
GONG, Ruiqi (1):
selinux: enable use of both GFP_KERNEL and GFP_ATOMIC in convert_context()
Genjian Zhang (1):
dm: remove unnecessary assignment statement in alloc_dev()
Greg Kroah-Hartman (1):
Linux 5.15.76
Harini Katakam (1):
net: phy: dp83867: Extend RX strap quirk for SGMII mode
James Morse (1):
arm64: errata: Remove AES hwcap for COMPAT tasks
Jan Sokolowski (1):
i40e: Fix DMA mappings leak
Jean-Francois Le Fillatre (1):
r8152: add PID for the Lenovo OneLink+ Dock
Jerry Snitselaar (1):
iommu/vt-d: Clean up si_domain in the init_dmars() error path
Jonathan Cooper (1):
sfc: Change VF mac via PF as first preference if available.
Joseph Qi (2):
ocfs2: clear dinode links count in case of error
ocfs2: fix BUG when iput after ocfs2_mknod fails
José Expósito (1):
HID: magicmouse: Do not set BTN_MOUSE on double report
Kai-Heng Feng (1):
ata: ahci: Match EM_MAX_SLOTS with SATA_PMP_MAX_PORTS
Kuniyuki Iwashima (1):
udp: Update reuse->has_conns under reuseport_lock.
Mark Tomlinson (1):
tipc: Fix recognition of trial period
Maxime Ripard (1):
drm/vc4: Add module dependency on hdmi-codec
Michael Grzeschik (5):
usb: gadget: uvc: consistently use define for headerlen
usb: gadget: uvc: use on returned header len in video_encode_isoc_sg
usb: gadget: uvc: rework uvcg_queue_next_buffer to uvcg_complete_buffer
usb: gadget: uvc: giveback vb2 buffer on req complete
usb: gadget: uvc: improve sg exit condition
Namjae Jeon (2):
ksmbd: handle smb2 query dir request for OutputBufferLength that is too small
ksmbd: fix incorrect handling of iterate_dir
Nathan Chancellor (1):
x86/Kconfig: Drop check for -mabi=ms for CONFIG_EFI_STUB
Nick Desaulniers (1):
Makefile.debug: re-enable debug info for .S files
Pablo Neira Ayuso (1):
netfilter: nf_tables: relax NFTA_SET_ELEM_KEY_END set flags requirements
Peter Collingbourne (1):
arm64: mte: move register initialization to C
Pieter Jansen van Vuuren (1):
sfc: include vport_id in filter spec hash and equal()
Prathamesh Shete (1):
mmc: sdhci-tegra: Use actual clock rate for SW tuning correction
Qu Wenruo (1):
btrfs: enhance unsupported compat RO flags handling
Rafael Mendonca (1):
scsi: lpfc: Fix memory leak in lpfc_create_port()
Rik van Riel (1):
mm,hugetlb: take hugetlb_lock before decrementing h->resv_huge_pages
Rob Herring (1):
perf: Skip and warn on unknown format 'configN' attrs
Sagi Grimberg (1):
nvmet: fix workqueue MEM_RECLAIM flushing dependency
Sakari Ailus (1):
media: ipu3-imgu: Fix NULL pointer dereference in active selection access
Sean Young (1):
media: mceusb: set timeout to at least timeout provided
Serge Semin (1):
nvme-hwmon: kmalloc the NVME SMART log buffer
Seth Jenkins (1):
mm: /proc/pid/smaps_rollup: fix no vma's null-deref
Shenwei Wang (1):
net: phylink: add mac_managed_pm in phylink_config structure
Steven Rostedt (Google) (1):
tracing: Do not free snapshot if tracer is on cmdline
Tony Luck (1):
ACPI: extlog: Handle multiple records
Werner Sembach (1):
ACPI: video: Force backlight native for more TongFang devices
Xiaobo Liu (1):
net/atm: fix proc_mpc_write incorrect return value
Yang Yingliang (2):
wwan_hwsim: fix possible memory leak in wwan_hwsim_dev_new()
net: hns: fix possible memory leak in hnae_ae_register()
Zhang Rui (3):
hwmon/coretemp: Handle large core ID value
x86/topology: Fix multiple packages shown on a single-package system x86/topology: Fix duplicated core ID within a package
Zhang Xiaoxu (4):
cifs: Fix xid leak in cifs_create()
cifs: Fix xid leak in cifs_copy_file_range()
cifs: Fix xid leak in cifs_flock()
cifs: Fix xid leak in cifs_ses_add_channel()
Zhengchao Shao (3):
net: sched: cake: fix null pointer access issue when cake_init() fails
net: sched: delete duplicate cleanup of backlog and qlen
net: sched: sfb: fix null pointer access issue when sfb_init() fails
sunliming (1):
tracing: Simplify conditional compilation code in tracing_set_tracer()
Greg Kroah-Hartman
maintainerDocumentation/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 |
Makefile +4 -2
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 15 -SUBLEVEL = 75 +SUBLEVEL = 76 EXTRAVERSION = NAME = Trick or Treat
@@ -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
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/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/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/kernel/cpu_errata.c +16 -0
@@ -355,6 +355,14 @@ static const struct midr_range erratum_1463225[] = { };#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 {
@@ -564,6 +572,14 @@ const struct arm64_cpu_capabilities arm64_errata[] = {/* Cortex-A510 r0p0-r1p1 */ 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 +15 -2
@@ -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>
@@ -1902,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
@@ -1915,6 +1917,14 @@ static void cpu_enable_mte(struct arm64_cpu_capabilities const *cap) }#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 +2952,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 +3007,7 @@ static int enable_mismatched_32bit_el0(unsigned int cpu) 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/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/kvm/vgic/vgic-its.c +4 -1
@@ -2096,7 +2096,7 @@ static int scan_its_table(struct vgic_its *its, gpa_t base, int size, u32 esz,memset (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_its *its, gpa_t base, int size, u32 esz,return next_offset; byte_offset = next_offset * esz; +if (byte_offset >= len) +break ; + id += next_offset; gpa += byte_offset; len -= byte_offset;
arch/arm64/mm/proc.S +6 -42
70 lines not on this page · raw message
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
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
arch/x86/events/intel/pt.c +50 -13
90 lines not on this page · raw message
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",
arch/x86/kernel/cpu/microcode/amd.c +13 -3
@@ -440,7 +440,13 @@ apply_microcode_early_amd(u32 cpuid_1_eax, void *ucode, size_t size, bool save_preturn 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 cpuid_1_eax)native_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 ;
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_intel(void) 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(void) 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;
arch/x86/kernel/cpu/topology.c +11 -5
@@ -96,6 +96,7 @@ int detect_extended_topology(struct cpuinfo_x86 *c)unsigned 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 cpuinfo_x86 *c) 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,10 +133,15 @@ int detect_extended_topology(struct cpuinfo_x86 *c) 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; + core_select_mask = (~(-1 << pkg_mask_width)) >> ht_mask_width; die_select_mask = (~(-1 << die_plus_mask_width)) >> core_plus_mask_width;
@@ -148,7 +154,7 @@ int detect_extended_topology(struct cpuinfo_x86 *c) } 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. */
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:
drivers/acpi/video_detect.c +64 -0
70 lines not on this page · raw message
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 */
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 );
drivers/cpufreq/qcom-cpufreq-nvmem.c +7 -3
@@ -215,6 +215,7 @@ static int qcom_cpufreq_krait_name_version(struct device *cpu_dev,int 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_version(struct device *cpu_dev,break ;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_version(struct device *cpu_dev, drv->versions = (1 << speed); +len_error:kfree (speedbin); -return 0 ; +return ret; }static const struct qcom_cpufreq_match_data match_data_kryo = {
@@ -264,7 +267,8 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)struct 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;
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +0 -5
@@ -1507,11 +1507,6 @@ static int sdma_v4_0_start(struct amdgpu_device *adev)WREG32_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 *handle)return 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 *handle)/* 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 ; }
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" );
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 ; }
drivers/hwmon/coretemp.c +41 -15
127 lines not on this page · raw message
drivers/i2c/busses/i2c-qcom-cci.c +8 -5
@@ -638,6 +638,11 @@ static int cci_probe(struct platform_device *pdev)if (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_device *pdev) } } -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);
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);
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);
drivers/media/platform/qcom/venus/vdec.c +2 -0
@@ -158,6 +158,8 @@ vdec_try_fmt_common(struct venus_inst *inst, struct v4l2_format *f)else return NULL ; fmt =find_format (inst, pixmp->pixelformat, f->type); +if (!fmt) +return NULL ; } pixmp->width = clamp(pixmp->width, frame_width_min(inst),
drivers/media/rc/mceusb.c +1 -1
@@ -1077,7 +1077,7 @@ static int mceusb_set_timeout(struct rc_dev *dev, unsigned int timeout)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;
drivers/mmc/core/block.c +6 -1
@@ -1107,6 +1107,11 @@ static void mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req) 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(struct mmc_queue *mq, struct request *req) 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(const struct mmc_card *c) 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_unused mmc_blk_fixups[] = {MMC_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 };
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
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 );
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_ */
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)
drivers/net/ethernet/sfc/ef10.c +24 -34
70 lines not on this page · raw message
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 ); }
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);
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 );
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 ; }
drivers/net/usb/cdc_ether.c +7 -0
@@ -776,6 +776,13 @@ static const struct usb_device_id products[] = { },#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_interface *intf,if (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 rtl8152_table[] = {REALTEK_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),
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); }
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 +22 -10
@@ -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 :
@@ -230,7 +230,13 @@ int nvme_hwmon_init(struct nvme_ctrl *ctrl) data =kzalloc (sizeof (*data),GFP_KERNEL );if (!data) -return 0 ; +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);
@@ -238,8 +244,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_log; } hwmon = hwmon_device_register_with_info(dev, "nvme",
@@ -247,11 +252,17 @@ 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_log; } ctrl->hwmon_device = hwmon;return 0 ; + +err_free_log: +kfree (data->log); +err_free_data: +kfree (data); +return err; }void nvme_hwmon_exit (struct nvme_ctrl *ctrl)
@@ -262,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); } }
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)
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 ;
drivers/staging/media/ipu3/ipu3-v4l2.c +14 -17
@@ -192,33 +192,30 @@ static int imgu_subdev_get_selection(struct v4l2_subdev *sd,struct 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,
drivers/usb/gadget/function/uvc.h +4 -1
@@ -69,6 +69,8 @@ extern unsigned int uvc_gadget_trace_param;#define UVC_MAX_REQUEST_SIZE 64#define UVC_MAX_EVENTS 4 +#define UVCG_REQUEST_HEADER_LEN 2 +/* ------------------------------------------------------------------------ * Structures */
@@ -77,7 +79,8 @@ 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_buffer *last_buf; };struct uvc_video {
drivers/usb/gadget/function/uvc_queue.c +2 -13
@@ -335,33 +335,22 @@ int uvcg_queue_enable(struct uvc_video_queue *queue, int enable) }/* 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++; buf->buf.vb2_buf.timestamp =ktime_get_ns ();vb2_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_queue *queue, int disconnect);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 +22 -13
@@ -33,7 +33,7 @@ uvc_video_encode_header(struct uvc_video *video, struct uvc_buffer *buf,if (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
@@ -83,7 +83,8 @@ uvc_video_encode_bulk(struct usb_request *req, struct uvc_video *video,if (buf->bytesused == video->queue.buf_used) { video->queue.buf_used =0 ; buf->state =UVC_BUF_STATE_DONE ; -uvcg_queue_next_buffer (&video->queue, buf); +list_del (&buf->queue); +uvcg_complete_buffer (&video->queue, buf); video->fid ^=UVC_STREAM_FID ; video->payload_size =0 ;
@@ -104,28 +105,28 @@ uvc_video_encode_isoc_sg(struct usb_request *req, struct uvc_video *video,unsigned 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);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;
@@ -148,14 +149,15 @@ uvc_video_encode_isoc_sg(struct usb_request *req, struct uvc_video *video, 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 ; buf->state =UVC_BUF_STATE_DONE ; buf->offset =0 ; -uvcg_queue_next_buffer (&video->queue, buf); +list_del (&buf->queue); video->fid ^=UVC_STREAM_FID ; + ureq->last_buf = buf; } }
@@ -181,7 +183,8 @@ uvc_video_encode_isoc(struct usb_request *req, struct uvc_video *video,if (buf->bytesused == video->queue.buf_used) { video->queue.buf_used =0 ; buf->state =UVC_BUF_STATE_DONE ; -uvcg_queue_next_buffer (&video->queue, buf); +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, struct usb_request *req)uvcg_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,12 +306,13 @@ uvc_video_alloc_requests(struct uvc_video *video) 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 */ 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);
fs/btrfs/backref.c +31 -15
115 lines not on this page · raw message
fs/btrfs/block-group.c +10 -1
@@ -2139,7 +2139,16 @@ int btrfs_read_block_groups(struct btrfs_fs_info *info)int 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_block *sb, int *flags, char *data) 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;
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);
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);
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,
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; }
fs/dlm/lock.c +1 -1
@@ -3632,7 +3632,7 @@ static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb,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 ;
fs/ksmbd/smb2pdu.c +13 -11
@@ -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 ));
@@ -3962,11 +3956,15 @@ 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); -if (rc ==0 ) -restart_ctx (&dir_fp->readdir_data.ctx); -if (rc == -ENOSPC ) +/* +* 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 || rc == -ENOSPC ) rc =0 ; -if (rc) +else if (rc) goto err_out; d_info.wptr = d_info.rptr;
@@ -3988,10 +3986,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 );
@@ -4021,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 ;
fs/ocfs2/namei.c +11 -12
@@ -231,6 +231,7 @@ static int ocfs2_mknod(struct user_namespace *mnt_userns,handle_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_namespace *mnt_userns, 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 @@ static int ocfs2_mknod(struct user_namespace *mnt_userns, 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)
@@ -631,18 +636,9 @@ static int ocfs2_mknod_locked(struct ocfs2_super *osb,return 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,
@@ -2027,8 +2023,11 @@ static int ocfs2_symlink(struct user_namespace *mnt_userns, 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)
fs/proc/task_mmu.c +1 -1
@@ -951,7 +951,7 @@ static int show_smaps_rollup(struct seq_file *m, void *v) 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" );
include/linux/kvm_host.h +2 -0
@@ -1124,6 +1124,8 @@ int kvm_vm_ioctl_enable_cap(struct kvm *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);
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 */
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);
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,
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 */
kernel/trace/trace.c +6 -6
@@ -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
@@ -6416,14 +6416,14 @@ 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) { +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) {
mm/hugetlb.c +1 -1
@@ -2813,11 +2813,11 @@ struct page *alloc_huge_page(struct vm_area_struct *vma, 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 */ }
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 ; }
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/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 );
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;
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 ])
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 {
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_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); }
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 +2 -3
@@ -455,9 +455,8 @@ 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 ; +if (likely (q->qdisc)) +qdisc_reset (q->qdisc); 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
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)
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))
security/selinux/ss/services.c +3 -2
@@ -2021,7 +2021,8 @@ static inline int convert_context_handle_invalid_context(* 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 context *oldc, struct context *newc, void *p) 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 *s, struct context *context, } 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 sidtab_entry_inner *edst,while (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; };
tools/perf/util/parse-events.c +3 -0
@@ -373,6 +373,9 @@ __add_event(struct list_head *list, int *idx,struct 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 @@ static struct perf_pmu *pmu_lookup(const char *lookup_name)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_pmu *pmu);void 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:
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 file *filp,if (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 : {