Linux 5.13.14
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.13.14 kernel.
All users of the 5.13 kernel series must upgrade.
The updated 5.13.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.13.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/devicetree/bindings/riscv/sifive-l2-cache.yaml | 8 Makefile | 2 arch/arc/kernel/vmlinux.lds.S | 2 arch/arm64/boot/dts/qcom/msm8994-angler-rev-101.dts | 4 arch/arm64/include/asm/el2_setup.h | 3 arch/parisc/include/asm/string.h | 15 - arch/parisc/kernel/parisc_ksyms.c | 4 arch/parisc/lib/Makefile | 4 arch/parisc/lib/memset.c | 72 +++++ arch/parisc/lib/string.S | 136 ----------- arch/powerpc/platforms/Kconfig.cputype | 2 arch/riscv/kernel/ptrace.c | 4 arch/x86/events/intel/uncore_snbep.c | 2 block/blk-iocost.c | 8 block/blk-mq.c | 30 -- drivers/block/floppy.c | 30 +- drivers/bluetooth/btusb.c | 22 + drivers/clk/renesas/rcar-usb2-clock-sel.c | 2 drivers/cpufreq/cpufreq-dt-platdev.c | 1 drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 2 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 11 drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 36 ++ drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 10 drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c | 15 + drivers/gpu/drm/drm_ioc32.c | 4 drivers/gpu/drm/i915/display/intel_dp.c | 9 drivers/gpu/drm/i915/gt/intel_timeline.c | 9 drivers/gpu/drm/nouveau/dispnv50/disp.c | 27 ++ drivers/gpu/drm/nouveau/dispnv50/head.c | 13 - drivers/gpu/drm/nouveau/dispnv50/head.h | 1 drivers/gpu/drm/nouveau/nvkm/engine/device/base.c | 21 + drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c | 2 drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h | 1 drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.c | 9 drivers/infiniband/core/uverbs_std_types_mr.c | 3 drivers/infiniband/hw/bnxt_re/ib_verbs.c | 1 drivers/infiniband/hw/bnxt_re/main.c | 1 drivers/infiniband/hw/efa/efa_main.c | 1 drivers/infiniband/hw/hfi1/sdma.c | 9 drivers/infiniband/hw/mlx5/main.c | 3 drivers/infiniband/sw/rxe/rxe_mcast.c | 2 drivers/media/pci/intel/ipu3/cio2-bridge.c | 2 drivers/mmc/host/sdhci-iproc.c | 3 drivers/net/can/usb/esd_usb2.c | 4 drivers/net/dsa/hirschmann/hellcreek.c | 8 drivers/net/dsa/mt7530.c | 5 drivers/net/ethernet/apm/xgene-v2/main.c | 4 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 7 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c | 6 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h | 4 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c | 13 - drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 34 ++ drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c | 7 drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h | 1 drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 2 drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c | 2 drivers/net/ethernet/intel/e1000e/ich8lan.c | 32 +- drivers/net/ethernet/intel/e1000e/ich8lan.h | 3 drivers/net/ethernet/intel/ice/ice_devlink.c | 4 drivers/net/ethernet/intel/igc/igc_main.c | 36 +- drivers/net/ethernet/intel/igc/igc_ptp.c | 3 drivers/net/ethernet/marvell/mvneta.c | 2 drivers/net/ethernet/mscc/ocelot_io.c | 16 - drivers/net/ethernet/qlogic/qed/qed_ll2.c | 20 + drivers/net/ethernet/qlogic/qed/qed_rdma.c | 3 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 8 drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c | 20 + drivers/net/ethernet/stmicro/stmmac/stmmac_xdp.c | 12 drivers/net/usb/pegasus.c | 4 drivers/net/wireless/intel/iwlwifi/fw/pnvm.c | 25 +- drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 70 +++++ drivers/opp/of.c | 5 drivers/platform/x86/Kconfig | 3 drivers/platform/x86/asus-nb-wmi.c | 28 ++ drivers/platform/x86/dual_accel_detect.h | 76 ++++++ drivers/platform/x86/gigabyte-wmi.c | 2 drivers/platform/x86/intel-hid.c | 21 - drivers/platform/x86/intel-vbtn.c | 18 + drivers/platform/x86/thinkpad_acpi.c | 3 drivers/scsi/scsi_sysfs.c | 9 drivers/tty/vt/vt_ioctl.c | 10 drivers/usb/dwc3/gadget.c | 23 - drivers/usb/gadget/function/u_audio.c | 5 drivers/usb/host/xhci-pci-renesas.c | 35 +- drivers/usb/serial/ch341.c | 1 drivers/usb/serial/option.c | 2 drivers/usb/typec/tcpm/tcpm.c | 81 +++--- drivers/vhost/vringh.c | 2 drivers/virtio/virtio_pci_common.c | 7 drivers/virtio/virtio_ring.c | 6 drivers/virtio/virtio_vdpa.c | 3 fs/btrfs/inode.c | 2 fs/btrfs/volumes.c | 2 fs/ceph/caps.c | 21 + fs/ceph/mds_client.c | 7 fs/ceph/snap.c | 3 fs/ceph/super.h | 3 fs/crypto/hooks.c | 44 +++ fs/ext4/symlink.c | 12 fs/f2fs/namei.c | 12 fs/io_uring.c | 19 - fs/overlayfs/export.c | 2 fs/pipe.c | 33 +- fs/ubifs/file.c | 13 - include/linux/fscrypt.h | 7 include/linux/netdevice.h | 4 include/linux/netfilter/ipset/ip_set.h | 3 include/linux/once.h | 4 include/linux/pipe_fs_i.h | 2 include/linux/stmmac.h | 1 kernel/audit_tree.c | 2 kernel/bpf/verifier.c | 8 kernel/cred.c | 12 kernel/sched/sched.h | 3 lib/once.c | 11 mm/memory_hotplug.c | 1 net/core/rtnetlink.c | 3 net/ipv4/ip_gre.c | 2 net/ipv4/route.c | 12 net/ipv6/route.c | 20 + net/netfilter/ipset/ip_set_hash_ip.c | 9 net/netfilter/ipset/ip_set_hash_ipmark.c | 10 net/netfilter/ipset/ip_set_hash_ipport.c | 3 net/netfilter/ipset/ip_set_hash_ipportip.c | 3 net/netfilter/ipset/ip_set_hash_ipportnet.c | 3 net/netfilter/ipset/ip_set_hash_net.c | 11 net/netfilter/ipset/ip_set_hash_netiface.c | 10 net/netfilter/ipset/ip_set_hash_netnet.c | 16 + net/netfilter/ipset/ip_set_hash_netport.c | 11 net/netfilter/ipset/ip_set_hash_netportnet.c | 16 + net/netfilter/nf_conntrack_core.c | 71 +---- net/qrtr/qrtr.c | 2 net/rds/ib_frmr.c | 4 net/sched/sch_ets.c | 7 net/socket.c | 6 net/sunrpc/svc_xprt.c | 3 net/tipc/socket.c | 2 sound/soc/codecs/rt5682.c | 1 sound/soc/soc-component.c | 63 ++--- tools/virtio/Makefile | 3 tools/virtio/linux/spinlock.h | 56 ++++ tools/virtio/linux/virtio.h | 2 142 files changed, 1181 insertions(+), 640 deletions(-)
Aaron Ma (1):
igc: fix page fault when thunderbolt is unplugged
Adam Ford (1):
clk: renesas: rcar-usb2-clock-sel: Fix kernel NULL pointer dereference
Alexey Gladkov (1):
ucounts: Increase ucounts reference counter before the security hook
Andrey Ignatov (1):
rtnetlink: Return correct error on changing device netns
Andy Shevchenko (1):
media: ipu3-cio2: Drop reference on error path in cio2_bridge_connect_sensor()
Ben Skeggs (3):
drm/nouveau: recognise GA107
drm/nouveau/disp: power down unused DP links during init drm/nouveau/kms/nv50: workaround EFI GOP window channel format differences
Bob Pearson (1):
RDMA/rxe: Fix memory allocation while in a spin lock
Borislav Petkov (1):
drm/amdgpu: Fix build with missing pm_suspend_target_state module export
Christian König (1):
drm/amdgpu: use the preferred pin domain after the check
Christophe JAILLET (1):
xgene-v2: Fix a resource leak in the error handling path of 'xge_probe()'
Colin Ian King (1):
perf/x86/intel/uncore: Fix integer overflow on 23 bit left shift of a u32
DENG Qingfang (1):
net: dsa: mt7530: fix VLAN traffic leaks again
Daniel Borkmann (1):
bpf: Fix ringbuf helper function compatibility
Davide Caratti (1):
net/sched: ets: fix crash when flipping from 'strict' to 'quantum'
Denis Efremov (1):
Revert "floppy: reintroduce O_NDELAY fix"
Derek Fang (1):
ASoC: rt5682: Adjust headset volume button threshold
Dinghao Liu (1):
RDMA/bnxt_re: Remove unpaired rtnl unlock in bnxt_re_dev_init()
Eric Biggers (4):
fscrypt: add fscrypt_symlink_getattr() for computing st_size
ext4: report correct st_size for encrypted symlinks
f2fs: report correct st_size for encrypted symlinks
ubifs: report correct st_size for encrypted symlinks
Eric Dumazet (2):
ipv6: use siphash in rt6_exception_hash()
ipv4: use siphash instead of Jenkins in fnhe_hashfun()
Florian Westphal (1):
netfilter: conntrack: collect all entries in one cycle
Gal Pressman (2):
RDMA/uverbs: Track dmabuf memory regions
RDMA/efa: Free IRQ vectors on error flow
Gerd Rausch (1):
net/rds: dma_map_sg is entitled to merge entries
Greg Kroah-Hartman (1):
Linux 5.13.14
Guangbin Huang (1):
net: hns3: fix get wrong pfc_en when query PFC configuration
Guenter Roeck (1):
ARC: Fix CONFIG_STACKDEPOT
Guojia Liao (1):
net: hns3: fix duplicate node in VLAN list
Hans de Goede (4):
platform/x86: Add and use a dual_accel_detect() helper
platform/x86: asus-nb-wmi: Allow configuring SW_TABLET_MODE method with a module option platform/x86: asus-nb-wmi: Add tablet_mode_sw=lid-flip quirk for the TP200s platform/x86: Make dual_accel_detect() KIOX010A + KIOX020A detect more robust
Helge Deller (1):
Revert "parisc: Add assembly implementations for memset, strlen, strcpy, strncpy and strcat"
Jacob Keller (1):
ice: do not abort devlink info if board identifier can't be found
Jens Axboe (1):
io_uring: rsrc ref lock needs to be IRQ safe
Jerome Brunet (1):
usb: gadget: u_audio: fix race condition on endpoint stop
Johan Hovold (1):
Revert "USB: serial: ch341: fix character loss at high transfer rates"
Johannes Berg (1):
iwlwifi: pnvm: accept multiple HW-type TLVs
Jozsef Kadlecsik (1):
netfilter: ipset: Limit the maximal range of consecutive elements to add/delete
Kefeng Wang (1):
once: Fix panic when module unload
Kenneth Feng (2):
Revert "drm/amd/pm: fix workload mismatch on vega10" drm/amd/pm: change the workload type for some cards
Kurt Kanzenbach (2):
net: dsa: hellcreek: Fix incorrect setting of GCL
net: dsa: hellcreek: Adjust schedule look ahead window
Kyle Tso (1):
usb: typec: tcpm: Raise vdm_sm_running flag only when VDM SM is running
Li Jinlin (1):
scsi: core: Fix hang of freezing queue between blocking and running device
Linus Torvalds (3):
pipe: avoid unnecessary EPOLLET wakeups under normal loads
pipe: do FASYNC notifications for every pipe IO, not just state changes
vt_kdsetmode: extend console locking
Lukas Bulwahn (1):
powerpc: Re-enable ARCH_ENABLE_SPLIT_PMD_PTLOCK
Maor Gottlieb (1):
RDMA/mlx5: Fix crash when unbind multiport slave
Mark Brown (2):
ASoC: component: Remove misplaced prefix handling in pin control functions
net: mscc: Fix non-GPL export of regmap APIs
Mark Rutland (1):
arm64: initialize all of CNTHCTL_EL2
Mark Yacoub (1):
drm: Copy drm_wait_vblank to user before returning
Matthew Brost (1):
drm/i915: Fix syncmap memory leak
Maxim Kiselev (1):
net: marvell: fix MVNETA_TX_IN_PRGRS bit number
Miaohe Lin (1):
mm/memory_hotplug: fix potential permanent lru cache disable
Michael S. Tsirkin (1):
tools/virtio: fix build
Michał Mirosław (1):
opp: remove WARN when no valid OPPs remain
Michel Dänzer (1):
drm/amdgpu: Cancel delayed work when GFXOFF is disabled
Miklos Szeredi (1):
ovl: fix uninitialized pointer read in ovl_lookup_real_one()
Ming Lei (2):
blk-iocost: fix lockdep warning on blkcg->lock
blk-mq: don't grab rq's refcount in blk_mq_check_expired()
Naresh Kumar PBS (1):
RDMA/bnxt_re: Add missing spin lock initialization
Neeraj Upadhyay (1):
vringh: Use wiov->used to check for read/write desc order
Parav Pandit (2):
virtio: Improve vq->broken access to avoid any compiler optimization
virtio_pci: Support surprise removal of virtio pci device
Pauli Virtanen (1):
Bluetooth: btusb: check conditions before enabling USB ALT 3 for WBS
Peter Collingbourne (1):
net: don't unconditionally copy_from_user a struct ifreq for socket ioctls
Petko Manolov (1):
net: usb: pegasus: fixes of set_register(s) return value evaluation;
Petr Vorel (1):
arm64: dts: qcom: msm8994-angler: Fix gpio-reserved-ranges 85-88
Qu Wenruo (2):
Revert "btrfs: compression: don't try to compress if we don't have enough pages"
btrfs: fix NULL pointer dereference when deleting device by invalid id
Rahul Lakkireddy (1):
cxgb4: dont touch blocked freelist bitmap after free
Richard Guy Briggs (1):
audit: move put_tree() to avoid trim_trees refcount underflow and UAF
Rob Herring (1):
dt-bindings: sifive-l2-cache: Fix 'select' matching
Sasha Neftin (2):
e1000e: Fix the max snoop/no-snoop latency for 10M
e1000e: Do not take care about recovery NVM checksum
Sebastian Andrzej Siewior (1):
sched: Fix get_push_task() vs migrate_disable()
Shai Malin (2):
qed: qed ll2 race condition fixes
qed: Fix null-pointer dereference in qed_rdma_create_qp()
Shreyansh Chouhan (1):
ip_gre: add validation for csum_start
Song Yoong Siang (2):
net: stmmac: fix kernel panic due to NULL pointer dereference of xsk_pool
net: stmmac: fix kernel panic due to NULL pointer dereference of buf->xdp
Stefan Mätje (1):
can: usb: esd_usb2: esd_usb2_rx_event(): fix the interchange of the CAN RX and TX error counters
Swati Sharma (1):
drm/i915/dp: Drop redundant debug print
Takashi Iwai (1):
usb: renesas-xhci: Prefer firmware loading on unknown ROM state
Thara Gopinath (1):
cpufreq: blocklist Qualcomm sm8150 in cpufreq-dt-platdev
Thinh Nguyen (1):
usb: dwc3: gadget: Fix dwc3_calc_trbs_left()
Thomas Weißschuh (2):
platform/x86: gigabyte-wmi: add support for X570 GAMING X platform/x86: gigabyte-wmi: add support for B450M S2H V2
Toshiki Nishioka (1):
igc: Use num_tx_queues when iterating over tx_ring queue
Trond Myklebust (1):
SUNRPC: Fix XPT_BUSY flag leakage in svc_handle_xprt()...
Tuo Li (1):
IB/hfi1: Fix possible null-pointer dereference in _extend_sdma_tx_descs()
Ulf Hansson (1):
Revert "mmc: sdhci-iproc: Set SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN on BCM2711"
Vincent Chen (1):
riscv: Ensure the value of FP registers in the core dump file is up to date
Vincent Whitchurch (1):
virtio_vdpa: reject invalid vq indices
Wesley Cheng (1):
usb: dwc3: gadget: Stop EP0 transfers during pullup disable
Wong Vee Khee (1):
net: stmmac: fix kernel panic due to NULL pointer dereference of plat->est
Xiaoliang Yang (1):
net: stmmac: add mutex lock to protect est parameters
Xiaolong Huang (1):
net: qrtr: fix another OOB Read in qrtr_endpoint_post
Xin Long (1):
tipc: call tipc_wait_for_connect only when dlen is not 0
Xiubo Li (1):
ceph: correctly handle releasing an embedded cap flush
Yaara Baruch (2):
iwlwifi: add new SoF with JF devices
iwlwifi: add new so-jf devices
Yonglong Liu (1):
net: hns3: fix speed unknown issue in bond 4
Yufeng Mo (2):
net: hns3: clear hardware resource when loading driver
net: hns3: add waiting time before cmdq memory is released
Zhengjun Zhang (1):
USB: serial: option: add new VID/PID to support Fibocom FG150
Greg Kroah-Hartman
maintainerDocumentation/devicetree/bindings/riscv/sifive-l2-cache.yaml +4 -4
@@ -24,10 +24,10 @@ allOf: select: properties: compatible: - items: - - enum: - - sifive,fu540-c000-ccache - - sifive,fu740-c000-ccache + contains: + enum: + - sifive,fu540-c000-ccache + - sifive,fu740-c000-ccache required: - compatible
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 13 -SUBLEVEL = 13 +SUBLEVEL = 14 EXTRAVERSION = NAME = Opossums on Parade
arch/arc/kernel/vmlinux.lds.S +2 -0
@@ -88,6 +88,8 @@ SECTIONS CPUIDLE_TEXT LOCK_TEXT KPROBES_TEXT + IRQENTRY_TEXT + SOFTIRQENTRY_TEXT *(.fixup) *(.gnu.warning) }
arch/arm64/boot/dts/qcom/msm8994-angler-rev-101.dts +4 -0
@@ -36,3 +36,7 @@ serial@f991e000 { }; }; }; + +&tlmm { + gpio-reserved-ranges = <85 4>; +};
arch/arm64/include/asm/el2_setup.h +1 -2
@@ -33,8 +33,7 @@* EL2. */ .macro __init_el2_timers -mrs x0, cnthctl_el2 - orr x0, x0, #3 // Enable EL1 physical timers + mov x0, #3 // Enable EL1 physical timersmsr cnthctl_el2, x0 msr cntvoff_el2, xzr // Clear virtual offset .endm
arch/parisc/include/asm/string.h +0 -15
@@ -8,19 +8,4 @@ extern void * memset(void *, int, size_t);#define __HAVE_ARCH_MEMCPYvoid *memcpy (void * dest,const void *src,size_t count); -#define __HAVE_ARCH_STRLEN -extern size_t strlen (const char *s); - -#define __HAVE_ARCH_STRCPY -extern char *strcpy (char *dest,const char *src); - -#define __HAVE_ARCH_STRNCPY -extern char *strncpy (char *dest,const char *src,size_t count); - -#define __HAVE_ARCH_STRCAT -extern char *strcat (char *dest,const char *src); - -#define __HAVE_ARCH_MEMSET -extern void *memset (void *,int ,size_t ); -#endif
arch/parisc/kernel/parisc_ksyms.c +0 -4
@@ -17,10 +17,6 @@#include <linux/string.h> EXPORT_SYMBOL (memset); -EXPORT_SYMBOL (strlen); -EXPORT_SYMBOL (strcpy); -EXPORT_SYMBOL (strncpy); -EXPORT_SYMBOL (strcat);#include <linux/atomic.h> EXPORT_SYMBOL (__xchg8);
arch/parisc/lib/Makefile +2 -2
@@ -3,7 +3,7 @@ # Makefile for parisc-specific library files # -lib-y := lusercopy.o bitops.o checksum.o io.o memcpy.o \ - ucmpdi2.o delay.o string.o +lib-y := lusercopy.o bitops.o checksum.o io.o memset.o memcpy.o \ + ucmpdi2.o delay.o obj-y := iomap.o
arch/parisc/lib/memset.c new file +72 -0
72 lines not on this page · raw message
arch/parisc/lib/string.S deleted +0 -136
136 lines not on this page · raw message
arch/powerpc/platforms/Kconfig.cputype +1 -1
@@ -97,7 +97,7 @@ config PPC_BOOK3S_64 select PPC_HAVE_PMU_SUPPORT select HAVE_ARCH_TRANSPARENT_HUGEPAGE select ARCH_ENABLE_HUGEPAGE_MIGRATION if HUGETLB_PAGE && MIGRATION - select ARCH_ENABLE_PMD_SPLIT_PTLOCK + select ARCH_ENABLE_SPLIT_PMD_PTLOCK select ARCH_ENABLE_THP_MIGRATION if TRANSPARENT_HUGEPAGE select ARCH_SUPPORTS_HUGETLBFS select ARCH_SUPPORTS_NUMA_BALANCING
arch/riscv/kernel/ptrace.c +4 -0
@@ -10,6 +10,7 @@#include <asm/ptrace.h> #include <asm/syscall.h> #include <asm/thread_info.h> +#include <asm/switch_to.h> #include <linux/audit.h> #include <linux/ptrace.h> #include <linux/elf.h>
@@ -56,6 +57,9 @@ static int riscv_fpr_get(struct task_struct *target, {struct __riscv_d_ext_state *fstate = &target->thread.fstate; +if (target == current) +fstate_save (current,task_pt_regs (current)); +membuf_write (&to, fstate, offsetof(struct __riscv_d_ext_state , fcsr));membuf_store (&to, fstate->fcsr);return membuf_zero (&to,4 );// explicitly pad
arch/x86/events/intel/uncore_snbep.c +1 -1
@@ -4701,7 +4701,7 @@ static void __snr_uncore_mmio_init_box(struct intel_uncore_box *box,return ;pci_read_config_dword (pdev,SNR_IMC_MMIO_BASE_OFFSET , &pci_dword); - addr = (pci_dword &SNR_IMC_MMIO_BASE_MASK ) <<23 ; + addr = ((resource_size_t )pci_dword &SNR_IMC_MMIO_BASE_MASK ) <<23 ;pci_read_config_dword (pdev, mem_offset, &pci_dword); addr |= (pci_dword &SNR_IMC_MMIO_MEM0_MASK ) <<12 ;
block/blk-iocost.c +4 -4
@@ -3061,19 +3061,19 @@ static ssize_t ioc_weight_write(struct kernfs_open_file *of, char *buf,if (v <CGROUP_WEIGHT_MIN || v >CGROUP_WEIGHT_MAX )return -EINVAL ; -spin_lock (&blkcg->lock); +spin_lock_irq (&blkcg->lock); iocc->dfl_weight = v *WEIGHT_ONE ;hlist_for_each_entry (blkg, &blkcg->blkg_list, blkcg_node) {struct ioc_gq *iocg =blkg_to_iocg (blkg);if (iocg) { -spin_lock_irq (&iocg->ioc->lock); +spin_lock (&iocg->ioc->lock);ioc_now (iocg->ioc, &now);weight_updated (iocg, &now); -spin_unlock_irq (&iocg->ioc->lock); +spin_unlock (&iocg->ioc->lock); } } -spin_unlock (&blkcg->lock); +spin_unlock_irq (&blkcg->lock);return nbytes; }
block/blk-mq.c +5 -25
@@ -923,34 +923,14 @@ static bool blk_mq_check_expired(struct blk_mq_hw_ctx *hctx,unsigned long *next = priv;/* -* Just do a quick check if it is expired before locking the request in -* so we're not unnecessarilly synchronizing across CPUs. -*/ -if (!blk_mq_req_expired (rq, next)) -return true; - -/* -* We have reason to believe the request may be expired. Take a -* reference on the request to lock this request lifetime into its -* currently allocated context to prevent it from being reallocated in -* the event the completion by-passes this timeout handler. -* -* If the reference was already released, then the driver beat the -* timeout handler to posting a natural completion. -*/ -if (!refcount_inc_not_zero (&rq->ref)) -return true; - -/* -* The request is now locked and cannot be reallocated underneath the -* timeout handler's processing. Re-verify this exact request is truly -* expired; if it is not expired, then the request was completed and -* reallocated as a new request. +* blk_mq_queue_tag_busy_iter() has locked the request, so it cannot +* be reallocated underneath the timeout handler's processing, then +* the expire check is reliable. If the request is not expired, then +* it was completed and reallocated as a new request after returning +* from blk_mq_check_expired(). */ if (blk_mq_req_expired (rq, next))blk_mq_rq_timed_out (rq, reserved); - -blk_mq_put_rq_ref (rq);return true; }
drivers/block/floppy.c +15 -15
@@ -4029,23 +4029,23 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)if (fdc_state[FDC (drive)].rawcmd ==1 ) fdc_state[FDC (drive)].rawcmd =2 ; -if (mode & (FMODE_READ |FMODE_WRITE )) { - drive_state[drive].last_checked =0 ; -clear_bit (FD_OPEN_SHOULD_FAIL_BIT , &drive_state[drive].flags); -if (bdev_check_media_change (bdev)) -floppy_revalidate (bdev->bd_disk); -if (test_bit (FD_DISK_CHANGED_BIT , &drive_state[drive].flags)) - goto out; -if (test_bit (FD_OPEN_SHOULD_FAIL_BIT , &drive_state[drive].flags)) +if (!(mode &FMODE_NDELAY )) { +if (mode & (FMODE_READ |FMODE_WRITE )) { + drive_state[drive].last_checked =0 ; +clear_bit (FD_OPEN_SHOULD_FAIL_BIT , + &drive_state[drive].flags); +if (bdev_check_media_change (bdev)) +floppy_revalidate (bdev->bd_disk); +if (test_bit (FD_DISK_CHANGED_BIT , &drive_state[drive].flags)) + goto out; +if (test_bit (FD_OPEN_SHOULD_FAIL_BIT , &drive_state[drive].flags)) + goto out; + } + res = -EROFS ; +if ((mode &FMODE_WRITE ) && + !test_bit (FD_DISK_WRITABLE_BIT , &drive_state[drive].flags)) goto out; } - - res = -EROFS ; - -if ((mode &FMODE_WRITE ) && - !test_bit (FD_DISK_WRITABLE_BIT , &drive_state[drive].flags)) - goto out; -mutex_unlock (&open_lock);mutex_unlock (&floppy_mutex);return 0 ;
drivers/bluetooth/btusb.c +14 -8
@@ -516,6 +516,7 @@ static const struct dmi_system_id btusb_needs_reset_resume_table[] = {#define BTUSB_HW_RESET_ACTIVE 12#define BTUSB_TX_WAIT_VND_EVT 13#define BTUSB_WAKEUP_DISABLE 14 +#define BTUSB_USE_ALT3_FOR_WBS 15struct btusb_data {struct hci_dev *hdev;
@@ -1748,16 +1749,20 @@ static void btusb_work(struct work_struct *work)/* Bluetooth USB spec recommends alt 6 (63 bytes), but * many adapters do not support it. Alt 1 appears to * work for all adapters that do not have alt 6, and -* which work with WBS at all. +* which work with WBS at all. Some devices prefer +* alt 3 (HCI payload >= 60 Bytes let air packet +* data satisfy 60 bytes), requiring +* MTU >= 3 (packets) * 25 (size) - 3 (headers) = 72 +* see also Core spec 5, vol 4, B 2.1.1 & Table 2.1. */ - new_alts =btusb_find_altsetting (data,6 ) ?6 :1 ; -/* Because mSBC frames do not need to be aligned to the -* SCO packet boundary. If support the Alt 3, use the -* Alt 3 for HCI payload >= 60 Bytes let air packet -* data satisfy 60 bytes. -*/ -if (new_alts ==1 &&btusb_find_altsetting (data,3 )) +if (btusb_find_altsetting (data,6 )) + new_alts =6 ; +else if (btusb_find_altsetting (data,3 ) && + hdev->sco_mtu >=72 && +test_bit (BTUSB_USE_ALT3_FOR_WBS , &data->flags)) new_alts =3 ; +else + new_alts =1 ; }if (btusb_switch_alt_setting (hdev, new_alts) <0 )
@@ -4733,6 +4738,7 @@ static int btusb_probe(struct usb_interface *intf,* (DEVICE_REMOTE_WAKEUP) */ set_bit (BTUSB_WAKEUP_DISABLE , &data->flags); +set_bit (BTUSB_USE_ALT3_FOR_WBS , &data->flags); }if (!reset)
drivers/clk/renesas/rcar-usb2-clock-sel.c +1 -1
@@ -187,7 +187,7 @@ static int rcar_usb2_clock_sel_probe(struct platform_device *pdev) init.ops = &usb2_clock_sel_clock_ops; priv->hw.init = &init; - ret =devm_clk_hw_register (NULL , &priv->hw); + ret =devm_clk_hw_register (dev, &priv->hw);if (ret) goto pm_put;
drivers/cpufreq/cpufreq-dt-platdev.c +1 -0
@@ -138,6 +138,7 @@ static const struct of_device_id blacklist[] __initconst = { { .compatible = "qcom,qcs404", }, { .compatible = "qcom,sc7180", }, { .compatible = "qcom,sdm845", }, + { .compatible = "qcom,sm8150", }, { .compatible = "st,stih407", }, { .compatible = "st,stih410", },
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c +1 -1
@@ -904,7 +904,7 @@ void amdgpu_acpi_fini(struct amdgpu_device *adev)*/ bool amdgpu_acpi_is_s0ix_supported (struct amdgpu_device *adev) { -#if IS_ENABLED (CONFIG_AMD_PMC ) &&IS_ENABLED (CONFIG_PM_SLEEP ) +#if IS_ENABLED (CONFIG_AMD_PMC ) &&IS_ENABLED (CONFIG_SUSPEND )if (acpi_gbl_FADT.flags &ACPI_FADT_LOW_POWER_S0 ) {if (adev->flags &AMD_IS_APU )return pm_suspend_target_state ==PM_SUSPEND_TO_IDLE ;
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +5 -6
@@ -2690,12 +2690,11 @@ static void amdgpu_device_delay_enable_gfx_off(struct work_struct *work)struct amdgpu_device *adev = container_of(work, struct amdgpu_device, gfx.gfx_off_delay_work.work); -mutex_lock (&adev->gfx.gfx_off_mutex); -if (!adev->gfx.gfx_off_state && !adev->gfx.gfx_off_req_count) { -if (!amdgpu_dpm_set_powergating_by_smu (adev,AMD_IP_BLOCK_TYPE_GFX , true)) - adev->gfx.gfx_off_state = true; - } -mutex_unlock (&adev->gfx.gfx_off_mutex); +WARN_ON_ONCE (adev->gfx.gfx_off_state); +WARN_ON_ONCE (adev->gfx.gfx_off_req_count); + +if (!amdgpu_dpm_set_powergating_by_smu (adev,AMD_IP_BLOCK_TYPE_GFX , true)) + adev->gfx.gfx_off_state = true; }/**
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c +25 -11
@@ -563,24 +563,38 @@ void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable)mutex_lock (&adev->gfx.gfx_off_mutex); -if (!enable) - adev->gfx.gfx_off_req_count++; -else if (adev->gfx.gfx_off_req_count >0 ) +if (enable) { +/* If the count is already 0, it means there's an imbalance bug somewhere. +* Note that the bug may be in a different caller than the one which triggers the +* WARN_ON_ONCE. +*/ +if (WARN_ON_ONCE (adev->gfx.gfx_off_req_count ==0 )) + goto unlock; + adev->gfx.gfx_off_req_count--; -if (enable && !adev->gfx.gfx_off_state && !adev->gfx.gfx_off_req_count) { -schedule_delayed_work (&adev->gfx.gfx_off_delay_work,GFX_OFF_DELAY_ENABLE ); - }else if (!enable && adev->gfx.gfx_off_state) { -if (!amdgpu_dpm_set_powergating_by_smu (adev,AMD_IP_BLOCK_TYPE_GFX , false)) { - adev->gfx.gfx_off_state = false; +if (adev->gfx.gfx_off_req_count ==0 && !adev->gfx.gfx_off_state) +schedule_delayed_work (&adev->gfx.gfx_off_delay_work,GFX_OFF_DELAY_ENABLE ); + }else { +if (adev->gfx.gfx_off_req_count ==0 ) { +cancel_delayed_work_sync (&adev->gfx.gfx_off_delay_work); + +if (adev->gfx.gfx_off_state && + !amdgpu_dpm_set_powergating_by_smu (adev,AMD_IP_BLOCK_TYPE_GFX , false)) { + adev->gfx.gfx_off_state = false; -if (adev->gfx.funcs->init_spm_golden) { -dev_dbg (adev->dev,"GFXOFF is disabled, re-init SPM golden settings\n" ); -amdgpu_gfx_init_spm_golden (adev); +if (adev->gfx.funcs->init_spm_golden) { +dev_dbg (adev->dev, +"GFXOFF is disabled, re-init SPM golden settings\n" ); +amdgpu_gfx_init_spm_golden (adev); + } } } + + adev->gfx.gfx_off_req_count++; } +unlock:mutex_unlock (&adev->gfx.gfx_off_mutex); }
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +5 -5
@@ -937,11 +937,6 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,return -EINVAL ; } -/* This assumes only APU display buffers are pinned with (VRAM|GTT). -* See function amdgpu_display_supported_domains() -*/ - domain =amdgpu_bo_get_preferred_pin_domain (adev, domain); -if (bo->tbo.pin_count) {uint32_t mem_type = bo->tbo.mem.mem_type;uint32_t mem_flags = bo->tbo.mem.placement;
@@ -966,6 +961,11 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,return 0 ; } +/* This assumes only APU display buffers are pinned with (VRAM|GTT). +* See function amdgpu_display_supported_domains() +*/ + domain =amdgpu_bo_get_preferred_pin_domain (adev, domain); +if (bo->tbo.base.import_attach)dma_buf_pin (bo->tbo.base.import_attach);
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c +14 -1
@@ -5123,6 +5123,13 @@ static int vega10_get_power_profile_mode(struct pp_hwmgr *hwmgr, char *buf)return size; } +static bool vega10_get_power_profile_mode_quirks (struct pp_hwmgr *hwmgr) +{ +struct amdgpu_device *adev = hwmgr->adev; + +return (adev->pdev->device ==0x6860 ); +} +static int vega10_set_power_profile_mode (struct pp_hwmgr *hwmgr,long *input,uint32_t size) {struct vega10_hwmgr *data = hwmgr->backend;
@@ -5159,9 +5166,15 @@ static int vega10_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, ui } out: -smum_send_msg_to_smc_with_parameter (hwmgr, PPSMC_MSG_SetWorkloadMask, +if (vega10_get_power_profile_mode_quirks (hwmgr)) +smum_send_msg_to_smc_with_parameter (hwmgr, PPSMC_MSG_SetWorkloadMask, +1 << power_profile_mode, +NULL ); +else +smum_send_msg_to_smc_with_parameter (hwmgr, PPSMC_MSG_SetWorkloadMask, (!power_profile_mode) ?0 :1 << (power_profile_mode -1 ),NULL ); + hwmgr->power_profile_mode = power_profile_mode;return 0 ;
drivers/gpu/drm/drm_ioc32.c +1 -3
@@ -856,8 +856,6 @@ static int compat_drm_wait_vblank(struct file *file, unsigned int cmd, req.request.sequence = req32.request.sequence; req.request.signal = req32.request.signal; err =drm_ioctl_kernel (file, drm_wait_vblank_ioctl, &req,DRM_UNLOCKED ); -if (err) -return err; req32.reply.type = req.reply.type; req32.reply.sequence = req.reply.sequence;
@@ -866,7 +864,7 @@ static int compat_drm_wait_vblank(struct file *file, unsigned int cmd,if (copy_to_user (argp, &req32,sizeof (req32)))return -EFAULT ; -return 0 ; +return err; }#if defined(CONFIG_X86 )
drivers/gpu/drm/i915/display/intel_dp.c +2 -7
@@ -3833,23 +3833,18 @@ static void intel_dp_check_device_service_irq(struct intel_dp *intel_dp)static void intel_dp_check_link_service_irq (struct intel_dp *intel_dp) { -struct drm_i915_private *i915 =dp_to_i915 (intel_dp);u8 val;if (intel_dp->dpcd[DP_DPCD_REV ] <0x11 )return ;if (drm_dp_dpcd_readb (&intel_dp->aux, -DP_LINK_SERVICE_IRQ_VECTOR_ESI0 , &val) !=1 || !val) { -drm_dbg_kms (&i915->drm,"Error in reading link service irq vector\n" ); +DP_LINK_SERVICE_IRQ_VECTOR_ESI0 , &val) !=1 || !val)return ; - }if (drm_dp_dpcd_writeb (&intel_dp->aux, -DP_LINK_SERVICE_IRQ_VECTOR_ESI0 , val) !=1 ) { -drm_dbg_kms (&i915->drm,"Error in writing link service irq vector\n" ); +DP_LINK_SERVICE_IRQ_VECTOR_ESI0 , val) !=1 )return ; - }if (val &HDMI_LINK_STATUS_CHANGED )intel_dp_handle_hdmi_link_status_change (intel_dp);
drivers/gpu/drm/i915/gt/intel_timeline.c +9 -0
@@ -127,6 +127,15 @@ static void intel_timeline_fini(struct rcu_head *rcu)i915_vma_put (timeline->hwsp_ggtt);i915_active_fini (&timeline->active); + +/* +* A small race exists between intel_gt_retire_requests_timeout and +* intel_timeline_exit which could result in the syncmap not getting +* free'd. Rather than work to hard to seal this race, simply cleanup +* the syncmap on fini. +*/ +i915_syncmap_free (&timeline->sync); +kfree (timeline); }
drivers/gpu/drm/nouveau/dispnv50/disp.c +27 -0
@@ -2235,6 +2235,33 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state) interlock[NV50_DISP_INTERLOCK_CORE ] =0 ; } +/* Finish updating head(s)... +* +* NVD is rather picky about both where window assignments can change, +* *and* about certain core and window channel states matching. +* +* The EFI GOP driver on newer GPUs configures window channels with a +* different output format to what we do, and the core channel update +* in the assign_windows case above would result in a state mismatch. +* +* Delay some of the head update until after that point to workaround +* the issue. This only affects the initial modeset. +* +* TODO: handle this better when adding flexible window mapping +*/ +for_each_oldnew_crtc_in_state (state, crtc, old_crtc_state, new_crtc_state, i) { +struct nv50_head_atom *asyh =nv50_head_atom (new_crtc_state); +struct nv50_head *head =nv50_head (crtc); + +NV_ATOMIC (drm,"%s: set %04x (clr %04x)\n" , crtc->name, + asyh->set.mask, asyh->clr.mask); + +if (asyh->set.mask) { +nv50_head_flush_set_wndw (head, asyh); + interlock[NV50_DISP_INTERLOCK_CORE ] =1 ; + } + } +/* Update plane(s). */ for_each_new_plane_in_state (state, plane, new_plane_state, i) {struct nv50_wndw_atom *asyw =nv50_wndw_atom (new_plane_state);
drivers/gpu/drm/nouveau/dispnv50/head.c +9 -4
@@ -50,11 +50,8 @@ nv50_head_flush_clr(struct nv50_head *head, }void -nv50_head_flush_set (struct nv50_head *head,struct nv50_head_atom *asyh) +nv50_head_flush_set_wndw (struct nv50_head *head,struct nv50_head_atom *asyh) { -if (asyh->set.view ) head->func->view (head, asyh); -if (asyh->set.mode ) head->func->mode (head, asyh); -if (asyh->set.core ) head->func->core_set (head, asyh);if (asyh->set.olut ) { asyh->olut.offset = nv50_lut_load(&head->olut, asyh->olut.buffer,
@@ -62,6 +59,14 @@ nv50_head_flush_set(struct nv50_head *head, struct nv50_head_atom *asyh) asyh->olut.load); head->func->olut_set (head, asyh); } +} + +void +nv50_head_flush_set (struct nv50_head *head,struct nv50_head_atom *asyh) +{ +if (asyh->set.view ) head->func->view (head, asyh); +if (asyh->set.mode ) head->func->mode (head, asyh); +if (asyh->set.core ) head->func->core_set (head, asyh);if (asyh->set.curs ) head->func->curs_set (head, asyh);if (asyh->set.base ) head->func->base (head, asyh);if (asyh->set.ovly ) head->func->ovly (head, asyh);
drivers/gpu/drm/nouveau/dispnv50/head.h +1 -0
@@ -21,6 +21,7 @@ struct nv50_head {struct nv50_head *nv50_head_create (struct drm_device *,int index);void nv50_head_flush_set (struct nv50_head *head,struct nv50_head_atom *asyh); +void nv50_head_flush_set_wndw (struct nv50_head *head,struct nv50_head_atom *asyh);void nv50_head_flush_clr (struct nv50_head *head,struct nv50_head_atom *asyh,bool flush);
drivers/gpu/drm/nouveau/nvkm/engine/device/base.c +21 -0
@@ -2624,6 +2624,26 @@ nv174_chipset = { .dma = { 0x00000001, gv100_dma_new }, }; +static const struct nvkm_device_chip +nv177_chipset = { + .name ="GA107" , + .bar = {0x00000001 , tu102_bar_new }, + .bios = {0x00000001 , nvkm_bios_new }, + .devinit = {0x00000001 , ga100_devinit_new }, + .fb = {0x00000001 , ga102_fb_new }, + .gpio = {0x00000001 , ga102_gpio_new }, + .i2c = {0x00000001 , gm200_i2c_new }, + .imem = {0x00000001 , nv50_instmem_new }, + .mc = {0x00000001 , ga100_mc_new }, + .mmu = {0x00000001 , tu102_mmu_new }, + .pci = {0x00000001 , gp100_pci_new }, + .privring = {0x00000001 , gm200_privring_new }, + .timer = {0x00000001 , gk20a_timer_new }, + .top = {0x00000001 , ga100_top_new }, + .disp = {0x00000001 , ga102_disp_new }, + .dma = {0x00000001 , gv100_dma_new }, +}; +static int nvkm_device_event_ctor (struct nvkm_object *object,void *data,u32 size,struct nvkm_notify *notify)
@@ -3049,6 +3069,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,case 0x168 : device->chip = &nv168_chipset;break ;case 0x172 : device->chip = &nv172_chipset;break ;case 0x174 : device->chip = &nv174_chipset;break ; +case 0x177 : device->chip = &nv177_chipset;break ;default :if (nvkm_boolopt (device->cfgopt,"NvEnableUnsupportedChipsets" , false)) {switch (device->chipset) {
drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c +1 -1
@@ -440,7 +440,7 @@ nvkm_dp_train(struct nvkm_dp *dp, u32 dataKBps)return ret; } -static void +void nvkm_dp_disable (struct nvkm_outp *outp,struct nvkm_ior *ior) {struct nvkm_dp *dp =nvkm_dp (outp);
drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h +1 -0
@@ -32,6 +32,7 @@ struct nvkm_dp {int nvkm_dp_new (struct nvkm_disp *,int index,struct dcb_output *,struct nvkm_outp **); +void nvkm_dp_disable (struct nvkm_outp *,struct nvkm_ior *);/* DPCD Receiver Capabilities */ #define DPCD_RC00_DPCD_REV 0x00000
drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.c +9 -0
@@ -22,6 +22,7 @@* Authors: Ben Skeggs */ #include "outp.h" +#include "dp.h" #include "ior.h" #include <subdev/bios.h>
@@ -257,6 +258,14 @@ nvkm_outp_init_route(struct nvkm_outp *outp)if (!ior->arm.head || ior->arm.proto != proto) {OUTP_DBG (outp,"no heads (%x %d %d)" , ior->arm.head, ior->arm.proto, proto); + +/* The EFI GOP driver on Ampere can leave unused DP links routed, +* which we don't expect. The DisableLT IED script *should* get +* us back to where we need to be. +*/ +if (ior->func->route.get && !ior->arm.head && outp->info.type ==DCB_OUTPUT_DP ) +nvkm_dp_disable (outp, ior); +return ; }
drivers/infiniband/core/uverbs_std_types_mr.c +3 -0
@@ -249,6 +249,9 @@ static int UVERBS_HANDLER(UVERBS_METHOD_REG_DMABUF_MR)( mr->uobject = uobj;atomic_inc (&pd->usecnt); +rdma_restrack_new (&mr->res,RDMA_RESTRACK_MR ); +rdma_restrack_set_name (&mr->res,NULL ); +rdma_restrack_add (&mr->res); uobj->object = mr;uverbs_finalize_uobj_create (attrs,UVERBS_ATTR_REG_DMABUF_MR_HANDLE );
drivers/infiniband/hw/bnxt_re/ib_verbs.c +1 -0
@@ -1691,6 +1691,7 @@ int bnxt_re_create_srq(struct ib_srq *ib_srq,if (nq) nq->budget++;atomic_inc (&rdev->srq_count); +spin_lock_init (&srq->lock);return 0 ;
drivers/infiniband/hw/bnxt_re/main.c +0 -1
@@ -1406,7 +1406,6 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 wqe_mode)memset (&rattr,0 ,sizeof (rattr)); rc =bnxt_re_register_netdev (rdev);if (rc) { -rtnl_unlock ();ibdev_err (&rdev->ibdev,"Failed to register with netedev: %#x\n" , rc);return -EINVAL ;
drivers/infiniband/hw/efa/efa_main.c +1 -0
@@ -356,6 +356,7 @@ static int efa_enable_msix(struct efa_dev *dev) }if (irq_num != msix_vecs) { +efa_disable_msix (dev);dev_err (&dev->pdev->dev,"Allocated %d MSI-X (out of %d requested)\n" , irq_num, msix_vecs);
drivers/infiniband/hw/hfi1/sdma.c +4 -5
@@ -3055,6 +3055,7 @@ static void __sdma_process_event(struct sdma_engine *sde,static int _extend_sdma_tx_descs (struct hfi1_devdata *dd,struct sdma_txreq *tx) {int i; +struct sdma_desc *descp;/* Handle last descriptor */ if (unlikely ((tx->num_desc == (MAX_DESC -1 )))) {
@@ -3075,12 +3076,10 @@ static int _extend_sdma_tx_descs(struct hfi1_devdata *dd, struct sdma_txreq *tx)if (unlikely (tx->num_desc ==MAX_DESC )) goto enomem; - tx->descp =kmalloc_array ( -MAX_DESC , -sizeof (struct sdma_desc ), -GFP_ATOMIC ); -if (!tx->descp) + descp =kmalloc_array (MAX_DESC ,sizeof (struct sdma_desc ),GFP_ATOMIC ); +if (!descp) goto enomem; + tx->descp = descp;/* reserve last descriptor for coalescing */ tx->desc_limit =MAX_DESC -1 ;
drivers/infiniband/hw/mlx5/main.c +2 -1
@@ -4444,7 +4444,8 @@ static void mlx5r_mp_remove(struct auxiliary_device *adev)mutex_lock (&mlx5_ib_multiport_mutex);if (mpi->ibdev)mlx5_ib_unbind_slave_port (mpi->ibdev, mpi); -list_del (&mpi->list); +else +list_del (&mpi->list);mutex_unlock (&mlx5_ib_multiport_mutex);kfree (mpi); }
drivers/infiniband/sw/rxe/rxe_mcast.c +1 -1
@@ -85,7 +85,7 @@ int rxe_mcast_add_grp_elem(struct rxe_dev *rxe, struct rxe_qp *qp, goto out; } - elem =rxe_alloc (&rxe->mc_elem_pool); + elem =rxe_alloc_locked (&rxe->mc_elem_pool);if (!elem) { err = -ENOMEM ; goto out;
drivers/media/pci/intel/ipu3/cio2-bridge.c +1 -1
@@ -226,7 +226,7 @@ static int cio2_bridge_connect_sensor(const struct cio2_sensor_config *cfg, err_free_swnodes:software_node_unregister_nodes (sensor->swnodes); err_put_adev: -acpi_dev_put (sensor->adev); +acpi_dev_put (adev);return ret; }
drivers/mmc/host/sdhci-iproc.c +1 -2
@@ -295,8 +295,7 @@ static const struct sdhci_ops sdhci_iproc_bcm2711_ops = { };static const struct sdhci_pltfm_data sdhci_bcm2711_pltfm_data = { - .quirks =SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 | -SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN , + .quirks =SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 , .ops = &sdhci_iproc_bcm2711_ops, };
drivers/net/can/usb/esd_usb2.c +2 -2
@@ -224,8 +224,8 @@ static void esd_usb2_rx_event(struct esd_usb2_net_priv *priv,if (id ==ESD_EV_CAN_ERROR_EXT ) {u8 state = msg->msg.rx.data[0 ];u8 ecc = msg->msg.rx.data[1 ]; -u8 txerr = msg->msg.rx.data[2 ]; -u8 rxerr = msg->msg.rx.data[3 ]; +u8 rxerr = msg->msg.rx.data[2 ]; +u8 txerr = msg->msg.rx.data[3 ]; skb =alloc_can_err_skb (priv->netdev, &cf);if (skb ==NULL ) {
drivers/net/dsa/hirschmann/hellcreek.c +4 -4
@@ -1473,9 +1473,6 @@ static void hellcreek_setup_gcl(struct hellcreek *hellcreek, int port,u16 data;u8 gates; - cur++; - next++; -if (i == schedule->num_entries) gates = initial->gate_mask ^ cur->gate_mask;
@@ -1504,6 +1501,9 @@ static void hellcreek_setup_gcl(struct hellcreek *hellcreek, int port, (initial->gate_mask <<TR_GCLCMD_INIT_GATE_STATES_SHIFT );hellcreek_write (hellcreek, data,TR_GCLCMD ); + + cur++; + next++; } }
@@ -1551,7 +1551,7 @@ static bool hellcreek_schedule_startable(struct hellcreek *hellcreek, int port)/* Calculate difference to admin base time */ base_time_ns =ktime_to_ns (hellcreek_port->current_schedule->base_time); -return base_time_ns - current_ns < (s64 )8 *NSEC_PER_SEC ; +return base_time_ns - current_ns < (s64 )4 *NSEC_PER_SEC ; }static void hellcreek_start_schedule (struct hellcreek *hellcreek,int port)
drivers/net/dsa/mt7530.c +1 -4
@@ -1295,11 +1295,8 @@ mt7530_port_bridge_leave(struct dsa_switch *ds, int port,/* Remove this port from the port matrix of the other ports * in the same bridge. If the port is disabled, port matrix * is kept and not being setup until the port becomes enabled. -* And the other port's port matrix cannot be broken when the -* other port is still a VLAN-aware port. */ -if (dsa_is_user_port (ds, i) && i != port && - !dsa_port_is_vlan_filtering (dsa_to_port (ds, i))) { +if (dsa_is_user_port (ds, i) && i != port) {if (dsa_to_port (ds, i)->bridge_dev != bridge)continue ;if (priv->ports[i].enable)
drivers/net/ethernet/apm/xgene-v2/main.c +3 -1
@@ -677,11 +677,13 @@ static int xge_probe(struct platform_device *pdev) ret =register_netdev (ndev);if (ret) {netdev_err (ndev,"Failed to register netdev\n" ); - goto err; + goto err_mdio_remove; }return 0 ; +err_mdio_remove: +xge_mdio_remove (ndev); err:free_netdev (ndev);
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +3 -4
@@ -5068,6 +5068,7 @@ static int adap_init0(struct adapter *adap, int vpd_skip) ret = -ENOMEM ; goto bye; } +bitmap_zero (adap->sge.blocked_fl, adap->sge.egr_sz);#endif params[0 ] =FW_PARAM_PFVF (CLIP_START );
@@ -6788,13 +6789,11 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)setup_memwin (adapter); err =adap_init0 (adapter,0 ); -#ifdef CONFIG_DEBUG_FS -bitmap_zero (adapter->sge.blocked_fl, adapter->sge.egr_sz); -#endif -setup_memwin_rdma (adapter);if (err) goto out_unmap_bar; +setup_memwin_rdma (adapter); +/* configure SGE_STAT_CFG_A to read WC stats */ if (!is_t4 (adapter->params.chip)) t4_write_reg(adapter, SGE_STAT_CFG_A, STATSOURCE_T5_V(7) |
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c +5 -1
@@ -564,9 +564,13 @@ static void hclge_cmd_uninit_regs(struct hclge_hw *hw)void hclge_cmd_uninit (struct hclge_dev *hdev) { +set_bit (HCLGE_STATE_CMD_DISABLE , &hdev->state); +/* wait to ensure that the firmware completes the possible left +* over commands. +*/ +msleep (HCLGE_CMDQ_CLEAR_WAIT_TIME );spin_lock_bh (&hdev->hw.cmq.csq.lock);spin_lock (&hdev->hw.cmq.crq.lock); -set_bit (HCLGE_STATE_CMD_DISABLE , &hdev->state);hclge_cmd_uninit_regs (&hdev->hw);spin_unlock (&hdev->hw.cmq.crq.lock);spin_unlock_bh (&hdev->hw.cmq.csq.lock);
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h +4 -0
@@ -9,6 +9,7 @@#include "hnae3.h" #define HCLGE_CMDQ_TX_TIMEOUT 30000 +#define HCLGE_CMDQ_CLEAR_WAIT_TIME 200#define HCLGE_DESC_DATA_LEN 6struct hclge_dev ;
@@ -264,6 +265,9 @@ enum hclge_opcode_type {/* Led command */ HCLGE_OPC_LED_STATUS_CFG =0xB000 , +/* clear hardware resource command */ +HCLGE_OPC_CLEAR_HW_RESOURCE =0x700B , +/* NCL config command */ HCLGE_OPC_QUERY_NCL_CONFIG = 0x7011,
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c +2 -11
@@ -255,21 +255,12 @@ static int hclge_ieee_getpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)u64 requests[HNAE3_MAX_TC ], indications[HNAE3_MAX_TC ];struct hclge_vport *vport =hclge_get_vport (h);struct hclge_dev *hdev = vport->back; -u8 i, j, pfc_map, *prio_tc;int ret; +u8 i;memset (pfc,0 ,sizeof (*pfc)); pfc->pfc_cap = hdev->pfc_max; - prio_tc = hdev->tm_info.prio_tc; - pfc_map = hdev->tm_info.hw_pfc_map; - -/* Pfc setting is based on TC */ -for (i =0 ; i < hdev->tm_info.num_tc; i++) { -for (j =0 ; j <HNAE3_MAX_USER_PRIO ; j++) { -if ((prio_tc[j] == i) && (pfc_map &BIT (i))) - pfc->pfc_en |=BIT (j); - } - } + pfc->pfc_en = hdev->tm_info.pfc_en; ret =hclge_pfc_tx_stats_get (hdev, requests);if (ret)
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +32 -2
@@ -2924,12 +2924,12 @@ static void hclge_update_link_status(struct hclge_dev *hdev) }if (state != hdev->hw.mac.link) { + hdev->hw.mac.link = state; client->ops->link_status_change (handle, state);hclge_config_mac_tnl_int (hdev, state);if (rclient && rclient->ops->link_status_change) rclient->ops->link_status_change (rhandle, state); - hdev->hw.mac.link = state;hclge_push_link_status (hdev); }
@@ -9869,7 +9869,11 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev)static void hclge_add_vport_vlan_table (struct hclge_vport *vport,u16 vlan_id,bool writen_to_tbl) { -struct hclge_vport_vlan_cfg *vlan; +struct hclge_vport_vlan_cfg *vlan, *tmp; + +list_for_each_entry_safe (vlan, tmp, &vport->vlan_list, node) +if (vlan->vlan_id == vlan_id) +return ; vlan =kzalloc (sizeof (*vlan),GFP_KERNEL );if (!vlan)
@@ -11167,6 +11171,28 @@ static void hclge_clear_resetting_state(struct hclge_dev *hdev) } } +static int hclge_clear_hw_resource (struct hclge_dev *hdev) +{ +struct hclge_desc desc; +int ret; + +hclge_cmd_setup_basic_desc (&desc,HCLGE_OPC_CLEAR_HW_RESOURCE , false); + + ret =hclge_cmd_send (&hdev->hw, &desc,1 ); +/* This new command is only supported by new firmware, it will +* fail with older firmware. Error value -EOPNOSUPP can only be +* returned by older firmware running this command, to keep code +* backward compatible we will override this value and return +* success. +*/ +if (ret && ret != -EOPNOTSUPP ) { +dev_err (&hdev->pdev->dev, +"failed to clear hw resource, ret = %d\n" , ret); +return ret; + } +return 0 ; +} +static int hclge_init_ae_dev (struct hnae3_ae_dev *ae_dev) {struct pci_dev *pdev = ae_dev->pdev;
@@ -11204,6 +11230,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)if (ret) goto err_cmd_uninit; + ret =hclge_clear_hw_resource (hdev); +if (ret) + goto err_cmd_uninit; + ret =hclge_get_cap (hdev);if (ret) goto err_cmd_uninit;
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c +6 -1
@@ -505,12 +505,17 @@ static void hclgevf_cmd_uninit_regs(struct hclgevf_hw *hw)void hclgevf_cmd_uninit (struct hclgevf_dev *hdev) { +set_bit (HCLGEVF_STATE_CMD_DISABLE , &hdev->state); +/* wait to ensure that the firmware completes the possible left +* over commands. +*/ +msleep (HCLGEVF_CMDQ_CLEAR_WAIT_TIME );spin_lock_bh (&hdev->hw.cmq.csq.lock);spin_lock (&hdev->hw.cmq.crq.lock); -set_bit (HCLGEVF_STATE_CMD_DISABLE , &hdev->state);hclgevf_cmd_uninit_regs (&hdev->hw);spin_unlock (&hdev->hw.cmq.crq.lock);spin_unlock_bh (&hdev->hw.cmq.csq.lock); +hclgevf_free_cmd_desc (&hdev->hw.cmq.csq);hclgevf_free_cmd_desc (&hdev->hw.cmq.crq); }
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h +1 -0
@@ -8,6 +8,7 @@#include "hnae3.h" #define HCLGEVF_CMDQ_TX_TIMEOUT 30000 +#define HCLGEVF_CMDQ_CLEAR_WAIT_TIME 200#define HCLGEVF_CMDQ_RX_INVLD_B 0#define HCLGEVF_CMDQ_RX_OUTVLD_B 1
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +1 -1
@@ -498,10 +498,10 @@ void hclgevf_update_link_status(struct hclgevf_dev *hdev, int link_state) link_state =test_bit (HCLGEVF_STATE_DOWN , &hdev->state) ?0 : link_state;if (link_state != hdev->hw.mac.link) { + hdev->hw.mac.link = link_state; client->ops->link_status_change (handle, !!link_state);if (rclient && rclient->ops->link_status_change) rclient->ops->link_status_change (rhandle, !!link_state); - hdev->hw.mac.link = link_state; }clear_bit (HCLGEVF_STATE_LINK_UPDATING , &hdev->state);
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c +1 -1
@@ -304,8 +304,8 @@ void hclgevf_mbx_async_handler(struct hclgevf_dev *hdev) flag = (u8 )msg_q[5 ];/* update upper layer with new link link status */ -hclgevf_update_link_status (hdev, link_status);hclgevf_update_speed_duplex (hdev, speed, duplex); +hclgevf_update_link_status (hdev, link_status);if (flag &HCLGE_MBX_PUSH_LINK_STATUS_EN ) set_bit(HCLGEVF_STATE_PF_PUSH_LINK_STATUS,
drivers/net/ethernet/intel/e1000e/ich8lan.c +24 -8
@@ -1006,6 +1006,8 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link) {u32 reg = link << (E1000_LTRV_REQ_SHIFT +E1000_LTRV_NOSNOOP_SHIFT ) | link <<E1000_LTRV_REQ_SHIFT |E1000_LTRV_SEND ; +u16 max_ltr_enc_d =0 ;/* maximum LTR decoded by platform */ +u16 lat_enc_d =0 ;/* latency decoded */ u16 lat_enc =0 ;/* latency encoded */ if (link) {
@@ -1059,7 +1061,17 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link) E1000_PCI_LTR_CAP_LPT + 2, &max_nosnoop); max_ltr_enc =max_t (u16, max_snoop, max_nosnoop); -if (lat_enc > max_ltr_enc) + lat_enc_d = (lat_enc &E1000_LTRV_VALUE_MASK ) * + (1U << (E1000_LTRV_SCALE_FACTOR * + ((lat_enc &E1000_LTRV_SCALE_MASK ) + >>E1000_LTRV_SCALE_SHIFT ))); + + max_ltr_enc_d = (max_ltr_enc &E1000_LTRV_VALUE_MASK ) * + (1U << (E1000_LTRV_SCALE_FACTOR * + ((max_ltr_enc &E1000_LTRV_SCALE_MASK ) + >>E1000_LTRV_SCALE_SHIFT ))); + +if (lat_enc_d > max_ltr_enc_d) lat_enc = max_ltr_enc; }
@@ -4115,13 +4127,17 @@ static s32 e1000_validate_nvm_checksum_ich8lan(struct e1000_hw *hw)return ret_val;if (!(data & valid_csum_mask)) { - data |= valid_csum_mask; - ret_val =e1000_write_nvm (hw, word,1 , &data); -if (ret_val) -return ret_val; - ret_val =e1000e_update_nvm_checksum (hw); -if (ret_val) -return ret_val; +e_dbg ("NVM Checksum Invalid\n" ); + +if (hw->mac.type < e1000_pch_cnp) { + data |= valid_csum_mask; + ret_val =e1000_write_nvm (hw, word,1 , &data); +if (ret_val) +return ret_val; + ret_val =e1000e_update_nvm_checksum (hw); +if (ret_val) +return ret_val; + } }return e1000e_validate_nvm_checksum_generic (hw);
drivers/net/ethernet/intel/e1000e/ich8lan.h +3 -0
@@ -274,8 +274,11 @@/* Latency Tolerance Reporting */ #define E1000_LTRV 0x000F8 +#define E1000_LTRV_VALUE_MASK 0x000003FF#define E1000_LTRV_SCALE_MAX 5#define E1000_LTRV_SCALE_FACTOR 5 +#define E1000_LTRV_SCALE_SHIFT 10 +#define E1000_LTRV_SCALE_MASK 0x00001C00#define E1000_LTRV_REQ_SHIFT 15#define E1000_LTRV_NOSNOOP_SHIFT 16#define E1000_LTRV_SEND (1 << 30)
drivers/net/ethernet/intel/ice/ice_devlink.c +3 -1
@@ -42,7 +42,9 @@ static int ice_info_pba(struct ice_pf *pf, struct ice_info_ctx *ctx) status =ice_read_pba_string (hw, (u8 *)ctx->buf,sizeof (ctx->buf));if (status) -return -EIO ; +/* We failed to locate the PBA, so just skip this entry */ +dev_dbg (ice_pf_to_dev (pf),"Failed to read Product Board Assembly string, status %s\n" , +ice_stat_str (status));return 0 ; }
drivers/net/ethernet/intel/igc/igc_main.c +21 -15
@@ -146,6 +146,9 @@ static void igc_release_hw_control(struct igc_adapter *adapter)struct igc_hw *hw = &adapter->hw;u32 ctrl_ext; +if (!pci_device_is_present (adapter->pdev)) +return ; +/* Let firmware take over control of h/w */ ctrl_ext =rd32 (IGC_CTRL_EXT ); wr32(IGC_CTRL_EXT,
@@ -4037,26 +4040,29 @@ void igc_down(struct igc_adapter *adapter)igc_ptp_suspend (adapter); -/* disable receives in the hardware */ - rctl =rd32 (IGC_RCTL ); -wr32 (IGC_RCTL , rctl & ~IGC_RCTL_EN ); -/* flush and sleep below */ - +if (pci_device_is_present (adapter->pdev)) { +/* disable receives in the hardware */ + rctl =rd32 (IGC_RCTL ); +wr32 (IGC_RCTL , rctl & ~IGC_RCTL_EN ); +/* flush and sleep below */ + }/* set trans_start so we don't get spurious watchdogs during reset */ netif_trans_update (netdev);netif_carrier_off (netdev);netif_tx_stop_all_queues (netdev); -/* disable transmits in the hardware */ - tctl =rd32 (IGC_TCTL ); - tctl &= ~IGC_TCTL_EN ; -wr32 (IGC_TCTL , tctl); -/* flush both disables and wait for them to finish */ -wrfl (); -usleep_range (10000 ,20000 ); +if (pci_device_is_present (adapter->pdev)) { +/* disable transmits in the hardware */ + tctl =rd32 (IGC_TCTL ); + tctl &= ~IGC_TCTL_EN ; +wr32 (IGC_TCTL , tctl); +/* flush both disables and wait for them to finish */ +wrfl (); +usleep_range (10000 ,20000 ); -igc_irq_disable (adapter); +igc_irq_disable (adapter); + } adapter->flags &= ~IGC_FLAG_NEED_LINK_UPDATE ;
@@ -5074,7 +5080,7 @@ static bool validate_schedule(struct igc_adapter *adapter,if (e->command !=TC_TAPRIO_CMD_SET_GATES )return false; -for (i =0 ; i <IGC_MAX_TX_QUEUES ; i++) { +for (i =0 ; i < adapter->num_tx_queues; i++) {if (e->gate_mask &BIT (i)) queue_uses[i]++;
@@ -5131,7 +5137,7 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter, end_time += e->interval; -for (i =0 ; i <IGC_MAX_TX_QUEUES ; i++) { +for (i =0 ; i < adapter->num_tx_queues; i++) {struct igc_ring *ring = adapter->tx_ring[i];if (!(e->gate_mask &BIT (i)))
drivers/net/ethernet/intel/igc/igc_ptp.c +2 -1
@@ -849,7 +849,8 @@ void igc_ptp_suspend(struct igc_adapter *adapter) adapter->ptp_tx_skb =NULL ;clear_bit_unlock (__IGC_PTP_TX_IN_PROGRESS, &adapter->state); -igc_ptp_time_save (adapter); +if (pci_device_is_present (adapter->pdev)) +igc_ptp_time_save (adapter); }/**
drivers/net/ethernet/marvell/mvneta.c +1 -1
@@ -105,7 +105,7 @@#define MVNETA_VLAN_PRIO_TO_RXQ 0x2440#define MVNETA_VLAN_PRIO_RXQ_MAP (prio, rxq) ((rxq) << ((prio) * 3))#define MVNETA_PORT_STATUS 0x2444 -#define MVNETA_TX_IN_PRGRS BIT(1) +#define MVNETA_TX_IN_PRGRS BIT(0)#define MVNETA_TX_FIFO_EMPTY BIT(8)#define MVNETA_RX_MIN_FRAME_SIZE 0x247c/* Only exists on Armada XP and Armada 370 */
drivers/net/ethernet/mscc/ocelot_io.c +8 -8
@@ -21,7 +21,7 @@ u32 __ocelot_read_ix(struct ocelot *ocelot, u32 reg, u32 offset) ocelot->map[target][reg & REG_MASK] + offset, &val);return val; } -EXPORT_SYMBOL (__ocelot_read_ix); +EXPORT_SYMBOL_GPL (__ocelot_read_ix);void __ocelot_write_ix (struct ocelot *ocelot,u32 val,u32 reg,u32 offset) {
@@ -32,7 +32,7 @@ void __ocelot_write_ix(struct ocelot *ocelot, u32 val, u32 reg, u32 offset)regmap_write (ocelot->targets[target], ocelot->map[target][reg ®_MASK ] + offset, val); } -EXPORT_SYMBOL (__ocelot_write_ix); +EXPORT_SYMBOL_GPL (__ocelot_write_ix);void __ocelot_rmw_ix (struct ocelot *ocelot,u32 val,u32 mask,u32 reg,u32 offset)
@@ -45,7 +45,7 @@ void __ocelot_rmw_ix(struct ocelot *ocelot, u32 val, u32 mask, u32 reg, ocelot->map[target][reg ®_MASK ] + offset, mask, val); } -EXPORT_SYMBOL (__ocelot_rmw_ix); +EXPORT_SYMBOL_GPL (__ocelot_rmw_ix);u32 ocelot_port_readl (struct ocelot_port *port,u32 reg) {
@@ -58,7 +58,7 @@ u32 ocelot_port_readl(struct ocelot_port *port, u32 reg)regmap_read (port->target, ocelot->map[target][reg ®_MASK ], &val);return val; } -EXPORT_SYMBOL (ocelot_port_readl); +EXPORT_SYMBOL_GPL (ocelot_port_readl);void ocelot_port_writel (struct ocelot_port *port,u32 val,u32 reg) {
@@ -69,7 +69,7 @@ void ocelot_port_writel(struct ocelot_port *port, u32 val, u32 reg)regmap_write (port->target, ocelot->map[target][reg ®_MASK ], val); } -EXPORT_SYMBOL (ocelot_port_writel); +EXPORT_SYMBOL_GPL (ocelot_port_writel);void ocelot_port_rmwl (struct ocelot_port *port,u32 val,u32 mask,u32 reg) {
@@ -77,7 +77,7 @@ void ocelot_port_rmwl(struct ocelot_port *port, u32 val, u32 mask, u32 reg)ocelot_port_writel (port, (cur & (~mask)) | val, reg); } -EXPORT_SYMBOL (ocelot_port_rmwl); +EXPORT_SYMBOL_GPL (ocelot_port_rmwl);u32 __ocelot_target_read_ix (struct ocelot *ocelot,enum ocelot_target target,u32 reg,u32 offset)
@@ -128,7 +128,7 @@ int ocelot_regfields_init(struct ocelot *ocelot,return 0 ; } -EXPORT_SYMBOL (ocelot_regfields_init); +EXPORT_SYMBOL_GPL (ocelot_regfields_init);static struct regmap_config ocelot_regmap_config = { .reg_bits =32 ,
@@ -148,4 +148,4 @@ struct regmap *ocelot_regmap_init(struct ocelot *ocelot, struct resource *res)return devm_regmap_init_mmio (ocelot->dev, regs, &ocelot_regmap_config); } -EXPORT_SYMBOL (ocelot_regmap_init); +EXPORT_SYMBOL_GPL (ocelot_regmap_init);
drivers/net/ethernet/qlogic/qed/qed_ll2.c +20 -0
@@ -327,6 +327,9 @@ static int qed_ll2_txq_completion(struct qed_hwfn *p_hwfn, void *p_cookie)unsigned long flags;int rc = -EINVAL ; +if (!p_ll2_conn) +return rc; +spin_lock_irqsave (&p_tx->lock, flags);if (p_tx->b_completing_packet) { rc = -EBUSY ;
@@ -500,7 +503,16 @@ static int qed_ll2_rxq_completion(struct qed_hwfn *p_hwfn, void *cookie)unsigned long flags =0 ;int rc =0 ; +if (!p_ll2_conn) +return rc; +spin_lock_irqsave (&p_rx->lock, flags); + +if (!QED_LL2_RX_REGISTERED (p_ll2_conn)) { +spin_unlock_irqrestore (&p_rx->lock, flags); +return 0 ; + } + cq_new_idx =le16_to_cpu (*p_rx->p_fw_cons); cq_old_idx =qed_chain_get_cons_idx (&p_rx->rcq_chain);
@@ -821,6 +833,9 @@ static int qed_ll2_lb_rxq_completion(struct qed_hwfn *p_hwfn, void *p_cookie)struct qed_ll2_info *p_ll2_conn = (struct qed_ll2_info *)p_cookie;int rc; +if (!p_ll2_conn) +return 0 ; +if (!QED_LL2_RX_REGISTERED (p_ll2_conn))return 0 ;
@@ -844,6 +859,9 @@ static int qed_ll2_lb_txq_completion(struct qed_hwfn *p_hwfn, void *p_cookie)u16 new_idx =0 , num_bds =0 ;int rc; +if (!p_ll2_conn) +return 0 ; +if (!QED_LL2_TX_REGISTERED (p_ll2_conn))return 0 ;
@@ -1725,6 +1743,8 @@ int qed_ll2_post_rx_buffer(void *cxt,if (!p_ll2_conn)return -EINVAL ; p_rx = &p_ll2_conn->rx_queue; +if (!p_rx->set_prod_addr) +return -EIO ;spin_lock_irqsave (&p_rx->lock, flags);if (!list_empty (&p_rx->free_descq))
drivers/net/ethernet/qlogic/qed/qed_rdma.c +1 -2
@@ -1285,8 +1285,7 @@ qed_rdma_create_qp(void *rdma_cxt,if (!rdma_cxt || !in_params || !out_params || !p_hwfn->p_rdma_info->active) { -DP_ERR (p_hwfn->cdev, -"qed roce create qp failed due to NULL entry (rdma_cxt=%p, in=%p, out=%p, roce_info=?\n" , +pr_err ("qed roce create qp failed due to NULL entry (rdma_cxt=%p, in=%p, out=%p, roce_info=?\n" , rdma_cxt, in_params, out_params);return NULL ; }
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +4 -4
@@ -4925,6 +4925,10 @@ static int stmmac_rx_zc(struct stmmac_priv *priv, int limit, u32 queue)prefetch (np); +/* Ensure a valid XSK buffer before proceed */ +if (!buf->xdp) +break ; +if (priv->extend_desc) stmmac_rx_extended_status(priv, &priv->dev->stats, &priv->xstats,
@@ -4945,10 +4949,6 @@ static int stmmac_rx_zc(struct stmmac_priv *priv, int limit, u32 queue)continue ; } -/* Ensure a valid XSK buffer before proceed */ -if (!buf->xdp) -break ; -/* XSK pool expects RX frame 1:1 mapped to XSK buffer */ if (likely (status & rx_not_ls)) {xsk_buff_free (buf->xdp);
drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c +16 -4
@@ -775,14 +775,18 @@ static int tc_setup_taprio(struct stmmac_priv *priv, GFP_KERNEL);if (!plat->est)return -ENOMEM ; + +mutex_init (&priv->plat->est->lock); }else {memset (plat->est,0 ,sizeof (*plat->est)); } size = qopt->num_entries; +mutex_lock (&priv->plat->est->lock); priv->plat->est->gcl_size = size; priv->plat->est->enable = qopt->enable; +mutex_unlock (&priv->plat->est->lock);for (i =0 ; i < size; i++) {s64 delta_ns = qopt->entries[i].interval;
@@ -813,6 +817,7 @@ static int tc_setup_taprio(struct stmmac_priv *priv, priv->plat->est->gcl[i] = delta_ns | (gates << wid); } +mutex_lock (&priv->plat->est->lock);/* Adjust for real system time */ priv->ptp_clock_ops.gettime64 (&priv->ptp_clock_ops, ¤t_time); current_time_ns =timespec64_to_ktime (current_time);
@@ -837,8 +842,10 @@ static int tc_setup_taprio(struct stmmac_priv *priv, priv->plat->est->ctr[0 ] =do_div (ctr,NSEC_PER_SEC ); priv->plat->est->ctr[1 ] = (u32 )ctr; -if (fpe && !priv->dma_cap.fpesel) +if (fpe && !priv->dma_cap.fpesel) { +mutex_unlock (&priv->plat->est->lock);return -EOPNOTSUPP ; + }/* Actual FPE register configuration will be done after FPE handshake * is success.
@@ -847,6 +854,7 @@ static int tc_setup_taprio(struct stmmac_priv *priv, ret =stmmac_est_configure (priv, priv->ioaddr, priv->plat->est, priv->plat->clk_ptp_rate); +mutex_unlock (&priv->plat->est->lock);if (ret) {netdev_err (priv->dev,"failed to configure EST\n" ); goto disable;
@@ -862,9 +870,13 @@ static int tc_setup_taprio(struct stmmac_priv *priv,return 0 ; disable: - priv->plat->est->enable = false; -stmmac_est_configure (priv, priv->ioaddr, priv->plat->est, - priv->plat->clk_ptp_rate); +if (priv->plat->est) { +mutex_lock (&priv->plat->est->lock); + priv->plat->est->enable = false; +stmmac_est_configure (priv, priv->ioaddr, priv->plat->est, + priv->plat->clk_ptp_rate); +mutex_unlock (&priv->plat->est->lock); + } priv->plat->fpe_cfg->enable = false; stmmac_fpe_configure(priv, priv->ioaddr,
drivers/net/ethernet/stmicro/stmmac/stmmac_xdp.c +6 -6
@@ -34,18 +34,18 @@ static int stmmac_xdp_enable_pool(struct stmmac_priv *priv, need_update =netif_running (priv->dev) &&stmmac_xdp_is_enabled (priv);if (need_update) { -stmmac_disable_rx_queue (priv, queue); -stmmac_disable_tx_queue (priv, queue);napi_disable (&ch->rx_napi);napi_disable (&ch->tx_napi); +stmmac_disable_rx_queue (priv, queue); +stmmac_disable_tx_queue (priv, queue); }set_bit (queue, priv->af_xdp_zc_qps);if (need_update) { -napi_enable (&ch->rxtx_napi);stmmac_enable_rx_queue (priv, queue);stmmac_enable_tx_queue (priv, queue); +napi_enable (&ch->rxtx_napi); err =stmmac_xsk_wakeup (priv->dev, queue,XDP_WAKEUP_RX );if (err)
@@ -72,10 +72,10 @@ static int stmmac_xdp_disable_pool(struct stmmac_priv *priv, u16 queue) need_update =netif_running (priv->dev) &&stmmac_xdp_is_enabled (priv);if (need_update) { +napi_disable (&ch->rxtx_napi);stmmac_disable_rx_queue (priv, queue);stmmac_disable_tx_queue (priv, queue);synchronize_rcu (); -napi_disable (&ch->rxtx_napi); }xsk_pool_dma_unmap (pool,STMMAC_RX_DMA_ATTR );
@@ -83,10 +83,10 @@ static int stmmac_xdp_disable_pool(struct stmmac_priv *priv, u16 queue)clear_bit (queue, priv->af_xdp_zc_qps);if (need_update) { -napi_enable (&ch->rx_napi); -napi_enable (&ch->tx_napi);stmmac_enable_rx_queue (priv, queue);stmmac_enable_tx_queue (priv, queue); +napi_enable (&ch->rx_napi); +napi_enable (&ch->tx_napi); }return 0 ;
drivers/net/usb/pegasus.c +2 -2
@@ -471,7 +471,7 @@ static int enable_net_traffic(struct net_device *dev, struct usb_device *usb)write_mii_word (pegasus,0 ,0x1b , &auxmode); } -return 0 ; +return ret; fail:netif_dbg (pegasus, drv, pegasus->net,"%s failed\n" , __func__);return ret;
@@ -860,7 +860,7 @@ static int pegasus_open(struct net_device *net)if (!pegasus->rx_skb) goto exit; - res =set_registers (pegasus, EthID,6 , net->dev_addr); +set_registers (pegasus, EthID,6 , net->dev_addr); usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb, usb_rcvbulkpipe(pegasus->usb, 1),
drivers/net/wireless/intel/iwlwifi/fw/pnvm.c +16 -9
@@ -37,6 +37,7 @@ static int iwl_pnvm_handle_section(struct iwl_trans *trans, const u8 *data,u32 sha1 =0 ;u16 mac_type =0 , rf_id =0 ;u8 *pnvm_data =NULL , *tmp; +bool hw_match = false;u32 size =0 ;int ret;
@@ -83,6 +84,9 @@ static int iwl_pnvm_handle_section(struct iwl_trans *trans, const u8 *data,break ; } +if (hw_match) +break ; + mac_type =le16_to_cpup ((__le16 *)data); rf_id =le16_to_cpup ((__le16 *)(data +sizeof (__le16)));
@@ -90,15 +94,9 @@ static int iwl_pnvm_handle_section(struct iwl_trans *trans, const u8 *data,"Got IWL_UCODE_TLV_HW_TYPE mac_type 0x%0x rf_id 0x%0x\n" , mac_type, rf_id); -if (mac_type !=CSR_HW_REV_TYPE (trans->hw_rev) || - rf_id !=CSR_HW_RFID_TYPE (trans->hw_rf_id)) { -IWL_DEBUG_FW (trans, -"HW mismatch, skipping PNVM section, mac_type 0x%0x, rf_id 0x%0x.\n" , -CSR_HW_REV_TYPE (trans->hw_rev), trans->hw_rf_id); - ret = -ENOENT ; - goto out; - } - +if (mac_type ==CSR_HW_REV_TYPE (trans->hw_rev) && + rf_id ==CSR_HW_RFID_TYPE (trans->hw_rf_id)) + hw_match = true;break ;case IWL_UCODE_TLV_SEC_RT : {struct iwl_pnvm_section *section = (void *)data;
@@ -149,6 +147,15 @@ static int iwl_pnvm_handle_section(struct iwl_trans *trans, const u8 *data, } done: +if (!hw_match) { +IWL_DEBUG_FW (trans, +"HW mismatch, skipping PNVM section (need mac_type 0x%x rf_id 0x%x)\n" , +CSR_HW_REV_TYPE (trans->hw_rev), +CSR_HW_RFID_TYPE (trans->hw_rf_id)); + ret = -ENOENT ; + goto out; + } +if (!size) {IWL_DEBUG_FW (trans,"Empty PNVM, skipping.\n" ); ret = -ENOENT ;
drivers/net/wireless/intel/iwlwifi/pcie/drv.c +69 -1
81 lines not on this page · raw message
drivers/opp/of.c +3 -2
@@ -985,8 +985,9 @@ static int _of_add_opp_table_v2(struct device *dev, struct opp_table *opp_table) } } -/* There should be one of more OPP defined */ -if (WARN_ON (!count)) { +/* There should be one or more OPPs defined */ +if (!count) { +dev_err (dev,"%s: no supported OPPs" , __func__); ret = -ENOENT ; goto remove_static_opp; }
drivers/platform/x86/Kconfig +3 -0
@@ -507,6 +507,7 @@ config THINKPAD_ACPI depends on RFKILL || RFKILL = n depends on ACPI_VIDEO || ACPI_VIDEO = n depends on BACKLIGHT_CLASS_DEVICE + depends on I2C select ACPI_PLATFORM_PROFILE select HWMON select NVRAM
@@ -701,6 +702,7 @@ config INTEL_HID_EVENT tristate "INTEL HID Event" depends on ACPI depends on INPUT + depends on I2C select INPUT_SPARSEKMAP help This driver provides support for the Intel HID Event hotkey interface.
@@ -752,6 +754,7 @@ config INTEL_VBTN tristate "INTEL VIRTUAL BUTTON" depends on ACPI depends on INPUT + depends on I2C select INPUT_SPARSEKMAP help This driver provides support for the Intel Virtual Button interface.
drivers/platform/x86/asus-nb-wmi.c +28 -0
@@ -41,6 +41,10 @@ static int wapf = -1;module_param (wapf, uint,0444 );MODULE_PARM_DESC (wapf,"WAPF value" ); +static int tablet_mode_sw =-1 ; +module_param (tablet_mode_sw, uint,0444 ); +MODULE_PARM_DESC (tablet_mode_sw,"Tablet mode detect: -1:auto 0:disable 1:kbd-dock 2:lid-flip" ); +static struct quirk_entry *quirks; static bool asus_q500a_i8042_filter(unsigned char data, unsigned char str,
@@ -458,6 +462,15 @@ static const struct dmi_system_id asus_quirks[] = { }, .driver_data = &quirk_asus_use_lid_flip_devid, }, + { + .callback = dmi_matched, + .ident = "ASUS TP200s / E205SA", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_PRODUCT_NAME, "E205SA"), + }, + .driver_data = &quirk_asus_use_lid_flip_devid, + }, {}, };
@@ -477,6 +490,21 @@ static void asus_nb_wmi_quirks(struct asus_wmi_driver *driver)else wapf = quirks->wapf; +switch (tablet_mode_sw) { +case 0 : + quirks->use_kbd_dock_devid = false; + quirks->use_lid_flip_devid = false; +break ; +case 1 : + quirks->use_kbd_dock_devid = true; + quirks->use_lid_flip_devid = false; +break ; +case 2 : + quirks->use_kbd_dock_devid = false; + quirks->use_lid_flip_devid = true; +break ; + } +if (quirks->i8042_filter) { ret =i8042_install_filter (quirks->i8042_filter);if (ret) {
drivers/platform/x86/dual_accel_detect.h new file +76 -0
76 lines not on this page · raw message
drivers/platform/x86/gigabyte-wmi.c +2 -0
@@ -140,6 +140,7 @@ static u8 gigabyte_wmi_detect_sensor_usability(struct wmi_device *wdev) }}static const struct dmi_system_id gigabyte_wmi_known_working_platforms[] = { +DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("B450M S2H V2" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("B550 AORUS ELITE" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("B550 AORUS ELITE V2" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("B550 GAMING X V2" ),
@@ -147,6 +148,7 @@ static const struct dmi_system_id gigabyte_wmi_known_working_platforms[] = {DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("B550M DS3H" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("Z390 I AORUS PRO WIFI-CF" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("X570 AORUS ELITE" ), +DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("X570 GAMING X" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("X570 I AORUS PRO WIFI" ), DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("X570 UD"), { }
drivers/platform/x86/intel-hid.c +6 -15
@@ -14,6 +14,7 @@#include <linux/module.h> #include <linux/platform_device.h> #include <linux/suspend.h> +#include "dual_accel_detect.h" /* When NOT in tablet mode, VGBS returns with the flag 0x40 */ #define TABLET_MODE_FLAG BIT(6)
@@ -121,6 +122,7 @@ struct intel_hid_priv {struct input_dev *array;struct input_dev *switches;bool wakeup_mode; +bool dual_accel; };#define HID_EVENT_FILTER_UUID "eeec56b3-4442-408f-a792-4edd4d758054"
@@ -450,22 +452,9 @@ static void notify_handler(acpi_handle handle, u32 event, void *context)* SW_TABLET_MODE report, in these cases we enable support when receiving * the first event instead of during driver setup. * -* Some 360 degree hinges (yoga) style 2-in-1 devices use 2 accelerometers -* to allow the OS to determine the angle between the display and the base -* of the device. On Windows these are read by a special HingeAngleService -* process which calls an ACPI DSM (Device Specific Method) on the -* ACPI KIOX010A device node for the sensor in the display, to let the -* firmware know if the 2-in-1 is in tablet- or laptop-mode so that it can -* disable the kbd and touchpad to avoid spurious input in tablet-mode. -* -* The linux kxcjk1013 driver calls the DSM for this once at probe time -* to ensure that the builtin kbd and touchpad work. On some devices this -* causes a "spurious" 0xcd event on the intel-hid ACPI dev. In this case -* there is not a functional tablet-mode switch, so we should not register -* the tablet-mode switch device. +* See dual_accel_detect.h for more info on the dual_accel check. */ -if (!priv->switches && (event ==0xcc || event ==0xcd ) && - !acpi_dev_present ("KIOX010A" ,NULL ,-1 )) { +if (!priv->switches && !priv->dual_accel && (event ==0xcc || event ==0xcd )) {dev_info (&device->dev,"switch event received, enable switches supports\n" ); err =intel_hid_switches_setup (device);if (err)
@@ -606,6 +595,8 @@ static int intel_hid_probe(struct platform_device *device)return -ENOMEM ;dev_set_drvdata (&device->dev, priv); + priv->dual_accel =dual_accel_detect (); + err =intel_hid_input_setup (device);if (err) {pr_err ("Failed to setup Intel HID hotkeys\n" );
drivers/platform/x86/intel-vbtn.c +15 -3
@@ -14,6 +14,7 @@#include <linux/module.h> #include <linux/platform_device.h> #include <linux/suspend.h> +#include "dual_accel_detect.h" /* Returned when NOT in tablet mode on some HP Stream x360 11 models */ #define VGBS_TABLET_MODE_FLAG_ALT 0x10
@@ -66,6 +67,7 @@ static const struct key_entry intel_vbtn_switchmap[] = {struct intel_vbtn_priv {struct input_dev *buttons_dev;struct input_dev *switches_dev; +bool dual_accel;bool has_buttons;bool has_switches;bool wakeup_mode;
@@ -160,6 +162,10 @@ static void notify_handler(acpi_handle handle, u32 event, void *context) input_dev = priv->buttons_dev; }else if ((ke =sparse_keymap_entry_from_scancode (priv->switches_dev, event))) {if (!priv->has_switches) { +/* See dual_accel_detect.h for more info */ +if (priv->dual_accel) +return ; +dev_info (&device->dev,"Registering Intel Virtual Switches input-dev after receiving a switch event\n" ); ret =input_register_device (priv->switches_dev);if (ret)
@@ -248,11 +254,15 @@ static const struct dmi_system_id dmi_switches_allow_list[] = { {}/* Array terminator */ }; -static bool intel_vbtn_has_switches (acpi_handle handle) +static bool intel_vbtn_has_switches (acpi_handle handle,bool dual_accel) {unsigned long long vgbs;acpi_status status; +/* See dual_accel_detect.h for more info */ +if (dual_accel) +return false; +if (!dmi_check_system (dmi_switches_allow_list))return false;
@@ -263,13 +273,14 @@ static bool intel_vbtn_has_switches(acpi_handle handle)static int intel_vbtn_probe (struct platform_device *device) {acpi_handle handle =ACPI_HANDLE (&device->dev); -bool has_buttons, has_switches; +bool dual_accel, has_buttons, has_switches;struct intel_vbtn_priv *priv;acpi_status status;int err; + dual_accel =dual_accel_detect (); has_buttons =acpi_has_method (handle,"VBDL" ); - has_switches =intel_vbtn_has_switches (handle); + has_switches =intel_vbtn_has_switches (handle, dual_accel);if (!has_buttons && !has_switches) {dev_warn (&device->dev,"failed to read Intel Virtual Button driver\n" );
@@ -281,6 +292,7 @@ static int intel_vbtn_probe(struct platform_device *device)return -ENOMEM ;dev_set_drvdata (&device->dev, priv); + priv->dual_accel = dual_accel; priv->has_buttons = has_buttons; priv->has_switches = has_switches;
drivers/platform/x86/thinkpad_acpi.c +2 -1
@@ -73,6 +73,7 @@#include <linux/uaccess.h> #include <acpi/battery.h> #include <acpi/video.h> +#include "dual_accel_detect.h" /* ThinkPad CMOS commands */ #define TP_CMOS_VOLUME_DOWN 0
@@ -3232,7 +3233,7 @@ static int hotkey_init_tablet_mode(void)* the laptop/tent/tablet mode to the EC. The bmc150 iio driver * does not support this, so skip the hotkey on these models. */ -if (has_tablet_mode && !acpi_dev_present ("BOSC0200" ,"1" ,-1 )) +if (has_tablet_mode && !dual_accel_detect ()) tp_features.hotkey_tablet =TP_HOTKEY_TABLET_USES_GMMS ; type ="GMMS" ; }else if (acpi_evalf (hkey_handle, &res,"MHKG" ,"qd" )) {
drivers/scsi/scsi_sysfs.c +6 -3
@@ -808,12 +808,15 @@ store_state_field(struct device *dev, struct device_attribute *attr, ret =scsi_device_set_state (sdev, state);/* * If the device state changes to SDEV_RUNNING, we need to -* rescan the device to revalidate it, and run the queue to -* avoid I/O hang. +* run the queue to avoid I/O hang, and rescan the device +* to revalidate it. Running the queue first is necessary +* because another thread may be waiting inside +* blk_mq_freeze_queue_wait() and because that call may be +* waiting for pending I/O to finish. */ if (ret ==0 && state ==SDEV_RUNNING ) { -scsi_rescan_device (dev);blk_mq_run_hw_queues (sdev->request_queue, true); +scsi_rescan_device (dev); }mutex_unlock (&sdev->state_mutex);
drivers/tty/vt/vt_ioctl.c +6 -4
@@ -246,6 +246,8 @@ int vt_waitactive(int n)* * XXX It should at least call into the driver, fbdev's definitely need to * restore their engine state. --BenH +* +* Called with the console lock held. */ static int vt_kdsetmode (struct vc_data *vc,unsigned long mode) {
@@ -262,7 +264,6 @@ static int vt_kdsetmode(struct vc_data *vc, unsigned long mode)return -EINVAL ; } -/* FIXME: this needs the console lock extending */ if (vc->vc_mode == mode)return 0 ;
@@ -271,12 +272,10 @@ static int vt_kdsetmode(struct vc_data *vc, unsigned long mode)return 0 ;/* explicitly blank/unblank the screen if switching modes */ -console_lock ();if (mode ==KD_TEXT )do_unblank_screen (1 );else do_blank_screen (1 ); -console_unlock ();return 0 ; }
@@ -378,7 +377,10 @@ static int vt_k_ioctl(struct tty_struct *tty, unsigned int cmd,if (!perm)return -EPERM ; -return vt_kdsetmode (vc, arg); +console_lock (); + ret =vt_kdsetmode (vc, arg); +console_unlock (); +return ret;case KDGETMODE :return put_user (vc->vc_mode, (int __user *)arg);
drivers/usb/dwc3/gadget.c +11 -12
@@ -940,19 +940,19 @@ static struct dwc3_trb *dwc3_ep_prev_trb(struct dwc3_ep *dep, u8 index)static u32 dwc3_calc_trbs_left (struct dwc3_ep *dep) { -struct dwc3_trb *tmp;u8 trbs_left;/* -* If enqueue & dequeue are equal than it is either full or empty. -* -* One way to know for sure is if the TRB right before us has HWO bit -* set or not. If it has, then we're definitely full and can't fit any -* more transfers in our ring. +* If the enqueue & dequeue are equal then the TRB ring is either full +* or empty. It's considered full when there are DWC3_TRB_NUM-1 of TRBs +* pending to be processed by the driver. */ if (dep->trb_enqueue == dep->trb_dequeue) { - tmp =dwc3_ep_prev_trb (dep, dep->trb_enqueue); -if (tmp->ctrl &DWC3_TRB_CTRL_HWO ) +/* +* If there is any request remained in the started_list at +* this point, that means there is no TRB available. +*/ +if (!list_empty (&dep->started_list))return 0 ;return DWC3_TRB_NUM -1 ;
@@ -2243,10 +2243,8 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) ret =wait_for_completion_timeout (&dwc->ep0_in_setup,msecs_to_jiffies (DWC3_PULL_UP_TIMEOUT )); -if (ret ==0 ) { -dev_err (dwc->dev,"timed out waiting for SETUP phase\n" ); -return -ETIMEDOUT ; - } +if (ret ==0 ) +dev_warn (dwc->dev,"timed out waiting for SETUP phase\n" ); }/*
@@ -2458,6 +2456,7 @@ static int __dwc3_gadget_start(struct dwc3 *dwc)/* begin to receive SETUP packets */ dwc->ep0state =EP0_SETUP_PHASE ; dwc->link_state =DWC3_LINK_STATE_SS_DIS ; + dwc->delayed_status = false;dwc3_ep0_out_start (dwc);dwc3_gadget_enable_irq (dwc);
drivers/usb/gadget/function/u_audio.c +2 -3
@@ -312,8 +312,6 @@ static inline void free_ep(struct uac_rtd_params *prm, struct usb_ep *ep)if (!prm->ep_enabled)return ; - prm->ep_enabled = false; - audio_dev = uac->audio_dev; params = &audio_dev->params;
@@ -331,11 +329,12 @@ static inline void free_ep(struct uac_rtd_params *prm, struct usb_ep *ep) } } + prm->ep_enabled = false; +if (usb_ep_disable (ep))dev_err (uac->card->dev,"%s:%d Error!\n" , __func__, __LINE__); } -int u_audio_start_capture (struct g_audio *audio_dev) {struct snd_uac_chip *uac = audio_dev->uac;
drivers/usb/host/xhci-pci-renesas.c +23 -12
@@ -207,7 +207,8 @@ static int renesas_check_rom_state(struct pci_dev *pdev)return 0 ;case RENESAS_ROM_STATUS_NO_RESULT :/* No result yet */ -return 0 ; +dev_dbg (&pdev->dev,"Unknown ROM status ...\n" ); +return -ENOENT ;case RENESAS_ROM_STATUS_ERROR :/* Error State */ default :/* All other states are marked as "Reserved states" */
@@ -224,14 +225,6 @@ static int renesas_fw_check_running(struct pci_dev *pdev)u8 fw_state;int err; -/* Check if device has ROM and loaded, if so skip everything */ - err =renesas_check_rom (pdev); -if (err) {/* we have rom */ - err =renesas_check_rom_state (pdev); -if (!err) -return err; - } -/* * Test if the device is actually needing the firmware. As most * BIOSes will initialize the device for us. If the device is
@@ -591,21 +584,39 @@ int renesas_xhci_check_request_fw(struct pci_dev *pdev, (struct xhci_driver_data *)id->driver_data;const char *fw_name = driver_data->firmware;const struct firmware *fw; +bool has_rom;int err; +/* Check if device has ROM and loaded, if so skip everything */ + has_rom =renesas_check_rom (pdev); +if (has_rom) { + err =renesas_check_rom_state (pdev); +if (!err) +return 0 ; +else if (err != -ENOENT ) + has_rom = false; + } + err =renesas_fw_check_running (pdev);/* Continue ahead, if the firmware is already running. */ if (err ==0 )return 0 ; +/* no firmware interface available */ if (err !=1 ) -return err; +return has_rom ?0 : err;pci_dev_get (pdev); - err =request_firmware (&fw, fw_name, &pdev->dev); + err =firmware_request_nowarn (&fw, fw_name, &pdev->dev);pci_dev_put (pdev);if (err) { -dev_err (&pdev->dev,"request_firmware failed: %d\n" , err); +if (has_rom) { +dev_info (&pdev->dev,"failed to load firmware %s, fallback to ROM\n" , + fw_name); +return 0 ; + } +dev_err (&pdev->dev,"failed to load firmware %s: %d\n" , + fw_name, err);return err; }
drivers/usb/serial/ch341.c +0 -1
@@ -851,7 +851,6 @@ static struct usb_serial_driver ch341_device = { .owner = THIS_MODULE, .name = "ch341-uart", }, - .bulk_in_size = 512, .id_table = id_table, .num_ports = 1, .open = ch341_open,
drivers/usb/serial/option.c +2 -0
@@ -2074,6 +2074,8 @@ static const struct usb_device_id option_ids[] = { .driver_info = RSVD(4) | RSVD(5) }, { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0105, 0xff), /* Fibocom NL678 series */ .driver_info = RSVD(6) }, + { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) }, /* Fibocom FG150 Diag */ + { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0, 0) }, /* Fibocom FG150 AT */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) }, /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */ { USB_DEVICE_INTERFACE_CLASS(0x2df3, 0x9d03, 0xff) }, /* LongSung M5710 */ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1404, 0xff) }, /* GosunCn GM500 RNDIS */
drivers/usb/typec/tcpm/tcpm.c +38 -43
241 lines not on this page · raw message
drivers/vhost/vringh.c +1 -1
@@ -359,7 +359,7 @@ __vringh_iov(struct vringh *vrh, u16 i, iov = wiov; else { iov = riov; -if (unlikely (wiov && wiov->i)) { +if (unlikely (wiov && wiov->used)) {vringh_bad ("Readable desc %p after writable" , &descs[i]); err = -EINVAL ;
drivers/virtio/virtio_pci_common.c +7 -0
@@ -576,6 +576,13 @@ static void virtio_pci_remove(struct pci_dev *pci_dev)struct virtio_pci_device *vp_dev =pci_get_drvdata (pci_dev);struct device *dev =get_device (&vp_dev->vdev.dev); +/* +* Device is marked broken on surprise removal so that virtio upper +* layers can abort any ongoing operation. +*/ +if (!pci_device_is_present (pci_dev)) +virtio_break_device (&vp_dev->vdev); +pci_disable_sriov (pci_dev);unregister_virtio_device (&vp_dev->vdev);
drivers/virtio/virtio_ring.c +4 -2
@@ -2268,7 +2268,7 @@ bool virtqueue_is_broken(struct virtqueue *_vq) {struct vring_virtqueue *vq =to_vvq (_vq); -return vq->broken; +return READ_ONCE (vq->broken); }EXPORT_SYMBOL_GPL (virtqueue_is_broken);
@@ -2283,7 +2283,9 @@ void virtio_break_device(struct virtio_device *dev)spin_lock (&dev->vqs_list_lock);list_for_each_entry (_vq, &dev->vqs, list) {struct vring_virtqueue *vq =to_vvq (_vq); - vq->broken = true; + +/* Pairs with READ_ONCE() in virtqueue_is_broken(). */ +WRITE_ONCE (vq->broken, true); }spin_unlock (&dev->vqs_list_lock); }
drivers/virtio/virtio_vdpa.c +3 -0
@@ -149,6 +149,9 @@ virtio_vdpa_setup_vq(struct virtio_device *vdev, unsigned int index,if (!name)return NULL ; +if (index >= vdpa->nvqs) +return ERR_PTR (-ENOENT ); +/* Queue shouldn't already be set up. */ if (ops->get_vq_ready (vdpa, index))return ERR_PTR (-ENOENT );
fs/btrfs/inode.c +1 -1
@@ -603,7 +603,7 @@ static noinline int compress_file_range(struct async_chunk *async_chunk)* inode has not been flagged as nocompress. This flag can * change at any time if we discover bad compression ratios. */ -if (nr_pages >1 &&inode_need_compress (BTRFS_I (inode), start, end)) { +if (inode_need_compress (BTRFS_I (inode), start, end)) {WARN_ON (pages); pages =kcalloc (nr_pages,sizeof (struct page *),GFP_NOFS );if (!pages) {
fs/btrfs/volumes.c +1 -1
@@ -2137,7 +2137,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,if (IS_ERR (device)) {if (PTR_ERR (device) == -ENOENT && -strcmp (device_path,"missing" ) ==0 ) + device_path &&strcmp (device_path,"missing" ) ==0 ) ret =BTRFS_ERROR_DEV_MISSING_NOT_FOUND ;else ret =PTR_ERR (device);
fs/ceph/caps.c +13 -8
@@ -1753,7 +1753,11 @@ int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask,struct ceph_cap_flush *ceph_alloc_cap_flush (void ) { -return kmem_cache_alloc (ceph_cap_flush_cachep,GFP_KERNEL ); +struct ceph_cap_flush *cf; + + cf =kmem_cache_alloc (ceph_cap_flush_cachep,GFP_KERNEL ); + cf->is_capsnap = false; +return cf; }void ceph_free_cap_flush (struct ceph_cap_flush *cf)
@@ -1788,7 +1792,7 @@ static bool __detach_cap_flush_from_mdsc(struct ceph_mds_client *mdsc, prev->wake = true; wake = false; } -list_del (&cf->g_list); +list_del_init (&cf->g_list);return wake; }
@@ -1803,7 +1807,7 @@ static bool __detach_cap_flush_from_ci(struct ceph_inode_info *ci, prev->wake = true; wake = false; } -list_del (&cf->i_list); +list_del_init (&cf->i_list);return wake; }
@@ -2423,7 +2427,7 @@ static void __kick_flushing_caps(struct ceph_mds_client *mdsc, ci->i_ceph_flags &= ~CEPH_I_KICK_FLUSH ;list_for_each_entry_reverse (cf, &ci->i_cap_flush_list, i_list) { -if (!cf->caps) { +if (cf->is_capsnap) { last_snap_flush = cf->tid;break ; }
@@ -2442,7 +2446,7 @@ static void __kick_flushing_caps(struct ceph_mds_client *mdsc, first_tid = cf->tid +1 ; -if (cf->caps) { +if (!cf->is_capsnap) {struct cap_msg_args arg; dout("kick_flushing_caps %p cap %p tid %llu %s\n",
@@ -3589,7 +3593,7 @@ static void handle_cap_flush_ack(struct inode *inode, u64 flush_tid, cleaned = cf->caps;/* Is this a capsnap? */ -if (cf->caps ==0 ) +if (cf->is_capsnap)continue ;if (cf->tid <= flush_tid) {
@@ -3662,8 +3666,9 @@ static void handle_cap_flush_ack(struct inode *inode, u64 flush_tid,while (!list_empty (&to_remove)) { cf =list_first_entry (&to_remove, struct ceph_cap_flush, i_list); -list_del (&cf->i_list); -ceph_free_cap_flush (cf); +list_del_init (&cf->i_list); +if (!cf->is_capsnap) +ceph_free_cap_flush (cf); }if (wake_ci)
fs/ceph/mds_client.c +4 -3
@@ -1621,7 +1621,7 @@ static int remove_session_caps_cb(struct inode *inode, struct ceph_cap *cap,spin_lock (&mdsc->cap_dirty_lock);list_for_each_entry (cf, &to_remove, i_list) -list_del (&cf->g_list); +list_del_init (&cf->g_list);if (!list_empty (&ci->i_dirty_item)) { pr_warn_ratelimited(
@@ -1673,8 +1673,9 @@ static int remove_session_caps_cb(struct inode *inode, struct ceph_cap *cap,struct ceph_cap_flush *cf; cf =list_first_entry (&to_remove, struct ceph_cap_flush, i_list); -list_del (&cf->i_list); -ceph_free_cap_flush (cf); +list_del_init (&cf->i_list); +if (!cf->is_capsnap) +ceph_free_cap_flush (cf); }wake_up_all (&ci->i_cap_wq);
fs/ceph/snap.c +3 -0
@@ -487,6 +487,9 @@ void ceph_queue_cap_snap(struct ceph_inode_info *ci)pr_err ("ENOMEM allocating ceph_cap_snap on %p\n" , inode);return ; } + capsnap->cap_flush.is_capsnap = true; +INIT_LIST_HEAD (&capsnap->cap_flush.i_list); +INIT_LIST_HEAD (&capsnap->cap_flush.g_list);spin_lock (&ci->i_ceph_lock); used =__ceph_caps_used (ci);
fs/ceph/super.h +2 -1
@@ -182,8 +182,9 @@ struct ceph_cap {struct ceph_cap_flush {u64 tid; -int caps;/* 0 means capsnap */ +int caps;bool wake;/* wake up flush waiters when finish ? */ +bool is_capsnap;/* true means capsnap */ struct list_head g_list;// global struct list_head i_list;// per inode };
fs/crypto/hooks.c +44 -0
47 lines not on this page · raw message
fs/ext4/symlink.c +11 -1
@@ -52,10 +52,20 @@ static const char *ext4_encrypted_get_link(struct dentry *dentry,return paddr; } +static int ext4_encrypted_symlink_getattr (struct user_namespace *mnt_userns, +const struct path *path, +struct kstat *stat,u32 request_mask, +unsigned int query_flags) +{ +ext4_getattr (mnt_userns, path, stat, request_mask, query_flags); + +return fscrypt_symlink_getattr (path, stat); +} +const struct inode_operations ext4_encrypted_symlink_inode_operations = { .get_link = ext4_encrypted_get_link, .setattr = ext4_setattr, - .getattr = ext4_getattr, + .getattr = ext4_encrypted_symlink_getattr, .listxattr = ext4_listxattr, };
fs/f2fs/namei.c +11 -1
@@ -1313,9 +1313,19 @@ static const char *f2fs_encrypted_get_link(struct dentry *dentry,return target; } +static int f2fs_encrypted_symlink_getattr (struct user_namespace *mnt_userns, +const struct path *path, +struct kstat *stat,u32 request_mask, +unsigned int query_flags) +{ +f2fs_getattr (mnt_userns, path, stat, request_mask, query_flags); + +return fscrypt_symlink_getattr (path, stat); +} +const struct inode_operations f2fs_encrypted_symlink_inode_operations = { .get_link = f2fs_encrypted_get_link, - .getattr = f2fs_getattr, + .getattr = f2fs_encrypted_symlink_getattr, .setattr = f2fs_setattr, .listxattr = f2fs_listxattr, };
fs/io_uring.c +5 -14
@@ -7105,16 +7105,6 @@ static void io_free_file_tables(struct io_file_table *table, unsigned nr_files) table->files =NULL ; } -static inline void io_rsrc_ref_lock (struct io_ring_ctx *ctx) -{ -spin_lock_bh (&ctx->rsrc_ref_lock); -} - -static inline void io_rsrc_ref_unlock (struct io_ring_ctx *ctx) -{ -spin_unlock_bh (&ctx->rsrc_ref_lock); -} -static void io_rsrc_node_destroy (struct io_rsrc_node *ref_node) {percpu_ref_exit (&ref_node->refs);
@@ -7131,9 +7121,9 @@ static void io_rsrc_node_switch(struct io_ring_ctx *ctx,struct io_rsrc_node *rsrc_node = ctx->rsrc_node; rsrc_node->rsrc_data = data_to_kill; -io_rsrc_ref_lock (ctx); +spin_lock_irq (&ctx->rsrc_ref_lock);list_add_tail (&rsrc_node->node, &ctx->rsrc_ref_list); -io_rsrc_ref_unlock (ctx); +spin_unlock_irq (&ctx->rsrc_ref_lock);atomic_inc (&data_to_kill->refs);percpu_ref_kill (&rsrc_node->refs);
@@ -7625,9 +7615,10 @@ static void io_rsrc_node_ref_zero(struct percpu_ref *ref) { struct io_rsrc_node *node = container_of(ref, struct io_rsrc_node, refs);struct io_ring_ctx *ctx = node->rsrc_data->ctx; +unsigned long flags;bool first_add = false; -io_rsrc_ref_lock (ctx); +spin_lock_irqsave (&ctx->rsrc_ref_lock, flags); node->done = true;while (!list_empty (&ctx->rsrc_ref_list)) {
@@ -7639,7 +7630,7 @@ static void io_rsrc_node_ref_zero(struct percpu_ref *ref)list_del (&node->node); first_add |=llist_add (&node->llist, &ctx->rsrc_put_llist); } -io_rsrc_ref_unlock (ctx); +spin_unlock_irqrestore (&ctx->rsrc_ref_lock, flags);if (first_add)mod_delayed_work (system_wq, &ctx->rsrc_put_work,HZ );
fs/overlayfs/export.c +1 -1
@@ -392,6 +392,7 @@ static struct dentry *ovl_lookup_real_one(struct dentry *connected,*/ take_dentry_name_snapshot (&name, real); this =lookup_one_len (name.name.name, connected, name.name.len); +release_dentry_name_snapshot (&name); err =PTR_ERR (this);if (IS_ERR (this)) { goto fail;
@@ -406,7 +407,6 @@ static struct dentry *ovl_lookup_real_one(struct dentry *connected, } out: -release_dentry_name_snapshot (&name);dput (parent);inode_unlock (dir);return this;
fs/pipe.c +16 -17
@@ -363,10 +363,9 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to)* _very_ unlikely case that the pipe was full, but we got * no data. */ -if (unlikely (was_full)) { +if (unlikely (was_full))wake_up_interruptible_sync_poll (&pipe->wr_wait,EPOLLOUT |EPOLLWRNORM ); -kill_fasync (&pipe->fasync_writers,SIGIO ,POLL_OUT ); - } +kill_fasync (&pipe->fasync_writers,SIGIO ,POLL_OUT );/* * But because we didn't read anything, at this point we can
@@ -385,12 +384,11 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to) wake_next_reader = false;__pipe_unlock (pipe); -if (was_full) { +if (was_full)wake_up_interruptible_sync_poll (&pipe->wr_wait,EPOLLOUT |EPOLLWRNORM ); -kill_fasync (&pipe->fasync_writers,SIGIO ,POLL_OUT ); - }if (wake_next_reader)wake_up_interruptible_sync_poll (&pipe->rd_wait,EPOLLIN |EPOLLRDNORM ); +kill_fasync (&pipe->fasync_writers,SIGIO ,POLL_OUT );if (ret >0 )file_accessed (filp);return ret;
@@ -444,9 +442,6 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from)#endif /* -* Epoll nonsensically wants a wakeup whether the pipe -* was already empty or not. -* * If it wasn't empty we try to merge new data into * the last buffer. *
@@ -455,9 +450,9 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from)* spanning multiple pages. */ head = pipe->head; - was_empty = true; + was_empty =pipe_empty (head, pipe->tail); chars = total_len & (PAGE_SIZE -1 ); -if (chars && !pipe_empty (head, pipe->tail)) { +if (chars && !was_empty) {unsigned int mask = pipe->ring_size -1 ;struct pipe_buffer *buf = &pipe->bufs[(head -1 ) & mask];int offset = buf->offset + buf->len;
@@ -568,10 +563,9 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from)* become empty while we dropped the lock. */ __pipe_unlock (pipe); -if (was_empty) { +if (was_empty)wake_up_interruptible_sync_poll (&pipe->rd_wait,EPOLLIN |EPOLLRDNORM ); -kill_fasync (&pipe->fasync_readers,SIGIO ,POLL_IN ); - } +kill_fasync (&pipe->fasync_readers,SIGIO ,POLL_IN );wait_event_interruptible_exclusive (pipe->wr_wait,pipe_writable (pipe));__pipe_lock (pipe); was_empty =pipe_empty (pipe->head, pipe->tail);
@@ -590,11 +584,13 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from)* This is particularly important for small writes, because of * how (for example) the GNU make jobserver uses small writes to * wake up pending jobs +* +* Epoll nonsensically wants a wakeup whether the pipe +* was already empty or not. */ -if (was_empty) { +if (was_empty || pipe->poll_usage)wake_up_interruptible_sync_poll (&pipe->rd_wait,EPOLLIN |EPOLLRDNORM ); -kill_fasync (&pipe->fasync_readers,SIGIO ,POLL_IN ); - } +kill_fasync (&pipe->fasync_readers,SIGIO ,POLL_IN );if (wake_next_writer)wake_up_interruptible_sync_poll (&pipe->wr_wait,EPOLLOUT |EPOLLWRNORM );if (ret >0 &&sb_start_write_trylock (file_inode (filp)->i_sb)) {
@@ -654,6 +650,9 @@ pipe_poll(struct file *filp, poll_table *wait)struct pipe_inode_info *pipe = filp->private_data;unsigned int head, tail; +/* Epoll has some historical nasty semantics, this enables them */ + pipe->poll_usage =1 ; +/* * Reading pipe state only -- no need for acquiring the semaphore. *
fs/ubifs/file.c +12 -1
@@ -1630,6 +1630,17 @@ static const char *ubifs_get_link(struct dentry *dentry,return fscrypt_get_symlink (inode, ui->data, ui->data_len, done); } +static int ubifs_symlink_getattr (struct user_namespace *mnt_userns, +const struct path *path,struct kstat *stat, +u32 request_mask,unsigned int query_flags) +{ +ubifs_getattr (mnt_userns, path, stat, request_mask, query_flags); + +if (IS_ENCRYPTED (d_inode (path->dentry))) +return fscrypt_symlink_getattr (path, stat); +return 0 ; +} +const struct address_space_operations ubifs_file_address_operations = { .readpage = ubifs_readpage, .writepage = ubifs_writepage,
@@ -1655,7 +1666,7 @@ const struct inode_operations ubifs_file_inode_operations = {const struct inode_operations ubifs_symlink_inode_operations = { .get_link = ubifs_get_link, .setattr = ubifs_setattr, - .getattr = ubifs_getattr, + .getattr = ubifs_symlink_getattr, .listxattr = ubifs_listxattr, .update_time = ubifs_update_time, };
include/linux/fscrypt.h +7 -0
@@ -253,6 +253,7 @@ int __fscrypt_encrypt_symlink(struct inode *inode, const char *target,const char *fscrypt_get_symlink (struct inode *inode,const void *caddr,unsigned int max_size,struct delayed_call *done); +int fscrypt_symlink_getattr (const struct path *path,struct kstat *stat);static inline void fscrypt_set_ops (struct super_block *sb,const struct fscrypt_operations *s_cop) {
@@ -583,6 +584,12 @@ static inline const char *fscrypt_get_symlink(struct inode *inode,return ERR_PTR (-EOPNOTSUPP ); } +static inline int fscrypt_symlink_getattr (const struct path *path, +struct kstat *stat) +{ +return -EOPNOTSUPP ; +} +static inline void fscrypt_set_ops (struct super_block *sb,const struct fscrypt_operations *s_cop) {
include/linux/netdevice.h +4 -0
@@ -4012,6 +4012,10 @@ int netdev_rx_handler_register(struct net_device *dev,void netdev_rx_handler_unregister (struct net_device *dev);bool dev_valid_name (const char *name); +static inline bool is_socket_ioctl_cmd (unsigned int cmd) +{ +return _IOC_TYPE (cmd) ==SOCK_IOC_TYPE ; +}int dev_ioctl (struct net *net,unsigned int cmd,struct ifreq *ifr,bool *need_copyout);int dev_ifconf (struct net *net,struct ifconf *,int );
include/linux/netfilter/ipset/ip_set.h +3 -0
@@ -196,6 +196,9 @@ struct ip_set_region {u32 elements;/* Number of elements vs timeout */ }; +/* Max range where every element is added/deleted in one step */ +#define IPSET_MAX_RANGE (1<<20) +/* The max revision number supported by any set type + 1 */ #define IPSET_REVISION_MAX 9
include/linux/once.h +2 -2
@@ -7,7 +7,7 @@bool __do_once_start (bool *done,unsigned long *flags);void __do_once_done (bool *done,struct static_key_true *once_key, -unsigned long *flags); +unsigned long *flags,struct module *mod);/* Call a function exactly once. The idea of DO_ONCE() is to perform * a function call such as initialization of random seeds, etc, only
@@ -46,7 +46,7 @@ void __do_once_done(bool *done, struct static_key_true *once_key,if (unlikely (___ret)) { \func (__VA_ARGS__); \__do_once_done (&___done, &___once_key, \ - &___flags); \ + &___flags,THIS_MODULE ); \ } \ } \ ___ret; \
include/linux/pipe_fs_i.h +2 -0
@@ -48,6 +48,7 @@ struct pipe_buffer {* @files: number of struct file referring this pipe (protected by ->i_lock) * @r_counter: reader counter * @w_counter: writer counter +* @poll_usage: is this pipe used for epoll, which has crazy wakeups? * @fasync_readers: reader side fasync * @fasync_writers: writer side fasync * @bufs: the circular array of pipe buffers
@@ -70,6 +71,7 @@ struct pipe_inode_info {unsigned int files;unsigned int r_counter;unsigned int w_counter; +unsigned int poll_usage;struct page *tmp_page;struct fasync_struct *fasync_readers;struct fasync_struct *fasync_writers;
include/linux/stmmac.h +1 -0
@@ -115,6 +115,7 @@ struct stmmac_axi {#define EST_GCL 1024struct stmmac_est { +struct mutex lock;int enable;u32 btr_offset[2 ];u32 btr[2 ];
kernel/audit_tree.c +1 -1
@@ -593,7 +593,6 @@ static void prune_tree_chunks(struct audit_tree *victim, bool tagged)spin_lock (&hash_lock); }spin_unlock (&hash_lock); -put_tree (victim); }/*
@@ -602,6 +601,7 @@ static void prune_tree_chunks(struct audit_tree *victim, bool tagged)static void prune_one (struct audit_tree *victim) {prune_tree_chunks (victim, false); +put_tree (victim); }/* trim the uncommitted chunks from tree */
kernel/bpf/verifier.c +6 -2
@@ -5148,8 +5148,6 @@ static int check_map_func_compatibility(struct bpf_verifier_env *env,case BPF_MAP_TYPE_RINGBUF :if (func_id != BPF_FUNC_ringbuf_output && func_id != BPF_FUNC_ringbuf_reserve && - func_id != BPF_FUNC_ringbuf_submit && - func_id != BPF_FUNC_ringbuf_discard && func_id != BPF_FUNC_ringbuf_query) goto error;break ;
@@ -5258,6 +5256,12 @@ static int check_map_func_compatibility(struct bpf_verifier_env *env,if (map->map_type !=BPF_MAP_TYPE_PERF_EVENT_ARRAY ) goto error;break ; +case BPF_FUNC_ringbuf_output: +case BPF_FUNC_ringbuf_reserve: +case BPF_FUNC_ringbuf_query: +if (map->map_type !=BPF_MAP_TYPE_RINGBUF ) + goto error; +break ;case BPF_FUNC_get_stackid:if (map->map_type !=BPF_MAP_TYPE_STACK_TRACE ) goto error;
kernel/cred.c +6 -6
@@ -286,13 +286,13 @@ struct cred *prepare_creds(void) new->security =NULL ;#endif -if (security_prepare_creds (new, old,GFP_KERNEL_ACCOUNT ) <0 ) - goto error; - new->ucounts =get_ucounts (new->ucounts);if (!new->ucounts) goto error; +if (security_prepare_creds (new, old,GFP_KERNEL_ACCOUNT ) <0 ) + goto error; +validate_creds (new);return new;
@@ -753,13 +753,13 @@ struct cred *prepare_kernel_cred(struct task_struct *daemon)#ifdef CONFIG_SECURITY new->security =NULL ;#endif -if (security_prepare_creds (new, old,GFP_KERNEL_ACCOUNT ) <0 ) - goto error; - new->ucounts =get_ucounts (new->ucounts);if (!new->ucounts) goto error; +if (security_prepare_creds (new, old,GFP_KERNEL_ACCOUNT ) <0 ) + goto error; +put_cred (old);validate_creds (new);return new;
kernel/sched/sched.h +3 -0
@@ -1977,6 +1977,9 @@ static inline struct task_struct *get_push_task(struct rq *rq)if (p->nr_cpus_allowed ==1 )return NULL ; +if (p->migration_disabled) +return NULL ; + rq->push_busy = true;return get_task_struct (p); }
lib/once.c +8 -3
@@ -3,10 +3,12 @@#include <linux/spinlock.h> #include <linux/once.h> #include <linux/random.h> +#include <linux/module.h> struct once_work {struct work_struct work;struct static_key_true *key; +struct module *module; };static void once_deferred (struct work_struct *w)
@@ -16,10 +18,11 @@ static void once_deferred(struct work_struct *w) work = container_of(w, struct once_work, work);BUG_ON (!static_key_enabled (work->key));static_branch_disable (work->key); +module_put (work->module);kfree (work); } -static void once_disable_jump (struct static_key_true *key)
Lines of this file are not shown. View the raw message.
net/netfilter/ipset/ip_set_hash_ipmark.c +9 -1
Lines of this file are not shown. View the raw message.
net/netfilter/ipset/ip_set_hash_ipport.c +3 -0
Lines of this file are not shown. View the raw message.
net/netfilter/ipset/ip_set_hash_ipportip.c +3 -0
Lines of this file are not shown. View the raw message.
net/netfilter/ipset/ip_set_hash_ipportnet.c +3 -0
Lines of this file are not shown. View the raw message.
net/netfilter/ipset/ip_set_hash_netiface.c +9 -1
Lines of this file are not shown. View the raw message.
net/netfilter/ipset/ip_set_hash_netnet.c +15 -1
Lines of this file are not shown. View the raw message.
net/netfilter/ipset/ip_set_hash_netport.c +10 -1
Lines of this file are not shown. View the raw message.
net/netfilter/ipset/ip_set_hash_netportnet.c +15 -1
Lines of this file are not shown. View the raw message.
net/netfilter/nf_conntrack_core.c +22 -49
71 lines not on this page · raw message
sound/soc/soc-component.c +27 -36
63 lines not on this page · raw message
tools/virtio/linux/spinlock.h new file +56 -0
56 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.