Linux 5.4.136
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.4.136 kernel.
All users of the 5.4 kernel series must upgrade.
The updated 5.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.4.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/arm64/tagged-address-abi.rst | 26 ++- Documentation/trace/histogram.rst | 2 Makefile | 2 arch/mips/include/asm/pgalloc.h | 10 - arch/nds32/mm/mmap.c | 2 arch/powerpc/kvm/book3s_hv.c | 2 arch/powerpc/kvm/book3s_hv_nested.c | 20 ++ arch/powerpc/kvm/book3s_rtas.c | 25 ++ arch/powerpc/kvm/powerpc.c | 4 arch/s390/boot/text_dma.S | 19 -- arch/s390/include/asm/ftrace.h | 1 arch/s390/kernel/ftrace.c | 2 arch/s390/kernel/mcount.S | 4 arch/s390/net/bpf_jit_comp.c | 2 drivers/block/rbd.c | 32 +-- drivers/firmware/efi/efi.c | 13 + drivers/firmware/efi/tpm.c | 8 drivers/gpu/drm/drm_ioctl.c | 3 drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c | 1 drivers/iio/accel/bma180.c | 75 +++++--- drivers/media/pci/ngene/ngene-core.c | 2 drivers/media/pci/ngene/ngene.h | 14 - drivers/net/dsa/mv88e6xxx/chip.c | 4 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 28 ++- drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 19 +- drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h | 3 drivers/net/ethernet/broadcom/genet/bcmgenet.c | 16 - drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c | 6 drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c | 2 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 18 +- drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c | 3 drivers/net/ethernet/google/gve/gve_main.c | 5 drivers/net/ethernet/hisilicon/hip04_eth.c | 6 drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 10 + drivers/net/ethernet/intel/e1000e/netdev.c | 1 drivers/net/ethernet/intel/fm10k/fm10k_pci.c | 1 drivers/net/ethernet/intel/iavf/iavf_main.c | 1 drivers/net/ethernet/intel/igb/igb_main.c | 15 + drivers/net/ethernet/intel/igc/igc.h | 2 drivers/net/ethernet/intel/igc/igc_main.c | 6 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 4 drivers/net/ethernet/realtek/r8169_main.c | 3 drivers/nvme/host/core.c | 5 drivers/nvme/host/pci.c | 5 drivers/pci/quirks.c | 4 drivers/pwm/pwm-sprd.c | 11 - drivers/regulator/hi6421-regulator.c | 30 +-- drivers/scsi/scsi_transport_iscsi.c | 90 +++------- drivers/spi/spi-cadence.c | 14 + drivers/spi/spi-imx.c | 37 ++-- drivers/spi/spi-mt65xx.c | 16 + drivers/spi/spi-stm32.c | 41 +++- drivers/target/target_core_sbc.c | 35 +--- drivers/usb/core/hub.c | 120 +++++++++----- drivers/usb/core/quirks.c | 4 drivers/usb/dwc2/gadget.c | 10 - drivers/usb/host/max3421-hcd.c | 44 +---- drivers/usb/host/xhci-hub.c | 3 drivers/usb/host/xhci-ring.c | 58 +++++- drivers/usb/host/xhci.h | 3 drivers/usb/renesas_usbhs/fifo.c | 7 drivers/usb/serial/cp210x.c | 5 drivers/usb/serial/option.c | 3 drivers/usb/storage/unusual_uas.h | 7 fs/afs/cmservice.c | 25 -- fs/btrfs/extent-tree.c | 3 fs/btrfs/inode.c | 2 fs/hugetlbfs/inode.c | 2 fs/proc/base.c | 2 fs/userfaultfd.c | 22 +- include/drm/drm_ioctl.h | 1 include/trace/events/afs.h | 67 +++++++ kernel/trace/ring_buffer.c | 28 ++- kernel/trace/trace.c | 4 kernel/trace/trace_events_hist.c | 22 +- net/caif/caif_socket.c | 3 net/decnet/af_decnet.c | 27 +-- net/ipv4/tcp_bpf.c | 2 net/ipv4/tcp_fastopen.c | 19 +- net/ipv6/ip6_output.c | 4 net/ipv6/route.c | 2 net/netrom/nr_timer.c | 20 +- net/sched/act_skbmod.c | 12 - net/sched/cls_api.c | 2 net/sched/cls_tcindex.c | 5 net/sctp/auth.c | 2 sound/isa/sb/sb16_csp.c | 4 sound/pci/hda/patch_hdmi.c | 1 sound/soc/codecs/rt5631.c | 2 sound/usb/mixer.c | 10 + sound/usb/quirks.c | 3 tools/bpf/bpftool/common.c | 5 tools/perf/builtin-inject.c | 8 tools/perf/builtin-script.c | 7 tools/perf/tests/event_update.c | 2 tools/perf/tests/topology.c | 1 tools/perf/util/data.c | 2 tools/perf/util/dso.c | 4 tools/perf/util/env.c | 1 tools/perf/util/lzma.c | 8 tools/perf/util/map.c | 2 tools/perf/util/probe-event.c | 4 tools/perf/util/probe-file.c | 4 tools/testing/selftests/net/icmp_redirect.sh | 5 tools/testing/selftests/vm/userfaultfd.c | 6 105 files changed, 848 insertions(+), 481 deletions(-)
Alain Volmat (1):
spi: stm32: fixes pm_runtime calls in probe/remove
Aleksandr Loktionov (1):
igb: Check if num of q_vectors is smaller than max before array access
Alexander Egorenkov (1):
s390/boot: fix use of expolines in the DMA code
Alexander Tsoy (1):
ALSA: usb-audio: Add registration quirk for JBL Quantum headsets
Anand Jain (1):
btrfs: check for missing device in btrfs_trim_fs
Axel Lin (2):
regulator: hi6421: Use correct variable type for regmap api val argument
regulator: hi6421: Fix getting wrong drvdata
Casey Chen (1):
nvme-pci: do not call nvme_dev_remove_admin from nvme_remove
Charles Baylis (1):
drm: Return -ENOTTY for non-drm ioctls
Christoph Hellwig (1):
nvme: set the PRACT bit when using Write Zeroes with T10 PI
Christophe JAILLET (7):
ixgbe: Fix an error handling path in 'ixgbe_probe()'
igc: Fix an error handling path in 'igc_probe()'
igb: Fix an error handling path in 'igb_probe()'
fm10k: Fix an error handling path in 'fm10k_probe()'
e1000e: Fix an error handling path in 'e1000_probe()'
iavf: Fix an error handling path in 'iavf_probe()'
gve: Fix an error handling path in 'gve_probe()'
Clark Wang (1):
spi: imx: add a check for speed_hz before calculating the clock
Colin Ian King (2):
liquidio: Fix unintentional sign extension issue on left shift of u16 s390/bpf: Perform r1 range checking before accessing jit->seen_reg[r1]
David Howells (1):
afs: Fix tracepoint string placement with built-in AFS
David Sterba (1):
btrfs: compression: don't try to compress if we don't have enough pages
Dmitry Bogdanov (1):
scsi: target: Fix protect handling in WRITE SAME(32)
Doug Berger (1):
net: bcmgenet: ensure EXT_ENERGY_DET_MASK is clear
Eric Dumazet (1):
net/tcp_fastopen: fix data races around tfo_active_disable_stamp
Evan Quan (1):
PCI: Mark AMD Navi14 GPU ATS as broken
Greg Kroah-Hartman (2):
nds32: fix up stack guard gap
Linux 5.4.136
Gustavo A. R. Silva (1):
media: ngene: Fix out-of-bounds bug in ngene_command_config_free_buf()
Hangbin Liu (2):
selftests: icmp_redirect: remove from checking for IPv6 route get
selftests: icmp_redirect: IPv6 PMTU info should be cleared after redirect
Haoran Luo (1):
tracing: Fix bug in rb_per_cpu_empty() that might cause deadloop.
Huang Pei (1):
Revert "MIPS: add PMD table accounting into MIPS'pmd_alloc_one"
Ian Ray (1):
USB: serial: cp210x: fix comments for GE CS1000
Ilya Dryomov (2):
rbd: don't hold lock_rwsem while running_list is being drained
rbd: always kick acquire on "acquired" and "released" notifications
Jedrzej Jagielski (1):
igb: Fix position of assignment to *ring
Jian Shen (1):
net: hns3: fix rx VLAN offload state inconsistent issue
John Fastabend (1):
bpf, sockmap, tcp: sk_prot needs inuse_idx set for proc stats
John Keeping (1):
USB: serial: cp210x: add ID for CEL EM3588 USB ZigBee stick
Julian Sikorski (1):
USB: usb-storage: Add LaCie Rugged USB3-FW to IGNORE_UAS
Linus Walleij (1):
iio: accel: bma180: Use explicit member assignment
Marc Zyngier (1):
firmware/efi: Tell memblock about EFI iomem reservations
Marcelo Henrique Cerri (1):
proc: Avoid mixing integer types in mem_rw()
Marco De Marco (1):
USB: serial: option: add support for u-blox LARA-R6 family
Marek Behún (1):
net: dsa: mv88e6xxx: use correct .stats_set_histogram() on Topaz
Marek Vasut (1):
spi: cadence: Correct initialisation of runtime PM again
Mark Tomlinson (1):
usb: max-3421: Prevent corruption of freed memory
Markus Boehme (1):
ixgbe: Fix packet corruption due to missing DMA sync
Mathias Nyman (4):
xhci: Fix lost USB 2 remote wake
usb: hub: Disable USB 3 device initiated lpm if exit latency is too high
usb: hub: Fix link power management max exit latency (MEL) calculations
xhci: add xhci_get_virt_ep() helper
Maxim Schwalm (1):
ASoC: rt5631: Fix regcache sync errors on resume
Maxime Ripard (1):
drm/panel: raspberrypi-touchscreen: Prevent double-free
Michael Chan (2):
bnxt_en: Refresh RoCE capabilities in bnxt_ulp_probe()
bnxt_en: Add missing check for BNXT_STATE_ABORT_ERR in bnxt_fw_rset_task()
Michal Suchanek (1):
efi/tpm: Differentiate missing and invalid final event log table.
Mike Christie (1):
scsi: iscsi: Fix iface sysfs attr detection
Mike Kravetz (1):
hugetlbfs: fix mount mode command line processing
Minas Harutyunyan (1):
usb: dwc2: gadget: Fix sending zero length packet in DDMA mode.
Nguyen Dinh Phi (1):
netrom: Decrease sock refcount when sock timers expire
Nicholas Piggin (4):
KVM: PPC: Book3S: Fix CONFIG_TRANSACTIONAL_MEM=n crash
KVM: PPC: Fix kvm_arch_vcpu_ioctl vcpu_load leak
KVM: PPC: Book3S: Fix H_RTAS rets buffer overflow
KVM: PPC: Book3S HV Nested: Sanitise H_ENTER_NESTED TM state
Nicolas Dichtel (1):
ipv6: fix 'disable_policy' for fwd packets
Paolo Abeni (1):
ipv6: fix another slab-out-of-bounds in fib6_nh_flush_exceptions
Pavel Skripkin (1):
net: sched: fix memory leak in tcindex_partial_destroy_work
Peilin Ye (1):
net/sched: act_skbmod: Skip non-Ethernet packets
Peter Collingbourne (2):
selftest: use mmap instead of posix_memalign to allocate memory
userfaultfd: do not untag user pointers
Peter Hess (1):
spi: mediatek: fix fifo rx mode
Peter Ujfalusi (1):
spi: stm32: Use dma_request_chan() instead dma_request_slave_channel()
Randy Dunlap (1):
net: hisilicon: rename CACHE_LINE_MASK to avoid redefinition
Riccardo Mancini (11):
perf map: Fix dso->nsinfo refcounting
perf probe: Fix dso->nsinfo refcounting
perf env: Fix sibling_dies memory leak
perf test session_topology: Delete session->evlist perf test event_update: Fix memory leak of evlist
perf dso: Fix memory leak in dso__new_map()
perf script: Fix memory 'threads' and 'cpus' leaks on exit perf lzma: Close lzma stream on exit
perf probe-file: Delete namelist in del_events() on the error path perf data: Close all files in close_dir()
perf inject: Close inject.output on exit
Sasha Neftin (1):
igc: Prefer to use the pci_release_mem_regions method
Sayanta Pattanayak (1):
r8169: Avoid duplicate sysfs entry creation error
Shahjada Abul Husain (1):
cxgb4: fix IRQ free race during driver unload
Somnath Kotur (1):
bnxt_en: Check abort error state in bnxt_half_open_nic()
Stephan Gerhold (1):
iio: accel: bma180: Fix BMA25x bandwidth register values
Steven Rostedt (VMware) (1):
tracing/histogram: Rename "cpu" to "common_cpu"
Takashi Iwai (3):
ALSA: usb-audio: Add missing proc text entry for BESPOKEN type
ALSA: sb: Fix potential ABBA deadlock in CSP driver
ALSA: hdmi: Expose all pins on MSI MS-7C94 board
Tobias Klauser (1):
bpftool: Check malloc return value in mount_bpffs_for_pin
Tom Rix (1):
igc: change default return of igc_read_phy_reg()
Uwe Kleine-König (1):
pwm: sprd: Ensure configuring period and duty_cycle isn't wrongly skipped
Vasily Gorbik (1):
s390/ftrace: fix ftrace_update_ftrace_func implementation
Vasundhara Volam (1):
bnxt_en: Improve bnxt_ulp_stop()/bnxt_ulp_start() call sequence.
Vincent Palatin (1):
Revert "USB: quirks: ignore remote wake-up on Fibocom L850-GL LTE modem"
Vinicius Costa Gomes (2):
igc: Fix use-after-free error during reset
igb: Fix use-after-free error during reset
Xin Long (1):
sctp: update active_key for asoc when old key is being replaced
Yajun Deng (2):
net: decnet: Fix sleeping inside in af_decnet
net: sched: cls_api: Fix the the wrong parameter
Yoshihiro Shimoda (1):
usb: renesas_usbhs: Fix superfluous irqs happen after usb_pkt_pop()
Zhihao Cheng (1):
nvme-pci: don't WARN_ON in nvme_reset_work if ctrl.state is not RESETTING
Ziyang Xuan (1):
net: fix uninit-value in caif_seqpkt_sendmsg
Greg Kroah-Hartman
maintainerDocumentation/arm64/tagged-address-abi.rst +18 -8
@@ -45,14 +45,24 @@ how the user addresses are used by the kernel: 1. User addresses not accessed by the kernel but used for address space management (e.g. ``mprotect()``, ``madvise()``). The use of valid - tagged pointers in this context is allowed with the exception of - ``brk()``, ``mmap()`` and the ``new_address`` argument to - ``mremap()`` as these have the potential to alias with existing - user addresses. - - NOTE: This behaviour changed in v5.6 and so some earlier kernels may - incorrectly accept valid tagged pointers for the ``brk()``, - ``mmap()`` and ``mremap()`` system calls. + tagged pointers in this context is allowed with these exceptions: + + - ``brk()``, ``mmap()`` and the ``new_address`` argument to + ``mremap()`` as these have the potential to alias with existing + user addresses. + + NOTE: This behaviour changed in v5.6 and so some earlier kernels may + incorrectly accept valid tagged pointers for the ``brk()``, + ``mmap()`` and ``mremap()`` system calls. + + - The ``range.start``, ``start`` and ``dst`` arguments to the + ``UFFDIO_*`` ``ioctl()``s used on a file descriptor obtained from + ``userfaultfd()``, as fault addresses subsequently obtained by reading + the file descriptor will be untagged, which may otherwise confuse + tag-unaware programs. + + NOTE: This behaviour changed in v5.14 and so some earlier kernels may + incorrectly accept valid tagged pointers for this system call. 2. User addresses accessed by the kernel (e.g. ``write()``). This ABI relaxation is disabled by default and the application thread needs to
Documentation/trace/histogram.rst +1 -1
@@ -191,7 +191,7 @@ Documentation written by Tom Zanussi with the event, in nanoseconds. May be modified by .usecs to have timestamps interpreted as microseconds. - cpu int the cpu on which the event occurred. + common_cpu int the cpu on which the event occurred. ====================== ==== ======================================= Extended error information
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 135 +SUBLEVEL = 136 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/mips/include/asm/pgalloc.h +3 -7
@@ -62,15 +62,11 @@ do { \static inline pmd_t *pmd_alloc_one (struct mm_struct *mm,unsigned long address) { -pmd_t *pmd =NULL ; -struct page *pg; +pmd_t *pmd; - pg =alloc_pages (GFP_KERNEL | __GFP_ACCOUNT,PMD_ORDER ); -if (pg) { -pgtable_pmd_page_ctor (pg); - pmd = (pmd_t *)page_address (pg); + pmd = (pmd_t *)__get_free_pages (GFP_KERNEL ,PMD_ORDER ); +if (pmd)pmd_init ((unsigned long )pmd, (unsigned long )invalid_pte_table); - }return pmd; }
arch/nds32/mm/mmap.c +1 -1
@@ -59,7 +59,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
arch/powerpc/kvm/book3s_hv.c +2 -0
@@ -2306,8 +2306,10 @@ static struct kvm_vcpu *kvmppc_core_vcpu_create_hv(struct kvm *kvm,HFSCR_DSCR |HFSCR_VECVSX |HFSCR_FP ;if (cpu_has_feature (CPU_FTR_HVMODE )) { vcpu->arch.hfscr &=mfspr (SPRN_HFSCR ); +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM if (cpu_has_feature (CPU_FTR_P9_TM_HV_ASSIST )) vcpu->arch.hfscr |=HFSCR_TM ; +#endif }if (cpu_has_feature (CPU_FTR_TM_COMP )) vcpu->arch.hfscr |=HFSCR_TM ;
arch/powerpc/kvm/book3s_hv_nested.c +20 -0
@@ -232,6 +232,9 @@ long kvmhv_enter_nested_guest(struct kvm_vcpu *vcpu)if (vcpu->kvm->arch.l1_ptcr ==0 )return H_NOT_AVAILABLE ; +if (MSR_TM_TRANSACTIONAL (vcpu->arch.shregs.msr)) +return H_BAD_MODE ; +/* copy parameters in */ hv_ptr =kvmppc_get_gpr (vcpu,4 ); err = kvm_vcpu_read_guest(vcpu, hv_ptr, &l2_hv,
@@ -253,6 +256,23 @@ long kvmhv_enter_nested_guest(struct kvm_vcpu *vcpu)if (l2_hv.vcpu_token >=NR_CPUS )return H_PARAMETER ; +/* +* L1 must have set up a suspended state to enter the L2 in a +* transactional state, and only in that case. These have to be +* filtered out here to prevent causing a TM Bad Thing in the +* host HRFID. We could synthesize a TM Bad Thing back to the L1 +* here but there doesn't seem like much point. +*/ +if (MSR_TM_SUSPENDED (vcpu->arch.shregs.msr)) { +if (!MSR_TM_ACTIVE (l2_regs.msr)) +return H_BAD_MODE ; + }else { +if (l2_regs.msr &MSR_TS_MASK ) +return H_BAD_MODE ; +if (WARN_ON_ONCE (vcpu->arch.shregs.msr &MSR_TS_MASK )) +return H_BAD_MODE ; + } +/* translate lpid */ l2 =kvmhv_get_nested (vcpu->kvm, l2_hv.lpid, true);if (!l2)
arch/powerpc/kvm/book3s_rtas.c +22 -3
@@ -240,6 +240,17 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)* value so we can restore it on the way out. */ orig_rets = args.rets; +if (be32_to_cpu (args.nargs) >=ARRAY_SIZE (args.args)) { +/* +* Don't overflow our args array: ensure there is room for +* at least rets[0] (even if the call specifies 0 nret). +* +* Each handler must then check for the correct nargs and nret +* values, but they may always return failure in rets[0]. +*/ + rc = -EINVAL ; + goto fail; + } args.rets = &args.args[be32_to_cpu (args.nargs)];mutex_lock (&vcpu->kvm->arch.rtas_token_lock);
@@ -267,9 +278,17 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu) fail:/* * We only get here if the guest has called RTAS with a bogus -* args pointer. That means we can't get to the args, and so we -* can't fail the RTAS call. So fail right out to userspace, -* which should kill the guest. +* args pointer or nargs/nret values that would overflow the +* array. That means we can't get to the args, and so we can't +* fail the RTAS call. So fail right out to userspace, which +* should kill the guest. +* +* SLOF should actually pass the hcall return value from the +* rtas handler call in r3, so enter_rtas could be modified to +* return a failure indication in r3 and we could return such +* errors to the guest rather than failing to host userspace. +* However old guests that don't test for failure could then +* continue silently after errors, so for now we won't do this. */ return rc; }
arch/powerpc/kvm/powerpc.c +2 -2
@@ -2035,9 +2035,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp, {struct kvm_enable_cap cap; r = -EFAULT ; -vcpu_load (vcpu);if (copy_from_user (&cap, argp,sizeof (cap))) goto out; +vcpu_load (vcpu); r =kvm_vcpu_ioctl_enable_cap (vcpu, &cap);vcpu_put (vcpu);break ;
@@ -2061,9 +2061,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,case KVM_DIRTY_TLB : {struct kvm_dirty_tlb dirty; r = -EFAULT ; -vcpu_load (vcpu);if (copy_from_user (&dirty, argp,sizeof (dirty))) goto out; +vcpu_load (vcpu); r =kvm_vcpu_ioctl_dirty_tlb (vcpu, &dirty);vcpu_put (vcpu);break ;
arch/s390/boot/text_dma.S +4 -15
@@ -9,16 +9,6 @@ #include <asm/errno.h> #include <asm/sigp.h> -#ifdef CC_USING_EXPOLINE - .pushsection .dma.text.__s390_indirect_jump_r14,"axG" -__dma__s390_indirect_jump_r14: - larl %r1,0f - ex 0,0(%r1) - j . -0: br %r14 - .popsection -#endif - .section .dma.text,"ax" /* * Simplified version of expoline thunk. The normal thunks can not be used here,
@@ -27,11 +17,10 @@ __dma__s390_indirect_jump_r14: * affects a few functions that are not performance-relevant. */ .macro BR_EX_DMA_r14 -#ifdef CC_USING_EXPOLINE - jg __dma__s390_indirect_jump_r14 -#else - br %r14 -#endif + larl %r1,0f + ex 0,0(%r1) + j . +0: br %r14 .endm /*
arch/s390/include/asm/ftrace.h +1 -0
@@ -27,6 +27,7 @@ void ftrace_caller(void);extern char ftrace_graph_caller_end;extern unsigned long ftrace_plt; +extern void *ftrace_func;struct dyn_arch_ftrace { };
arch/s390/kernel/ftrace.c +2 -0
@@ -57,6 +57,7 @@* > brasl %r0,ftrace_caller # offset 0 */ +void *ftrace_func__read_mostly = ftrace_stub;unsigned long ftrace_plt;static inline void ftrace_generate_orig_insn (struct ftrace_insn *insn)
@@ -166,6 +167,7 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)int ftrace_update_ftrace_func (ftrace_func_t func) { + ftrace_func = func;return 0 ; }
arch/s390/kernel/mcount.S +2 -2
@@ -61,13 +61,13 @@ ENTRY(ftrace_caller) #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES aghik %r2,%r0,-MCOUNT_INSN_SIZE lgrl %r4,function_trace_op - lgrl %r1,ftrace_trace_function + lgrl %r1,ftrace_func #else lgr %r2,%r0 aghi %r2,-MCOUNT_INSN_SIZE larl %r4,function_trace_op lg %r4,0(%r4) - larl %r1,ftrace_trace_function + larl %r1,ftrace_func lg %r1,0(%r1) #endif lgr %r3,%r14
arch/s390/net/bpf_jit_comp.c +1 -1
@@ -114,7 +114,7 @@ static inline void reg_set_seen(struct bpf_jit *jit, u32 b1) {u32 r1 = reg2hex[b1]; -if (!jit->seen_reg[r1] && r1 >=6 && r1 <=15 ) +if (r1 >=6 && r1 <=15 && !jit->seen_reg[r1]) jit->seen_reg[r1] =1 ; }
drivers/block/rbd.c +12 -20
@@ -4239,8 +4239,6 @@ static void rbd_acquire_lock(struct work_struct *work)static bool rbd_quiesce_lock (struct rbd_device *rbd_dev) { -bool need_wait; -dout ("%s rbd_dev %p\n" , __func__, rbd_dev);lockdep_assert_held_write (&rbd_dev->lock_rwsem);
@@ -4252,11 +4250,11 @@ static bool rbd_quiesce_lock(struct rbd_device *rbd_dev)*/ rbd_dev->lock_state =RBD_LOCK_STATE_RELEASING ;rbd_assert (!completion_done (&rbd_dev->releasing_wait)); - need_wait = !list_empty (&rbd_dev->running_list); -downgrade_write (&rbd_dev->lock_rwsem); -if (need_wait) -wait_for_completion (&rbd_dev->releasing_wait); -up_read (&rbd_dev->lock_rwsem); +if (list_empty (&rbd_dev->running_list)) +return true; + +up_write (&rbd_dev->lock_rwsem); +wait_for_completion (&rbd_dev->releasing_wait);down_write (&rbd_dev->lock_rwsem);if (rbd_dev->lock_state !=RBD_LOCK_STATE_RELEASING )
@@ -4342,15 +4340,11 @@ static void rbd_handle_acquired_lock(struct rbd_device *rbd_dev, u8 struct_v,if (!rbd_cid_equal (&cid, &rbd_empty_cid)) {down_write (&rbd_dev->lock_rwsem);if (rbd_cid_equal (&cid, &rbd_dev->owner_cid)) { -/* -* we already know that the remote client is -* the owner -*/ -up_write (&rbd_dev->lock_rwsem); -return ; +dout ("%s rbd_dev %p cid %llu-%llu == owner_cid\n" , + __func__, rbd_dev, cid.gid, cid.handle); + }else { +rbd_set_owner_cid (rbd_dev, &cid); } - -rbd_set_owner_cid (rbd_dev, &cid);downgrade_write (&rbd_dev->lock_rwsem); }else {down_read (&rbd_dev->lock_rwsem);
@@ -4375,14 +4369,12 @@ static void rbd_handle_released_lock(struct rbd_device *rbd_dev, u8 struct_v,if (!rbd_cid_equal (&cid, &rbd_empty_cid)) {down_write (&rbd_dev->lock_rwsem);if (!rbd_cid_equal (&cid, &rbd_dev->owner_cid)) { -dout ("%s rbd_dev %p unexpected owner, cid %llu-%llu != owner_cid %llu-%llu\n" , +dout ("%s rbd_dev %p cid %llu-%llu != owner_cid %llu-%llu\n" , __func__, rbd_dev, cid.gid, cid.handle, rbd_dev->owner_cid.gid, rbd_dev->owner_cid.handle); -up_write (&rbd_dev->lock_rwsem); -return ; + }else { +rbd_set_owner_cid (rbd_dev, &rbd_empty_cid); } - -rbd_set_owner_cid (rbd_dev, &rbd_empty_cid);downgrade_write (&rbd_dev->lock_rwsem); }else {down_read (&rbd_dev->lock_rwsem);
drivers/firmware/efi/efi.c +12 -1
@@ -975,6 +975,7 @@ static int __init efi_memreserve_map_root(void)static int efi_mem_reserve_iomem (phys_addr_t addr,u64 size) {struct resource *res, *parent; +int ret; res =kzalloc (sizeof (struct resource ),GFP_ATOMIC );if (!res)
@@ -987,7 +988,17 @@ static int efi_mem_reserve_iomem(phys_addr_t addr, u64 size)/* we expect a conflict with a 'System RAM' region */ parent =request_resource_conflict (&iomem_resource, res); -return parent ?request_resource (parent, res) :0 ; + ret = parent ?request_resource (parent, res) :0 ; + +/* +* Given that efi_mem_reserve_iomem() can be called at any +* time, only call memblock_reserve() if the architecture +* keeps the infrastructure around. +*/ +if (IS_ENABLED (CONFIG_ARCH_KEEP_MEMBLOCK ) && !ret) +memblock_reserve (addr, size); + +return ret; }int __ref efi_mem_reserve_persistent (phys_addr_t addr,u64 size)
drivers/firmware/efi/tpm.c +5 -3
@@ -62,9 +62,11 @@ int __init efi_tpm_eventlog_init(void) tbl_size =sizeof (*log_tbl) + log_tbl->size;memblock_reserve (efi.tpm_log, tbl_size); -if (efi.tpm_final_log ==EFI_INVALID_TABLE_ADDR || - log_tbl->version !=EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 ) { -pr_warn (FW_BUG "TPM Final Events table missing or invalid\n" ); +if (efi.tpm_final_log ==EFI_INVALID_TABLE_ADDR ) { +pr_info ("TPM Final Events table not present\n" ); + goto out; + }else if (log_tbl->version !=EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 ) { +pr_warn (FW_BUG "TPM Final Events table invalid\n" ); goto out; }
drivers/gpu/drm/drm_ioctl.c +3 -0
@@ -826,6 +826,9 @@ long drm_ioctl(struct file *filp,if (drm_dev_is_unplugged (dev))return -ENODEV ; +if (DRM_IOCTL_TYPE (cmd) !=DRM_IOCTL_BASE ) +return -ENOTTY ; + is_driver_ioctl = nr >=DRM_COMMAND_BASE && nr <DRM_COMMAND_END ;if (is_driver_ioctl) {
drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c +0 -1
@@ -453,7 +453,6 @@ static int rpi_touchscreen_remove(struct i2c_client *i2c)drm_panel_remove (&ts->base);mipi_dsi_device_unregister (ts->dsi); -kfree (ts->dsi);return 0 ; }
drivers/iio/accel/bma180.c +49 -26
101 lines not on this page · raw message
drivers/media/pci/ngene/ngene-core.c +1 -1
@@ -385,7 +385,7 @@ static int ngene_command_config_free_buf(struct ngene *dev, u8 *config) com.cmd.hdr.Opcode =CMD_CONFIGURE_FREE_BUFFER ; com.cmd.hdr.Length =6 ; -memcpy (&com.cmd.ConfigureBuffers.config, config,6 ); +memcpy (&com.cmd.ConfigureFreeBuffers.config, config,6 ); com.in_len =6 ; com.out_len =0 ;
drivers/media/pci/ngene/ngene.h +8 -6
@@ -407,12 +407,14 @@ enum _BUFFER_CONFIGS {struct FW_CONFIGURE_FREE_BUFFERS {struct FW_HEADER hdr; -u8 UVI1_BufferLength; -u8 UVI2_BufferLength; -u8 TVO_BufferLength; -u8 AUD1_BufferLength; -u8 AUD2_BufferLength; -u8 TVA_BufferLength; +struct { +u8 UVI1_BufferLength; +u8 UVI2_BufferLength; +u8 TVO_BufferLength; +u8 AUD1_BufferLength; +u8 AUD2_BufferLength; +u8 TVA_BufferLength; + } __packed config; } __attribute__ ((__packed__ ));struct FW_CONFIGURE_UART {
drivers/net/dsa/mv88e6xxx/chip.c +2 -2
@@ -3192,7 +3192,7 @@ static const struct mv88e6xxx_ops mv88e6141_ops = { .port_set_cmode = mv88e6341_port_set_cmode, .port_setup_message_port = mv88e6xxx_setup_message_port, .stats_snapshot = mv88e6390_g1_stats_snapshot, - .stats_set_histogram = mv88e6095_g1_stats_set_histogram, + .stats_set_histogram = mv88e6390_g1_stats_set_histogram, .stats_get_sset_count = mv88e6320_stats_get_sset_count, .stats_get_strings = mv88e6320_stats_get_strings, .stats_get_stats = mv88e6390_stats_get_stats,
@@ -3907,7 +3907,7 @@ static const struct mv88e6xxx_ops mv88e6341_ops = { .port_set_cmode = mv88e6341_port_set_cmode, .port_setup_message_port = mv88e6xxx_setup_message_port, .stats_snapshot = mv88e6390_g1_stats_snapshot, - .stats_set_histogram = mv88e6095_g1_stats_set_histogram, + .stats_set_histogram = mv88e6390_g1_stats_set_histogram, .stats_get_sset_count = mv88e6320_stats_get_sset_count, .stats_get_strings = mv88e6320_stats_get_strings, .stats_get_stats = mv88e6390_stats_get_stats,
drivers/net/ethernet/broadcom/bnxt/bnxt.c +20 -8
@@ -9239,6 +9239,12 @@ int bnxt_half_open_nic(struct bnxt *bp) {int rc =0 ; +if (test_bit (BNXT_STATE_ABORT_ERR , &bp->state)) { +netdev_err (bp->dev,"A previous firmware reset has not completed, aborting half open\n" ); + rc = -ENODEV ; + goto half_open_err; + } + rc =bnxt_alloc_mem (bp, false);if (rc) {netdev_err (bp->dev,"bnxt_alloc_mem err: %x\n" , rc);
@@ -9987,12 +9993,15 @@ static void bnxt_reset_task(struct bnxt *bp, bool silent)if (netif_running (bp->dev)) {int rc; -if (!silent) +if (silent) { +bnxt_close_nic (bp, false, false); +bnxt_open_nic (bp, false, false); + }else {bnxt_ulp_stop (bp); -bnxt_close_nic (bp, false, false); - rc =bnxt_open_nic (bp, false, false); -if (!silent && !rc) -bnxt_ulp_start (bp); +bnxt_close_nic (bp, true, false); + rc =bnxt_open_nic (bp, true, false); +bnxt_ulp_start (bp, rc); + } } }
@@ -10732,6 +10741,10 @@ static void bnxt_fw_reset_task(struct work_struct *work) } bp->fw_reset_timestamp = jiffies;rtnl_lock (); +if (test_bit (BNXT_STATE_ABORT_ERR , &bp->state)) { +rtnl_unlock (); + goto fw_reset_abort; + }bnxt_fw_reset_close (bp);if (bp->fw_cap &BNXT_FW_CAP_ERR_RECOVER_RELOAD ) { bp->fw_reset_state =BNXT_FW_RESET_STATE_POLL_FW_DOWN ;
@@ -12144,10 +12157,9 @@ static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev)if (!err &&netif_running (netdev)) err =bnxt_open (netdev); -if (!err) { +if (!err) result =PCI_ERS_RESULT_RECOVERED ; -bnxt_ulp_start (bp); - } +bnxt_ulp_start (bp, err); }if (result !=PCI_ERS_RESULT_RECOVERED ) {
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +13 -6
@@ -186,7 +186,7 @@ static int bnxt_free_msix_vecs(struct bnxt_en_dev *edev, int ulp_id) edev->ulp_tbl[ulp_id].msix_requested =0 ; edev->flags &= ~BNXT_EN_FLAG_MSIX_REQUESTED ; -if (netif_running (dev)) { +if (netif_running (dev) && !(edev->flags &BNXT_EN_FLAG_ULP_STOPPED )) {bnxt_close_nic (bp, true, false);bnxt_open_nic (bp, true, false); }
@@ -274,6 +274,7 @@ void bnxt_ulp_stop(struct bnxt *bp)if (!edev)return ; + edev->flags |=BNXT_EN_FLAG_ULP_STOPPED ;for (i =0 ; i <BNXT_MAX_ULP ; i++) {struct bnxt_ulp *ulp = &edev->ulp_tbl[i];
@@ -284,7 +285,7 @@ void bnxt_ulp_stop(struct bnxt *bp) } } -void bnxt_ulp_start (struct bnxt *bp) +void bnxt_ulp_start (struct bnxt *bp,int err) {struct bnxt_en_dev *edev = bp->edev;struct bnxt_ulp_ops *ops;
@@ -293,6 +294,11 @@ void bnxt_ulp_start(struct bnxt *bp)if (!edev)return ; + edev->flags &= ~BNXT_EN_FLAG_ULP_STOPPED ; + +if (err) +return ; +for (i =0 ; i <BNXT_MAX_ULP ; i++) {struct bnxt_ulp *ulp = &edev->ulp_tbl[i];
@@ -467,13 +473,14 @@ struct bnxt_en_dev *bnxt_ulp_probe(struct net_device *dev)if (!edev)return ERR_PTR (-ENOMEM ); edev->en_ops = &bnxt_en_ops_tbl; -if (bp->flags &BNXT_FLAG_ROCEV1_CAP ) - edev->flags |=BNXT_EN_FLAG_ROCEV1_CAP ; -if (bp->flags &BNXT_FLAG_ROCEV2_CAP ) - edev->flags |=BNXT_EN_FLAG_ROCEV2_CAP ; edev->net = dev; edev->pdev = bp->pdev; bp->edev = edev; } + edev->flags &= ~BNXT_EN_FLAG_ROCE_CAP ; +if (bp->flags &BNXT_FLAG_ROCEV1_CAP ) + edev->flags |=BNXT_EN_FLAG_ROCEV1_CAP ; +if (bp->flags &BNXT_FLAG_ROCEV2_CAP ) + edev->flags |=BNXT_EN_FLAG_ROCEV2_CAP ;return bp->edev; }
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h +2 -1
@@ -64,6 +64,7 @@ struct bnxt_en_dev {#define BNXT_EN_FLAG_ROCE_CAP (BNXT_EN_FLAG_ROCEV1_CAP | \ BNXT_EN_FLAG_ROCEV2_CAP)#define BNXT_EN_FLAG_MSIX_REQUESTED 0x4 +#define BNXT_EN_FLAG_ULP_STOPPED 0x8const struct bnxt_en_ops *en_ops;struct bnxt_ulp ulp_tbl[BNXT_MAX_ULP ]; };
@@ -92,7 +93,7 @@ int bnxt_get_ulp_msix_num(struct bnxt *bp);int bnxt_get_ulp_msix_base (struct bnxt *bp);int bnxt_get_ulp_stat_ctxs (struct bnxt *bp);void bnxt_ulp_stop (struct bnxt *bp); -void bnxt_ulp_start (struct bnxt *bp); +void bnxt_ulp_start (struct bnxt *bp,int err);void bnxt_ulp_sriov_cfg (struct bnxt *bp,int num_vfs);void bnxt_ulp_shutdown (struct bnxt *bp);void bnxt_ulp_irq_stop (struct bnxt *bp);
drivers/net/ethernet/broadcom/genet/bcmgenet.c +2 -14
@@ -1187,7 +1187,8 @@ static void bcmgenet_power_up(struct bcmgenet_priv *priv,switch (mode) {case GENET_POWER_PASSIVE : - reg &= ~(EXT_PWR_DOWN_DLL |EXT_PWR_DOWN_BIAS ); + reg &= ~(EXT_PWR_DOWN_DLL |EXT_PWR_DOWN_BIAS | +EXT_ENERGY_DET_MASK );if (GENET_IS_V5 (priv)) { reg &= ~(EXT_PWR_DOWN_PHY_EN | EXT_PWR_DOWN_PHY_RD |
@@ -2901,12 +2902,6 @@ static int bcmgenet_open(struct net_device *dev)bcmgenet_set_hw_addr (priv, dev->dev_addr); -if (priv->internal_phy) { - reg =bcmgenet_ext_readl (priv,EXT_EXT_PWR_MGMT ); - reg |=EXT_ENERGY_DET_MASK ; -bcmgenet_ext_writel (priv, reg,EXT_EXT_PWR_MGMT ); - } -/* Disable RX/TX DMA and flush TX queues */ dma_ctrl =bcmgenet_dma_disable (priv);
@@ -3623,7 +3618,6 @@ static int bcmgenet_resume(struct device *d)struct bcmgenet_priv *priv =netdev_priv (dev);unsigned long dma_ctrl;int ret; -u32 reg;if (!netif_running (dev))return 0 ;
@@ -3655,12 +3649,6 @@ static int bcmgenet_resume(struct device *d)bcmgenet_set_hw_addr (priv, dev->dev_addr); -if (priv->internal_phy) { - reg =bcmgenet_ext_readl (priv,EXT_EXT_PWR_MGMT ); - reg |=EXT_ENERGY_DET_MASK ; -bcmgenet_ext_writel (priv, reg,EXT_EXT_PWR_MGMT ); - } -if (priv->wolopts)bcmgenet_power_up (priv,GENET_POWER_WOL_MAGIC );
drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c +0 -6
@@ -160,12 +160,6 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv, reg |=CMD_RX_EN ;bcmgenet_umac_writel (priv, reg,UMAC_CMD ); -if (priv->hw_params->flags &GENET_HAS_EXT ) { - reg =bcmgenet_ext_readl (priv,EXT_EXT_PWR_MGMT ); - reg &= ~EXT_ENERGY_DET_MASK ; -bcmgenet_ext_writel (priv, reg,EXT_EXT_PWR_MGMT ); - } -return 0 ; }
drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c +1 -1
@@ -420,7 +420,7 @@ static int cn23xx_pf_setup_global_input_regs(struct octeon_device *oct)* bits 32:47 indicate the PVF num. */ for (q_no =0 ; q_no < ern; q_no++) { - reg_val = oct->pcie_port <<CN23XX_PKT_INPUT_CTL_MAC_NUM_POS ; + reg_val = (u64 )oct->pcie_port <<CN23XX_PKT_INPUT_CTL_MAC_NUM_POS ;/* for VF assigned queues. */ if (q_no < oct->sriov_info.pf_srn) {
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +10 -8
@@ -2245,6 +2245,9 @@ static void detach_ulds(struct adapter *adap) {unsigned int i; +if (!is_uld (adap)) +return ; +mutex_lock (&uld_mutex);list_del (&adap->list_node);
@@ -6152,10 +6155,13 @@ static void remove_one(struct pci_dev *pdev)*/ destroy_workqueue (adapter->workq); -if (is_uld (adapter)) { -detach_ulds (adapter); -t4_uld_clean_up (adapter); - } +detach_ulds (adapter); + +for_each_port (adapter, i) +if (adapter->port[i]->reg_state ==NETREG_REGISTERED ) +unregister_netdev (adapter->port[i]); + +t4_uld_clean_up (adapter);adap_free_hma_mem (adapter);
@@ -6163,10 +6169,6 @@ static void remove_one(struct pci_dev *pdev)cxgb4_free_mps_ref_entries (adapter); -for_each_port (adapter, i) -if (adapter->port[i]->reg_state ==NETREG_REGISTERED ) -unregister_netdev (adapter->port[i]); -debugfs_remove_recursive (adapter->debugfs_root);if (!is_t4 (adapter->params.chip))
drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c +3 -0
@@ -638,6 +638,9 @@ void t4_uld_clean_up(struct adapter *adap) {unsigned int i; +if (!is_uld (adap)) +return ; +mutex_lock (&uld_mutex);for (i =0 ; i <CXGB4_ULD_MAX ; i++) {if (!adap->uld[i].handle)
drivers/net/ethernet/google/gve/gve_main.c +4 -1
@@ -1170,13 +1170,16 @@ static int gve_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err =register_netdev (dev);if (err) - goto abort_with_wq; + goto abort_with_gve_init;dev_info (&pdev->dev,"GVE version %s\n" , gve_version_str);gve_clear_probe_in_progress (priv);queue_work (priv->gve_wq, &priv->service_task);return 0 ; +abort_with_gve_init: +gve_teardown_priv_resources (priv); + abort_with_wq:destroy_workqueue (priv->gve_wq);
drivers/net/ethernet/hisilicon/hip04_eth.c +3 -3
@@ -131,7 +131,7 @@/* buf unit size is cache_line_size, which is 64, so the shift is 6 */ #define PPE_BUF_SIZE_SHIFT 6#define PPE_TX_BUF_HOLD BIT(31) -#define CACHE_LINE_MASK 0x3F +#define SOC_CACHE_LINE_MASK 0x3F#else #define PPE_CFG_QOS_VMID_GRP_SHIFT 8#define PPE_CFG_RX_CTRL_ALIGN_SHIFT 11
@@ -531,8 +531,8 @@ hip04_mac_start_xmit(struct sk_buff *skb, struct net_device *ndev)#if defined(CONFIG_HI13X1_GMAC ) desc->cfg = (__force u32 )cpu_to_be32 (TX_CLEAR_WB |TX_FINISH_CACHE_INV |TX_RELEASE_TO_PPE | priv->port <<TX_POOL_SHIFT ); - desc->data_offset = (__force u32 )cpu_to_be32 (phys &CACHE_LINE_MASK ); - desc->send_addr = (__force u32 )cpu_to_be32 (phys & ~CACHE_LINE_MASK ); + desc->data_offset = (__force u32 )cpu_to_be32 (phys &SOC_CACHE_LINE_MASK ); + desc->send_addr = (__force u32 )cpu_to_be32 (phys & ~SOC_CACHE_LINE_MASK );#else desc->cfg = (__force u32 )cpu_to_be32 (TX_CLEAR_WB |TX_FINISH_CACHE_INV ); desc->send_addr = (__force u32 )cpu_to_be32 (phys);
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +10 -0
@@ -2119,6 +2119,16 @@ static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)static int hclgevf_init_vlan_config (struct hclgevf_dev *hdev) { +struct hnae3_handle *nic = &hdev->nic; +int ret; + + ret =hclgevf_en_hw_strip_rxvtag (nic, true); +if (ret) { +dev_err (&hdev->pdev->dev, +"failed to enable rx vlan offload, ret = %d\n" , ret); +return ret; + } +return hclgevf_set_vlan_filter (&hdev->nic,htons (ETH_P_8021Q ),0 , false); }
drivers/net/ethernet/intel/e1000e/netdev.c +1 -0
@@ -7401,6 +7401,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err_ioremap:free_netdev (netdev); err_alloc_etherdev: +pci_disable_pcie_error_reporting (pdev);pci_release_mem_regions (pdev); err_pci_reg: err_dma:
drivers/net/ethernet/intel/fm10k/fm10k_pci.c +1 -0
@@ -2230,6 +2230,7 @@ static int fm10k_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err_ioremap:free_netdev (netdev); err_alloc_netdev: +pci_disable_pcie_error_reporting (pdev);pci_release_mem_regions (pdev); err_pci_reg: err_dma:
drivers/net/ethernet/intel/iavf/iavf_main.c +1 -0
@@ -3765,6 +3765,7 @@ static int iavf_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err_ioremap:free_netdev (netdev); err_alloc_etherdev: +pci_disable_pcie_error_reporting (pdev);pci_release_regions (pdev); err_pci_reg: err_dma:
drivers/net/ethernet/intel/igb/igb_main.c +13 -2
@@ -940,6 +940,7 @@ static void igb_configure_msix(struct igb_adapter *adapter)**/ static int igb_request_msix (struct igb_adapter *adapter) { +unsigned int num_q_vectors = adapter->num_q_vectors;struct net_device *netdev = adapter->netdev;int i, err =0 , vector =0 , free_vector =0 ;
@@ -948,7 +949,13 @@ static int igb_request_msix(struct igb_adapter *adapter)if (err) goto err_out; -for (i =0 ; i < adapter->num_q_vectors; i++) { +if (num_q_vectors >MAX_Q_VECTORS ) { + num_q_vectors =MAX_Q_VECTORS ; +dev_warn (&adapter->pdev->dev, +"The number of queue vectors (%d) is higher than max allowed (%d)\n" , + adapter->num_q_vectors,MAX_Q_VECTORS ); + } +for (i =0 ; i < num_q_vectors; i++) {struct igb_q_vector *q_vector = adapter->q_vector[i]; vector++;
@@ -1687,14 +1694,15 @@ static bool is_any_txtime_enabled(struct igb_adapter *adapter)**/ static void igb_config_tx_modes (struct igb_adapter *adapter,int queue) { -struct igb_ring *ring = adapter->tx_ring[queue];struct net_device *netdev = adapter->netdev;struct e1000_hw *hw = &adapter->hw; +struct igb_ring *ring;u32 tqavcc, tqavctrl;u16 value;WARN_ON (hw->mac.type != e1000_i210);WARN_ON (queue <0 || queue >1 ); + ring = adapter->tx_ring[queue];/* If any of the Qav features is enabled, configure queues as SR and * with HIGH PRIO. If none is, then configure them with LOW PRIO and
@@ -3469,6 +3477,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err_ioremap:free_netdev (netdev); err_alloc_etherdev: +pci_disable_pcie_error_reporting (pdev);pci_release_mem_regions (pdev); err_pci_reg: err_dma:
@@ -4657,6 +4666,8 @@ static void igb_clean_tx_ring(struct igb_ring *tx_ring) DMA_TO_DEVICE); } + tx_buffer->next_to_watch =NULL ; +/* move us one more past the eop_desc for start of next pkt */ tx_buffer++; i++;
drivers/net/ethernet/intel/igc/igc.h +1 -1
@@ -504,7 +504,7 @@ static inline s32 igc_read_phy_reg(struct igc_hw *hw, u32 offset, u16 *data)if (hw->phy.ops.read_reg)return hw->phy.ops.read_reg (hw, offset, data); -return 0 ; +return -EOPNOTSUPP ; }/* forward declaration */
drivers/net/ethernet/intel/igc/igc_main.c +4 -2
@@ -256,6 +256,8 @@ static void igc_clean_tx_ring(struct igc_ring *tx_ring) DMA_TO_DEVICE); } + tx_buffer->next_to_watch =NULL ; +/* move us one more past the eop_desc for start of next pkt */ tx_buffer++; i++;
@@ -4310,8 +4312,8 @@ static int igc_probe(struct pci_dev *pdev, err_ioremap:free_netdev (netdev); err_alloc_etherdev: -pci_release_selected_regions (pdev, -pci_select_bars (pdev,IORESOURCE_MEM )); +pci_disable_pcie_error_reporting (pdev); +pci_release_mem_regions (pdev); err_pci_reg: err_dma:pci_disable_device (pdev);
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +3 -1
@@ -1827,7 +1827,8 @@ static void ixgbe_dma_sync_frag(struct ixgbe_ring *rx_ring, struct sk_buff *skb) {if (ring_uses_build_skb (rx_ring)) { -unsigned long offset = (unsigned long )(skb->data) & ~PAGE_MASK ; +unsigned long mask = (unsigned long )ixgbe_rx_pg_size (rx_ring) -1 ; +unsigned long offset = (unsigned long )(skb->data) & mask; dma_sync_single_range_for_cpu(rx_ring->dev, IXGBE_CB(skb)->dma,
@@ -11207,6 +11208,7 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent) disable_dev = !test_and_set_bit (__IXGBE_DISABLED, &adapter->state);free_netdev (netdev); err_alloc_etherdev: +pci_disable_pcie_error_reporting (pdev);pci_release_mem_regions (pdev); err_pci_reg: err_dma:
drivers/net/ethernet/realtek/r8169_main.c +2 -1
@@ -6850,7 +6850,8 @@ static int r8169_mdio_register(struct rtl8169_private *tp) new_bus->priv = tp; new_bus->parent = &pdev->dev; new_bus->irq[0 ] =PHY_IGNORE_INTERRUPT ; -snprintf (new_bus->id,MII_BUS_ID_SIZE ,"r8169-%x" ,pci_dev_id (pdev)); +snprintf (new_bus->id,MII_BUS_ID_SIZE ,"r8169-%x-%x" , +pci_domain_nr (pdev->bus),pci_dev_id (pdev)); new_bus->read = r8169_mdio_read_reg; new_bus->write = r8169_mdio_write_reg;
drivers/nvme/host/core.c +4 -1
@@ -694,7 +694,10 @@ static inline blk_status_t nvme_setup_write_zeroes(struct nvme_ns *ns,cpu_to_le64 (nvme_sect_to_lba (ns,blk_rq_pos (req))); cmnd->write_zeroes.length =cpu_to_le16 ((blk_rq_bytes (req) >> ns->lba_shift) -1 ); - cmnd->write_zeroes.control =0 ; +if (nvme_ns_has_pi (ns)) + cmnd->write_zeroes.control =cpu_to_le16 (NVME_RW_PRINFO_PRACT ); +else + cmnd->write_zeroes.control =0 ;return BLK_STS_OK ; }
drivers/nvme/host/pci.c +3 -2
@@ -2590,7 +2590,9 @@ static void nvme_reset_work(struct work_struct *work)bool was_suspend = !!(dev->ctrl.ctrl_config &NVME_CC_SHN_NORMAL );int result; -if (WARN_ON (dev->ctrl.state !=NVME_CTRL_RESETTING )) { +if (dev->ctrl.state !=NVME_CTRL_RESETTING ) { +dev_warn (dev->ctrl.device,"ctrl state %d is not RESETTING\n" , + dev->ctrl.state); result = -ENODEV ; goto out; }
@@ -2954,7 +2956,6 @@ static void nvme_remove(struct pci_dev *pdev)if (!pci_device_is_present (pdev)) {nvme_change_ctrl_state (&dev->ctrl,NVME_CTRL_DEAD );nvme_dev_disable (dev, true); -nvme_dev_remove_admin (dev); }flush_work (&dev->ctrl.reset_work);
drivers/pci/quirks.c +3 -1
@@ -5312,7 +5312,8 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0422, quirk_no_ext_tags);static void quirk_amd_harvest_no_ats (struct pci_dev *pdev) {if ((pdev->device ==0x7312 && pdev->revision !=0x00 ) || - (pdev->device ==0x7340 && pdev->revision !=0xc5 )) + (pdev->device ==0x7340 && pdev->revision !=0xc5 ) || + (pdev->device ==0x7341 && pdev->revision !=0x00 ))return ;pci_info (pdev,"disabling ATS\n" );
@@ -5327,6 +5328,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x6900, quirk_amd_harvest_no_ats);DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_ATI ,0x7312 , quirk_amd_harvest_no_ats);/* AMD Navi14 dGPU */ DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_ATI ,0x7340 , quirk_amd_harvest_no_ats); +DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_ATI ,0x7341 , quirk_amd_harvest_no_ats);#endif /* CONFIG_PCI_ATS */ /* Freescale PCIe doesn't support MSI in RC mode */
drivers/pwm/pwm-sprd.c +4 -7
@@ -180,13 +180,10 @@ static int sprd_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, } } -if (state->period != cstate->period || - state->duty_cycle != cstate->duty_cycle) { - ret =sprd_pwm_config (spc, pwm, state->duty_cycle, - state->period); -if (ret) -return ret; - } + ret =sprd_pwm_config (spc, pwm, state->duty_cycle, + state->period); +if (ret) +return ret;sprd_pwm_write (spc, pwm->hwpwm,SPRD_PWM_ENABLE ,1 ); }else if (cstate->enabled) {
drivers/regulator/hi6421-regulator.c +17 -13
@@ -366,9 +366,8 @@ static struct hi6421_regulator_infostatic int hi6421_regulator_enable (struct regulator_dev *rdev) { -struct hi6421_regulator_pdata *pdata; +struct hi6421_regulator_pdata *pdata =rdev_get_drvdata (rdev); - pdata =dev_get_drvdata (rdev->dev.parent);/* hi6421 spec requires regulator enablement must be serialized: * - Because when BUCK, LDO switching from off to on, it will have * a huge instantaneous current; so you can not turn on two or
@@ -385,9 +384,10 @@ static int hi6421_regulator_enable(struct regulator_dev *rdev)static unsigned int hi6421_regulator_ldo_get_mode (struct regulator_dev *rdev) { -struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); -u32 reg_val; +struct hi6421_regulator_info *info; +unsigned int reg_val; + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);regmap_read (rdev->regmap, rdev->desc->enable_reg, ®_val);if (reg_val & info->mode_mask)return REGULATOR_MODE_IDLE ;
@@ -397,9 +397,10 @@ static unsigned int hi6421_regulator_ldo_get_mode(struct regulator_dev *rdev)static unsigned int hi6421_regulator_buck_get_mode (struct regulator_dev *rdev) { -struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); -u32 reg_val; +struct hi6421_regulator_info *info; +unsigned int reg_val; + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);regmap_read (rdev->regmap, rdev->desc->enable_reg, ®_val);if (reg_val & info->mode_mask)return REGULATOR_MODE_STANDBY ;
@@ -410,9 +411,10 @@ static unsigned int hi6421_regulator_buck_get_mode(struct regulator_dev *rdev)static int hi6421_regulator_ldo_set_mode (struct regulator_dev *rdev,unsigned int mode) { -struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); -u32 new_mode; +struct hi6421_regulator_info *info; +unsigned int new_mode; + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);switch (mode) {case REGULATOR_MODE_NORMAL : new_mode =0 ;
@@ -434,9 +436,10 @@ static int hi6421_regulator_ldo_set_mode(struct regulator_dev *rdev,static int hi6421_regulator_buck_set_mode (struct regulator_dev *rdev,unsigned int mode) { -struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); -u32 new_mode; +struct hi6421_regulator_info *info; +unsigned int new_mode; + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);switch (mode) {case REGULATOR_MODE_NORMAL : new_mode =0 ;
@@ -459,7 +462,9 @@ static unsigned int hi6421_regulator_ldo_get_optimum_mode(struct regulator_dev *rdev, int input_uV, int output_uV, int load_uA) { - struct hi6421_regulator_info *info = rdev_get_drvdata(rdev); + struct hi6421_regulator_info *info; + + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);if (load_uA > info->eco_microamp)return REGULATOR_MODE_NORMAL ;
@@ -543,14 +548,13 @@ static int hi6421_regulator_probe(struct platform_device *pdev)if (!pdata)return -ENOMEM ;mutex_init (&pdata->lock); -platform_set_drvdata (pdev, pdata);for (i =0 ; i <ARRAY_SIZE (hi6421_regulator_info); i++) {/* assign per-regulator data */ info = &hi6421_regulator_info[i]; config.dev = pdev->dev.parent; - config.driver_data = info; + config.driver_data = pdata; config.regmap = pmic->regmap; rdev = devm_regulator_register(&pdev->dev, &info->desc,
drivers/scsi/scsi_transport_iscsi.c +34 -56
111 lines not on this page · raw message
drivers/spi/spi-cadence.c +9 -5
@@ -517,6 +517,12 @@ static int cdns_spi_probe(struct platform_device *pdev) goto clk_dis_apb; } +pm_runtime_use_autosuspend (&pdev->dev); +pm_runtime_set_autosuspend_delay (&pdev->dev,SPI_AUTOSUSPEND_TIMEOUT ); +pm_runtime_get_noresume (&pdev->dev); +pm_runtime_set_active (&pdev->dev); +pm_runtime_enable (&pdev->dev); + ret =of_property_read_u32 (pdev->dev.of_node,"num-cs" , &num_cs);if (ret <0 ) master->num_chipselect =CDNS_SPI_DEFAULT_NUM_CS ;
@@ -531,11 +537,6 @@ static int cdns_spi_probe(struct platform_device *pdev)/* SPI controller initializations */ cdns_spi_init_hw (xspi); -pm_runtime_set_active (&pdev->dev); -pm_runtime_enable (&pdev->dev); -pm_runtime_use_autosuspend (&pdev->dev); -pm_runtime_set_autosuspend_delay (&pdev->dev,SPI_AUTOSUSPEND_TIMEOUT ); - irq =platform_get_irq (pdev,0 );if (irq <=0 ) { ret = -ENXIO ;
@@ -566,6 +567,9 @@ static int cdns_spi_probe(struct platform_device *pdev) master->bits_per_word_mask =SPI_BPW_MASK (8 ); +pm_runtime_mark_last_busy (&pdev->dev); +pm_runtime_put_autosuspend (&pdev->dev); + ret =spi_register_master (master);if (ret) {dev_err (&pdev->dev,"spi_register_master failed\n" );
drivers/spi/spi-imx.c +21 -16
@@ -64,8 +64,7 @@ struct spi_imx_data;struct spi_imx_devtype_data {void (*intctrl)(struct spi_imx_data *,int );int (*prepare_message)(struct spi_imx_data *,struct spi_message *); -int (*prepare_transfer)(struct spi_imx_data *,struct spi_device *, -struct spi_transfer *); +int (*prepare_transfer)(struct spi_imx_data *,struct spi_device *);void (*trigger)(struct spi_imx_data *);int (*rx_available)(struct spi_imx_data *);void (*reset)(struct spi_imx_data *);
@@ -564,11 +563,10 @@ static int mx51_ecspi_prepare_message(struct spi_imx_data *spi_imx, }static int mx51_ecspi_prepare_transfer (struct spi_imx_data *spi_imx, -struct spi_device *spi, -struct spi_transfer *t) +struct spi_device *spi) {u32 ctrl =readl (spi_imx->base +MX51_ECSPI_CTRL ); -u32 clk = t->speed_hz, delay; +u32 clk, delay;/* Clear BL field and set the right value */ ctrl &= ~MX51_ECSPI_CTRL_BL_MASK ;
@@ -582,7 +580,7 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx,/* set clock speed */ ctrl &= ~(0xf <<MX51_ECSPI_CTRL_POSTDIV_OFFSET |0xf <<MX51_ECSPI_CTRL_PREDIV_OFFSET ); - ctrl |=mx51_ecspi_clkdiv (spi_imx, t->speed_hz, &clk); + ctrl |=mx51_ecspi_clkdiv (spi_imx, spi_imx->spi_bus_clk, &clk); spi_imx->spi_bus_clk = clk;if (spi_imx->usedma)
@@ -694,13 +692,12 @@ static int mx31_prepare_message(struct spi_imx_data *spi_imx, }static int mx31_prepare_transfer (struct spi_imx_data *spi_imx, -struct spi_device *spi, -struct spi_transfer *t) +struct spi_device *spi) {unsigned int reg =MX31_CSPICTRL_ENABLE |MX31_CSPICTRL_MASTER ;unsigned int clk; - reg |=spi_imx_clkdiv_2 (spi_imx->spi_clk, t->speed_hz, &clk) << + reg |=spi_imx_clkdiv_2 (spi_imx->spi_clk, spi_imx->spi_bus_clk, &clk) <<MX31_CSPICTRL_DR_SHIFT ; spi_imx->spi_bus_clk = clk;
@@ -799,14 +796,13 @@ static int mx21_prepare_message(struct spi_imx_data *spi_imx, }static int mx21_prepare_transfer (struct spi_imx_data *spi_imx, -struct spi_device *spi, -struct spi_transfer *t) +struct spi_device *spi) {unsigned int reg =MX21_CSPICTRL_ENABLE |MX21_CSPICTRL_MASTER ;unsigned int max =is_imx27_cspi (spi_imx) ?16 :18 ;unsigned int clk; - reg |=spi_imx_clkdiv_1 (spi_imx->spi_clk, t->speed_hz, max, &clk) + reg |=spi_imx_clkdiv_1 (spi_imx->spi_clk, spi_imx->spi_bus_clk, max, &clk) <<MX21_CSPICTRL_DR_SHIFT ; spi_imx->spi_bus_clk = clk;
@@ -875,13 +871,12 @@ static int mx1_prepare_message(struct spi_imx_data *spi_imx, }static int mx1_prepare_transfer (struct spi_imx_data *spi_imx, -struct spi_device *spi, -struct spi_transfer *t) +struct spi_device *spi) {unsigned int reg =MX1_CSPICTRL_ENABLE |MX1_CSPICTRL_MASTER ;unsigned int clk; - reg |=spi_imx_clkdiv_2 (spi_imx->spi_clk, t->speed_hz, &clk) << + reg |=spi_imx_clkdiv_2 (spi_imx->spi_clk, spi_imx->spi_bus_clk, &clk) <<MX1_CSPICTRL_DR_SHIFT ; spi_imx->spi_bus_clk = clk;
@@ -1199,6 +1194,16 @@ static int spi_imx_setupxfer(struct spi_device *spi,if (!t)return 0 ; +if (!t->speed_hz) { +if (!spi->max_speed_hz) { +dev_err (&spi->dev,"no speed_hz provided!\n" ); +return -EINVAL ; + } +dev_dbg (&spi->dev,"using spi->max_speed_hz!\n" ); + spi_imx->spi_bus_clk = spi->max_speed_hz; + }else + spi_imx->spi_bus_clk = t->speed_hz; + spi_imx->bits_per_word = t->bits_per_word;/*
@@ -1240,7 +1245,7 @@ static int spi_imx_setupxfer(struct spi_device *spi, spi_imx->slave_burst = t->len; } - spi_imx->devtype_data->prepare_transfer (spi_imx, spi, t); + spi_imx->devtype_data->prepare_transfer (spi_imx, spi);return 0 ; }
drivers/spi/spi-mt65xx.c +13 -3
@@ -427,13 +427,23 @@ static int mtk_spi_fifo_transfer(struct spi_master *master,mtk_spi_setup_packet (master); cnt = xfer->len /4 ; -iowrite32_rep (mdata->base +SPI_TX_DATA_REG , xfer->tx_buf, cnt); +if (xfer->tx_buf) +iowrite32_rep (mdata->base +SPI_TX_DATA_REG , xfer->tx_buf, cnt); + +if (xfer->rx_buf) +ioread32_rep (mdata->base +SPI_RX_DATA_REG , xfer->rx_buf, cnt); remainder = xfer->len %4 ;if (remainder >0 ) { reg_val =0 ; -memcpy (®_val, xfer->tx_buf + (cnt *4 ), remainder); -writel (reg_val, mdata->base +SPI_TX_DATA_REG ); +if (xfer->tx_buf) { +memcpy (®_val, xfer->tx_buf + (cnt *4 ), remainder); +writel (reg_val, mdata->base +SPI_TX_DATA_REG ); + } +if (xfer->rx_buf) { + reg_val =readl (mdata->base +SPI_RX_DATA_REG ); +memcpy (xfer->rx_buf + (cnt *4 ), ®_val, remainder); + } }mtk_spi_enable_transfer (master);
drivers/spi/spi-stm32.c +30 -11
94 lines not on this page · raw message
drivers/target/target_core_sbc.c +17 -18
@@ -25,7 +25,7 @@#include "target_core_alua.h" static sense_reason_t -sbc_check_prot (struct se_device *,struct se_cmd *,unsigned char *,u32 ,bool ); +sbc_check_prot (struct se_device *,struct se_cmd *,unsigned char ,u32 ,bool );static sense_reason_t sbc_execute_unmap (struct se_cmd *cmd); static sense_reason_t
@@ -279,14 +279,14 @@ static inline unsigned long long transport_lba_64_ext(unsigned char *cdb) }static sense_reason_t -sbc_setup_write_same (struct se_cmd *cmd,unsigned char *flags,struct sbc_ops *ops) +sbc_setup_write_same (struct se_cmd *cmd,unsigned char flags,struct sbc_ops *ops) {struct se_device *dev = cmd->se_dev;sector_t end_lba = dev->transport->get_blocks (dev) +1 ;unsigned int sectors =sbc_get_write_same_sectors (cmd);sense_reason_t ret; -if ((flags[0 ] &0x04 ) || (flags[0 ] &0x02 )) { +if ((flags &0x04 ) || (flags &0x02 )) {pr_err ("WRITE_SAME PBDATA and LBDATA" " bits not supported for Block Discard" " Emulation\n" );
@@ -308,7 +308,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o }/* We always have ANC_SUP == 0 so setting ANCHOR is always an error */ -if (flags[0 ] &0x10 ) { +if (flags &0x10 ) {pr_warn ("WRITE SAME with ANCHOR not supported\n" );return TCM_INVALID_CDB_FIELD ; }
@@ -316,7 +316,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o* Special case for WRITE_SAME w/ UNMAP=1 that ends up getting * translated into block discard requests within backend code. */ -if (flags[0 ] &0x08 ) { +if (flags &0x08 ) {if (!ops->execute_unmap)return TCM_UNSUPPORTED_SCSI_OPCODE ;
@@ -331,7 +331,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *oif (!ops->execute_write_same)return TCM_UNSUPPORTED_SCSI_OPCODE ; - ret =sbc_check_prot (dev, cmd, &cmd->t_task_cdb[0 ], sectors, true); + ret =sbc_check_prot (dev, cmd, flags >>5 , sectors, true);if (ret)return ret;
@@ -686,10 +686,9 @@ sbc_set_prot_op_checks(u8 protect, bool fabric_prot, enum target_prot_type prot_ }static sense_reason_t -sbc_check_prot (struct se_device *dev,struct se_cmd *cmd,unsigned char *cdb, +sbc_check_prot (struct se_device *dev,struct se_cmd *cmd,unsigned char protect,u32 sectors,bool is_write) { -u8 protect = cdb[1 ] >>5 ;int sp_ops = cmd->se_sess->sup_prot_ops;int pi_prot_type = dev->dev_attrib.pi_prot_type;bool fabric_prot = false;
@@ -737,7 +736,7 @@ sbc_check_prot(struct se_device *dev, struct se_cmd *cmd, unsigned char *cdb,/* Fallthrough */ default :pr_err ("Unable to determine pi_prot_type for CDB: 0x%02x " -"PROTECT: 0x%02x\n" , cdb[0 ], protect); +"PROTECT: 0x%02x\n" , cmd->t_task_cdb[0 ], protect);return TCM_INVALID_CDB_FIELD ; }
@@ -812,7 +811,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, false); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, false);if (ret)return ret;
@@ -826,7 +825,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, false); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, false);if (ret)return ret;
@@ -840,7 +839,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, false); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, false);if (ret)return ret;
@@ -861,7 +860,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, true); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, true);if (ret)return ret;
@@ -875,7 +874,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, true); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, true);if (ret)return ret;
@@ -890,7 +889,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, true); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, true);if (ret)return ret;
@@ -949,7 +948,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops) size =sbc_get_size (cmd,1 ); cmd->t_task_lba =get_unaligned_be64 (&cdb[12 ]); - ret =sbc_setup_write_same (cmd, &cdb[10 ], ops); + ret =sbc_setup_write_same (cmd, cdb[10 ], ops);if (ret)return ret;break ;
@@ -1048,7 +1047,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops) size =sbc_get_size (cmd,1 ); cmd->t_task_lba =get_unaligned_be64 (&cdb[2 ]); - ret =sbc_setup_write_same (cmd, &cdb[1 ], ops); + ret =sbc_setup_write_same (cmd, cdb[1 ], ops);if (ret)return ret;break ;
@@ -1066,7 +1065,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)* Follow sbcr26 with WRITE_SAME (10) and check for the existence * of byte 1 bit 3 UNMAP instead of original reserved field */ - ret =sbc_setup_write_same (cmd, &cdb[1 ], ops); + ret =sbc_setup_write_same (cmd, cdb[1 ], ops);if (ret)return ret;break ;
drivers/usb/core/hub.c +84 -36
159 lines not on this page · raw message
drivers/usb/core/quirks.c +0 -4
@@ -502,10 +502,6 @@ static const struct usb_device_id usb_quirk_list[] = {/* DJI CineSSD */ { USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM }, - /* Fibocom L850-GL LTE Modem */ - { USB_DEVICE(0x2cb7, 0x0007), .driver_info = - USB_QUIRK_IGNORE_REMOTE_WAKEUP }, - /* INTEL VALUE SSD */ { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
drivers/usb/dwc2/gadget.c +6 -4
@@ -2748,12 +2748,14 @@ static void dwc2_hsotg_complete_in(struct dwc2_hsotg *hsotg,return ; } -/* Zlp for all endpoints, for ep0 only in DATA IN stage */ +/* Zlp for all endpoints in non DDMA, for ep0 only in DATA IN stage */ if (hs_ep->send_zlp) { -dwc2_hsotg_program_zlp (hsotg, hs_ep); hs_ep->send_zlp =0 ; -/* transfer will be completed on next complete interrupt */ -return ; +if (!using_desc_dma (hsotg)) { +dwc2_hsotg_program_zlp (hsotg, hs_ep); +/* transfer will be completed on next complete interrupt */ +return ; + } }if (hs_ep->index ==0 && hsotg->ep0_state ==DWC2_EP0_DATA_IN ) {
drivers/usb/host/max3421-hcd.c +14 -30
95 lines not on this page · raw message
drivers/usb/host/xhci-hub.c +2 -1
@@ -1546,11 +1546,12 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf)* Inform the usbcore about resume-in-progress by returning * a non-zero value even if there are no status changes. */ +spin_lock_irqsave (&xhci->lock, flags); + status = bus_state->resuming_ports; mask =PORT_CSC |PORT_PEC |PORT_OCC |PORT_PLC |PORT_WRC |PORT_CEC ; -spin_lock_irqsave (&xhci->lock, flags);/* For each port, did anything change? If so, set that bit in buf. */ for (i =0 ; i < max_ports; i++) { temp =readl (ports[i]->addr);
drivers/usb/host/xhci-ring.c +45 -13
118 lines not on this page · raw message
drivers/usb/host/xhci.h +2 -1
@@ -993,6 +993,7 @@ struct xhci_interval_bw_table {unsigned int ss_bw_out; }; +#define EP_CTX_PER_DEV 31struct xhci_virt_device {struct usb_device *udev;
@@ -1007,7 +1008,7 @@ struct xhci_virt_device {struct xhci_container_ctx *out_ctx;/* Used for addressing devices and configuration changes */ struct xhci_container_ctx *in_ctx; -struct xhci_virt_ep eps[31 ]; +struct xhci_virt_ep eps[EP_CTX_PER_DEV ];u8 fake_port;u8 real_port;struct xhci_interval_bw_table *bw_table;
drivers/usb/renesas_usbhs/fifo.c +7 -0
@@ -101,6 +101,8 @@ static struct dma_chan *usbhsf_dma_chan_get(struct usbhs_fifo *fifo,#define usbhsf_dma_map (p) __usbhsf_dma_map_ctrl(p, 1)#define usbhsf_dma_unmap (p) __usbhsf_dma_map_ctrl(p, 0)static int __usbhsf_dma_map_ctrl (struct usbhs_pkt *pkt,int map); +static void usbhsf_tx_irq_ctrl (struct usbhs_pipe *pipe,int enable); +static void usbhsf_rx_irq_ctrl (struct usbhs_pipe *pipe,int enable);struct usbhs_pkt *usbhs_pkt_pop (struct usbhs_pipe *pipe,struct usbhs_pkt *pkt) {struct usbhs_priv *priv =usbhs_pipe_to_priv (pipe);
@@ -123,6 +125,11 @@ struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt)if (chan) {dmaengine_terminate_all (chan);usbhsf_dma_unmap (pkt); + }else { +if (usbhs_pipe_is_dir_in (pipe)) +usbhsf_rx_irq_ctrl (pipe,0 ); +else +usbhsf_tx_irq_ctrl (pipe,0 ); }usbhs_pipe_clear_without_sequence (pipe,0 ,0 );
drivers/usb/serial/cp210x.c +3 -2
@@ -156,6 +156,7 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(0x10C4, 0x89A4) }, /* CESINEL FTBC Flexible Thyristor Bridge Controller */ { USB_DEVICE(0x10C4, 0x89FB) }, /* Qivicon ZigBee USB Radio Stick */ { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */ + { USB_DEVICE(0x10C4, 0x8A5B) }, /* CEL EM3588 ZigBee USB Stick */ { USB_DEVICE(0x10C4, 0x8A5E) }, /* CEL EM3588 ZigBee USB Stick Long Range */ { USB_DEVICE(0x10C4, 0x8B34) }, /* Qivicon ZigBee USB Radio Stick */ { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
@@ -203,8 +204,8 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(0x1901, 0x0194) }, /* GE Healthcare Remote Alarm Box */ { USB_DEVICE(0x1901, 0x0195) }, /* GE B850/B650/B450 CP2104 DP UART interface */ { USB_DEVICE(0x1901, 0x0196) }, /* GE B850 CP2105 DP UART interface */ - { USB_DEVICE(0x1901, 0x0197) }, /* GE CS1000 Display serial interface */ - { USB_DEVICE(0x1901, 0x0198) }, /* GE CS1000 M.2 Key E serial interface */ + { USB_DEVICE(0x1901, 0x0197) }, /* GE CS1000 M.2 Key E serial interface */ + { USB_DEVICE(0x1901, 0x0198) }, /* GE CS1000 Display serial interface */ { USB_DEVICE(0x199B, 0xBA30) }, /* LORD WSDA-200-USB */ { USB_DEVICE(0x19CF, 0x3000) }, /* Parrot NMEA GPS Flight Recorder */ { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */
drivers/usb/serial/option.c +3 -0
@@ -238,6 +238,7 @@ static void option_instat_callback(struct urb *urb);#define QUECTEL_PRODUCT_UC15 0x9090/* These u-blox products use Qualcomm's vendor ID */ #define UBLOX_PRODUCT_R410M 0x90b2 +#define UBLOX_PRODUCT_R6XX 0x90fa/* These Yuga products use Qualcomm's vendor ID */ #define YUGA_PRODUCT_CLM920_NC5 0x9625
@@ -1101,6 +1102,8 @@ static const struct usb_device_id option_ids[] = {/* u-blox products using Qualcomm vendor ID */ { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R410M), .driver_info = RSVD(1) | RSVD(3) }, + { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R6XX), + .driver_info = RSVD(3) }, /* Quectel products using Quectel vendor ID */ { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21, 0xff, 0xff, 0xff), .driver_info = NUMEP2 },
drivers/usb/storage/unusual_uas.h +7 -0
@@ -45,6 +45,13 @@ UNUSUAL_DEV(0x059f, 0x105f, 0x0000, 0x9999, USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_NO_REPORT_OPCODES | US_FL_NO_SAME), +/* Reported-by: Julian Sikorski <[email protected]> */ +UNUSUAL_DEV (0x059f ,0x1061 ,0x0000 ,0x9999 , +"LaCie" , +"Rugged USB3-FW" , +USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , + US_FL_IGNORE_UAS), +/* * Apricorn USB3 dongle sometimes returns "USBSUSBSUSBS" in response to SCSI * commands in UAS mode. Observed with the 1.28 firmware; are there others?
fs/afs/cmservice.c +7 -18
@@ -29,16 +29,11 @@ static void SRXAFSCB_TellMeAboutYourself(struct work_struct *);static int afs_deliver_yfs_cb_callback (struct afs_call *); -#define CM_NAME (name) \ - char afs_SRXCB##name##_name[] __tracepoint_string = \ - "CB." #name -/* * CB.CallBack operation type */ -static CM_NAME (CallBack);static const struct afs_call_type afs_SRXCBCallBack = { - .name = afs_SRXCBCallBack_name, + .name ="CB.CallBack" , .deliver = afs_deliver_cb_callback, .destructor = afs_cm_destructor, .work = SRXAFSCB_CallBack,
@@ -47,9 +42,8 @@ static const struct afs_call_type afs_SRXCBCallBack = {/* * CB.InitCallBackState operation type */ -static CM_NAME (InitCallBackState);static const struct afs_call_type afs_SRXCBInitCallBackState = { - .name = afs_SRXCBInitCallBackState_name, + .name ="CB.InitCallBackState" , .deliver = afs_deliver_cb_init_call_back_state, .destructor = afs_cm_destructor, .work = SRXAFSCB_InitCallBackState,
@@ -58,9 +52,8 @@ static const struct afs_call_type afs_SRXCBInitCallBackState = {/* * CB.InitCallBackState3 operation type */ -static CM_NAME (InitCallBackState3);static const struct afs_call_type afs_SRXCBInitCallBackState3 = { - .name = afs_SRXCBInitCallBackState3_name, + .name ="CB.InitCallBackState3" , .deliver = afs_deliver_cb_init_call_back_state3, .destructor = afs_cm_destructor, .work = SRXAFSCB_InitCallBackState,
@@ -69,9 +62,8 @@ static const struct afs_call_type afs_SRXCBInitCallBackState3 = {/* * CB.Probe operation type */ -static CM_NAME (Probe);static const struct afs_call_type afs_SRXCBProbe = { - .name = afs_SRXCBProbe_name, + .name ="CB.Probe" , .deliver = afs_deliver_cb_probe, .destructor = afs_cm_destructor, .work = SRXAFSCB_Probe,
@@ -80,9 +72,8 @@ static const struct afs_call_type afs_SRXCBProbe = {/* * CB.ProbeUuid operation type */ -static CM_NAME (ProbeUuid);static const struct afs_call_type afs_SRXCBProbeUuid = { - .name = afs_SRXCBProbeUuid_name, + .name ="CB.ProbeUuid" , .deliver = afs_deliver_cb_probe_uuid, .destructor = afs_cm_destructor, .work = SRXAFSCB_ProbeUuid,
@@ -91,9 +82,8 @@ static const struct afs_call_type afs_SRXCBProbeUuid = {/* * CB.TellMeAboutYourself operation type */ -static CM_NAME (TellMeAboutYourself);static const struct afs_call_type afs_SRXCBTellMeAboutYourself = { - .name = afs_SRXCBTellMeAboutYourself_name, + .name ="CB.TellMeAboutYourself" , .deliver = afs_deliver_cb_tell_me_about_yourself, .destructor = afs_cm_destructor, .work = SRXAFSCB_TellMeAboutYourself,
@@ -102,9 +92,8 @@ static const struct afs_call_type afs_SRXCBTellMeAboutYourself = {/* * YFS CB.CallBack operation type */ -static CM_NAME (YFS_CallBack);static const struct afs_call_type afs_SRXYFSCB_CallBack = { - .name = afs_SRXCBYFS_CallBack_name, + .name ="YFSCB.CallBack" , .deliver = afs_deliver_yfs_cb_callback, .destructor = afs_cm_destructor, .work = SRXAFSCB_CallBack,
fs/btrfs/extent-tree.c +3 -0
@@ -5768,6 +5768,9 @@ int btrfs_trim_fs(struct btrfs_fs_info *fs_info, struct fstrim_range *range)mutex_lock (&fs_info->fs_devices->device_list_mutex); devices = &fs_info->fs_devices->devices;list_for_each_entry (device, devices, dev_list) { +if (test_bit (BTRFS_DEV_STATE_MISSING , &device->dev_state)) +continue ; + ret =btrfs_trim_free_extents (device, &group_trimmed);if (ret) { dev_failed++;
fs/btrfs/inode.c +1 -1
@@ -543,7 +543,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 (inode_need_compress (inode, start, end)) { +if (nr_pages >1 &&inode_need_compress (inode, start, end)) {WARN_ON (pages); pages =kcalloc (nr_pages,sizeof (struct page *),GFP_NOFS );if (!pages) {
fs/hugetlbfs/inode.c +1 -1
@@ -76,7 +76,7 @@ enum hugetlb_param {static const struct fs_parameter_spec hugetlb_param_specs[] = {fsparam_u32 ("gid" , Opt_gid),fsparam_string ("min_size" , Opt_min_size), -fsparam_u32 ("mode" , Opt_mode), +fsparam_u32oct ("mode" , Opt_mode),fsparam_string ("nr_inodes" , Opt_nr_inodes),fsparam_string ("pagesize" , Opt_pagesize),fsparam_string ("size" , Opt_size),
fs/proc/base.c +1 -1
@@ -836,7 +836,7 @@ static ssize_t mem_rw(struct file *file, char __user *buf, flags =FOLL_FORCE | (write ?FOLL_WRITE :0 );while (count >0 ) { -int this_len =min_t (int, count,PAGE_SIZE ); +size_t this_len =min_t (size_t, count,PAGE_SIZE );if (write &©_from_user (page, buf, this_len)) { copied = -EFAULT ;
fs/userfaultfd.c +10 -12
@@ -1272,23 +1272,21 @@ static __always_inline void wake_userfault(struct userfaultfd_ctx *ctx, } static __always_inline int validate_range(struct mm_struct *mm, -__u64 *start,__u64 len) +__u64 start,__u64 len) {__u64 task_size = mm->task_size; - *start =untagged_addr (*start); - -if (*start & ~PAGE_MASK ) +if (start & ~PAGE_MASK )return -EINVAL ;if (len & ~PAGE_MASK )return -EINVAL ;if (!len)return -EINVAL ; -if (*start < mmap_min_addr) +if (start < mmap_min_addr)return -EINVAL ; -if (*start >= task_size) +if (start >= task_size)return -EINVAL ; -if (len > task_size - *start) +if (len > task_size - start)return -EINVAL ;return 0 ; }
@@ -1338,7 +1336,7 @@ static int userfaultfd_register(struct userfaultfd_ctx *ctx, goto out; } - ret =validate_range (mm, &uffdio_register.range.start, + ret =validate_range (mm, uffdio_register.range.start, uffdio_register.range.len);if (ret) goto out;
@@ -1527,7 +1525,7 @@ static int userfaultfd_unregister(struct userfaultfd_ctx *ctx,if (copy_from_user (&uffdio_unregister, buf,sizeof (uffdio_unregister))) goto out; - ret =validate_range (mm, &uffdio_unregister.start, + ret =validate_range (mm, uffdio_unregister.start, uffdio_unregister.len);if (ret) goto out;
@@ -1678,7 +1676,7 @@ static int userfaultfd_wake(struct userfaultfd_ctx *ctx,if (copy_from_user (&uffdio_wake, buf,sizeof (uffdio_wake))) goto out; - ret =validate_range (ctx->mm, &uffdio_wake.start, uffdio_wake.len); + ret =validate_range (ctx->mm, uffdio_wake.start, uffdio_wake.len);if (ret) goto out;
@@ -1718,7 +1716,7 @@ static int userfaultfd_copy(struct userfaultfd_ctx *ctx, sizeof(uffdio_copy)-sizeof(__s64))) goto out; - ret =validate_range (ctx->mm, &uffdio_copy.dst, uffdio_copy.len); + ret =validate_range (ctx->mm, uffdio_copy.dst, uffdio_copy.len);if (ret) goto out;/*
@@ -1774,7 +1772,7 @@ static int userfaultfd_zeropage(struct userfaultfd_ctx *ctx, sizeof(uffdio_zeropage)-sizeof(__s64))) goto out; - ret =validate_range (ctx->mm, &uffdio_zeropage.range.start, + ret =validate_range (ctx->mm, uffdio_zeropage.range.start, uffdio_zeropage.range.len);if (ret) goto out;
include/drm/drm_ioctl.h +1 -0
@@ -68,6 +68,7 @@ typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd, unsigned long arg);#define DRM_IOCTL_NR (n) _IOC_NR(n) +#define DRM_IOCTL_TYPE (n) _IOC_TYPE(n)#define DRM_MAJOR 226/**
include/trace/events/afs.h +62 -5
100 lines not on this page · raw message
kernel/trace/ring_buffer.c +24 -4
@@ -3221,10 +3221,30 @@ static bool rb_per_cpu_empty(struct ring_buffer_per_cpu *cpu_buffer)if (unlikely (!head))return true; -return reader->read ==rb_page_commit (reader) && - (commit == reader || - (commit == head && - head->read ==rb_page_commit (commit))); +/* Reader should exhaust content in reader page */ +if (reader->read !=rb_page_commit (reader)) +return false; + +/* +* If writers are committing on the reader page, knowing all +* committed content has been read, the ring buffer is empty. +*/ +if (commit == reader) +return true; + +/* +* If writers are committing on a page other than reader page +* and head page, there should always be content to read. +*/ +if (commit != head) +return false; + +/* +* Writers are committing on the head page, we just need +* to care about there're committed data, and the reader will +* swap reader page with head page when it is to read data. +*/ +return rb_page_commit (commit) ==0 ; }/**
kernel/trace/trace.c +4 -0
@@ -4975,6 +4975,10 @@ static const char readme_msg[] ="\t [:name=histname1]\n" "\t [:<handler>.<action>]\n" "\t [if <filter>]\n\n" +"\t Note, special fields can be used as well:\n" +"\t common_timestamp - to record current timestamp\n" +"\t common_cpu - to record the CPU the event happened on\n" +"\n" "\t When a matching event is hit, an entry is added to a hash\n" "\t table using the key(s) and value(s) named, and the value of a\n" "\t sum called 'hitcount' is incremented. Keys and values\n"
kernel/trace/trace_events_hist.c +16 -6
@@ -2001,7 +2001,7 @@ static const char *hist_field_name(struct hist_field *field, field->flags & HIST_FIELD_FL_ALIAS) field_name =hist_field_name (field->operands[0 ], ++level); else if (field->flags & HIST_FIELD_FL_CPU) - field_name ="cpu" ; + field_name ="common_cpu" ; else if (field->flags & HIST_FIELD_FL_EXPR || field->flags & HIST_FIELD_FL_VAR_REF) {if (field->system) {
@@ -2873,14 +2873,24 @@ parse_field(struct hist_trigger_data *hist_data, struct trace_event_file *file, hist_data->enable_timestamps = true;if (*flags &HIST_FIELD_FL_TIMESTAMP_USECS ) hist_data->attrs->ts_in_usecs = true; - }else if (strcmp (field_name,"cpu" ) ==0 ) + }else if (strcmp (field_name,"common_cpu" ) ==0 ) *flags |=HIST_FIELD_FL_CPU ;else { field =trace_find_event_field (file->event_call, field_name);if (!field || !field->size) { -hist_err (tr,HIST_ERR_FIELD_NOT_FOUND ,errpos (field_name)); - field =ERR_PTR (-EINVAL ); - goto out; +/* +* For backward compatibility, if field_name +* was "cpu", then we treat this the same as +* common_cpu. +*/ +if (strcmp (field_name,"cpu" ) ==0 ) { + *flags |=HIST_FIELD_FL_CPU ; + }else { +hist_err (tr,HIST_ERR_FIELD_NOT_FOUND , +errpos (field_name)); + field =ERR_PTR (-EINVAL ); + goto out; + } } } out:
@@ -5641,7 +5651,7 @@ static void hist_field_print(struct seq_file *m, struct hist_field *hist_field)seq_printf (m,"%s=" , hist_field->var.name);if (hist_field->flags &HIST_FIELD_FL_CPU ) -seq_puts (m,"cpu" ); +seq_puts (m,"common_cpu" );else if (field_name) {if (hist_field->flags &HIST_FIELD_FL_VAR_REF || hist_field->flags &HIST_FIELD_FL_ALIAS )
net/caif/caif_socket.c +2 -1
@@ -539,7 +539,8 @@ static int caif_seqpkt_sendmsg(struct socket *sock, struct msghdr *msg, goto err; ret = -EINVAL ; -if (unlikely (msg->msg_iter.iov->iov_base ==NULL )) +if (unlikely (msg->msg_iter.nr_segs ==0 ) || +unlikely (msg->msg_iter.iov->iov_base ==NULL )) goto err; noblock = msg->msg_flags &MSG_DONTWAIT ;
net/decnet/af_decnet.c +12 -15
@@ -815,7 +815,7 @@ static int dn_auto_bind(struct socket *sock)static int dn_confirm_accept (struct sock *sk,long *timeo,gfp_t allocation) {struct dn_scp *scp =DN_SK (sk); -DEFINE_WAIT (wait); +DEFINE_WAIT_FUNC (wait, woken_wake_function);int err;if (scp->state !=DN_CR )
@@ -825,11 +825,11 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation) scp->segsize_loc =dst_metric_advmss (__sk_dst_get (sk));dn_send_conn_conf (sk, allocation); -prepare_to_wait (sk_sleep (sk), &wait,TASK_INTERRUPTIBLE ); +add_wait_queue (sk_sleep (sk), &wait);for (;;) {release_sock (sk);if (scp->state ==DN_CC ) - *timeo =schedule_timeout (*timeo); + *timeo =wait_woken (&wait,TASK_INTERRUPTIBLE , *timeo);lock_sock (sk); err =0 ;if (scp->state ==DN_RUN )
@@ -843,9 +843,8 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation) err = -EAGAIN ;if (!*timeo)break ; -prepare_to_wait (sk_sleep (sk), &wait,TASK_INTERRUPTIBLE ); } -finish_wait (sk_sleep (sk), &wait); +remove_wait_queue (sk_sleep (sk), &wait);if (err ==0 ) { sk->sk_socket->state =SS_CONNECTED ; }else if (scp->state !=DN_CC ) {
@@ -857,7 +856,7 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation)static int dn_wait_run (struct sock *sk,long *timeo) {struct dn_scp *scp =DN_SK (sk); -DEFINE_WAIT (wait); +DEFINE_WAIT_FUNC (wait, woken_wake_function);int err =0 ;if (scp->state ==DN_RUN )
@@ -866,11 +865,11 @@ static int dn_wait_run(struct sock *sk, long *timeo)if (!*timeo)return -EALREADY ; -prepare_to_wait (sk_sleep (sk), &wait,TASK_INTERRUPTIBLE ); +add_wait_queue (sk_sleep (sk), &wait);for (;;) {release_sock (sk);if (scp->state ==DN_CI || scp->state ==DN_CC ) - *timeo =schedule_timeout (*timeo); + *timeo =wait_woken (&wait,TASK_INTERRUPTIBLE , *timeo);lock_sock (sk); err =0 ;if (scp->state ==DN_RUN )
@@ -884,9 +883,8 @@ static int dn_wait_run(struct sock *sk, long *timeo) err = -ETIMEDOUT ;if (!*timeo)break ; -prepare_to_wait (sk_sleep (sk), &wait,TASK_INTERRUPTIBLE ); } -finish_wait (sk_sleep (sk), &wait); +remove_wait_queue (sk_sleep (sk), &wait); out:if (err ==0 ) { sk->sk_socket->state =SS_CONNECTED ;
@@ -1031,16 +1029,16 @@ static void dn_user_copy(struct sk_buff *skb, struct optdata_dn *opt)static struct sk_buff *dn_wait_for_connect (struct sock *sk,long *timeo) { -DEFINE_WAIT (wait); +DEFINE_WAIT_FUNC (wait, woken_wake_function);struct sk_buff *skb =NULL ;int err =0 ; -prepare_to_wait (sk_sleep (sk), &wait,TASK_INTERRUPTIBLE ); +add_wait_queue (sk_sleep (sk), &wait);for (;;) {release_sock (sk); skb =skb_dequeue (&sk->sk_receive_queue);if (skb ==NULL ) { - *timeo =schedule_timeout (*timeo); + *timeo =wait_woken (&wait,TASK_INTERRUPTIBLE , *timeo); skb =skb_dequeue (&sk->sk_receive_queue); }lock_sock (sk);
@@ -1055,9 +1053,8 @@ static struct sk_buff *dn_wait_for_connect(struct sock *sk, long *timeo) err = -EAGAIN ;if (!*timeo)break ; -prepare_to_wait (sk_sleep (sk), &wait,TASK_INTERRUPTIBLE ); } -finish_wait (sk_sleep (sk), &wait); +remove_wait_queue (sk_sleep (sk), &wait);return skb ==NULL ?ERR_PTR (err) : skb; }
net/ipv4/tcp_bpf.c +1 -1
@@ -636,7 +636,7 @@ static int __init tcp_bpf_v4_build_proto(void)tcp_bpf_rebuild_protos (tcp_bpf_prots[TCP_BPF_IPV4 ], &tcp_prot);return 0 ; } -core_initcall (tcp_bpf_v4_build_proto); +late_initcall (tcp_bpf_v4_build_proto);static void tcp_bpf_update_sk_prot (struct sock *sk,struct sk_psock *psock) {
net/ipv4/tcp_fastopen.c +16 -3
@@ -504,8 +504,15 @@ void tcp_fastopen_active_disable(struct sock *sk) {struct net *net =sock_net (sk); +/* Paired with READ_ONCE() in tcp_fastopen_active_should_disable() */ +WRITE_ONCE (net->ipv4.tfo_active_disable_stamp, jiffies); + +/* Paired with smp_rmb() in tcp_fastopen_active_should_disable(). +* We want net->ipv4.tfo_active_disable_stamp to be updated first. +*/ +smp_mb__before_atomic ();atomic_inc (&net->ipv4.tfo_active_disable_times); - net->ipv4.tfo_active_disable_stamp = jiffies; +NET_INC_STATS (net,LINUX_MIB_TCPFASTOPENBLACKHOLE ); }
@@ -523,10 +530,16 @@ bool tcp_fastopen_active_should_disable(struct sock *sk)if (!tfo_da_times)return false; +/* Paired with smp_mb__before_atomic() in tcp_fastopen_active_disable() */ +smp_rmb (); +/* Limit timout to max: 2^6 * initial timeout */ multiplier =1 <<min (tfo_da_times -1 ,6 ); - timeout = multiplier * tfo_bh_timeout *HZ ; -if (time_before (jiffies,sock_net (sk)->ipv4.tfo_active_disable_stamp + timeout)) + +/* Paired with the WRITE_ONCE() in tcp_fastopen_active_disable(). */ + timeout =READ_ONCE (sock_net (sk)->ipv4.tfo_active_disable_stamp) + + multiplier * tfo_bh_timeout *HZ ; +if (time_before (jiffies, timeout))return true;/* Mark check bit so we can check for successful active TFO
net/ipv6/ip6_output.c +3 -1
@@ -477,7 +477,9 @@ int ip6_forward(struct sk_buff *skb)if (skb_warn_if_lro (skb)) goto drop; -if (!xfrm6_policy_check (NULL ,XFRM_POLICY_FWD , skb)) { +if (!net->ipv6.devconf_all->disable_policy && + !idev->cnf.disable_policy && + !xfrm6_policy_check (NULL ,XFRM_POLICY_FWD , skb)) {__IP6_INC_STATS (net, idev,IPSTATS_MIB_INDISCARDS ); goto drop; }
net/ipv6/route.c +1 -1
@@ -3655,7 +3655,7 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg, err =PTR_ERR (rt->fib6_metrics);/* Do not leave garbage there. */ rt->fib6_metrics = (struct dst_metrics *)&dst_default_metrics; - goto out; + goto out_free; }if (cfg->fc_flags &RTF_ADDRCONF )
net/netrom/nr_timer.c +11 -9
@@ -121,11 +121,9 @@ static void nr_heartbeat_expiry(struct timer_list *t)is accepted() it isn't 'dead' so doesn't get removed. */ if (sock_flag (sk,SOCK_DESTROY ) || (sk->sk_state ==TCP_LISTEN &&sock_flag (sk,SOCK_DEAD ))) { -sock_hold (sk);bh_unlock_sock (sk);nr_destroy_socket (sk); -sock_put (sk); -return ; + goto out; }break ;
@@ -146,6 +144,8 @@ static void nr_heartbeat_expiry(struct timer_list *t)nr_start_heartbeat (sk);bh_unlock_sock (sk); +out: +sock_put (sk); }static void nr_t2timer_expiry (struct timer_list *t)
@@ -159,6 +159,7 @@ static void nr_t2timer_expiry(struct timer_list *t)nr_enquiry_response (sk); }bh_unlock_sock (sk); +sock_put (sk); }static void nr_t4timer_expiry (struct timer_list *t)
@@ -169,6 +170,7 @@ static void nr_t4timer_expiry(struct timer_list *t)bh_lock_sock (sk);nr_sk (sk)->condition &= ~NR_COND_PEER_RX_BUSY ;bh_unlock_sock (sk); +sock_put (sk); }static void nr_idletimer_expiry (struct timer_list *t)
@@ -197,6 +199,7 @@ static void nr_idletimer_expiry(struct timer_list *t)sock_set_flag (sk,SOCK_DEAD ); }bh_unlock_sock (sk); +sock_put (sk); }static void nr_t1timer_expiry (struct timer_list *t)
@@ -209,8 +212,7 @@ static void nr_t1timer_expiry(struct timer_list *t)case NR_STATE_1 :if (nr->n2count == nr->n2) {nr_disconnect (sk,ETIMEDOUT ); -bh_unlock_sock (sk); -return ; + goto out; }else { nr->n2count++;nr_write_internal (sk,NR_CONNREQ );
@@ -220,8 +222,7 @@ static void nr_t1timer_expiry(struct timer_list *t)case NR_STATE_2 :if (nr->n2count == nr->n2) {nr_disconnect (sk,ETIMEDOUT ); -bh_unlock_sock (sk); -return ; + goto out; }else { nr->n2count++;nr_write_internal (sk,NR_DISCREQ );
@@ -231,8 +232,7 @@ static void nr_t1timer_expiry(struct timer_list *t)case NR_STATE_3 :if (nr->n2count == nr->n2) {nr_disconnect (sk,ETIMEDOUT ); -bh_unlock_sock (sk); -return ; + goto out; }else { nr->n2count++;nr_requeue_frames (sk);
@@ -241,5 +241,7 @@ static void nr_t1timer_expiry(struct timer_list *t) }nr_start_t1timer (sk); +out:bh_unlock_sock (sk); +sock_put (sk); }
net/sched/act_skbmod.c +8 -4
@@ -6,6 +6,7 @@*/ #include <linux/module.h> +#include <linux/if_arp.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/skbuff.h>
@@ -33,6 +34,13 @@ static int tcf_skbmod_act(struct sk_buff *skb, const struct tc_action *a,tcf_lastuse_update (&d->tcf_tm);bstats_cpu_update (this_cpu_ptr (d->common.cpu_bstats), skb); + action =READ_ONCE (d->tcf_action); +if (unlikely (action ==TC_ACT_SHOT )) + goto drop; + +if (!skb->dev || skb->dev->type !=ARPHRD_ETHER ) +return action; +/* XXX: if you are going to edit more fields beyond ethernet header * (example when you add IP header replacement or vlan swap) * then MAX_EDIT_LEN needs to change appropriately
@@ -41,10 +49,6 @@ static int tcf_skbmod_act(struct sk_buff *skb, const struct tc_action *a,if (unlikely (err))/* best policy is to drop on the floor */ goto drop; - action =READ_ONCE (d->tcf_action); -if (unlikely (action ==TC_ACT_SHOT )) - goto drop; - p =rcu_dereference_bh (d->skbmod_p); flags = p->flags;if (flags &SKBMOD_F_DMAC )
net/sched/cls_api.c +1 -1
@@ -2866,7 +2866,7 @@ static int tc_ctl_chain(struct sk_buff *skb, struct nlmsghdr *n,break ;case RTM_GETCHAIN : err =tc_chain_notify (chain, skb, n->nlmsg_seq, - n->nlmsg_seq, n->nlmsg_type, true); + n->nlmsg_flags, n->nlmsg_type, true);if (err <0 )NL_SET_ERR_MSG (extack,"Failed to send chain notify message" );break ;
net/sched/cls_tcindex.c +4 -1
@@ -278,6 +278,8 @@ static int tcindex_filter_result_init(struct tcindex_filter_result *r, TCA_TCINDEX_POLICE); } +static void tcindex_free_perfect_hash (struct tcindex_data *cp); +static void tcindex_partial_destroy_work (struct work_struct *work) { struct tcindex_data *p = container_of(to_rcu_work(work),
@@ -285,7 +287,8 @@ static void tcindex_partial_destroy_work(struct work_struct *work) rwork);rtnl_lock (); -kfree (p->perfect); +if (p->perfect) +tcindex_free_perfect_hash (p);kfree (p);rtnl_unlock (); }
net/sctp/auth.c +2 -0
@@ -866,6 +866,8 @@ int sctp_auth_set_key(struct sctp_endpoint *ep,if (replace) {list_del_init (&shkey->key_list);sctp_auth_shkey_release (shkey); +if (asoc && asoc->active_key_id == auth_key->sca_keynumber) +sctp_auth_asoc_init_active_key (asoc,GFP_KERNEL ); }list_add (&cur_key->key_list, sh_keys);
sound/isa/sb/sb16_csp.c +4 -0
@@ -814,6 +814,7 @@ static int snd_sb_csp_start(struct snd_sb_csp * p, int sample_width, int channel mixR =snd_sbmixer_read (p->chip,SB_DSP4_PCM_DEV +1 );snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV , mixL &0x7 );snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV +1 , mixR &0x7 ); +spin_unlock_irqrestore (&p->chip->mixer_lock, flags);spin_lock (&p->chip->reg_lock);set_mode_register (p->chip,0xc0 );/* c0 = STOP */
@@ -853,6 +854,7 @@ static int snd_sb_csp_start(struct snd_sb_csp * p, int sample_width, int channelspin_unlock (&p->chip->reg_lock);/* restore PCM volume */ +spin_lock_irqsave (&p->chip->mixer_lock, flags);snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV , mixL);snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV +1 , mixR);spin_unlock_irqrestore (&p->chip->mixer_lock, flags);
@@ -878,6 +880,7 @@ static int snd_sb_csp_stop(struct snd_sb_csp * p) mixR =snd_sbmixer_read (p->chip,SB_DSP4_PCM_DEV +1 );snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV , mixL &0x7 );snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV +1 , mixR &0x7 ); +spin_unlock_irqrestore (&p->chip->mixer_lock, flags);spin_lock (&p->chip->reg_lock);if (p->running &SNDRV_SB_CSP_ST_QSOUND ) {
@@ -892,6 +895,7 @@ static int snd_sb_csp_stop(struct snd_sb_csp * p)spin_unlock (&p->chip->reg_lock);/* restore PCM volume */ +spin_lock_irqsave (&p->chip->mixer_lock, flags);snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV , mixL);snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV +1 , mixR);spin_unlock_irqrestore (&p->chip->mixer_lock, flags);
sound/pci/hda/patch_hdmi.c +1 -0
@@ -1820,6 +1820,7 @@ static int hdmi_add_cvt(struct hda_codec *codec, hda_nid_t cvt_nid)static const struct snd_pci_quirk force_connect_list[] = {SND_PCI_QUIRK (0x103c ,0x870f ,"HP" ,1 ),SND_PCI_QUIRK (0x103c ,0x871a ,"HP" ,1 ), +SND_PCI_QUIRK (0x1462 ,0xec94 ,"MS-7C94" ,1 ), {} };
sound/soc/codecs/rt5631.c +2 -0
@@ -1691,6 +1691,8 @@ static const struct regmap_config rt5631_regmap_config = { .reg_defaults = rt5631_reg, .num_reg_defaults = ARRAY_SIZE(rt5631_reg), .cache_type = REGCACHE_RBTREE, + .use_single_read = true, + .use_single_write = true, }; static int rt5631_i2c_probe(struct i2c_client *i2c,
sound/usb/mixer.c +9 -1
@@ -3242,7 +3242,15 @@ static void snd_usb_mixer_dump_cval(struct snd_info_buffer *buffer, {struct usb_mixer_elem_info *cval =mixer_elem_list_to_info (list);static const char *const val_types[] = { -"BOOLEAN" ,"INV_BOOLEAN" ,"S8" ,"U8" ,"S16" ,"U16" ,"S32" ,"U32" , + [USB_MIXER_BOOLEAN ] ="BOOLEAN" , + [USB_MIXER_INV_BOOLEAN ] ="INV_BOOLEAN" , + [USB_MIXER_S8 ] ="S8" , + [USB_MIXER_U8 ] ="U8" , + [USB_MIXER_S16 ] ="S16" , + [USB_MIXER_U16 ] ="U16" , + [USB_MIXER_S32 ] ="S32" , + [USB_MIXER_U32 ] ="U32" , + [USB_MIXER_BESPOKEN ] ="BESPOKEN" , }; snd_iprintf(buffer, " Info: id=%i, control=%i, cmask=0x%x, " "channels=%i, type=\"%s\"\n", cval->head.id,
sound/usb/quirks.c +3 -0
@@ -1840,6 +1840,9 @@ static const struct registration_quirk registration_quirks[] = {REG_QUIRK_ENTRY (0x0951 ,0x16d8 ,2 ),/* Kingston HyperX AMP */ REG_QUIRK_ENTRY (0x0951 ,0x16ed ,2 ),/* Kingston HyperX Cloud Alpha S */ REG_QUIRK_ENTRY (0x0951 ,0x16ea ,2 ),/* Kingston HyperX Cloud Flight S */ +REG_QUIRK_ENTRY (0x0ecb ,0x1f46 ,2 ),/* JBL Quantum 600 */ +REG_QUIRK_ENTRY (0x0ecb ,0x2039 ,2 ),/* JBL Quantum 400 */ +REG_QUIRK_ENTRY (0x0ecb ,0x203e ,2 ),/* JBL Quantum 800 */ { 0 } /* terminator */ };
tools/bpf/bpftool/common.c +5 -0
@@ -171,6 +171,11 @@ int mount_bpffs_for_pin(const char *name)int err =0 ; file =malloc (strlen (name) +1 ); +if (!file) { +p_err ("mem alloc failed" ); +return -1 ; + } +strcpy (file, name); dir =dirname (file);
tools/perf/builtin-inject.c +6 -2
@@ -836,8 +836,10 @@ int cmd_inject(int argc, const char **argv) data.path = inject.input_name; inject.session =perf_session__new (&data, inject.output.is_pipe, &inject.tool); -if (IS_ERR (inject.session)) -return PTR_ERR (inject.session); +if (IS_ERR (inject.session)) { + ret =PTR_ERR (inject.session); + goto out_close_output; + }if (zstd_init (&(inject.session->zstd_data),0 ) <0 )pr_warning ("Decompression initialization failed.\n" );
@@ -874,5 +876,7 @@ int cmd_inject(int argc, const char **argv) out_delete:zstd_fini (&(inject.session->zstd_data));perf_session__delete (inject.session); +out_close_output: +perf_data__close (&inject.output);return ret; }
tools/perf/builtin-script.c +7 -0
@@ -2474,6 +2474,12 @@ static void perf_script__exit_per_event_dump_stats(struct perf_script *script) } } +static void perf_script__exit (struct perf_script *script) +{ +perf_thread_map__put (script->threads); +perf_cpu_map__put (script->cpus); +} +static int __cmd_script (struct perf_script *script) {int ret;
@@ -3893,6 +3899,7 @@ int cmd_script(int argc, const char **argv)perf_evlist__free_stats (session->evlist);perf_session__delete (session); +perf_script__exit (&script);if (script_started)cleanup_scripting ();
tools/perf/tests/event_update.c +1 -1
@@ -119,6 +119,6 @@ int test__event_update(struct test *test __maybe_unused, int subtest __maybe_unuTEST_ASSERT_VAL ("failed to synthesize attr update cpus" , !perf_event__synthesize_event_update_cpus (&tmp.tool, evsel, process_event_cpus)); -perf_cpu_map__put (evsel->core.own_cpus); +evlist__delete (evlist);return 0 ; }
tools/perf/tests/topology.c +1 -0
@@ -52,6 +52,7 @@ static int session_write_header(char *path)TEST_ASSERT_VAL ("failed to write header" , !perf_session__write_header (session, session->evlist, data.file.fd, true)); +evlist__delete (session->evlist);perf_session__delete (session);return 0 ;
tools/perf/util/data.c +1 -1
@@ -20,7 +20,7 @@static void close_dir (struct perf_data_file *files,int nr) { -while (--nr >=1 ) { +while (--nr >=0 ) {close (files[nr].fd);zfree (&files[nr].path); }
tools/perf/util/dso.c +3 -1
@@ -1086,8 +1086,10 @@ struct map *dso__new_map(const char *name)struct map *map =NULL ;struct dso *dso =dso__new (name); -if (dso) +if (dso) { map =map__new2 (0 , dso); +dso__put (dso); + }return map; }
tools/perf/util/env.c +1 -0
@@ -175,6 +175,7 @@ void perf_env__exit(struct perf_env *env)zfree (&env->cpuid);zfree (&env->cmdline);zfree (&env->cmdline_argv); +zfree (&env->sibling_dies);zfree (&env->sibling_cores);zfree (&env->sibling_threads);zfree (&env->pmu_mappings);
tools/perf/util/lzma.c +5 -3
@@ -69,7 +69,7 @@ int lzma_decompress_to_file(const char *input, int output_fd)if (ferror (infile)) {pr_err ("lzma: read error: %s\n" ,strerror (errno)); - goto err_fclose; + goto err_lzma_end; }if (feof (infile))
@@ -83,7 +83,7 @@ int lzma_decompress_to_file(const char *input, int output_fd)if (writen (output_fd, buf_out, write_size) != write_size) {pr_err ("lzma: write error: %s\n" ,strerror (errno)); - goto err_fclose; + goto err_lzma_end; } strm.next_out = buf_out;
@@ -95,11 +95,13 @@ int lzma_decompress_to_file(const char *input, int output_fd)break ;pr_err ("lzma: failed %s\n" ,lzma_strerror (ret)); - goto err_fclose; + goto err_lzma_end; } } err =0 ; +err_lzma_end: +lzma_end (&strm); err_fclose:fclose (infile);return err;
tools/perf/util/map.c +2 -0
@@ -214,6 +214,8 @@ struct map *map__new(struct machine *machine, u64 start, u64 len,if (!(prot &PROT_EXEC ))dso__set_loaded (dso); } + +nsinfo__put (dso->nsinfo); dso->nsinfo = nsi;dso__put (dso); }
tools/perf/util/probe-event.c +3 -1
@@ -175,8 +175,10 @@ struct map *get_target_map(const char *target, struct nsinfo *nsi, bool user)struct map *map; map =dso__new_map (target); -if (map && map->dso) +if (map && map->dso) { +nsinfo__put (map->dso->nsinfo); map->dso->nsinfo =nsinfo__get (nsi); + }return map; }else {return kernel_get_module_map (target);
tools/perf/util/probe-file.c +2 -2
@@ -337,11 +337,11 @@ int probe_file__del_events(int fd, struct strfilter *filter) ret =probe_file__get_events (fd, filter, namelist);if (ret <0 ) -return ret; + goto out; ret =probe_file__del_strlist (fd, namelist); +out:strlist__delete (namelist); -return ret; }
tools/testing/selftests/net/icmp_redirect.sh +3 -2
@@ -309,9 +309,10 @@ check_exception() fi log_test $? 0 "IPv4: ${desc}" - if [ "$with_redirect" = "yes" ]; then + # No PMTU info for test "redirect" and "mtu exception plus redirect" + if [ "$with_redirect" = "yes" ] && [ "$desc" != "redirect exception plus mtu" ]; then ip -netns h1 -6 ro get ${H1_VRF_ARG} ${H2_N2_IP6} | \ - grep -q "${H2_N2_IP6} from :: via ${R2_LLADDR} dev br0.*${mtu}" + grep -v "mtu" | grep -q "${H2_N2_IP6} .*via ${R2_LLADDR} dev br0" elif [ -n "${mtu}" ]; then ip -netns h1 -6 ro get ${H1_VRF_ARG} ${H2_N2_IP6} | \ grep -q "${mtu}"
tools/testing/selftests/vm/userfaultfd.c +4 -2
@@ -139,8 +139,10 @@ static int anon_release_pages(char *rel_area)static void anon_allocate_area (void **alloc_area) { -if (posix_memalign (alloc_area, page_size, nr_pages * page_size)) { -fprintf (stderr,"out of memory\n" ); + *alloc_area =mmap (NULL , nr_pages * page_size,PROT_READ |PROT_WRITE , +MAP_ANONYMOUS |MAP_PRIVATE ,-1 ,0 ); +if (*alloc_area ==MAP_FAILED ) +fprintf (stderr,"mmap of anonymous memory failed" ); *alloc_area =NULL ; } }