Linux 5.18.2
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.18.2 kernel.
All users of the 5.18 kernel series must upgrade.
The updated 5.18.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.18.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/process/submitting-patches.rst | 2 Makefile | 2 arch/arm/boot/dts/s5pv210-aries.dtsi | 2 arch/powerpc/kvm/book3s_hv_uvmem.c | 8 arch/x86/include/asm/uaccess.h | 142 +++++++++++++++++ arch/x86/kernel/cpu/sgx/encl.c | 113 ++++++++++++- arch/x86/kernel/cpu/sgx/encl.h | 2 arch/x86/kernel/cpu/sgx/main.c | 13 + arch/x86/kernel/fpu/core.c | 17 +- arch/x86/kernel/kvm.c | 41 +++- arch/x86/kvm/mmu/mmu.c | 18 +- arch/x86/kvm/mmu/paging_tmpl.h | 38 ---- arch/x86/kvm/svm/nested.c | 3 arch/x86/kvm/svm/sev.c | 12 - arch/x86/kvm/vmx/nested.c | 3 arch/x86/kvm/vmx/vmx.c | 2 arch/x86/kvm/x86.c | 76 ++++----- crypto/ecrdsa.c | 8 drivers/bluetooth/hci_qca.c | 4 drivers/char/tpm/tpm2-cmd.c | 11 + drivers/char/tpm/tpm_ibmvtpm.c | 1 drivers/crypto/caam/ctrl.c | 18 ++ drivers/crypto/qat/qat_common/adf_accel_devices.h | 2 drivers/crypto/qat/qat_common/adf_gen2_pfvf.c | 58 ++++-- drivers/crypto/qat/qat_common/adf_gen4_pfvf.c | 44 +++-- drivers/crypto/qat/qat_common/adf_isr.c | 17 -- drivers/crypto/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c | 76 ++++++--- drivers/gpu/drm/i915/intel_pm.c | 2 drivers/hid/hid-ids.h | 1 drivers/hid/hid-multitouch.c | 9 + drivers/i2c/busses/i2c-ismt.c | 3 drivers/md/dm-crypt.c | 14 + drivers/md/dm-integrity.c | 2 drivers/md/dm-stats.c | 8 drivers/md/dm-verity-target.c | 1 drivers/md/raid5.c | 47 ++--- drivers/media/i2c/imx412.c | 8 drivers/net/ipa/ipa_endpoint.c | 9 - fs/exfat/balloc.c | 8 fs/exfat/exfat_fs.h | 6 fs/exfat/fatent.c | 6 fs/nfs/internal.h | 1 fs/nfsd/nfs4state.c | 12 - fs/ntfs3/super.c | 10 - fs/pipe.c | 33 ++- include/linux/bpf_local_storage.h | 4 include/linux/pipe_fs_i.h | 2 include/net/netfilter/nf_conntrack_core.h | 7 kernel/bpf/bpf_inode_storage.c | 4 kernel/bpf/bpf_local_storage.c | 29 ++- kernel/bpf/bpf_task_storage.c | 4 kernel/bpf/core.c | 20 +- kernel/bpf/stackmap.c | 1 kernel/bpf/trampoline.c | 18 +- kernel/bpf/verifier.c | 61 +++++-- lib/assoc_array.c | 8 mm/zsmalloc.c | 37 +++- net/core/bpf_sk_storage.c | 6 net/core/filter.c | 4 net/netfilter/nf_tables_api.c | 94 ++++++++--- net/netfilter/nft_limit.c | 2 sound/usb/clock.c | 11 + sound/usb/pcm.c | 17 +- sound/usb/quirks-table.h | 3 tools/memory-model/README | 3 65 files changed, 884 insertions(+), 364 deletions(-)
Akira Yokosawa (2):
tools/memory-model/README: Update klitmus7 compat table
docs: submitting-patches: Fix crossref to 'The canonical patch format'
Alex Elder (1):
net: ipa: compute proper aggregation limit
Alexei Starovoitov (1):
bpf: Fix combination of jit blinding and pointers to bpf subprogs.
Ashish Kalra (1):
KVM: SVM: Use kzalloc for sev ioctl interfaces to prevent kernel data leak
Bryan O'Donoghue (2):
media: i2c: imx412: Fix reset GPIO polarity
media: i2c: imx412: Fix power_off ordering
Chuck Lever (1):
NFSD: Fix possible sleep during nfsd4_release_lockowner()
Craig McLure (1):
ALSA: usb-audio: Configure sync endpoints before data
Dan Carpenter (2):
i2c: ismt: prevent memory corruption in ismt_access() dm integrity: fix error code in dm_integrity_ctr()
David Howells (1):
pipe: Fix missing lock in pipe_resize_ring()
Fabio Estevam (1):
crypto: caam - fix i.MX6SX entropy delay value
Florian Westphal (1):
netfilter: conntrack: re-fetch conntrack after insertion
Greg Kroah-Hartman (1):
Linux 5.18.2
Gustavo A. R. Silva (1):
drm/i915: Fix -Wstringop-overflow warning in call to intel_read_wm_latency()
Hou Wenlong (1):
KVM: x86/mmu: Don't rebuild page when the page is synced and no tlb flushing is required
Jonathan Bakker (1):
ARM: dts: s5pv210: Correct interrupt name for bluetooth in Aries
KP Singh (1):
bpf: Fix usage of trace RCU in local storage.
Kumar Kartikeya Dwivedi (3):
bpf: Reject writes for PTR_TO_MAP_KEY in check_helper_mem_access
bpf: Check PTR_TO_MEM | MEM_RDONLY in check_helper_mem_access
bpf: Do write access check for kfunc and global func
Kuniyuki Iwashima (1):
pipe: make poll_usage boolean and annotate its access
Liu Jian (1):
bpf: Enlarge offset check value to INT_MAX in bpf_skb_{load,store}_bytes
Marco Chiappero (1):
crypto: qat - rework the VF2PF interrupt handling logic
Marek Maślanka (1):
HID: multitouch: Add support for Google Whiskers Touchpad
Mariusz Tkaczyk (1):
raid5: introduce MD_BROKEN
Maxim Levitsky (2):
KVM: x86: fix typo in __try_cmpxchg_user causing non-atomicness
KVM: x86: avoid loading a vCPU after .vm_destroy was called
Mikulas Patocka (2):
dm crypt: make printing of the key constant-time dm stats: add cond_resched when looping over entries
Pablo Neira Ayuso (4):
netfilter: nf_tables: disallow non-stateful expression in sets earlier
netfilter: nf_tables: sanitize nft_set_desc_concat_parse()
netfilter: nf_tables: hold mutex on netns pre_exit path
netfilter: nf_tables: double hook unregistration in netns path
Paolo Bonzini (1):
x86, kvm: use correct GFP flags for preemption disabled
Peter Zijlstra (1):
x86/uaccess: Implement macros for CMPXCHG on user addresses
Phil Sutter (1):
netfilter: nft_limit: Clone packet limits' cost value
Randy Dunlap (1):
fs/ntfs3: validate BOOT sectors_per_clusters
Reinette Chatre (5):
x86/sgx: Disconnect backing page references from dirty status x86/sgx: Mark PCMD page as dirty when modifying contents x86/sgx: Obtain backing storage page with enclave mutex held x86/sgx: Fix race between reclaimer and page fault handler x86/sgx: Ensure no data in PCMD page after truncate
Sarthak Kukreti (1):
dm verity: set DM_TARGET_IMMUTABLE feature flag
Sean Christopherson (6):
x86/fpu: KVM: Set the base guest FPU uABI size to sizeof(struct kvm_xsave) x86/kvm: Alloc dummy async #PF token outside of raw spinlock
KVM: x86: Use __try_cmpxchg_user() to update guest PTE A/D bits
KVM: x86: Use __try_cmpxchg_user() to emulate atomic accesses
KVM: x86: avoid calling x86 emulator without a decoded instruction
KVM: x86: Drop WARNs that assert a triple fault never "escapes" from L2
Song Liu (1):
bpf: Fill new bpf_prog_pack with illegal instructions
Stefan Mahnke-Hartmann (1):
tpm: Fix buffer access in tpm2_get_tpm_pt()
Stephen Brennan (1):
assoc_array: Fix BUG_ON during garbage collect
Steven Rostedt (1):
Bluetooth: hci_qca: Use del_timer_sync() before freeing
Sultan Alsawaf (1):
zsmalloc: fix races between asynchronous zspage free and page migration
Tadeusz Struk (1):
exfat: check if cluster num is valid
Takashi Iwai (3):
ALSA: usb-audio: Workaround for clock setup on TEAC devices
ALSA: usb-audio: Add missing ep_idx in fixed EP quirks
ALSA: usb-audio: Optimize TEAC clock quirk
Tao Jin (1):
HID: multitouch: add quirks to enable Lenovo X12 trackpoint
Trond Myklebust (1):
NFS: Memory allocation failures are not server fatal errors
Vitaly Chikunov (1):
crypto: ecrdsa - Fix incorrect use of vli_cmp
Xiaomeng Tong (1):
KVM: PPC: Book3S HV: fix incorrect NULL check on list iterator
Xiu Jianfeng (1):
tpm: ibmvtpm: Correct the return value in tpm_ibmvtpm_probe()
Yanfei Xu (1):
KVM: x86: Fix the intel_pt PMI handling wrongly considered from guest
Yuntao Wang (2):
bpf: Fix potential array overflow in bpf_trampoline_get_progs()
bpf: Fix excessive memory allocation in stack_map_alloc()
Greg Kroah-Hartman
maintainerDocumentation/process/submitting-patches.rst +1 -1
@@ -77,7 +77,7 @@ as you intend it to. The maintainer will thank you if you write your patch description in a form which can be easily pulled into Linux's source code management -system, ``git``, as a "commit log". See :ref:`explicit_in_reply_to`. +system, ``git``, as a "commit log". See :ref:`the_canonical_patch_format`. Solve only one problem per patch. If your description starts to get long, that's a sign that you probably need to split up your patch.
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 18 -SUBLEVEL = 1 +SUBLEVEL = 2 EXTRAVERSION = NAME = Superb Owl
arch/arm/boot/dts/s5pv210-aries.dtsi +1 -1
@@ -895,7 +895,7 @@ bluetooth { device-wakeup-gpios = <&gpg3 4 GPIO_ACTIVE_HIGH>; interrupt-parent = <&gph2>; interrupts = <5 IRQ_TYPE_LEVEL_HIGH>; - interrupt-names = "host-wake"; + interrupt-names = "host-wakeup"; }; };
arch/powerpc/kvm/book3s_hv_uvmem.c +5 -3
@@ -361,13 +361,15 @@ static bool kvmppc_gfn_is_uvmem_pfn(unsigned long gfn, struct kvm *kvm,static bool kvmppc_next_nontransitioned_gfn (const struct kvm_memory_slot *memslot,struct kvm *kvm,unsigned long *gfn) { -struct kvmppc_uvmem_slot *p; +struct kvmppc_uvmem_slot *p =NULL , *iter;bool ret = false;unsigned long i; -list_for_each_entry (p, &kvm->arch.uvmem_pfns, list) -if (*gfn >= p->base_pfn && *gfn < p->base_pfn + p->nr_pfns) +list_for_each_entry (iter, &kvm->arch.uvmem_pfns, list) +if (*gfn >= iter->base_pfn && *gfn < iter->base_pfn + iter->nr_pfns) { + p = iter;break ; + }if (!p)return ret;/*
arch/x86/include/asm/uaccess.h +142 -0
154 lines not on this page · raw message
arch/x86/kernel/cpu/sgx/encl.c +104 -9
155 lines not on this page · raw message
arch/x86/kernel/cpu/sgx/encl.h +1 -1
@@ -107,7 +107,7 @@ void sgx_encl_release(struct kref *ref);int sgx_encl_mm_add (struct sgx_encl *encl,struct mm_struct *mm);int sgx_encl_get_backing (struct sgx_encl *encl,unsigned long page_index,struct sgx_backing *backing); -void sgx_encl_put_backing (struct sgx_backing *backing,bool do_write); +void sgx_encl_put_backing (struct sgx_backing *backing);int sgx_encl_test_and_clear_young (struct mm_struct *mm,struct sgx_encl_page *page);
arch/x86/kernel/cpu/sgx/main.c +9 -4
@@ -191,6 +191,8 @@ static int __sgx_encl_ewb(struct sgx_epc_page *epc_page, void *va_slot, backing->pcmd_offset; ret =__ewb (&pginfo,sgx_get_epc_virt_addr (epc_page), va_slot); +set_page_dirty (backing->pcmd); +set_page_dirty (backing->contents);kunmap_atomic ((void *)(unsigned long )(pginfo.metadata - backing->pcmd_offset));
@@ -308,6 +310,7 @@ static void sgx_reclaimer_write(struct sgx_epc_page *epc_page,sgx_encl_ewb (epc_page, backing); encl_page->epc_page =NULL ; encl->secs_child_cnt--; +sgx_encl_put_backing (backing);if (!encl->secs_child_cnt &&test_bit (SGX_ENCL_INITIALIZED , &encl->flags)) { ret = sgx_encl_get_backing(encl, PFN_DOWN(encl->size),
@@ -320,7 +323,7 @@ static void sgx_reclaimer_write(struct sgx_epc_page *epc_page,sgx_encl_free_epc_page (encl->secs.epc_page); encl->secs.epc_page =NULL ; -sgx_encl_put_backing (&secs_backing, true); +sgx_encl_put_backing (&secs_backing); } out:
@@ -379,11 +382,14 @@ static void sgx_reclaim_pages(void) goto skip; page_index =PFN_DOWN (encl_page->desc - encl_page->encl->base); + +mutex_lock (&encl_page->encl->lock); ret =sgx_encl_get_backing (encl_page->encl, page_index, &backing[i]); -if (ret) +if (ret) { +mutex_unlock (&encl_page->encl->lock); goto skip; + } -mutex_lock (&encl_page->encl->lock); encl_page->desc |=SGX_ENCL_PAGE_BEING_RECLAIMED ;mutex_unlock (&encl_page->encl->lock);continue ;
@@ -411,7 +417,6 @@ static void sgx_reclaim_pages(void) encl_page = epc_page->owner;sgx_reclaimer_write (epc_page, &backing[i]); -sgx_encl_put_backing (&backing[i], true);kref_put (&encl_page->encl->refcount, sgx_encl_release); epc_page->flags &= ~SGX_EPC_PAGE_RECLAIMER_TRACKED ;
arch/x86/kernel/fpu/core.c +16 -1
@@ -14,6 +14,8 @@#include <asm/traps.h> #include <asm/irq_regs.h> +#include <uapi/asm/kvm.h> +#include <linux/hardirq.h> #include <linux/pkeys.h> #include <linux/vmalloc.h>
@@ -232,7 +234,20 @@ bool fpu_alloc_guest_fpstate(struct fpu_guest *gfpu) gfpu->fpstate = fpstate; gfpu->xfeatures = fpu_user_cfg.default_features; gfpu->perm = fpu_user_cfg.default_features; - gfpu->uabi_size = fpu_user_cfg.default_size; + +/* +* KVM sets the FP+SSE bits in the XSAVE header when copying FPU state +* to userspace, even when XSAVE is unsupported, so that restoring FPU +* state on a different CPU that does support XSAVE can cleanly load +* the incoming state using its natural XSAVE. In other words, KVM's +* uABI size may be larger than this host's default size. Conversely, +* the default size should never be larger than KVM's base uABI size; +* all features that can expand the uABI size must be opt-in. +*/ + gfpu->uabi_size =sizeof (struct kvm_xsave ); +if (WARN_ON_ONCE (fpu_user_cfg.default_size > gfpu->uabi_size)) + gfpu->uabi_size = fpu_user_cfg.default_size; +fpu_init_guest_permissions (gfpu);return true;
arch/x86/kernel/kvm.c +27 -14
62 lines not on this page · raw message
arch/x86/kvm/mmu/mmu.c +9 -9
@@ -1843,17 +1843,14 @@ static void kvm_mmu_commit_zap_page(struct kvm *kvm, &(_kvm)->arch.mmu_page_hash[kvm_page_table_hashfn(_gfn)]) \if ((_sp)->gfn != (_gfn) || (_sp)->role.direct) {}else -static bool kvm_sync_page(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp, +static int kvm_sync_page(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,struct list_head *invalid_list) {int ret = vcpu->arch.mmu->sync_page (vcpu, sp); -if (ret <0 ) { +if (ret <0 )kvm_mmu_prepare_zap_page (vcpu->kvm, sp, invalid_list); -return false; - } - -return !!ret; +return ret; } static bool kvm_mmu_remote_flush_or_zap(struct kvm *kvm,
@@ -1975,7 +1972,7 @@ static int mmu_sync_children(struct kvm_vcpu *vcpu,for_each_sp (pages, sp, parents, i) {kvm_unlink_unsync_page (vcpu->kvm, sp); - flush |=kvm_sync_page (vcpu, sp, &invalid_list); + flush |=kvm_sync_page (vcpu, sp, &invalid_list) >0 ;mmu_pages_clear_parents (&parents); }if (need_resched () ||rwlock_needbreak (&vcpu->kvm->mmu_lock)) {
@@ -2016,6 +2013,7 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu,struct hlist_head *sp_list;unsigned quadrant;struct kvm_mmu_page *sp; +int ret;int collisions =0 ;LIST_HEAD (invalid_list);
@@ -2068,11 +2066,13 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu,* If the sync fails, the page is zapped. If so, break * in order to rebuild it. */ -if (!kvm_sync_page (vcpu, sp, &invalid_list)) + ret =kvm_sync_page (vcpu, sp, &invalid_list); +if (ret <0 )break ;WARN_ON (!list_empty (&invalid_list)); -kvm_flush_remote_tlbs (vcpu->kvm); +if (ret >0 ) +kvm_flush_remote_tlbs (vcpu->kvm); }__clear_sp_write_flooding_count (sp);
arch/x86/kvm/mmu/paging_tmpl.h +1 -37
@@ -144,42 +144,6 @@ static bool FNAME(is_rsvd_bits_set)(struct kvm_mmu *mmu, u64 gpte, int level)FNAME (is_bad_mt_xwr)(&mmu->guest_rsvd_check, gpte); } -static int FNAME (cmpxchg_gpte )(struct kvm_vcpu *vcpu,struct kvm_mmu *mmu, -pt_element_t __user *ptep_user,unsigned index, -pt_element_t orig_pte,pt_element_t new_pte) -{ -signed char r; - -if (!user_access_begin (ptep_user,sizeof (pt_element_t))) -return -EFAULT ; - -#ifdef CMPXCHG - asmvolatile ("1:" LOCK_PREFIX CMPXCHG " %[new], %[ptr]\n" -"setnz %b[r]\n" -"2:" - _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_EFAULT_REG, %k[r]) - : [ptr] "+m" (*ptep_user), - [old] "+a" (orig_pte), - [r] "=q" (r) - : [new] "r" (new_pte) - : "memory"); -#else - asmvolatile ("1:" LOCK_PREFIX "cmpxchg8b %[ptr]\n" -"setnz %b[r]\n" -"2:" - _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_EFAULT_REG, %k[r]) - : [ptr] "+m" (*ptep_user), - [old] "+A" (orig_pte), - [r] "=q" (r) - : [new_lo] "b" ((u32)new_pte), - [new_hi] "c" ((u32)(new_pte >> 32)) - : "memory"); -#endif - -user_access_end (); -return r; -} -static bool FNAME (prefetch_invalid_gpte )(struct kvm_vcpu *vcpu,struct kvm_mmu_page *sp,u64 *spte,u64 gpte)
@@ -278,7 +242,7 @@ static int FNAME(update_accessed_dirty_bits)(struct kvm_vcpu *vcpu,if (unlikely (!walker->pte_writable[level -1 ]))continue ; - ret =FNAME (cmpxchg_gpte)(vcpu, mmu, ptep_user, index, orig_pte, pte); + ret =__try_cmpxchg_user (ptep_user, &orig_pte, pte, fault);if (ret)return ret;
arch/x86/kvm/svm/nested.c +0 -3
@@ -819,9 +819,6 @@ int nested_svm_vmexit(struct vcpu_svm *svm)struct kvm_host_map map;int rc; -/* Triple faults in L2 should never escape. */ -WARN_ON_ONCE (kvm_check_request (KVM_REQ_TRIPLE_FAULT , vcpu)); - rc =kvm_vcpu_map (vcpu,gpa_to_gfn (svm->nested.vmcb12_gpa), &map);if (rc) {if (rc == -EINVAL )
arch/x86/kvm/svm/sev.c +6 -6
@@ -688,7 +688,7 @@ static int sev_launch_measure(struct kvm *kvm, struct kvm_sev_cmd *argp)if (params.len >SEV_FW_BLOB_MAX_SIZE )return -EINVAL ; - blob =kmalloc (params.len,GFP_KERNEL_ACCOUNT ); + blob =kzalloc (params.len,GFP_KERNEL_ACCOUNT );if (!blob)return -ENOMEM ;
@@ -808,7 +808,7 @@ static int __sev_dbg_decrypt_user(struct kvm *kvm, unsigned long paddr,if (!IS_ALIGNED (dst_paddr,16 ) || !IS_ALIGNED (paddr,16 ) || !IS_ALIGNED (size,16 )) { - tpage = (void *)alloc_page (GFP_KERNEL ); + tpage = (void *)alloc_page (GFP_KERNEL | __GFP_ZERO);if (!tpage)return -ENOMEM ;
@@ -1094,7 +1094,7 @@ static int sev_get_attestation_report(struct kvm *kvm, struct kvm_sev_cmd *argp)if (params.len >SEV_FW_BLOB_MAX_SIZE )return -EINVAL ; - blob =kmalloc (params.len,GFP_KERNEL_ACCOUNT ); + blob =kzalloc (params.len,GFP_KERNEL_ACCOUNT );if (!blob)return -ENOMEM ;
@@ -1176,7 +1176,7 @@ static int sev_send_start(struct kvm *kvm, struct kvm_sev_cmd *argp)return -EINVAL ;/* allocate the memory to hold the session data blob */ - session_data =kmalloc (params.session_len,GFP_KERNEL_ACCOUNT ); + session_data =kzalloc (params.session_len,GFP_KERNEL_ACCOUNT );if (!session_data)return -ENOMEM ;
@@ -1300,11 +1300,11 @@ static int sev_send_update_data(struct kvm *kvm, struct kvm_sev_cmd *argp)/* allocate memory for header and transport buffer */ ret = -ENOMEM ; - hdr =kmalloc (params.hdr_len,GFP_KERNEL_ACCOUNT ); + hdr =kzalloc (params.hdr_len,GFP_KERNEL_ACCOUNT );if (!hdr) goto e_unpin; - trans_data =kmalloc (params.trans_len,GFP_KERNEL_ACCOUNT ); + trans_data =kzalloc (params.trans_len,GFP_KERNEL_ACCOUNT );if (!trans_data) goto e_free_hdr;
arch/x86/kvm/vmx/nested.c +0 -3
@@ -4518,9 +4518,6 @@ void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 vm_exit_reason,/* trying to cancel vmlaunch/vmresume is a bug */ WARN_ON_ONCE (vmx->nested.nested_run_pending); -/* Similarly, triple faults in L2 should never escape. */ -WARN_ON_ONCE (kvm_check_request (KVM_REQ_TRIPLE_FAULT , vcpu)); -if (kvm_check_request (KVM_REQ_GET_NESTED_STATE_PAGES , vcpu)) {/* * KVM_REQ_GET_NESTED_STATE_PAGES is also used to map
arch/x86/kvm/vmx/vmx.c +1 -1
@@ -7856,7 +7856,7 @@ static unsigned int vmx_handle_intel_pt_intr(void)struct kvm_vcpu *vcpu =kvm_get_running_vcpu ();/* '0' on failure so that the !PT case can use a RET0 static call. */ -if (!kvm_arch_pmi_in_guest (vcpu)) +if (!vcpu || !kvm_handling_nmi_from_guest (vcpu))return 0 ;kvm_make_request (KVM_REQ_PMI , vcpu);
arch/x86/kvm/x86.c +36 -40
163 lines not on this page · raw message
crypto/ecrdsa.c +4 -4
@@ -113,15 +113,15 @@ static int ecrdsa_verify(struct akcipher_request *req)/* Step 1: verify that 0 < r < q, 0 < s < q */ if (vli_is_zero (r, ndigits) || -vli_cmp (r, ctx->curve->n, ndigits) ==1 || +vli_cmp (r, ctx->curve->n, ndigits) >=0 ||vli_is_zero (s, ndigits) || -vli_cmp (s, ctx->curve->n, ndigits) ==1 ) +vli_cmp (s, ctx->curve->n, ndigits) >=0 )return -EKEYREJECTED ;/* Step 2: calculate hash (h) of the message (passed as input) */ /* Step 3: calculate e = h \mod q */ vli_from_le64 (e, digest, ndigits); -if (vli_cmp (e, ctx->curve->n, ndigits) ==1 ) +if (vli_cmp (e, ctx->curve->n, ndigits) >=0 )vli_sub (e, e, ctx->curve->n, ndigits);if (vli_is_zero (e, ndigits)) e[0 ] =1 ;
@@ -137,7 +137,7 @@ static int ecrdsa_verify(struct akcipher_request *req)/* Step 6: calculate point C = z_1P + z_2Q, and R = x_c \mod q */ ecc_point_mult_shamir (&cc, z1, &ctx->curve->g, z2, &ctx->pub_key, ctx->curve); -if (vli_cmp (cc.x, ctx->curve->n, ndigits) ==1 ) +if (vli_cmp (cc.x, ctx->curve->n, ndigits) >=0 )vli_sub (cc.x, cc.x, ctx->curve->n, ndigits);/* Step 7: if R == r signature is valid */
drivers/bluetooth/hci_qca.c +2 -2
@@ -696,9 +696,9 @@ static int qca_close(struct hci_uart *hu)skb_queue_purge (&qca->tx_wait_q);skb_queue_purge (&qca->txq);skb_queue_purge (&qca->rx_memdump_q); -del_timer (&qca->tx_idle_timer); -del_timer (&qca->wake_retrans_timer);destroy_workqueue (qca->workqueue); +del_timer_sync (&qca->tx_idle_timer); +del_timer_sync (&qca->wake_retrans_timer); qca->hu =NULL ;kfree_skb (qca->rx_skb);
drivers/char/tpm/tpm2-cmd.c +10 -1
@@ -400,7 +400,16 @@ ssize_t tpm2_get_tpm_pt(struct tpm_chip *chip, u32 property_id, u32 *value,if (!rc) { out = (struct tpm2_get_cap_out *) &buf.data[TPM_HEADER_SIZE ]; - *value =be32_to_cpu (out->value); +/* +* To prevent failing boot up of some systems, Infineon TPM2.0 +* returns SUCCESS on TPM2_Startup in field upgrade mode. Also +* the TPM2_Getcapability command returns a zero length list +* in field upgrade mode. +*/ +if (be32_to_cpu (out->property_cnt) >0 ) + *value =be32_to_cpu (out->value); +else + rc = -ENODATA ; }tpm_buf_destroy (&buf);return rc;
drivers/char/tpm/tpm_ibmvtpm.c +1 -0
@@ -681,6 +681,7 @@ static int tpm_ibmvtpm_probe(struct vio_dev *vio_dev,if (!wait_event_timeout (ibmvtpm->crq_queue.wq, ibmvtpm->rtce_buf !=NULL ,HZ )) { + rc = -ENODEV ;dev_err (dev,"CRQ response timed out\n" ); goto init_irq_cleanup; }
drivers/crypto/caam/ctrl.c +18 -0
@@ -609,6 +609,13 @@ static bool check_version(struct fsl_mc_version *mc_version, u32 major, }#endif +static bool needs_entropy_delay_adjustment (void ) +{ +if (of_machine_is_compatible ("fsl,imx6sx" )) +return true; +return false; +} +/* Probe routine for CAAM top (controller) level */ static int caam_probe (struct platform_device *pdev) {
@@ -855,6 +862,8 @@ static int caam_probe(struct platform_device *pdev)* Also, if a handle was instantiated, do not change * the TRNG parameters. */ +if (needs_entropy_delay_adjustment ()) + ent_delay =12000 ;if (!(ctrlpriv->rng4_sh_init || inst_handles)) { dev_info(dev, "Entropy delay = %u\n",
@@ -871,6 +880,15 @@ static int caam_probe(struct platform_device *pdev)*/ ret =instantiate_rng (dev, inst_handles, gen_sk); +/* +* Entropy delay is determined via TRNG characterization. +* TRNG characterization is run across different voltages +* and temperatures. +* If worst case value for ent_dly is identified, +* the loop can be skipped for that platform. +*/ +if (needs_entropy_delay_adjustment ()) +break ;if (ret == -EAGAIN )/* * if here, the loop will rerun,
drivers/crypto/qat/qat_common/adf_accel_devices.h +1 -1
@@ -152,9 +152,9 @@ struct adf_pfvf_ops {int (*enable_comms)(struct adf_accel_dev *accel_dev);u32 (*get_pf2vf_offset)(u32 i);u32 (*get_vf2pf_offset)(u32 i); -u32 (*get_vf2pf_sources)(void__iomem *pmisc_addr);void (*enable_vf2pf_interrupts)(void __iomem *pmisc_addr,u32 vf_mask);void (*disable_vf2pf_interrupts)(void __iomem *pmisc_addr,u32 vf_mask); +u32 (*disable_pending_vf2pf_interrupts)(void__iomem *pmisc_addr);int (*send_msg)(struct adf_accel_dev *accel_dev,struct pfvf_message msg,u32 pfvf_offset,struct mutex *csr_lock); struct pfvf_message (*recv_msg)(struct adf_accel_dev *accel_dev,
drivers/crypto/qat/qat_common/adf_gen2_pfvf.c +40 -18
84 lines not on this page · raw message
drivers/crypto/qat/qat_common/adf_gen4_pfvf.c +33 -11
70 lines not on this page · raw message
drivers/crypto/qat/qat_common/adf_isr.c +7 -10
@@ -76,32 +76,29 @@ void adf_disable_vf2pf_interrupts(struct adf_accel_dev *accel_dev, u32 vf_mask)spin_unlock_irqrestore (&accel_dev->pf.vf2pf_ints_lock, flags); } -static void adf_disable_vf2pf_interrupts_irq (struct adf_accel_dev *accel_dev, -u32 vf_mask) +static u32 adf_disable_pending_vf2pf_interrupts (struct adf_accel_dev *accel_dev) {void __iomem *pmisc_addr =adf_get_pmisc_base (accel_dev); +u32 pending;spin_lock (&accel_dev->pf.vf2pf_ints_lock); -GET_PFVF_OPS (accel_dev)->disable_vf2pf_interrupts (pmisc_addr, vf_mask); + pending =GET_PFVF_OPS (accel_dev)->disable_pending_vf2pf_interrupts (pmisc_addr);spin_unlock (&accel_dev->pf.vf2pf_ints_lock); + +return pending; }static bool adf_handle_vf2pf_int (struct adf_accel_dev *accel_dev) { -void __iomem *pmisc_addr =adf_get_pmisc_base (accel_dev);bool irq_handled = false;unsigned long vf_mask; -/* Get the interrupt sources triggered by VFs */ - vf_mask =GET_PFVF_OPS (accel_dev)->get_vf2pf_sources (pmisc_addr); - +/* Get the interrupt sources triggered by VFs, except for those already disabled */ + vf_mask =adf_disable_pending_vf2pf_interrupts (accel_dev);if (vf_mask) {struct adf_accel_vf_info *vf_info;int i; -/* Disable VF2PF interrupts for VFs with pending ints */ -adf_disable_vf2pf_interrupts_irq (accel_dev, vf_mask); -/* * Handle VF2PF interrupt unless the VF is malicious and * is attempting to flood the host OS with VF2PF interrupts.
drivers/crypto/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c +51 -25
108 lines not on this page · raw message
drivers/gpu/drm/i915/intel_pm.c +1 -1
@@ -2859,7 +2859,7 @@ static void ilk_compute_wm_level(const struct drm_i915_private *dev_priv, }static void intel_read_wm_latency (struct drm_i915_private *dev_priv, -u16 wm[8 ]) +u16 wm[]) {struct intel_uncore *uncore = &dev_priv->uncore;
drivers/hid/hid-ids.h +1 -0
@@ -768,6 +768,7 @@#define USB_DEVICE_ID_LENOVO_X1_COVER 0x6085#define USB_DEVICE_ID_LENOVO_X1_TAB 0x60a3#define USB_DEVICE_ID_LENOVO_X1_TAB3 0x60b5 +#define USB_DEVICE_ID_LENOVO_X12_TAB 0x60fe#define USB_DEVICE_ID_LENOVO_OPTICAL_USB_MOUSE_600E 0x600e#define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D 0x608d#define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6019 0x6019
drivers/hid/hid-multitouch.c +9 -0
@@ -2034,6 +2034,12 @@ static const struct hid_device_id mt_devices[] = { USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB3) }, +/* Lenovo X12 TAB Gen 1 */ + { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, +HID_DEVICE (BUS_USB ,HID_GROUP_MULTITOUCH_WIN_8 , +USB_VENDOR_ID_LENOVO , + USB_DEVICE_ID_LENOVO_X12_TAB) }, + /* MosArt panels */ { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, MT_USB_DEVICE(USB_VENDOR_ID_ASUS,
@@ -2178,6 +2184,9 @@ static const struct hid_device_id mt_devices[] = { { .driver_data = MT_CLS_GOOGLE,HID_DEVICE (HID_BUS_ANY ,HID_GROUP_ANY ,USB_VENDOR_ID_GOOGLE , USB_DEVICE_ID_GOOGLE_TOUCH_ROSE) }, + { .driver_data = MT_CLS_GOOGLE, +HID_DEVICE (BUS_USB ,HID_GROUP_MULTITOUCH_WIN_8 ,USB_VENDOR_ID_GOOGLE , + USB_DEVICE_ID_GOOGLE_WHISKERS) },/* Generic MT device */ { HID_DEVICE(HID_BUS_ANY, HID_GROUP_MULTITOUCH, HID_ANY_ID, HID_ANY_ID) },
drivers/i2c/busses/i2c-ismt.c +3 -0
@@ -528,6 +528,9 @@ static int ismt_access(struct i2c_adapter *adap, u16 addr,case I2C_SMBUS_BLOCK_PROC_CALL :dev_dbg (dev,"I2C_SMBUS_BLOCK_PROC_CALL\n" ); +if (data->block[0 ] >I2C_SMBUS_BLOCK_MAX ) +return -EINVAL ; + dma_size =I2C_SMBUS_BLOCK_MAX ; desc->tgtaddr_rw =ISMT_DESC_ADDR_RW (addr,1 ); desc->wr_len_cmd = data->block[0 ] +1 ;
drivers/md/dm-crypt.c +11 -3
@@ -3439,6 +3439,11 @@ static int crypt_map(struct dm_target *ti, struct bio *bio)return DM_MAPIO_SUBMITTED ; } +static char hex2asc (unsigned char c) +{ +return c +'0' + ((unsigned )(9 - c) >>4 &0x27 ); +} +static void crypt_status (struct dm_target *ti,status_type_t type,unsigned status_flags,char *result,unsigned maxlen) {
@@ -3457,9 +3462,12 @@ static void crypt_status(struct dm_target *ti, status_type_t type,if (cc->key_size >0 ) {if (cc->key_string)DMEMIT (":%u:%s" , cc->key_size, cc->key_string); -else -for (i =0 ; i < cc->key_size; i++) -DMEMIT ("%02x" , cc->key[i]); +else { +for (i =0 ; i < cc->key_size; i++) { +DMEMIT ("%c%c" ,hex2asc (cc->key[i] >>4 ), +hex2asc (cc->key[i] &0xf )); + } + } }else DMEMIT ("-" );
drivers/md/dm-integrity.c +0 -2
@@ -4494,8 +4494,6 @@ static int dm_integrity_ctr(struct dm_target *ti, unsigned argc, char **argv) }if (should_write_sb) { -int r; -init_journal (ic,0 , ic->journal_sections,0 ); r =dm_integrity_failed (ic);if (unlikely (r)) {
drivers/md/dm-stats.c +8 -0
@@ -225,6 +225,7 @@ void dm_stats_cleanup(struct dm_stats *stats)atomic_read (&shared->in_flight[READ ]), atomic_read(&shared->in_flight[WRITE])); } +cond_resched (); }dm_stat_free (&s->rcu_head); }
@@ -330,6 +331,7 @@ static int dm_stats_create(struct dm_stats *stats, sector_t start, sector_t end,for (ni =0 ; ni < n_entries; ni++) {atomic_set (&s->stat_shared[ni].in_flight[READ ],0 );atomic_set (&s->stat_shared[ni].in_flight[WRITE ],0 ); +cond_resched (); }if (s->n_histogram_entries) {
@@ -342,6 +344,7 @@ static int dm_stats_create(struct dm_stats *stats, sector_t start, sector_t end,for (ni =0 ; ni < n_entries; ni++) { s->stat_shared[ni].tmp.histogram = hi; hi += s->n_histogram_entries +1 ; +cond_resched (); } }
@@ -362,6 +365,7 @@ static int dm_stats_create(struct dm_stats *stats, sector_t start, sector_t end,for (ni =0 ; ni < n_entries; ni++) { p[ni].histogram = hi; hi += s->n_histogram_entries +1 ; +cond_resched (); } } }
@@ -497,6 +501,7 @@ static int dm_stats_list(struct dm_stats *stats, const char *program, }DMEMIT ("\n" ); } +cond_resched (); }mutex_unlock (&stats->mutex);
@@ -774,6 +779,7 @@ static void __dm_stat_clear(struct dm_stat *s, size_t idx_start, size_t idx_end,local_irq_enable (); } } +cond_resched (); } }
@@ -889,6 +895,8 @@ static int dm_stats_print(struct dm_stats *stats, int id,if (unlikely (sz +1 >= maxlen)) goto buffer_overflow; + +cond_resched (); }if (clear)
drivers/md/dm-verity-target.c +1 -0
@@ -1312,6 +1312,7 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv)static struct target_type verity_target = { .name ="verity" , + .features =DM_TARGET_IMMUTABLE , .version = {1 ,8 ,0 }, .module =THIS_MODULE , .ctr = verity_ctr,
drivers/md/raid5.c +22 -25
73 lines not on this page · raw message
drivers/media/i2c/imx412.c +4 -4
@@ -1011,7 +1011,7 @@ static int imx412_power_on(struct device *dev)struct imx412 *imx412 =to_imx412 (sd);int ret; -gpiod_set_value_cansleep (imx412->reset_gpio,1 ); +gpiod_set_value_cansleep (imx412->reset_gpio,0 ); ret =clk_prepare_enable (imx412->inclk);if (ret) {
@@ -1024,7 +1024,7 @@ static int imx412_power_on(struct device *dev)return 0 ; error_reset: -gpiod_set_value_cansleep (imx412->reset_gpio,0 ); +gpiod_set_value_cansleep (imx412->reset_gpio,1 );return ret; }
@@ -1040,10 +1040,10 @@ static int imx412_power_off(struct device *dev)struct v4l2_subdev *sd =dev_get_drvdata (dev);struct imx412 *imx412 =to_imx412 (sd); -gpiod_set_value_cansleep (imx412->reset_gpio,0 ); -clk_disable_unprepare (imx412->inclk); +gpiod_set_value_cansleep (imx412->reset_gpio,1 ); +return 0 ; }
drivers/net/ipa/ipa_endpoint.c +6 -3
@@ -130,9 +130,10 @@ static bool ipa_endpoint_data_valid_one(struct ipa *ipa, u32 count,*/ if (data->endpoint.config.aggregation) { limit +=SZ_1K *aggr_byte_limit_max (ipa->version); -if (buffer_size > limit) { +if (buffer_size -NET_SKB_PAD > limit) {dev_err (dev,"RX buffer size too large for aggregated RX endpoint %u (%u > %u)\n" , - data->endpoint_id, buffer_size, limit); + data->endpoint_id, + buffer_size -NET_SKB_PAD , limit);return false; }
@@ -739,6 +740,7 @@ static void ipa_endpoint_init_aggr(struct ipa_endpoint *endpoint)if (endpoint->data->aggregation) {if (!endpoint->toward_ipa) {const struct ipa_endpoint_rx_data *rx_data; +u32 buffer_size;bool close_eof;u32 limit;
@@ -746,7 +748,8 @@ static void ipa_endpoint_init_aggr(struct ipa_endpoint *endpoint) val |=u32_encode_bits (IPA_ENABLE_AGGR ,AGGR_EN_FMASK ); val |=u32_encode_bits (IPA_GENERIC ,AGGR_TYPE_FMASK ); - limit =ipa_aggr_size_kb (rx_data->buffer_size); + buffer_size = rx_data->buffer_size; + limit =ipa_aggr_size_kb (buffer_size -NET_SKB_PAD ); val |=aggr_byte_limit_encoded (version, limit); limit =IPA_AGGR_TIME_LIMIT ;
fs/exfat/balloc.c +6 -2
@@ -148,7 +148,9 @@ int exfat_set_bitmap(struct inode *inode, unsigned int clu, bool sync)struct super_block *sb = inode->i_sb;struct exfat_sb_info *sbi =EXFAT_SB (sb); -WARN_ON (clu <EXFAT_FIRST_CLUSTER ); +if (!is_valid_cluster (sbi, clu)) +return -EINVAL ; + ent_idx =CLUSTER_TO_BITMAP_ENT (clu); i =BITMAP_OFFSET_SECTOR_INDEX (sb, ent_idx); b =BITMAP_OFFSET_BIT_IN_SECTOR (sb, ent_idx);
@@ -166,7 +168,9 @@ void exfat_clear_bitmap(struct inode *inode, unsigned int clu, bool sync)struct exfat_sb_info *sbi =EXFAT_SB (sb);struct exfat_mount_options *opts = &sbi->options; -WARN_ON (clu <EXFAT_FIRST_CLUSTER ); +if (!is_valid_cluster (sbi, clu)) +return ; + ent_idx =CLUSTER_TO_BITMAP_ENT (clu); i =BITMAP_OFFSET_SECTOR_INDEX (sb, ent_idx); b =BITMAP_OFFSET_BIT_IN_SECTOR (sb, ent_idx);
fs/exfat/exfat_fs.h +6 -0
@@ -381,6 +381,12 @@ static inline int exfat_sector_to_cluster(struct exfat_sb_info *sbi,EXFAT_RESERVED_CLUSTERS ; } +static inline bool is_valid_cluster (struct exfat_sb_info *sbi, +unsigned int clus) +{ +return clus >=EXFAT_FIRST_CLUSTER && clus < sbi->num_clusters; +} +/* super.c */ int exfat_set_volume_dirty (struct super_block *sb);int exfat_clear_volume_dirty (struct super_block *sb);
fs/exfat/fatent.c +0 -6
@@ -81,12 +81,6 @@ int exfat_ent_set(struct super_block *sb, unsigned int loc,return 0 ; } -static inline bool is_valid_cluster (struct exfat_sb_info *sbi, -unsigned int clus) -{ -return clus >=EXFAT_FIRST_CLUSTER && clus < sbi->num_clusters; -} -int exfat_ent_get (struct super_block *sb,unsigned int loc,unsigned int *content) {
fs/nfs/internal.h +1 -0
@@ -841,6 +841,7 @@ static inline bool nfs_error_is_fatal_on_server(int err)case 0 :case -ERESTARTSYS :case -EINTR : +case -ENOMEM :return false; }return nfs_error_is_fatal (err);
fs/nfsd/nfs4state.c +4 -8
@@ -7330,16 +7330,12 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp,if (sop->so_is_open_owner || !same_owner_str (sop, owner))continue ; -/* see if there are still any locks associated with it */ - lo =lockowner (sop); -list_for_each_entry (stp, &sop->so_stateids, st_perstateowner) { -if (check_for_locks (stp->st_stid.sc_file, lo)) { - status = nfserr_locks_held; -spin_unlock (&clp->cl_lock); -return status; - } +if (atomic_read (&sop->so_count) !=1 ) { +spin_unlock (&clp->cl_lock); +return nfserr_locks_held; } + lo =lockowner (sop);nfs4_get_stateowner (sop);break ; }
fs/ntfs3/super.c +7 -3
@@ -668,9 +668,11 @@ static u32 format_size_gb(const u64 bytes, u32 *mb)static u32 true_sectors_per_clst (const struct NTFS_BOOT *boot) { -return boot->sectors_per_clusters <=0x80 - ? boot->sectors_per_clusters - : (1u << (0 - boot->sectors_per_clusters)); +if (boot->sectors_per_clusters <=0x80 ) +return boot->sectors_per_clusters; +if (boot->sectors_per_clusters >=0xf4 )/* limit shift to 2MB max */ +return 1U << (0 - boot->sectors_per_clusters); +return -EINVAL ; }/*
@@ -713,6 +715,8 @@ static int ntfs_init_from_boot(struct super_block *sb, u32 sector_size,/* cluster size: 512, 1K, 2K, 4K, ... 2M */ sct_per_clst =true_sectors_per_clst (boot); +if ((int )sct_per_clst <0 ) + goto out;if (!is_power_of_2 (sct_per_clst)) goto out;
fs/pipe.c +19 -14
@@ -653,7 +653,7 @@ pipe_poll(struct file *filp, poll_table *wait)unsigned int head, tail;/* Epoll has some historical nasty semantics, this enables them */ - pipe->poll_usage =1 ; +WRITE_ONCE (pipe->poll_usage, true);/* * Reading pipe state only -- no need for acquiring the semaphore.
@@ -1245,30 +1245,33 @@ unsigned int round_pipe_size(unsigned long size)/* * Resize the pipe ring to a number of slots. +* +* Note the pipe can be reduced in capacity, but only if the current +* occupancy doesn't exceed nr_slots; if it does, EBUSY will be +* returned instead. */ int pipe_resize_ring (struct pipe_inode_info *pipe,unsigned int nr_slots) {struct pipe_buffer *bufs;unsigned int head, tail, mask, n; -/* -* We can shrink the pipe, if arg is greater than the ring occupancy. -* Since we don't expect a lot of shrink+grow operations, just free and -* allocate again like we would do for growing. If the pipe currently -* contains more buffers than arg, then return busy. -*/ - mask = pipe->ring_size -1 ; - head = pipe->head; - tail = pipe->tail; - n =pipe_occupancy (pipe->head, pipe->tail); -if (nr_slots < n) -return -EBUSY ; - bufs =kcalloc (nr_slots,sizeof (*bufs),GFP_KERNEL_ACCOUNT | __GFP_NOWARN);if (unlikely (!bufs))return -ENOMEM ; +spin_lock_irq (&pipe->rd_wait.lock); + mask = pipe->ring_size -1 ; + head = pipe->head; + tail = pipe->tail; + + n =pipe_occupancy (head, tail); +if (nr_slots < n) { +spin_unlock_irq (&pipe->rd_wait.lock); +kfree (bufs); +return -EBUSY ; + } +/* * The pipe array wraps around, so just start the new one at zero * and adjust the indices.
@@ -1300,6 +1303,8 @@ int pipe_resize_ring(struct pipe_inode_info *pipe, unsigned int nr_slots) pipe->tail = tail; pipe->head = head; +spin_unlock_irq (&pipe->rd_wait.lock); +/* This might have made more room for writers */ wake_up_interruptible (&pipe->wr_wait);return 0 ;
include/linux/bpf_local_storage.h +2 -2
@@ -143,9 +143,9 @@ void bpf_selem_link_storage_nolock(struct bpf_local_storage *local_storage,bool bpf_selem_unlink_storage_nolock (struct bpf_local_storage *local_storage,struct bpf_local_storage_elem *selem, -bool uncharge_omem); +bool uncharge_omem,bool use_trace_rcu); -void bpf_selem_unlink (struct bpf_local_storage_elem *selem); +void bpf_selem_unlink (struct bpf_local_storage_elem *selem,bool use_trace_rcu);void bpf_selem_link_map (struct bpf_local_storage_map *smap,struct bpf_local_storage_elem *selem);
include/linux/pipe_fs_i.h +1 -1
@@ -71,7 +71,7 @@ struct pipe_inode_info {unsigned int files;unsigned int r_counter;unsigned int w_counter; -unsigned int poll_usage; +bool poll_usage;struct page *tmp_page;struct fasync_struct *fasync_readers;struct fasync_struct *fasync_writers;
include/net/netfilter/nf_conntrack_core.h +6 -1
@@ -58,8 +58,13 @@ static inline int nf_conntrack_confirm(struct sk_buff *skb)int ret =NF_ACCEPT ;if (ct) { -if (!nf_ct_is_confirmed (ct)) +if (!nf_ct_is_confirmed (ct)) { ret =__nf_conntrack_confirm (skb); + +if (ret ==NF_ACCEPT ) + ct = (struct nf_conn *)skb_nfct (skb); + } +if (likely (ret ==NF_ACCEPT ))nf_ct_deliver_cached_events (ct); }
kernel/bpf/bpf_inode_storage.c +2 -2
@@ -90,7 +90,7 @@ void bpf_inode_storage_free(struct inode *inode)*/ bpf_selem_unlink_map (selem); free_inode_storage =bpf_selem_unlink_storage_nolock ( - local_storage, selem, false); + local_storage, selem, false, false); }raw_spin_unlock_bh (&local_storage->lock);rcu_read_unlock ();
@@ -149,7 +149,7 @@ static int inode_storage_delete(struct inode *inode, struct bpf_map *map)if (!sdata)return -ENOENT ; -bpf_selem_unlink (SELEM (sdata)); +bpf_selem_unlink (SELEM (sdata), true);return 0 ; }
kernel/bpf/bpf_local_storage.c +19 -10
@@ -106,7 +106,7 @@ static void bpf_selem_free_rcu(struct rcu_head *rcu)*/ bool bpf_selem_unlink_storage_nolock (struct bpf_local_storage *local_storage,struct bpf_local_storage_elem *selem, -bool uncharge_mem) +bool uncharge_mem,bool use_trace_rcu) {struct bpf_local_storage_map *smap;bool free_local_storage;
@@ -150,11 +150,16 @@ bool bpf_selem_unlink_storage_nolock(struct bpf_local_storage *local_storage, SDATA(selem))RCU_INIT_POINTER (local_storage->cache[smap->cache_idx],NULL ); -call_rcu_tasks_trace (&selem->rcu, bpf_selem_free_rcu); +if (use_trace_rcu) +call_rcu_tasks_trace (&selem->rcu, bpf_selem_free_rcu); +else +kfree_rcu (selem, rcu); +return free_local_storage; } -static void __bpf_selem_unlink_storage (struct bpf_local_storage_elem *selem) +static void __bpf_selem_unlink_storage (struct bpf_local_storage_elem *selem, +bool use_trace_rcu) {struct bpf_local_storage *local_storage;bool free_local_storage = false;
@@ -169,12 +174,16 @@ static void __bpf_selem_unlink_storage(struct bpf_local_storage_elem *selem)raw_spin_lock_irqsave (&local_storage->lock, flags);if (likely (selem_linked_to_storage (selem))) free_local_storage =bpf_selem_unlink_storage_nolock ( - local_storage, selem, true); + local_storage, selem, true, use_trace_rcu);raw_spin_unlock_irqrestore (&local_storage->lock, flags); -if (free_local_storage) -call_rcu_tasks_trace (&local_storage->rcu, +if (free_local_storage) { +if (use_trace_rcu) +call_rcu_tasks_trace (&local_storage->rcu, bpf_local_storage_free_rcu); +else +kfree_rcu (local_storage, rcu); + } } void bpf_selem_link_storage_nolock(struct bpf_local_storage *local_storage,
@@ -214,14 +223,14 @@ void bpf_selem_link_map(struct bpf_local_storage_map *smap,raw_spin_unlock_irqrestore (&b->lock, flags); } -void bpf_selem_unlink (struct bpf_local_storage_elem *selem) +void bpf_selem_unlink (struct bpf_local_storage_elem *selem,bool use_trace_rcu) {/* Always unlink from map before unlinking from local_storage * because selem will be freed after successfully unlinked from * the local_storage. */ bpf_selem_unlink_map (selem); -__bpf_selem_unlink_storage (selem); +__bpf_selem_unlink_storage (selem, use_trace_rcu); } struct bpf_local_storage_data *
@@ -466,7 +475,7 @@ bpf_local_storage_update(void *owner, struct bpf_local_storage_map *smap,if (old_sdata) {bpf_selem_unlink_map (SELEM (old_sdata));bpf_selem_unlink_storage_nolock (local_storage,SELEM (old_sdata), - false); + false, true); } unlock:
@@ -548,7 +557,7 @@ void bpf_local_storage_map_free(struct bpf_local_storage_map *smap,migrate_disable ();__this_cpu_inc (*busy_counter); } -bpf_selem_unlink (selem); +bpf_selem_unlink (selem, false);if (busy_counter) {__this_cpu_dec (*busy_counter);migrate_enable ();
kernel/bpf/bpf_task_storage.c +2 -2
@@ -102,7 +102,7 @@ void bpf_task_storage_free(struct task_struct *task)*/ bpf_selem_unlink_map (selem); free_task_storage =bpf_selem_unlink_storage_nolock ( - local_storage, selem, false); + local_storage, selem, false, false); }raw_spin_unlock_irqrestore (&local_storage->lock, flags);bpf_task_storage_unlock ();
@@ -192,7 +192,7 @@ static int task_storage_delete(struct task_struct *task, struct bpf_map *map)if (!sdata)return -ENOENT ; -bpf_selem_unlink (SELEM (sdata)); +bpf_selem_unlink (SELEM (sdata), true);return 0 ; }
kernel/bpf/core.c +16 -4
@@ -873,7 +873,7 @@ static size_t select_bpf_prog_pack_size(void)return size; } -static struct bpf_prog_pack *alloc_new_pack (void ) +static struct bpf_prog_pack *alloc_new_pack (bpf_jit_fill_hole_t bpf_fill_ill_insns) {struct bpf_prog_pack *pack;
@@ -886,6 +886,7 @@ static struct bpf_prog_pack *alloc_new_pack(void)kfree (pack);return NULL ; } +bpf_fill_ill_insns (pack->ptr, bpf_prog_pack_size);bitmap_zero (pack->bitmap, bpf_prog_pack_size /BPF_PROG_CHUNK_SIZE );list_add_tail (&pack->list, &pack_list);
@@ -895,7 +896,7 @@ static struct bpf_prog_pack *alloc_new_pack(void)return pack; } -static void *bpf_prog_pack_alloc (u32 size) +static void *bpf_prog_pack_alloc (u32 size,bpf_jit_fill_hole_t bpf_fill_ill_insns) {unsigned int nbits =BPF_PROG_SIZE_TO_NBITS (size);struct bpf_prog_pack *pack;
@@ -910,6 +911,7 @@ static void *bpf_prog_pack_alloc(u32 size) size =round_up (size,PAGE_SIZE ); ptr =module_alloc (size);if (ptr) { +bpf_fill_ill_insns (ptr, size);set_vm_flush_reset_perms (ptr);set_memory_ro ((unsigned long )ptr, size /PAGE_SIZE );set_memory_x ((unsigned long )ptr, size /PAGE_SIZE );
@@ -923,7 +925,7 @@ static void *bpf_prog_pack_alloc(u32 size) goto found_free_area; } - pack =alloc_new_pack (); + pack =alloc_new_pack (bpf_fill_ill_insns);if (!pack) goto out;
@@ -1102,7 +1104,7 @@ bpf_jit_binary_pack_alloc(unsigned int proglen, u8 **image_ptr,if (bpf_jit_charge_modmem (size))return NULL ; - ro_header =bpf_prog_pack_alloc (size); + ro_header =bpf_prog_pack_alloc (size, bpf_fill_ill_insns);if (!ro_header) {bpf_jit_uncharge_modmem (size);return NULL ;
@@ -1434,6 +1436,16 @@ struct bpf_prog *bpf_jit_blind_constants(struct bpf_prog *prog) insn = clone->insnsi;for (i =0 ; i < insn_cnt; i++, insn++) { +if (bpf_pseudo_func (insn)) { +/* ld_imm64 with an address of bpf subprog is not +* a user controlled constant. Don't randomize it, +* since it will conflict with jit_subprogs() logic. +*/ + insn++; + i++; +continue ; + } +/* We temporarily need to hold the original ld64 insn * so that we can still access the first part in the * second blinding run.
kernel/bpf/stackmap.c +0 -1
@@ -100,7 +100,6 @@ static struct bpf_map *stack_map_alloc(union bpf_attr *attr)return ERR_PTR (-E2BIG ); cost = n_buckets *sizeof (struct stack_map_bucket *) +sizeof (*smap); - cost += n_buckets * (value_size +sizeof (struct stack_map_bucket )); smap =bpf_map_area_alloc (cost,bpf_map_attr_numa_node (attr));if (!smap)return ERR_PTR (-ENOMEM );
kernel/bpf/trampoline.c +12 -6
@@ -411,7 +411,7 @@ int bpf_trampoline_link_prog(struct bpf_prog *prog, struct bpf_trampoline *tr) {enum bpf_tramp_prog_type kind;int err =0 ; -int cnt; +int cnt =0 , i; kind =bpf_attach_type_to_tramp (prog);mutex_lock (&tr->mutex);
@@ -422,7 +422,10 @@ int bpf_trampoline_link_prog(struct bpf_prog *prog, struct bpf_trampoline *tr) err = -EBUSY ; goto out; } - cnt = tr->progs_cnt[BPF_TRAMP_FENTRY ] + tr->progs_cnt[BPF_TRAMP_FEXIT ]; + +for (i =0 ; i <BPF_TRAMP_MAX ; i++) + cnt += tr->progs_cnt[i]; +if (kind ==BPF_TRAMP_REPLACE ) {/* Cannot attach extension if fentry/fexit are in use. */ if (cnt) {
@@ -500,16 +503,19 @@ struct bpf_trampoline *bpf_trampoline_get(u64 key,void bpf_trampoline_put (struct bpf_trampoline *tr) { +int i; +if (!tr)return ;mutex_lock (&trampoline_mutex);if (!refcount_dec_and_test (&tr->refcnt)) goto out;WARN_ON_ONCE (mutex_is_locked (&tr->mutex)); -if (WARN_ON_ONCE (!hlist_empty (&tr->progs_hlist[BPF_TRAMP_FENTRY ]))) - goto out; -if (WARN_ON_ONCE (!hlist_empty (&tr->progs_hlist[BPF_TRAMP_FEXIT ]))) - goto out; + +for (i =0 ; i <BPF_TRAMP_MAX ; i++) +if (WARN_ON_ONCE (!hlist_empty (&tr->progs_hlist[i]))) + goto out; +/* This code will be executed even when the last bpf_tramp_image * is alive. All progs are detached from the trampoline and the * trampoline image is patched with jmp into epilogue to skip
kernel/bpf/verifier.c +45 -16
112 lines not on this page · raw message
lib/assoc_array.c +8 -0
@@ -1461,6 +1461,7 @@ int assoc_array_gc(struct assoc_array *array,struct assoc_array_ptr *cursor, *ptr;struct assoc_array_ptr *new_root, *new_parent, **new_ptr_pp;unsigned long nr_leaves_on_tree; +bool retained;int keylen, slot, nr_free, next_slot, i;pr_devel ("-->%s()\n" , __func__);
@@ -1536,6 +1537,7 @@ int assoc_array_gc(struct assoc_array *array, goto descend; } +retry_compress:pr_devel ("-- compress node %p --\n" , new_n);/* Count up the number of empty slots in this node and work out the
@@ -1553,6 +1555,7 @@ int assoc_array_gc(struct assoc_array *array,pr_devel ("free=%d, leaves=%lu\n" , nr_free, new_n->nr_leaves_on_branch);/* See what we can fold in */ + retained = false; next_slot =0 ;for (slot =0 ; slot <ASSOC_ARRAY_FAN_OUT ; slot++) {struct assoc_array_shortcut *s;
@@ -1602,9 +1605,14 @@ int assoc_array_gc(struct assoc_array *array,pr_devel ("[%d] retain node %lu/%d [nx %d]\n" , slot, child->nr_leaves_on_branch, nr_free +1 , next_slot); + retained = true; } } +if (retained && new_n->nr_leaves_on_branch <=ASSOC_ARRAY_FAN_OUT ) { +pr_devel ("internal nodes remain despite enough space, retrying\n" ); + goto retry_compress; + }pr_devel ("after: %lu\n" , new_n->nr_leaves_on_branch); nr_leaves_on_tree = new_n->nr_leaves_on_branch;
mm/zsmalloc.c +33 -4
@@ -1718,11 +1718,40 @@ static enum fullness_group putback_zspage(struct size_class *class,*/ static void lock_zspage (struct zspage *zspage) { -struct page *page =get_first_page (zspage); +struct page *curr_page, *page; -do { -lock_page (page); - }while ((page =get_next_page (page)) !=NULL ); +/* +* Pages we haven't locked yet can be migrated off the list while we're +* trying to lock them, so we need to be careful and only attempt to +* lock each page under migrate_read_lock(). Otherwise, the page we lock +* may no longer belong to the zspage. This means that we may wait for +* the wrong page to unlock, so we must take a reference to the page +* prior to waiting for it to unlock outside migrate_read_lock(). +*/ +while (1 ) { +migrate_read_lock (zspage); + page =get_first_page (zspage); +if (trylock_page (page)) +break ; +get_page (page); +migrate_read_unlock (zspage); +wait_on_page_locked (page); +put_page (page); + } + + curr_page = page; +while ((page =get_next_page (curr_page))) { +if (trylock_page (page)) { + curr_page = page; + }else { +get_page (page); +migrate_read_unlock (zspage); +wait_on_page_locked (page); +put_page (page); +migrate_read_lock (zspage); + } + } +migrate_read_unlock (zspage); }static int zs_init_fs_context (struct fs_context *fc)
net/core/bpf_sk_storage.c +3 -3
@@ -40,7 +40,7 @@ static int bpf_sk_storage_del(struct sock *sk, struct bpf_map *map)if (!sdata)return -ENOENT ; -bpf_selem_unlink (SELEM (sdata)); +bpf_selem_unlink (SELEM (sdata), true);return 0 ; }
@@ -75,8 +75,8 @@ void bpf_sk_storage_free(struct sock *sk)* sk_storage. */ bpf_selem_unlink_map (selem); - free_sk_storage =bpf_selem_unlink_storage_nolock (sk_storage, - selem, true); + free_sk_storage =bpf_selem_unlink_storage_nolock ( + sk_storage, selem, true, false); }raw_spin_unlock_bh (&sk_storage->lock);rcu_read_unlock ();
net/core/filter.c +2 -2
@@ -1687,7 +1687,7 @@ BPF_CALL_5(bpf_skb_store_bytes, struct sk_buff *, skb, u32, offset,if (unlikely (flags & ~(BPF_F_RECOMPUTE_CSUM |BPF_F_INVALIDATE_HASH )))return -EINVAL ; -if (unlikely (offset >0xffff )) +if (unlikely (offset >INT_MAX ))return -EFAULT ;if (unlikely (bpf_try_make_writable (skb, offset + len)))return -EFAULT ;
@@ -1722,7 +1722,7 @@ BPF_CALL_4(bpf_skb_load_bytes, const struct sk_buff *, skb, u32, offset, {void *ptr; -if (unlikely (offset >0xffff )) +if (unlikely (offset >INT_MAX )) goto err_clear; ptr =skb_header_pointer (skb, offset, len, to);
net/netfilter/nf_tables_api.c +68 -26
193 lines not on this page · raw message
net/netfilter/nft_limit.c +2 -0
@@ -213,6 +213,8 @@ static int nft_limit_pkts_clone(struct nft_expr *dst, const struct nft_expr *srcstruct nft_limit_priv_pkts *priv_dst =nft_expr_priv (dst);struct nft_limit_priv_pkts *priv_src =nft_expr_priv (src); + priv_dst->cost = priv_src->cost; +return nft_limit_clone (&priv_dst->limit, &priv_src->limit); }
sound/usb/clock.c +11 -0
@@ -572,6 +572,17 @@ static int set_sample_rate_v2v3(struct snd_usb_audio *chip,/* continue processing */ } +/* FIXME - TEAC devices require the immediate interface setup */ +if (USB_ID_VENDOR (chip->usb_id) ==0x0644 ) { +bool cur_base_48k = (rate %48000 ==0 ); +bool prev_base_48k = (prev_rate %48000 ==0 ); +if (cur_base_48k != prev_base_48k) { +usb_set_interface (chip->dev, fmt->iface, fmt->altsetting); +if (chip->quirk_flags &QUIRK_FLAG_IFACE_DELAY ) +msleep (50 ); + } + } + validation:/* validate clock after rate change */ if (!uac_clock_source_is_valid (chip, fmt, clock))
sound/usb/pcm.c +11 -6
@@ -439,16 +439,21 @@ static int configure_endpoints(struct snd_usb_audio *chip,/* stop any running stream beforehand */ if (stop_endpoints (subs, false))sync_pending_stops (subs); +if (subs->sync_endpoint) { + err =snd_usb_endpoint_configure (chip, subs->sync_endpoint); +if (err <0 ) +return err; + } err =snd_usb_endpoint_configure (chip, subs->data_endpoint);if (err <0 )return err;snd_usb_set_format_quirk (subs, subs->cur_audiofmt); - } - -if (subs->sync_endpoint) { - err =snd_usb_endpoint_configure (chip, subs->sync_endpoint); -if (err <0 ) -return err; + }else { +if (subs->sync_endpoint) { + err =snd_usb_endpoint_configure (chip, subs->sync_endpoint); +if (err <0 ) +return err; + } }return 0 ;
sound/usb/quirks-table.h +3 -0
@@ -2672,6 +2672,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), .altset_idx = 1, .attributes = 0, .endpoint = 0x82, + .ep_idx = 1, .ep_attr = USB_ENDPOINT_XFER_ISOC, .datainterval = 1, .maxpacksize = 0x0126,
@@ -2875,6 +2876,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), .altset_idx = 1, .attributes = 0x4, .endpoint = 0x81, + .ep_idx = 1, .ep_attr =USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, .maxpacksize = 0x130,
@@ -3391,6 +3393,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), .altset_idx = 1, .attributes = 0, .endpoint = 0x03, + .ep_idx = 1, .rates = SNDRV_PCM_RATE_96000, .ep_attr =USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
tools/memory-model/README +2 -1
@@ -54,7 +54,8 @@ klitmus7 Compatibility Table -- 4.14 7.48 -- 4.15 -- 4.19 7.49 -- 4.20 -- 5.5 7.54 -- - 5.6 -- 7.56 -- + 5.6 -- 5.16 7.56 -- + 5.17 -- 7.56.1 -- ============ ==========