Linux 5.10.56
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.10.56 kernel.
All users of the 5.10 kernel series must upgrade.
The updated 5.10.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.10.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
------------
Makefile | 2 arch/alpha/kernel/setup.c | 13 arch/arm/net/bpf_jit_32.c | 3 arch/arm64/net/bpf_jit_comp.c | 13 arch/mips/net/ebpf_jit.c | 3 arch/powerpc/net/bpf_jit_comp64.c | 6 arch/powerpc/platforms/pseries/setup.c | 2 arch/riscv/net/bpf_jit_comp32.c | 4 arch/riscv/net/bpf_jit_comp64.c | 4 arch/s390/net/bpf_jit_comp.c | 5 arch/sparc/net/bpf_jit_comp_64.c | 3 arch/x86/include/asm/proto.h | 2 arch/x86/kvm/ioapic.c | 2 arch/x86/kvm/ioapic.h | 4 arch/x86/kvm/x86.c | 4 arch/x86/net/bpf_jit_comp.c | 7 arch/x86/net/bpf_jit_comp32.c | 6 block/blk-iocost.c | 11 drivers/acpi/dptf/dptf_pch_fivr.c | 51 ++- drivers/acpi/resource.c | 9 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 8 drivers/gpu/drm/amd/amdgpu/psp_v12_0.c | 7 drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c | 2 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 2 drivers/gpu/drm/msm/dp/dp_catalog.c | 1 drivers/hid/wacom_wac.c | 2 drivers/infiniband/hw/bnxt_re/main.c | 4 drivers/infiniband/hw/bnxt_re/qplib_res.c | 10 drivers/infiniband/hw/bnxt_re/qplib_res.h | 1 drivers/net/can/spi/hi311x.c | 2 drivers/net/can/usb/ems_usb.c | 14 drivers/net/can/usb/esd_usb2.c | 16 drivers/net/can/usb/mcba_usb.c | 2 drivers/net/can/usb/peak_usb/pcan_usb.c | 10 drivers/net/can/usb/usb_8dev.c | 15 drivers/net/ethernet/dec/tulip/winbond-840.c | 7 drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 6 drivers/net/ethernet/intel/i40e/i40e_main.c | 61 ++- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 50 ++ drivers/net/ethernet/intel/i40e/i40e_txrx.h | 2 drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c | 7 drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c | 5 drivers/net/ethernet/mellanox/mlx4/main.c | 1 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 33 + drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 10 drivers/net/ethernet/pensando/ionic/ionic_lif.c | 14 drivers/net/ethernet/pensando/ionic/ionic_txrx.c | 41 +- drivers/net/ethernet/sis/sis900.c | 7 drivers/net/ethernet/sun/niu.c | 3 drivers/nfc/nfcsim.c | 3 fs/btrfs/compression.c | 2 fs/btrfs/volumes.c | 1 fs/cifs/file.c | 2 fs/io_uring.c | 2 fs/ocfs2/file.c | 103 +++--- fs/pipe.c | 10 include/linux/bpf_types.h | 1 include/linux/bpf_verifier.h | 11 include/linux/filter.h | 15 include/linux/skmsg.h | 1 include/net/llc_pdu.h | 31 + kernel/bpf/core.c | 19 + kernel/bpf/disasm.c | 16 kernel/bpf/verifier.c | 186 +++-------- net/can/j1939/transport.c | 11 net/can/raw.c | 20 + net/core/skmsg.c | 3 net/ipv4/ip_tunnel.c | 2 net/llc/af_llc.c | 10 net/llc/llc_s_ac.c | 2 net/mac80211/cfg.c | 19 + net/mac80211/ieee80211_i.h | 2 net/mac80211/mlme.c | 4 net/netfilter/nf_conntrack_core.c | 7 net/netfilter/nft_nat.c | 4 net/qrtr/qrtr.c | 6 net/sctp/input.c | 2 net/tipc/crypto.c | 14 net/tipc/socket.c | 30 + net/wireless/scan.c | 6 tools/perf/util/map.c | 2 tools/testing/selftests/vm/userfaultfd.c | 2 virt/kvm/kvm_main.c | 28 + 83 files changed, 707 insertions(+), 367 deletions(-)
Arkadiusz Kubalewski (2):
i40e: Fix logic of disabling queues
i40e: Fix firmware LLDP agent related warning
Arnaldo Carvalho de Melo (1):
Revert "perf map: Fix dso->nsinfo refcounting"
Bjorn Andersson (1):
drm/msm/dp: Initialize the INTF_CONFIG register
Cong Wang (1):
skmsg: Make sk_psock_destroy() static
Dale Zhao (1):
drm/amd/display: ensure dentist display clock update finished in DCN20
Dan Carpenter (1):
can: hi311x: fix a signedness bug in hi3110_cmd()
Daniel Borkmann (4):
bpf: Introduce BPF nospec instruction for mitigating Spectre v4
bpf: Fix leakage due to insufficient speculative store bypass mitigation
bpf: Remove superfluous aux sanitation on subprog rejection
bpf: Fix pointer arithmetic mask tightening under state pruning
Desmond Cheong Zhi Xi (1):
btrfs: fix rw device counting in __btrfs_free_extra_devids
Dima Chumak (1):
net/mlx5e: Fix nullptr in mlx5e_hairpin_get_mdev()
Felix Fietkau (1):
mac80211: fix enabling 4-address mode on a sta vif after assoc
Florian Westphal (1):
netfilter: conntrack: adjust stop timestamp to real expiry value
Geetha sowjanya (1):
octeontx2-pf: Fix interface down flag on error
Gilad Naaman (1):
net: Set true network header for ECN decapsulation
Goldwyn Rodrigues (1):
btrfs: mark compressed range uptodate only if all bio succeed
Greg Kroah-Hartman (2):
selftest: fix build error in tools/testing/selftests/vm/userfaultfd.c Linux 5.10.56
Hoang Le (1):
tipc: fix sleeping in tipc accept routine
Hui Wang (1):
Revert "ACPI: resources: Add checks for ACPI IRQ override"
Jan Kiszka (1):
x86/asm: Ensure asm/proto.h can be included stand-alone
Jason Gerecke (1):
HID: wacom: Re-enable touch by default for Cintiq 24HDT / 27QHDT
Jedrzej Jagielski (2):
i40e: Fix queue-to-TC mapping on Tx
i40e: Fix log TC creation failure when max num of queues is exceeded
Jiapeng Chong (1):
mlx4: Fix missing error code in mlx4_load_one()
Jiri Kosina (2):
drm/amdgpu: Avoid printing of stack contents on firmware load error drm/amdgpu: Fix resource leak on probe error path
Juergen Gross (1):
x86/kvm: fix vcpu-id indexed array sizes
Junxiao Bi (2):
ocfs2: fix zero out valid data
ocfs2: issue zeroout to EOF blocks
Krzysztof Kozlowski (1):
nfc: nfcsim: fix use after free during module unload
Linus Torvalds (1):
pipe: make pipe writes always wake up readers
Lorenz Bauer (2):
bpf: Fix OOB read when printing XDP link fdinfo
bpf: verifier: Allocate idmap scratch in verifier env
Lukasz Cieplicki (1):
i40e: Add additional info to PHY type error
Maor Gottlieb (1):
net/mlx5: Fix flow table chaining
Marcelo Ricardo Leitner (1):
sctp: fix return value check in __sctp_rcv_asconf_lookup
Mike Rapoport (1):
alpha: register early reserved memory in memblock
Naresh Kumar PBS (1):
RDMA/bnxt_re: Fix stats counters
Nguyen Dinh Phi (1):
cfg80211: Fix possible memory leak in function cfg80211_bss_update
Oleksij Rempel (1):
can: j1939: j1939_session_deactivate(): clarify lifetime of session object
Pablo Neira Ayuso (1):
netfilter: nft_nat: allow to specify layer 4 protocol NAT only
Paolo Bonzini (1):
KVM: add missing compat KVM_CLEAR_DIRTY_LOG
Paul Jakma (1):
NIU: fix incorrect error return, missed in previous revert
Pavel Skripkin (6):
can: mcba_usb_start(): add missing urb->transfer_dma initialization
can: usb_8dev: fix memory leak
can: ems_usb: fix memory leak
can: esd_usb2: fix memory leak
net: qrtr: fix memory leaks
net: llc: fix skb_over_panic
Robert Foss (1):
drm/msm/dpu: Fix sm8250_mdp register length
Shannon Nelson (3):
ionic: remove intr coalesce update from napi
ionic: fix up dim accounting for tx and rx
ionic: count csum_none when offload enabled
Srikar Dronamraju (1):
powerpc/pseries: Fix regression while building external modules
Srinivas Pandruvada (1):
ACPI: DPTF: Fix reading of attributes
Stephane Grosjean (1):
can: peak_usb: pcan_usb_handle_bus_evt(): fix reading rxerr/txerr values
Steve French (1):
SMB3: fix readpage for large swap cache
Tejun Heo (1):
blk-iocost: fix operation ordering in iocg_wake_fn()
Vitaly Kuznetsov (1):
KVM: x86: Check the right feature bit for MSR_KVM_ASYNC_PF_ACK access
Wang Hai (2):
tulip: windbond-840: Fix missing pci_disable_device() in probe and remove
sis900: Fix missing pci_disable_device() in probe and remove
Xin Long (2):
tipc: fix implicit-connect for SYN+
tipc: do not write skb_shinfo frags when doing decrytion
Yang Yingliang (1):
io_uring: fix null-ptr-deref in io_sq_offload_start()
Zhang Changzhong (1):
can: j1939: j1939_xtp_rx_dat_one(): fix rxtimer value between consecutive TP.DT to 750ms
Ziyang Xuan (1):
can: raw: raw_setsockopt(): fix raw_rcv panic for sock UAF
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 10 -SUBLEVEL = 55 +SUBLEVEL = 56 EXTRAVERSION = NAME = Dare mighty things
arch/alpha/kernel/setup.c +7 -6
@@ -325,18 +325,19 @@ setup_memory(void *kernel_end) i, cluster->usage, cluster->start_pfn, cluster->start_pfn + cluster->numpages); -/* Bit 0 is console/PALcode reserved. Bit 1 is -non-volatile memory -- we might want to mark -this for later. */ -if (cluster->usage &3 ) -continue ; - end = cluster->start_pfn + cluster->numpages;if (end > max_low_pfn) max_low_pfn = end;memblock_add (PFN_PHYS (cluster->start_pfn), cluster->numpages <<PAGE_SHIFT ); + +/* Bit 0 is console/PALcode reserved. Bit 1 is +non-volatile memory -- we might want to mark +this for later. */ +if (cluster->usage &3 ) +memblock_reserve (PFN_PHYS (cluster->start_pfn), + cluster->numpages <<PAGE_SHIFT ); }/*
arch/arm/net/bpf_jit_32.c +3 -0
@@ -1602,6 +1602,9 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx) rn =arm_bpf_get_reg32 (src_lo, tmp2[1 ], ctx);emit_ldx_r (dst, rn, off, ctx,BPF_SIZE (code));break ; +/* speculation barrier */ +case BPF_ST |BPF_NOSPEC : +break ;/* ST: *(size *)(dst + off) = imm */ case BPF_ST |BPF_MEM |BPF_W :case BPF_ST |BPF_MEM |BPF_H :
arch/arm64/net/bpf_jit_comp.c +13 -0
@@ -829,6 +829,19 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,return ret;break ; +/* speculation barrier */ +case BPF_ST |BPF_NOSPEC : +/* +* Nothing required here. +* +* In case of arm64, we rely on the firmware mitigation of +* Speculative Store Bypass as controlled via the ssbd kernel +* parameter. Whenever the mitigation is enabled, it works +* for all of the kernel code with no need to provide any +* additional instructions. +*/ +break ; +/* ST: *(size *)(dst + off) = imm */ case BPF_ST |BPF_MEM |BPF_W :case BPF_ST |BPF_MEM |BPF_H :
arch/mips/net/ebpf_jit.c +3 -0
@@ -1355,6 +1355,9 @@ static int build_one_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, }break ; +case BPF_ST |BPF_NOSPEC :/* speculation barrier */ +break ; +case BPF_ST |BPF_B |BPF_MEM :case BPF_ST |BPF_H |BPF_MEM :case BPF_ST |BPF_W |BPF_MEM :
arch/powerpc/net/bpf_jit_comp64.c +6 -0
@@ -646,6 +646,12 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, }break ; +/* +* BPF_ST NOSPEC (speculation barrier) +*/ +case BPF_ST |BPF_NOSPEC : +break ; +/* * BPF_ST(X) */
arch/powerpc/platforms/pseries/setup.c +1 -1
@@ -76,7 +76,7 @@#include "../../../../drivers/pci/pci.h" DEFINE_STATIC_KEY_FALSE (shared_processor); -EXPORT_SYMBOL_GPL (shared_processor); +EXPORT_SYMBOL (shared_processor);int CMO_PrPSP =-1 ;int CMO_SecPSP =-1 ;
arch/riscv/net/bpf_jit_comp32.c +4 -0
@@ -1251,6 +1251,10 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,return -1 ;break ; +/* speculation barrier */ +case BPF_ST |BPF_NOSPEC : +break ; +case BPF_ST |BPF_MEM |BPF_B :case BPF_ST |BPF_MEM |BPF_H :case BPF_ST |BPF_MEM |BPF_W :
arch/riscv/net/bpf_jit_comp64.c +4 -0
@@ -939,6 +939,10 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,emit_ld (rd,0 ,RV_REG_T1 , ctx);break ; +/* speculation barrier */ +case BPF_ST |BPF_NOSPEC : +break ; +/* ST: *(size *)(dst + off) = imm */ case BPF_ST |BPF_MEM |BPF_B :emit_imm (RV_REG_T1 , imm, ctx);
arch/s390/net/bpf_jit_comp.c +5 -0
@@ -1153,6 +1153,11 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp,break ; }break ; +/* +* BPF_NOSPEC (speculation barrier) +*/ +case BPF_ST |BPF_NOSPEC : +break ;/* * BPF_ST(X) */
arch/sparc/net/bpf_jit_comp_64.c +3 -0
@@ -1287,6 +1287,9 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)return 1 ;break ; } +/* speculation barrier */ +case BPF_ST |BPF_NOSPEC : +break ;/* ST: *(size *)(dst + off) = imm */ case BPF_ST |BPF_MEM |BPF_W :case BPF_ST |BPF_MEM |BPF_H :
arch/x86/include/asm/proto.h +2 -0
@@ -4,6 +4,8 @@#include <asm/ldt.h> +struct task_struct ; +/* misc architecture specific prototypes */ void syscall_init (void );
arch/x86/kvm/ioapic.c +1 -1
@@ -96,7 +96,7 @@ static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic,static void rtc_irq_eoi_tracking_reset (struct kvm_ioapic *ioapic) { ioapic->rtc_status.pending_eoi =0 ; -bitmap_zero (ioapic->rtc_status.dest_map.map,KVM_MAX_VCPU_ID ); +bitmap_zero (ioapic->rtc_status.dest_map.map,KVM_MAX_VCPU_ID +1 ); }static void kvm_rtc_eoi_tracking_restore_all (struct kvm_ioapic *ioapic);
arch/x86/kvm/ioapic.h +2 -2
@@ -43,13 +43,13 @@ struct kvm_vcpu;struct dest_map {/* vcpu bitmap where IRQ has been sent */ - DECLARE_BITMAP(map, KVM_MAX_VCPU_ID); + DECLARE_BITMAP(map, KVM_MAX_VCPU_ID + 1);/* * Vector sent to a given vcpu, only valid when * the vcpu's bit in map is set */ -u8 vectors[KVM_MAX_VCPU_ID ]; +u8 vectors[KVM_MAX_VCPU_ID +1 ]; };
arch/x86/kvm/x86.c +2 -2
@@ -3205,7 +3205,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)return 1 ;break ;case MSR_KVM_ASYNC_PF_ACK : -if (!guest_pv_has (vcpu,KVM_FEATURE_ASYNC_PF )) +if (!guest_pv_has (vcpu,KVM_FEATURE_ASYNC_PF_INT ))return 1 ;if (data &0x1 ) { vcpu->arch.apf.pageready_pending = false;
@@ -3534,7 +3534,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) msr_info->data = vcpu->arch.apf.msr_int_val;break ;case MSR_KVM_ASYNC_PF_ACK : -if (!guest_pv_has (vcpu,KVM_FEATURE_ASYNC_PF )) +if (!guest_pv_has (vcpu,KVM_FEATURE_ASYNC_PF_INT ))return 1 ; msr_info->data =0 ;
arch/x86/net/bpf_jit_comp.c +7 -0
@@ -1141,6 +1141,13 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, }break ; +/* speculation barrier */ +case BPF_ST |BPF_NOSPEC : +if (boot_cpu_has (X86_FEATURE_XMM2 )) +/* Emit 'lfence' */ +EMIT3 (0x0F ,0xAE ,0xE8 ); +break ; +/* ST: *(u8*)(dst_reg + off) = imm */ case BPF_ST |BPF_MEM |BPF_B :if (is_ereg (dst_reg))
arch/x86/net/bpf_jit_comp32.c +6 -0
@@ -1705,6 +1705,12 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, i++;break ; } +/* speculation barrier */ +case BPF_ST |BPF_NOSPEC : +if (boot_cpu_has (X86_FEATURE_XMM2 )) +/* Emit 'lfence' */ +EMIT3 (0x0F ,0xAE ,0xE8 ); +break ;/* ST: *(u8*)(dst_reg + off) = imm */ case BPF_ST |BPF_MEM |BPF_H :case BPF_ST |BPF_MEM |BPF_B :
block/blk-iocost.c +6 -5
@@ -1394,16 +1394,17 @@ static int iocg_wake_fn(struct wait_queue_entry *wq_entry, unsigned mode,return -1 ;iocg_commit_bio (ctx->iocg, wait->bio, wait->abs_cost, cost); + wait->committed = true;/* * autoremove_wake_function() removes the wait entry only when it -* actually changed the task state. We want the wait always -* removed. Remove explicitly and use default_wake_function(). +* actually changed the task state. We want the wait always removed. +* Remove explicitly and use default_wake_function(). Note that the +* order of operations is important as finish_wait() tests whether +* @wq_entry is removed without grabbing the lock. */ -list_del_init (&wq_entry->entry); - wait->committed = true; -default_wake_function (wq_entry, mode, flags, key); +list_del_init_careful (&wq_entry->entry);return 0 ; }
drivers/acpi/dptf/dptf_pch_fivr.c +43 -8
64 lines not on this page · raw message
drivers/acpi/resource.c +1 -8
@@ -430,13 +430,6 @@ static void acpi_dev_get_irqresource(struct resource *res, u32 gsi, } } -static bool irq_is_legacy (struct acpi_resource_irq *irq) -{ -return irq->triggering ==ACPI_EDGE_SENSITIVE && - irq->polarity ==ACPI_ACTIVE_HIGH && - irq->shareable ==ACPI_EXCLUSIVE ; -} -/** * acpi_dev_resource_interrupt - Extract ACPI interrupt resource information. * @ares: Input ACPI resource object.
@@ -475,7 +468,7 @@ bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index, }acpi_dev_get_irqresource (res, irq->interrupts[index], irq->triggering, irq->polarity, - irq->shareable,irq_is_legacy (irq)); + irq->shareable, true);break ;case ACPI_RESOURCE_TYPE_EXTENDED_IRQ : ext_irq = &ares->data.extended_irq;
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +2 -6
@@ -3322,13 +3322,13 @@ int amdgpu_device_init(struct amdgpu_device *adev, r =amdgpu_device_get_job_timeout_settings (adev);if (r) {dev_err (adev->dev,"invalid lockup_timeout parameter syntax\n" ); - goto failed_unmap; +return r; }/* early init functions */ r =amdgpu_device_ip_early_init (adev);if (r) - goto failed_unmap; +return r;/* doorbell bar mapping and doorbell index init*/ amdgpu_device_doorbell_init (adev);
@@ -3532,10 +3532,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,if (boco)vga_switcheroo_fini_domain_pm_ops (adev->dev); -failed_unmap: -iounmap (adev->rmmio); - adev->rmmio =NULL ; -return r; }
drivers/gpu/drm/amd/amdgpu/psp_v12_0.c +3 -4
@@ -67,7 +67,7 @@ static int psp_v12_0_init_microcode(struct psp_context *psp) err =psp_init_asd_microcode (psp, chip_name);if (err) - goto out; +return err;snprintf (fw_name,sizeof (fw_name),"amdgpu/%s_ta.bin" , chip_name); err =request_firmware (&adev->psp.ta_fw, fw_name, adev->dev);
@@ -80,7 +80,7 @@ static int psp_v12_0_init_microcode(struct psp_context *psp) }else { err =amdgpu_ucode_validate (adev->psp.ta_fw);if (err) - goto out2; + goto out; ta_hdr = (const struct ta_firmware_header_v1_0 *) adev->psp.ta_fw->data;
@@ -105,10 +105,9 @@ static int psp_v12_0_init_microcode(struct psp_context *psp)return 0 ; -out2: +out:release_firmware (adev->psp.ta_fw); adev->psp.ta_fw =NULL ; -out:if (err) { dev_err(adev->dev, "psp v12.0: Failed to load firmware \"%s\"\n",
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c +1 -1
@@ -135,7 +135,7 @@ void dcn20_update_clocks_update_dentist(struct clk_mgr_internal *clk_mgr)REG_UPDATE (DENTIST_DISPCLK_CNTL ,DENTIST_DISPCLK_WDIVIDER , dispclk_wdivider); -// REG_WAIT(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_CHG_DONE, 1, 5, 100); +REG_WAIT (DENTIST_DISPCLK_CNTL ,DENTIST_DISPCLK_CHG_DONE ,1 ,50 ,1000 );REG_UPDATE (DENTIST_DISPCLK_CNTL ,DENTIST_DPPCLK_WDIVIDER , dppclk_wdivider);REG_WAIT (DENTIST_DISPCLK_CNTL ,DENTIST_DPPCLK_CHG_DONE ,1 ,5 ,100 );
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c +1 -1
@@ -168,7 +168,7 @@ static const struct dpu_mdp_cfg sc7180_mdp[] = {static const struct dpu_mdp_cfg sm8250_mdp[] = { { .name ="top_0" , .id =MDP_TOP , - .base =0x0 , .len =0x45C , + .base =0x0 , .len =0x494 , .features =0 , .highest_bank_bit =0x3 ,/* TODO: 2 for LP_DDR4 */ .clk_ctrls[DPU_CLK_CTRL_VIG0 ] = {
drivers/gpu/drm/msm/dp/dp_catalog.c +1 -0
@@ -740,6 +740,7 @@ int dp_catalog_panel_timing_cfg(struct dp_catalog *dp_catalog)dp_write_link (catalog,REG_DP_HSYNC_VSYNC_WIDTH_POLARITY , dp_catalog->width_blanking);dp_write_link (catalog,REG_DP_ACTIVE_HOR_VER , dp_catalog->dp_active); +dp_write_p0 (catalog,MMSS_DP_INTF_CONFIG ,0 );return 0 ; }
drivers/hid/wacom_wac.c +1 -1
@@ -3829,7 +3829,7 @@ int wacom_setup_touch_input_capabilities(struct input_dev *input_dev, wacom_wac->shared->touch->product == 0xF6) { input_dev->evbit[0 ] |=BIT_MASK (EV_SW );__set_bit (SW_MUTE_DEVICE , input_dev->swbit); - wacom_wac->shared->has_mute_touch_switch = true; + wacom_wac->has_mute_touch_switch = true; } fallthrough;
drivers/infiniband/hw/bnxt_re/main.c +3 -1
@@ -119,6 +119,7 @@ static int bnxt_re_setup_chip_ctx(struct bnxt_re_dev *rdev, u8 wqe_mode)if (!chip_ctx)return -ENOMEM ; chip_ctx->chip_num = bp->chip_num; + chip_ctx->hw_stats_size = bp->hw_ring_stats_size; rdev->chip_ctx = chip_ctx;/* rest members to follow eventually */
@@ -507,6 +508,7 @@ static int bnxt_re_net_stats_ctx_alloc(struct bnxt_re_dev *rdev,dma_addr_t dma_map, u32 *fw_stats_ctx_id) { + struct bnxt_qplib_chip_ctx *chip_ctx = rdev->chip_ctx;struct hwrm_stat_ctx_alloc_output resp = {0 };struct hwrm_stat_ctx_alloc_input req = {0 };struct bnxt_en_dev *en_dev = rdev->en_dev;
@@ -523,7 +525,7 @@ static int bnxt_re_net_stats_ctx_alloc(struct bnxt_re_dev *rdev,bnxt_re_init_hwrm_hdr (rdev, (void *)&req,HWRM_STAT_CTX_ALLOC ,-1 ,-1 ); req.update_period_ms =cpu_to_le32 (1000 ); req.stats_dma_addr =cpu_to_le64 (dma_map); - req.stats_dma_length =cpu_to_le16 (sizeof (struct ctx_hw_stats_ext )); + req.stats_dma_length =cpu_to_le16 (chip_ctx->hw_stats_size); req.stat_ctx_flags =STAT_CTX_ALLOC_REQ_STAT_CTX_FLAGS_ROCE ;bnxt_re_fill_fw_msg (&fw_msg, (void *)&req,sizeof (req), (void *)&resp,sizeof (resp),DFLT_HWRM_CMD_TIMEOUT );
drivers/infiniband/hw/bnxt_re/qplib_res.c +4 -6
@@ -56,6 +56,7 @@static void bnxt_qplib_free_stats_ctx (struct pci_dev *pdev,struct bnxt_qplib_stats *stats);static int bnxt_qplib_alloc_stats_ctx (struct pci_dev *pdev, +struct bnxt_qplib_chip_ctx *cctx,struct bnxt_qplib_stats *stats);/* PBL */
@@ -559,7 +560,7 @@ int bnxt_qplib_alloc_ctx(struct bnxt_qplib_res *res, goto fail; stats_alloc:/* Stats */ - rc =bnxt_qplib_alloc_stats_ctx (res->pdev, &ctx->stats); + rc =bnxt_qplib_alloc_stats_ctx (res->pdev, res->cctx, &ctx->stats);if (rc) goto fail;
@@ -889,15 +890,12 @@ static void bnxt_qplib_free_stats_ctx(struct pci_dev *pdev, }static int bnxt_qplib_alloc_stats_ctx (struct pci_dev *pdev, +struct bnxt_qplib_chip_ctx *cctx,struct bnxt_qplib_stats *stats) {memset (stats,0 ,sizeof (*stats)); stats->fw_id =-1 ; -/* 128 byte aligned context memory is required only for 57500. -* However making this unconditional, it does not harm previous -* generation. -*/ - stats->size =ALIGN (sizeof (struct ctx_hw_stats ),128 ); + stats->size = cctx->hw_stats_size; stats->dma =dma_alloc_coherent (&pdev->dev, stats->size, &stats->dma_map,GFP_KERNEL );if (!stats->dma) {
drivers/infiniband/hw/bnxt_re/qplib_res.h +1 -0
@@ -60,6 +60,7 @@ struct bnxt_qplib_chip_ctx {u16 chip_num;u8 chip_rev;u8 chip_metal; +u16 hw_stats_size;struct bnxt_qplib_drv_modes modes; };
drivers/net/can/spi/hi311x.c +1 -1
@@ -218,7 +218,7 @@ static int hi3110_spi_trans(struct spi_device *spi, int len)return ret; } -static u8 hi3110_cmd (struct spi_device *spi,u8 command) +static int hi3110_cmd (struct spi_device *spi,u8 command) {struct hi3110_priv *priv =spi_get_drvdata (spi);
drivers/net/can/usb/ems_usb.c +13 -1
@@ -255,6 +255,8 @@ struct ems_usb {unsigned int free_slots;/* remember number of available slots */ struct ems_cpc_msg active_params;/* active controller parameters */ +void *rxbuf[MAX_RX_URBS ]; +dma_addr_t rxbuf_dma[MAX_RX_URBS ]; };static void ems_usb_read_interrupt_callback (struct urb *urb)
@@ -587,6 +589,7 @@ static int ems_usb_start(struct ems_usb *dev)for (i =0 ; i <MAX_RX_URBS ; i++) {struct urb *urb =NULL ;u8 *buf =NULL ; +dma_addr_t buf_dma;/* create a URB, and a buffer for it */ urb =usb_alloc_urb (0 ,GFP_KERNEL );
@@ -596,7 +599,7 @@ static int ems_usb_start(struct ems_usb *dev) } buf =usb_alloc_coherent (dev->udev,RX_BUFFER_SIZE ,GFP_KERNEL , - &urb->transfer_dma); + &buf_dma);if (!buf) {netdev_err (netdev,"No memory left for USB buffer\n" );usb_free_urb (urb);
@@ -604,6 +607,8 @@ static int ems_usb_start(struct ems_usb *dev)break ; } + urb->transfer_dma = buf_dma; +usb_fill_bulk_urb (urb, dev->udev,usb_rcvbulkpipe (dev->udev,2 ), buf,RX_BUFFER_SIZE , ems_usb_read_bulk_callback, dev);
@@ -619,6 +624,9 @@ static int ems_usb_start(struct ems_usb *dev)break ; } + dev->rxbuf[i] = buf; + dev->rxbuf_dma[i] = buf_dma; +/* Drop reference, USB core will take care of freeing it */ usb_free_urb (urb); }
@@ -684,6 +692,10 @@ static void unlink_all_urbs(struct ems_usb *dev)usb_kill_anchored_urbs (&dev->rx_submitted); +for (i =0 ; i <MAX_RX_URBS ; ++i) +usb_free_coherent (dev->udev,RX_BUFFER_SIZE , + dev->rxbuf[i], dev->rxbuf_dma[i]); +usb_kill_anchored_urbs (&dev->tx_submitted);atomic_set (&dev->active_tx_urbs,0 );
drivers/net/can/usb/esd_usb2.c +15 -1
@@ -195,6 +195,8 @@ struct esd_usb2 {int net_count;u32 version;int rxinitdone; +void *rxbuf[MAX_RX_URBS ]; +dma_addr_t rxbuf_dma[MAX_RX_URBS ]; };struct esd_usb2_net_priv {
@@ -544,6 +546,7 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev)for (i =0 ; i <MAX_RX_URBS ; i++) {struct urb *urb =NULL ;u8 *buf =NULL ; +dma_addr_t buf_dma;/* create a URB, and a buffer for it */ urb =usb_alloc_urb (0 ,GFP_KERNEL );
@@ -553,7 +556,7 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev) } buf =usb_alloc_coherent (dev->udev,RX_BUFFER_SIZE ,GFP_KERNEL , - &urb->transfer_dma); + &buf_dma);if (!buf) {dev_warn (dev->udev->dev.parent,"No memory left for USB buffer\n" );
@@ -561,6 +564,8 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev) goto freeurb; } + urb->transfer_dma = buf_dma; + usb_fill_bulk_urb(urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), buf, RX_BUFFER_SIZE,
@@ -573,8 +578,12 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev)usb_unanchor_urb (urb);usb_free_coherent (dev->udev,RX_BUFFER_SIZE , buf, urb->transfer_dma); + goto freeurb; } + dev->rxbuf[i] = buf; + dev->rxbuf_dma[i] = buf_dma; + freeurb:/* Drop reference, USB core will take care of freeing it */ usb_free_urb (urb);
@@ -662,6 +671,11 @@ static void unlink_all_urbs(struct esd_usb2 *dev)int i, j;usb_kill_anchored_urbs (&dev->rx_submitted); + +for (i =0 ; i <MAX_RX_URBS ; ++i) +usb_free_coherent (dev->udev,RX_BUFFER_SIZE , + dev->rxbuf[i], dev->rxbuf_dma[i]); +for (i =0 ; i < dev->net_count; i++) { priv = dev->nets[i];if (priv) {
drivers/net/can/usb/mcba_usb.c +2 -0
@@ -653,6 +653,8 @@ static int mcba_usb_start(struct mcba_priv *priv)break ; } + urb->transfer_dma = buf_dma; + usb_fill_bulk_urb(urb, priv->udev, usb_rcvbulkpipe(priv->udev, MCBA_USB_EP_IN), buf, MCBA_USB_RX_BUFF_SIZE,
drivers/net/can/usb/peak_usb/pcan_usb.c +6 -4
@@ -117,7 +117,8 @@ MODULE_SUPPORTED_DEVICE("PEAK-System PCAN-USB adapter");#define PCAN_USB_BERR_MASK (PCAN_USB_ERR_RXERR | PCAN_USB_ERR_TXERR)/* identify bus event packets with rx/tx error counters */ -#define PCAN_USB_ERR_CNT 0x80 +#define PCAN_USB_ERR_CNT_DEC 0x00/* counters are decreasing */ +#define PCAN_USB_ERR_CNT_INC 0x80/* counters are increasing */ /* private to PCAN-USB adapter */ struct pcan_usb {
@@ -611,11 +612,12 @@ static int pcan_usb_handle_bus_evt(struct pcan_usb_msg_context *mc, u8 ir)/* acccording to the content of the packet */ switch (ir) { -case PCAN_USB_ERR_CNT : +case PCAN_USB_ERR_CNT_DEC : +case PCAN_USB_ERR_CNT_INC :/* save rx/tx error counters from in the device context */ - pdev->bec.rxerr = mc->ptr[0 ]; - pdev->bec.txerr = mc->ptr[1 ]; + pdev->bec.rxerr = mc->ptr[1 ]; + pdev->bec.txerr = mc->ptr[2 ];break ;default :
drivers/net/can/usb/usb_8dev.c +13 -2
@@ -137,7 +137,8 @@ struct usb_8dev_priv {u8 *cmd_msg_buffer;struct mutex usb_8dev_cmd_lock; - +void *rxbuf[MAX_RX_URBS ]; +dma_addr_t rxbuf_dma[MAX_RX_URBS ]; };/* tx frame */
@@ -733,6 +734,7 @@ static int usb_8dev_start(struct usb_8dev_priv *priv)for (i =0 ; i <MAX_RX_URBS ; i++) {struct urb *urb =NULL ;u8 *buf; +dma_addr_t buf_dma;/* create a URB, and a buffer for it */ urb =usb_alloc_urb (0 ,GFP_KERNEL );
@@ -742,7 +744,7 @@ static int usb_8dev_start(struct usb_8dev_priv *priv) } buf =usb_alloc_coherent (priv->udev,RX_BUFFER_SIZE ,GFP_KERNEL , - &urb->transfer_dma); + &buf_dma);if (!buf) {netdev_err (netdev,"No memory left for USB buffer\n" );usb_free_urb (urb);
@@ -750,6 +752,8 @@ static int usb_8dev_start(struct usb_8dev_priv *priv)break ; } + urb->transfer_dma = buf_dma; + usb_fill_bulk_urb(urb, priv->udev, usb_rcvbulkpipe(priv->udev, USB_8DEV_ENDP_DATA_RX),
@@ -767,6 +771,9 @@ static int usb_8dev_start(struct usb_8dev_priv *priv)break ; } + priv->rxbuf[i] = buf; + priv->rxbuf_dma[i] = buf_dma; +/* Drop reference, USB core will take care of freeing it */ usb_free_urb (urb); }
@@ -836,6 +843,10 @@ static void unlink_all_urbs(struct usb_8dev_priv *priv)usb_kill_anchored_urbs (&priv->rx_submitted); +for (i =0 ; i <MAX_RX_URBS ; ++i) +usb_free_coherent (priv->udev,RX_BUFFER_SIZE , + priv->rxbuf[i], priv->rxbuf_dma[i]); +usb_kill_anchored_urbs (&priv->tx_submitted);atomic_set (&priv->active_tx_urbs,0 );
drivers/net/ethernet/dec/tulip/winbond-840.c +2 -5
@@ -357,7 +357,7 @@ static int w840_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)int i, option = find_cnt <MAX_UNITS ? options[find_cnt] :0 ;void __iomem *ioaddr; - i =pci_enable_device (pdev); + i =pcim_enable_device (pdev);if (i)return i;pci_set_master (pdev);
@@ -379,7 +379,7 @@ static int w840_probe1(struct pci_dev *pdev, const struct pci_device_id *ent) ioaddr =pci_iomap (pdev,TULIP_BAR , netdev_res_size);if (!ioaddr) - goto err_out_free_res; + goto err_out_netdev;for (i =0 ; i <3 ; i++) ((__le16 *)dev->dev_addr)[i] =cpu_to_le16 (eeprom_read (ioaddr, i));
@@ -458,8 +458,6 @@ static int w840_probe1(struct pci_dev *pdev, const struct pci_device_id *ent) err_out_cleardev:pci_iounmap (pdev, ioaddr); -err_out_free_res: -pci_release_regions (pdev); err_out_netdev:free_netdev (dev);return -ENODEV ;
@@ -1526,7 +1524,6 @@ static void w840_remove1(struct pci_dev *pdev)if (dev) {struct netdev_private *np =netdev_priv (dev);unregister_netdev (dev); -pci_release_regions (pdev);pci_iounmap (pdev, np->base_addr);free_netdev (dev); }
drivers/net/ethernet/intel/i40e/i40e_ethtool.c +5 -1
@@ -980,7 +980,7 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,default :/* if we got here and link is up something bad is afoot */ netdev_info (netdev, -"WARNING: Link is up but PHY type 0x%x is not recognized.\n" , +"WARNING: Link is up but PHY type 0x%x is not recognized, or incorrect cable is in use\n" , hw_link_info->phy_type); }
@@ -5106,6 +5106,10 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)dev_warn (&pf->pdev->dev,"Device configuration forbids SW from starting the LLDP agent.\n" );return -EINVAL ; +case I40E_AQ_RC_EAGAIN : +dev_warn (&pf->pdev->dev, +"Stop FW LLDP agent command is still being processed, please try again in a second.\n" ); +return -EBUSY ;default : dev_warn(&pf->pdev->dev, "Starting FW LLDP agent failed: error: %s, %s\n",
drivers/net/ethernet/intel/i40e/i40e_main.c +37 -24
135 lines not on this page · raw message
drivers/net/ethernet/intel/i40e/i40e_txrx.c +50 -0
56 lines not on this page · raw message
drivers/net/ethernet/intel/i40e/i40e_txrx.h +2 -0
@@ -449,6 +449,8 @@ static inline unsigned int i40e_rx_pg_order(struct i40e_ring *ring)bool i40e_alloc_rx_buffers (struct i40e_ring *rxr,u16 cleaned_count);netdev_tx_t i40e_lan_xmit_frame (struct sk_buff *skb,struct net_device *netdev); +u16 i40e_lan_select_queue (struct net_device *netdev,struct sk_buff *skb, +struct net_device *sb_dev);void i40e_clean_tx_ring (struct i40e_ring *tx_ring);void i40e_clean_rx_ring (struct i40e_ring *rx_ring);int i40e_setup_tx_descriptors (struct i40e_ring *tx_ring);
drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c +3 -4
@@ -230,15 +230,14 @@ static int otx2_set_channels(struct net_device *dev, err =otx2_set_real_num_queues (dev, channel->tx_count, channel->rx_count);if (err) - goto fail; +return err; pfvf->hw.rx_queues = channel->rx_count; pfvf->hw.tx_queues = channel->tx_count; pfvf->qset.cq_cnt = pfvf->hw.tx_queues + pfvf->hw.rx_queues; -fail:if (if_up) - dev->netdev_ops->ndo_open (dev); + err = dev->netdev_ops->ndo_open (dev);netdev_info (dev,"Setting num Tx rings to %d, Rx rings to %d success\n" , pfvf->hw.tx_queues, pfvf->hw.rx_queues);
@@ -342,7 +341,7 @@ static int otx2_set_ringparam(struct net_device *netdev, qs->rqe_cnt = rx_count;if (if_up) - netdev->netdev_ops->ndo_open (netdev); +return netdev->netdev_ops->ndo_open (netdev);return 0 ; }
drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c +5 -0
@@ -1592,6 +1592,7 @@ int otx2_open(struct net_device *netdev) err_tx_stop_queues:netif_tx_stop_all_queues (netdev);netif_carrier_off (netdev); + pf->flags |=OTX2_FLAG_INTF_DOWN ; err_free_cints:otx2_free_cints (pf, qidx); vec = pci_irq_vector(pf->pdev,
@@ -1619,6 +1620,10 @@ int otx2_stop(struct net_device *netdev)struct otx2_rss_info *rss;int qidx, vec, wrk; +/* If the DOWN flag is set resources are already freed */ +if (pf->flags &OTX2_FLAG_INTF_DOWN ) +return 0 ; +netif_carrier_off (netdev);netif_tx_stop_all_queues (netdev);
drivers/net/ethernet/mellanox/mlx4/main.c +1 -0
@@ -3535,6 +3535,7 @@ static int mlx4_load_one(struct pci_dev *pdev, int pci_dev_data,if (!SRIOV_VALID_STATE (dev->flags)) {mlx4_err (dev,"Invalid SRIOV state\n" ); + err = -EINVAL ; goto err_close; } }
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +31 -2
@@ -481,12 +481,32 @@ static void mlx5e_detach_mod_hdr(struct mlx5e_priv *priv,static struct mlx5_core_dev *mlx5e_hairpin_get_mdev (struct net *net,int ifindex) { +struct mlx5_core_dev *mdev;struct net_device *netdev;struct mlx5e_priv *priv; - netdev =__dev_get_by_index (net, ifindex); + netdev =dev_get_by_index (net, ifindex); +if (!netdev) +return ERR_PTR (-ENODEV ); + priv =netdev_priv (netdev); -return priv->mdev; + mdev = priv->mdev; +dev_put (netdev); + +/* Mirred tc action holds a refcount on the ifindex net_device (see +* net/sched/act_mirred.c:tcf_mirred_get_dev). So, it's okay to continue using mdev +* after dev_put(netdev), while we're in the context of adding a tc flow. +* +* The mdev pointer corresponds to the peer/out net_device of a hairpin. It is then +* stored in a hairpin object, which exists until all flows, that refer to it, get +* removed. +* +* On the other hand, after a hairpin object has been created, the peer net_device may +* be removed/unbound while there are still some hairpin flows that are using it. This +* case is handled by mlx5e_tc_hairpin_update_dead_peer, which is hooked to +* NETDEV_UNREGISTER event of the peer net_device. +*/ +return mdev; }static int mlx5e_hairpin_create_transport (struct mlx5e_hairpin *hp)
@@ -685,6 +705,10 @@ mlx5e_hairpin_create(struct mlx5e_priv *priv, struct mlx5_hairpin_params *params func_mdev = priv->mdev; peer_mdev =mlx5e_hairpin_get_mdev (dev_net (priv->netdev), peer_ifindex); +if (IS_ERR (peer_mdev)) { + err =PTR_ERR (peer_mdev); + goto create_pair_err; + } pair =mlx5_core_hairpin_create (func_mdev, peer_mdev, params);if (IS_ERR (pair)) {
@@ -823,6 +847,11 @@ static int mlx5e_hairpin_flow_add(struct mlx5e_priv *priv,int err; peer_mdev =mlx5e_hairpin_get_mdev (dev_net (priv->netdev), peer_ifindex); +if (IS_ERR (peer_mdev)) { +NL_SET_ERR_MSG_MOD (extack,"invalid ifindex of mirred device" ); +return PTR_ERR (peer_mdev); + } +if (!MLX5_CAP_GEN (priv->mdev, hairpin) || !MLX5_CAP_GEN (peer_mdev, hairpin)) {NL_SET_ERR_MSG_MOD (extack,"hairpin is not supported" );return -EOPNOTSUPP ;
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +6 -4
@@ -1024,17 +1024,19 @@ static int connect_fwd_rules(struct mlx5_core_dev *dev,static int connect_flow_table (struct mlx5_core_dev *dev,struct mlx5_flow_table *ft,struct fs_prio *prio) { -struct mlx5_flow_table *next_ft; +struct mlx5_flow_table *next_ft, *first_ft;int err =0 ;/* Connect_prev_fts and update_root_ft_create are mutually exclusive */ -if (list_empty (&prio->node.children)) { + first_ft =list_first_entry_or_null (&prio->node.children, + struct mlx5_flow_table, node.list); +if (!first_ft || first_ft->level > ft->level) { err =connect_prev_fts (dev, ft, prio);if (err)return err; - next_ft =find_next_chained_ft (prio); + next_ft = first_ft ? first_ft :find_next_chained_ft (prio); err =connect_fwd_rules (dev, ft, next_ft);if (err)return err;
@@ -2113,7 +2115,7 @@ static int disconnect_flow_table(struct mlx5_flow_table *ft) node.list) == ft))return 0 ; - next_ft =find_next_chained_ft (prio); + next_ft =find_next_ft (ft); err =connect_fwd_rules (dev, next_ft, ft);if (err)return err;
drivers/net/ethernet/pensando/ionic/ionic_lif.c +13 -1
@@ -52,7 +52,19 @@ static void ionic_dim_work(struct work_struct *work) cur_moder =net_dim_get_rx_moderation (dim->mode, dim->profile_ix); qcq = container_of(dim, struct ionic_qcq, dim); new_coal =ionic_coal_usec_to_hw (qcq->q.lif->ionic, cur_moder.usec); - qcq->intr.dim_coal_hw = new_coal ? new_coal :1 ; + new_coal = new_coal ? new_coal :1 ; + +if (qcq->intr.dim_coal_hw != new_coal) { +unsigned int qi = qcq->cq.bound_q->index; +struct ionic_lif *lif = qcq->q.lif; + + qcq->intr.dim_coal_hw = new_coal; + +ionic_intr_coal_init (lif->ionic->idev.intr_ctrl, + lif->rxqcqs[qi]->intr.index, + qcq->intr.dim_coal_hw); + } + dim->state =DIM_START_MEASURE ; }
drivers/net/ethernet/pensando/ionic/ionic_txrx.c +25 -16
83 lines not on this page · raw message
drivers/net/ethernet/sis/sis900.c +2 -5
@@ -443,7 +443,7 @@ static int sis900_probe(struct pci_dev *pci_dev,#endif /* setup various bits in PCI command register */ - ret =pci_enable_device (pci_dev); + ret =pcim_enable_device (pci_dev);if (ret)return ret; i =dma_set_mask (&pci_dev->dev,DMA_BIT_MASK (32 ));
@@ -469,7 +469,7 @@ static int sis900_probe(struct pci_dev *pci_dev, ioaddr =pci_iomap (pci_dev,0 ,0 );if (!ioaddr) { ret = -ENOMEM ; - goto err_out_cleardev; + goto err_out; } sis_priv =netdev_priv (net_dev);
@@ -581,8 +581,6 @@ static int sis900_probe(struct pci_dev *pci_dev, sis_priv->tx_ring_dma); err_out_unmap:pci_iounmap (pci_dev, ioaddr); -err_out_cleardev: -pci_release_regions (pci_dev); err_out:free_netdev (net_dev);return ret;
@@ -2499,7 +2497,6 @@ static void sis900_remove(struct pci_dev *pci_dev) sis_priv->tx_ring_dma);pci_iounmap (pci_dev, sis_priv->ioaddr);free_netdev (net_dev); -pci_release_regions (pci_dev); }static int __maybe_unused sis900_suspend (struct device *dev)
drivers/net/ethernet/sun/niu.c +2 -1
@@ -8191,8 +8191,9 @@ static int niu_pci_vpd_fetch(struct niu *np, u32 start) err =niu_pci_vpd_scan_props (np, here, end);if (err <0 )return err; +/* ret == 1 is not an error */ if (err ==1 ) -return -EINVAL ; +return 0 ; }return 0 ; }
drivers/nfc/nfcsim.c +1 -2
@@ -192,8 +192,7 @@ static void nfcsim_recv_wq(struct work_struct *work)if (!IS_ERR (skb))dev_kfree_skb (skb); - - skb =ERR_PTR (-ENODEV ); +return ; } dev->cb (dev->nfc_digital_dev, dev->arg, skb);
fs/btrfs/compression.c +1 -1
@@ -340,7 +340,7 @@ static void end_compressed_bio_write(struct bio *bio) cb->compressed_pages[0 ]->mapping = cb->inode->i_mapping;btrfs_writepage_endio_finish_ordered (cb->compressed_pages[0 ], cb->start, cb->start + cb->len -1 , - bio->bi_status ==BLK_STS_OK ); + !cb->errors); cb->compressed_pages[0 ]->mapping =NULL ;end_compressed_writeback (inode, cb);
fs/btrfs/volumes.c +1 -0
@@ -1077,6 +1077,7 @@ static void __btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices,if (test_bit (BTRFS_DEV_STATE_WRITEABLE , &device->dev_state)) {list_del_init (&device->dev_alloc_list);clear_bit (BTRFS_DEV_STATE_WRITEABLE , &device->dev_state); + fs_devices->rw_devices--; }list_del_init (&device->dev_list); fs_devices->num_devices--;
fs/cifs/file.c +1 -1
@@ -4550,7 +4550,7 @@ static int cifs_readpage_worker(struct file *file, struct page *page,static int cifs_readpage (struct file *file,struct page *page) { -loff_t offset = (loff_t )page->index <<PAGE_SHIFT ; +loff_t offset =page_file_offset (page);int rc = -EACCES ;unsigned int xid;
fs/io_uring.c +1 -1
@@ -7997,7 +7997,7 @@ static void io_sq_offload_start(struct io_ring_ctx *ctx)struct io_sq_data *sqd = ctx->sq_data; ctx->flags &= ~IORING_SETUP_R_DISABLED ; -if ((ctx->flags &IORING_SETUP_SQPOLL ) && sqd->thread) +if ((ctx->flags &IORING_SETUP_SQPOLL ) && sqd && sqd->thread)wake_up_process (sqd->thread); }
fs/ocfs2/file.c +62 -41
145 lines not on this page · raw message
fs/pipe.c +5 -5
@@ -429,20 +429,20 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from)#endif /* -* Only wake up if the pipe started out empty, since -* otherwise there should be no readers waiting. +* 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. * * That naturally merges small writes, but it also -* page-aligs the rest of the writes for large writes +* page-aligns the rest of the writes for large writes * spanning multiple pages. */ head = pipe->head; - was_empty =pipe_empty (head, pipe->tail); + was_empty = true; chars = total_len & (PAGE_SIZE -1 ); -if (chars && !was_empty) { +if (chars && !pipe_empty (head, pipe->tail)) {unsigned int mask = pipe->ring_size -1 ;struct pipe_buffer *buf = &pipe->bufs[(head -1 ) & mask];int offset = buf->offset + buf->len;
include/linux/bpf_types.h +1 -0
@@ -133,4 +133,5 @@ BPF_LINK_TYPE(BPF_LINK_TYPE_CGROUP, cgroup) BPF_LINK_TYPE(BPF_LINK_TYPE_ITER, iter)#ifdef CONFIG_NET BPF_LINK_TYPE(BPF_LINK_TYPE_NETNS, netns) +BPF_LINK_TYPE(BPF_LINK_TYPE_XDP, xdp)#endif
include/linux/bpf_verifier.h +10 -1
@@ -204,6 +204,13 @@ struct bpf_idx_pair {u32 idx; }; +struct bpf_id_pair { +u32 old; +u32 cur; +}; + +/* Maximum number of register states that can exist at once */ +#define BPF_ID_MAP_SIZE (MAX_BPF_REG + MAX_BPF_STACK / BPF_REG_SIZE)#define MAX_CALL_FRAMES 8struct bpf_verifier_state {/* call stack tracking */
@@ -319,8 +326,8 @@ struct bpf_insn_aux_data { };u64 map_key_state;/* constant (32 bit) key tracking for maps */ int ctx_field_size;/* the ctx field size for load insn, maybe 0 */ -int sanitize_stack_off;/* stack slot to be cleared */ u32 seen;/* this insn was processed by the verifier at env->pass_cnt */ +bool sanitize_stack_spill;/* subject to Spectre v4 sanitation */ bool zext_dst;/* this insn zero extends dst reg */ u8 alu_state;/* used in combination with alu_limit */
@@ -390,6 +397,7 @@ struct bpf_verifier_env {struct bpf_map *used_maps[MAX_USED_MAPS ];/* array of map's used by eBPF program */ u32 used_map_cnt;/* number of used maps */ u32 id_gen;/* used to generate unique reg IDs */ +bool explore_alu_limits;bool allow_ptr_leaks;bool allow_uninit_stack;bool allow_ptr_to_map_access;
@@ -401,6 +409,7 @@ struct bpf_verifier_env {const struct bpf_line_info *prev_linfo;struct bpf_verifier_log log;struct bpf_subprog_info subprog_info[BPF_MAX_SUBPROGS +1 ]; +struct bpf_id_pair idmap_scratch[BPF_ID_MAP_SIZE ];struct {int *insn_state;int *insn_stack;
include/linux/filter.h +15 -0
@@ -72,6 +72,11 @@ struct ctl_table_header;/* unused opcode to mark call to interpreter with arguments */ #define BPF_CALL_ARGS 0xe0 +/* unused opcode to mark speculation barrier for mitigating +* Speculative Store Bypass +*/ +#define BPF_NOSPEC 0xc0 +/* As per nm, we expose JITed images as text (code) section for * kallsyms. That way, tools like perf can find it to match * addresses.
@@ -372,6 +377,16 @@ static inline bool insn_is_zext(const struct bpf_insn *insn) .off = 0, \ .imm = 0 }) +/* Speculation barrier */ + +#define BPF_ST_NOSPEC () \ + ((struct bpf_insn) { \ + .code = BPF_ST | BPF_NOSPEC, \ + .dst_reg = 0, \ + .src_reg = 0, \ + .off = 0, \ + .imm = 0 }) +/* Internal classic blocks for direct assignment */ #define __BPF_STMT (CODE ,K ) \
include/linux/skmsg.h +0 -1
@@ -395,7 +395,6 @@ static inline struct sk_psock *sk_psock_get(struct sock *sk) }void sk_psock_stop (struct sock *sk,struct sk_psock *psock); -void sk_psock_destroy (struct rcu_head *rcu);void sk_psock_drop (struct sock *sk,struct sk_psock *psock);static inline void sk_psock_put (struct sock *sk,struct sk_psock *psock)
include/net/llc_pdu.h +23 -8
@@ -15,9 +15,11 @@#include <linux/if_ether.h> /* Lengths of frame formats */ -#define LLC_PDU_LEN_I 4/* header and 2 control bytes */ -#define LLC_PDU_LEN_S 4 -#define LLC_PDU_LEN_U 3/* header and 1 control byte */ +#define LLC_PDU_LEN_I 4/* header and 2 control bytes */ +#define LLC_PDU_LEN_S 4 +#define LLC_PDU_LEN_U 3/* header and 1 control byte */ +/* header and 1 control byte and XID info */ +#define LLC_PDU_LEN_U_XID (LLC_PDU_LEN_U + sizeof(struct llc_xid_info))/* Known SAP addresses */ #define LLC_GLOBAL_SAP 0xFF#define LLC_NULL_SAP 0x00/* not network-layer visible */
@@ -50,9 +52,10 @@#define LLC_PDU_TYPE_U_MASK 0x03/* 8-bit control field */ #define LLC_PDU_TYPE_MASK 0x03 -#define LLC_PDU_TYPE_I 0/* first bit */ -#define LLC_PDU_TYPE_S 1/* first two bits */ -#define LLC_PDU_TYPE_U 3/* first two bits */ +#define LLC_PDU_TYPE_I 0/* first bit */ +#define LLC_PDU_TYPE_S 1/* first two bits */ +#define LLC_PDU_TYPE_U 3/* first two bits */ +#define LLC_PDU_TYPE_U_XID 4/* private type for detecting XID commands */ #define LLC_PDU_TYPE_IS_I (pdu) \ ((!(pdu->ctrl_1 & LLC_PDU_TYPE_I_MASK)) ? 1 : 0)
@@ -230,9 +233,18 @@ static inline struct llc_pdu_un *llc_pdu_un_hdr(struct sk_buff *skb)static inline void llc_pdu_header_init (struct sk_buff *skb,u8 type,u8 ssap,u8 dsap,u8 cr) { -const int hlen = type ==LLC_PDU_TYPE_U ?3 :4 ; +int hlen =4 ;/* default value for I and S types */ struct llc_pdu_un *pdu; +switch (type) { +case LLC_PDU_TYPE_U : + hlen =3 ; +break ; +case LLC_PDU_TYPE_U_XID : + hlen =6 ; +break ; + } +skb_push (skb, hlen);skb_reset_network_header (skb); pdu =llc_pdu_un_hdr (skb);
@@ -374,7 +386,10 @@ static inline void llc_pdu_init_as_xid_cmd(struct sk_buff *skb, xid_info->fmt_id =LLC_XID_FMT_ID ;/* 0x81 */ xid_info->type = svcs_supported; xid_info->rw = rx_window <<1 ;/* size of receive window */ -skb_put (skb,sizeof (struct llc_xid_info )); + +/* no need to push/put since llc_pdu_header_init() has already +* pushed 3 + 3 bytes +*/ }/**
kernel/bpf/core.c +18 -1
@@ -32,6 +32,8 @@#include <linux/perf_event.h> #include <linux/extable.h> #include <linux/log2.h> + +#include <asm/barrier.h> #include <asm/unaligned.h> /* Registers */
@@ -1380,6 +1382,7 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack) /* Non-UAPI available opcodes. */ [BPF_JMP | BPF_CALL_ARGS] = &&JMP_CALL_ARGS, [BPF_JMP | BPF_TAIL_CALL] = &&JMP_TAIL_CALL, + [BPF_ST | BPF_NOSPEC] = &&ST_NOSPEC, [BPF_LDX | BPF_PROBE_MEM | BPF_B] = &&LDX_PROBE_MEM_B, [BPF_LDX | BPF_PROBE_MEM | BPF_H] = &&LDX_PROBE_MEM_H, [BPF_LDX | BPF_PROBE_MEM | BPF_W] = &&LDX_PROBE_MEM_W,
@@ -1624,7 +1627,21 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack) COND_JMP(s, JSGE, >=) COND_JMP(s, JSLE, <=) #undef COND_JMP - /* STX and ST and LDX*/ + /* ST, STX and LDX*/ + ST_NOSPEC: + /* Speculation barrier for mitigating Speculative Store Bypass. + * In case of arm64, we rely on the firmware mitigation as + * controlled via the ssbd kernel parameter. Whenever the + * mitigation is enabled, it works for all of the kernel code + * with no need to provide any additional instructions here. + * In case of x86, we use 'lfence' insn for mitigation. We + * reuse preexisting logic from Spectre v1 mitigation that + * happens to produce the required code on x86 for v4 as well. + */ +#ifdef CONFIG_X86 + barrier_nospec(); +#endif + CONT; #define LDST(SIZEOP, SIZE) \ STX_MEM_##SIZEOP: \ *(SIZE *)(unsigned long) (DST + insn->off) = SRC; \
kernel/bpf/disasm.c +9 -7
@@ -162,15 +162,17 @@ void print_bpf_insn(const struct bpf_insn_cbs *cbs,else verbose (cbs->private_data,"BUG_%02x\n" , insn->code); }else if (class ==BPF_ST ) { -if (BPF_MODE (insn->code) !=BPF_MEM ) { +if (BPF_MODE (insn->code) ==BPF_MEM ) { +verbose (cbs->private_data,"(%02x) *(%s *)(r%d %+d) = %d\n" , + insn->code, + bpf_ldst_string[BPF_SIZE (insn->code) >>3 ], + insn->dst_reg, + insn->off, insn->imm); + }else if (BPF_MODE (insn->code) ==0xc0 /* BPF_NOSPEC, no UAPI */ ) { +verbose (cbs->private_data,"(%02x) nospec\n" , insn->code); + }else {verbose (cbs->private_data,"BUG_st_%02x\n" , insn->code); -return ; } -verbose (cbs->private_data,"(%02x) *(%s *)(r%d %+d) = %d\n" , - insn->code, - bpf_ldst_string[BPF_SIZE (insn->code) >>3 ], - insn->dst_reg, - insn->off, insn->imm); }else if (class ==BPF_LDX ) {if (BPF_MODE (insn->code) !=BPF_MEM ) {verbose (cbs->private_data,"BUG_ldx_%02x\n" , insn->code);
kernel/bpf/verifier.c +60 -126
301 lines not on this page · raw message
net/can/j1939/transport.c +8 -3
@@ -1075,11 +1075,16 @@ static bool j1939_session_deactivate_locked(struct j1939_session *session)static bool j1939_session_deactivate (struct j1939_session *session) { +struct j1939_priv *priv = session->priv;bool active; -j1939_session_list_lock (session->priv); +j1939_session_list_lock (priv); +/* This function should be called with a session ref-count of at +* least 2. +*/ +WARN_ON_ONCE (kref_read (&session->kref) <2 ); active =j1939_session_deactivate_locked (session); -j1939_session_list_unlock (session->priv); +j1939_session_list_unlock (priv);return active; }
@@ -1869,7 +1874,7 @@ static void j1939_xtp_rx_dat_one(struct j1939_session *session,if (!session->transmission)j1939_tp_schedule_txtimer (session,0 ); }else { -j1939_tp_set_rxtimeout (session,250 ); +j1939_tp_set_rxtimeout (session,750 ); } session->last_cmd =0xff ;consume_skb (se_skb);
net/can/raw.c +18 -2
@@ -546,10 +546,18 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,return -EFAULT ; } +rtnl_lock ();lock_sock (sk); -if (ro->bound && ro->ifindex) +if (ro->bound && ro->ifindex) { dev =dev_get_by_index (sock_net (sk), ro->ifindex); +if (!dev) { +if (count >1 ) +kfree (filter); + err = -ENODEV ; + goto out_fil; + } + }if (ro->bound) {/* (try to) register the new filters */
@@ -588,6 +596,7 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,dev_put (dev);release_sock (sk); +rtnl_unlock ();break ;
@@ -600,10 +609,16 @@ static int raw_setsockopt(struct socket *sock, int level, int optname, err_mask &=CAN_ERR_MASK ; +rtnl_lock ();lock_sock (sk); -if (ro->bound && ro->ifindex) +if (ro->bound && ro->ifindex) { dev =dev_get_by_index (sock_net (sk), ro->ifindex); +if (!dev) { + err = -ENODEV ; + goto out_err; + } + }/* remove current error mask */ if (ro->bound) {
@@ -627,6 +642,7 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,dev_put (dev);release_sock (sk); +rtnl_unlock ();break ;
net/core/skmsg.c +1 -2
@@ -676,14 +676,13 @@ static void sk_psock_destroy_deferred(struct work_struct *gc)kfree (psock); } -void sk_psock_destroy (struct rcu_head *rcu) +static void sk_psock_destroy (struct rcu_head *rcu) { struct sk_psock *psock = container_of(rcu, struct sk_psock, rcu);INIT_WORK (&psock->gc, sk_psock_destroy_deferred);schedule_work (&psock->gc); } -EXPORT_SYMBOL_GPL (sk_psock_destroy);void sk_psock_drop (struct sock *sk,struct sk_psock *psock) {
net/ipv4/ip_tunnel.c +1 -1
@@ -390,7 +390,7 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb, tunnel->i_seqno =ntohl (tpi->seq) +1 ; } -skb_reset_network_header (skb); +skb_set_network_header (skb, (tunnel->dev->type ==ARPHRD_ETHER ) ?ETH_HLEN :0 ); err =IP_ECN_decapsulate (iph, skb);if (unlikely (err)) {
net/llc/af_llc.c +9 -1
@@ -98,8 +98,16 @@ static inline u8 llc_ui_header_len(struct sock *sk, struct sockaddr_llc *addr) {u8 rc =LLC_PDU_LEN_U ; -if (addr->sllc_test || addr->sllc_xid) +if (addr->sllc_test) rc =LLC_PDU_LEN_U ; +else if (addr->sllc_xid) +/* We need to expand header to sizeof(struct llc_xid_info) +* since llc_pdu_init_as_xid_cmd() sets 4,5,6 bytes of LLC header +* as XID PDU. In llc_ui_sendmsg() we reserved header size and then +* filled all other space with user data. If we won't reserve this +* bytes, llc_pdu_init_as_xid_cmd() will overwrite user data +*/ + rc =LLC_PDU_LEN_U_XID ;else if (sk->sk_type ==SOCK_STREAM ) rc =LLC_PDU_LEN_I ;return rc;
net/llc/llc_s_ac.c +1 -1
@@ -79,7 +79,7 @@ int llc_sap_action_send_xid_c(struct llc_sap *sap, struct sk_buff *skb)struct llc_sap_state_ev *ev =llc_sap_ev (skb);int rc; -llc_pdu_header_init (skb,LLC_PDU_TYPE_U , ev->saddr.lsap, +llc_pdu_header_init (skb,LLC_PDU_TYPE_U_XID , ev->saddr.lsap, ev->daddr.lsap,LLC_PDU_CMD );llc_pdu_init_as_xid_cmd (skb,LLC_XID_NULL_CLASS_2 ,0 ); rc =llc_mac_hdr_init (skb, ev->saddr.mac, ev->daddr.mac);
net/mac80211/cfg.c +19 -0
@@ -152,6 +152,8 @@ static int ieee80211_change_iface(struct wiphy *wiphy, struct vif_params *params) {struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev); +struct ieee80211_local *local = sdata->local; +struct sta_info *sta;int ret; ret =ieee80211_if_change_type (sdata, type);
@@ -162,7 +164,24 @@ static int ieee80211_change_iface(struct wiphy *wiphy,RCU_INIT_POINTER (sdata->u.vlan.sta,NULL );ieee80211_check_fast_rx_iface (sdata); }else if (type ==NL80211_IFTYPE_STATION && params->use_4addr >=0 ) { +struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; + +if (params->use_4addr == ifmgd->use_4addr) +return 0 ; + sdata->u.mgd.use_4addr = params->use_4addr; +if (!ifmgd->associated) +return 0 ; + +mutex_lock (&local->sta_mtx); + sta =sta_info_get (sdata, ifmgd->bssid); +if (sta) +drv_sta_set_4addr (local, sdata, &sta->sta, + params->use_4addr); +mutex_unlock (&local->sta_mtx); + +if (params->use_4addr) +ieee80211_send_4addr_nullfunc (local, sdata); }if (sdata->vif.type ==NL80211_IFTYPE_MONITOR ) {
net/mac80211/ieee80211_i.h +2 -0
@@ -2051,6 +2051,8 @@ void ieee80211_dynamic_ps_timer(struct timer_list *t);void ieee80211_send_nullfunc (struct ieee80211_local *local,struct ieee80211_sub_if_data *sdata,bool powersave); +void ieee80211_send_4addr_nullfunc (struct ieee80211_local *local, +struct ieee80211_sub_if_data *sdata);void ieee80211_sta_tx_notify (struct ieee80211_sub_if_data *sdata,struct ieee80211_hdr *hdr,bool ack,u16 tx_time);
net/mac80211/mlme.c +2 -2
@@ -1115,8 +1115,8 @@ void ieee80211_send_nullfunc(struct ieee80211_local *local,ieee80211_tx_skb (sdata, skb); } -static void ieee80211_send_4addr_nullfunc (struct ieee80211_local *local, -struct ieee80211_sub_if_data *sdata) +void ieee80211_send_4addr_nullfunc (struct ieee80211_local *local, +struct ieee80211_sub_if_data *sdata) {struct sk_buff *skb;struct ieee80211_hdr *nullfunc;
net/netfilter/nf_conntrack_core.c +6 -1
@@ -661,8 +661,13 @@ bool nf_ct_delete(struct nf_conn *ct, u32 portid, int report)return false; tstamp =nf_conn_tstamp_find (ct); -if (tstamp && tstamp->stop ==0 ) +if (tstamp) { +s32 timeout = ct->timeout - nfct_time_stamp; + tstamp->stop =ktime_get_real_ns (); +if (timeout <0 ) + tstamp->stop -=jiffies_to_nsecs (-timeout); + }if (nf_conntrack_event_report (IPCT_DESTROY , ct, portid, report) <0 ) {
net/netfilter/nft_nat.c +3 -1
@@ -201,7 +201,9 @@ static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr, alen = sizeof_field(struct nf_nat_range, min_addr.ip6);break ;default : -return -EAFNOSUPPORT ; +if (tb[NFTA_NAT_REG_ADDR_MIN ]) +return -EAFNOSUPPORT ; +break ; } priv->family = family;
net/qrtr/qrtr.c +5 -1
@@ -504,8 +504,10 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)if (!ipc) goto err; -if (sock_queue_rcv_skb (&ipc->sk, skb)) +if (sock_queue_rcv_skb (&ipc->sk, skb)) { +qrtr_port_put (ipc); goto err; + }qrtr_port_put (ipc); }
@@ -830,6 +832,8 @@ static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb, ipc =qrtr_port_lookup (to->sq_port);if (!ipc || &ipc->sk == skb->sk) {/* do not send to self */ +if (ipc) +qrtr_port_put (ipc);kfree_skb (skb);return -ENODEV ; }
net/sctp/input.c +1 -1
@@ -1175,7 +1175,7 @@ static struct sctp_association *__sctp_rcv_asconf_lookup(if (unlikely (!af))return NULL ; -if (af->from_addr_param (&paddr, param, peer_port,0 )) +if (!af->from_addr_param (&paddr, param, peer_port,0 ))return NULL ;return __sctp_lookup_association (net, laddr, &paddr, transportp);
net/tipc/crypto.c +4 -10
@@ -891,16 +891,10 @@ static int tipc_aead_decrypt(struct net *net, struct tipc_aead *aead,if (unlikely (!aead))return -ENOKEY ; -/* Cow skb data if needed */ -if (likely (!skb_cloned (skb) && - (!skb_is_nonlinear (skb) || !skb_has_frag_list (skb)))) { - nsg =1 +skb_shinfo (skb)->nr_frags; - }else { - nsg =skb_cow_data (skb,0 , &unused); -if (unlikely (nsg <0 )) { -pr_err ("RX: skb_cow_data() returned %d\n" , nsg); -return nsg; - } + nsg =skb_cow_data (skb,0 , &unused); +if (unlikely (nsg <0 )) { +pr_err ("RX: skb_cow_data() returned %d\n" , nsg); +return nsg; }/* Allocate memory for the AEAD operation */
net/tipc/socket.c +17 -13
@@ -148,6 +148,7 @@ static void tipc_sk_remove(struct tipc_sock *tsk);static int __tipc_sendstream (struct socket *sock,struct msghdr *m,size_t dsz);static int __tipc_sendmsg (struct socket *sock,struct msghdr *m,size_t dsz);static void tipc_sk_push_backlog (struct tipc_sock *tsk,bool nagle_ack); +static int tipc_wait_for_connect (struct socket *sock,long *timeo_p);static const struct proto_ops packet_ops;static const struct proto_ops stream_ops;
@@ -1508,8 +1509,13 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dlen) rc =0 ; } -if (unlikely (syn && !rc)) +if (unlikely (syn && !rc)) {tipc_set_sk_state (sk,TIPC_CONNECTING ); +if (timeout) { + timeout =msecs_to_jiffies (timeout); +tipc_wait_for_connect (sock, &timeout); + } + }return rc ? rc : dlen; }
@@ -1557,7 +1563,7 @@ static int __tipc_sendstream(struct socket *sock, struct msghdr *m, size_t dlen)return -EMSGSIZE ;/* Handle implicit connection setup */ -if (unlikely (dest)) { +if (unlikely (dest && sk->sk_state ==TIPC_OPEN )) { rc =__tipc_sendmsg (sock, m, dlen);if (dlen && dlen == rc) { tsk->peer_caps =tipc_node_get_capabilities (net, dnode);
@@ -2644,7 +2650,7 @@ static int tipc_listen(struct socket *sock, int len)static int tipc_wait_for_accept (struct socket *sock,long timeo) {struct sock *sk = sock->sk; -DEFINE_WAIT (wait); +DEFINE_WAIT_FUNC (wait, woken_wake_function);int err;/* True wake-one mechanism for incoming connections: only
@@ -2653,12 +2659,12 @@ static int tipc_wait_for_accept(struct socket *sock, long timeo)* anymore, the common case will execute the loop only once. */ for (;;) { -prepare_to_wait_exclusive (sk_sleep (sk), &wait, -TASK_INTERRUPTIBLE );if (timeo &&skb_queue_empty (&sk->sk_receive_queue)) { +add_wait_queue (sk_sleep (sk), &wait);release_sock (sk); - timeo =schedule_timeout (timeo); + timeo =wait_woken (&wait,TASK_INTERRUPTIBLE , timeo);lock_sock (sk); +remove_wait_queue (sk_sleep (sk), &wait); } err =0 ;if (!skb_queue_empty (&sk->sk_receive_queue))
@@ -2670,7 +2676,6 @@ static int tipc_wait_for_accept(struct socket *sock, long timeo)if (signal_pending (current))break ; } -finish_wait (sk_sleep (sk), &wait);return err; }
@@ -2686,9 +2691,10 @@ static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags, bool kern) {struct sock *new_sk, *sk = sock->sk; -struct sk_buff *buf;struct tipc_sock *new_tsock; +struct msghdr m = {NULL ,};struct tipc_msg *msg; +struct sk_buff *buf;long timeo;int res;
@@ -2733,19 +2739,17 @@ static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags, }/* -* Respond to 'SYN-' by discarding it & returning 'ACK'-. -* Respond to 'SYN+' by queuing it on new socket. +* Respond to 'SYN-' by discarding it & returning 'ACK'. +* Respond to 'SYN+' by queuing it on new socket & returning 'ACK'. */ if (!msg_data_sz (msg)) { -struct msghdr m = {NULL ,}; -tsk_advance_rx_queue (sk); -__tipc_sendstream (new_sock, &m,0 ); }else {__skb_dequeue (&sk->sk_receive_queue);__skb_queue_head (&new_sk->sk_receive_queue, buf);skb_set_owner_r (buf, new_sk); } +__tipc_sendstream (new_sock, &m,0 );release_sock (new_sk); exit:release_sock (sk);
net/wireless/scan.c +2 -4
@@ -1746,16 +1746,14 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev,* be grouped with this beacon for updates ... */ if (!cfg80211_combine_bsses (rdev, new)) { -kfree (new); +bss_ref_put (rdev, new); goto drop; } }if (rdev->bss_entries >= bss_entries_limit && !cfg80211_bss_expire_oldest (rdev)) { -if (!list_empty (&new->hidden_list)) -list_del (&new->hidden_list); -kfree (new); +bss_ref_put (rdev, new); goto drop; }
tools/perf/util/map.c +0 -2
@@ -192,8 +192,6 @@ 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/testing/selftests/vm/userfaultfd.c +1 -1
@@ -182,7 +182,7 @@ static void anon_allocate_area(void **alloc_area) { *alloc_area =mmap (NULL , nr_pages * page_size,PROT_READ |PROT_WRITE ,MAP_ANONYMOUS |MAP_PRIVATE ,-1 ,0 ); -if (*alloc_area ==MAP_FAILED ) +if (*alloc_area ==MAP_FAILED ) {fprintf (stderr,"mmap of anonymous memory failed" ); *alloc_area =NULL ; }
virt/kvm/kvm_main.c +28 -0
@@ -3896,6 +3896,16 @@ struct compat_kvm_dirty_log { }; }; +struct compat_kvm_clear_dirty_log { +__u32 slot; +__u32 num_pages; +__u64 first_page; +union { +compat_uptr_t dirty_bitmap;/* one bit per page */ +__u64 padding2; + }; +}; +static long kvm_vm_compat_ioctl (struct file *filp,unsigned int ioctl,unsigned long arg) {
@@ -3905,6 +3915,24 @@ static long kvm_vm_compat_ioctl(struct file *filp,if (kvm->mm != current->mm)return -EIO ;switch (ioctl) { +#ifdef CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT +case KVM_CLEAR_DIRTY_LOG : { +struct compat_kvm_clear_dirty_log compat_log; +struct kvm_clear_dirty_log log; + +if (copy_from_user (&compat_log, (void __user *)arg, +sizeof (compat_log))) +return -EFAULT ; + log.slot = compat_log.slot; + log.num_pages = compat_log.num_pages; + log.first_page = compat_log.first_page; + log.padding2 = compat_log.padding2; + log.dirty_bitmap =compat_ptr (compat_log.dirty_bitmap); + + r =kvm_vm_ioctl_clear_dirty_log (kvm, &log); +break ; + } +#endif case KVM_GET_DIRTY_LOG : {struct compat_kvm_dirty_log compat_log;struct kvm_dirty_log log;