Linux 7.2.3
Greg Kroah-Hartman
maintainerI'm announcing the release of the 7.2.3 kernel.
All users of the 7.2 kernel series must upgrade.
The updated 7.2.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-7.2.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/filesystems/fscrypt.rst | 4 Makefile | 2 arch/s390/kvm/vsie.c | 1 arch/x86/kvm/svm/sev.c | 99 ++++++-- arch/x86/kvm/svm/svm.c | 8 arch/x86/kvm/svm/svm.h | 13 - crypto/krb5/krb5_api.c | 8 drivers/accessibility/speakup/main.c | 1 drivers/crypto/Kconfig | 1 drivers/crypto/allwinner/Kconfig | 16 - drivers/crypto/allwinner/sun8i-ce/Makefile | 1 drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c | 63 ----- drivers/crypto/allwinner/sun8i-ce/sun8i-ce-prng.c | 159 ------------- drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h | 29 -- drivers/crypto/allwinner/sun8i-ss/Makefile | 1 drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c | 45 --- drivers/crypto/allwinner/sun8i-ss/sun8i-ss-prng.c | 177 --------------- drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h | 23 - drivers/crypto/atmel-tdes.c | 5 drivers/crypto/intel/iaa/iaa_crypto_main.c | 111 +++++---- drivers/crypto/intel/iaa/iaa_crypto_stats.c | 9 drivers/crypto/intel/iaa/iaa_crypto_stats.h | 2 drivers/crypto/mxs-dcp.c | 2 drivers/crypto/qce/aead.c | 58 ---- drivers/crypto/qce/common.c | 55 +--- drivers/crypto/qce/common.h | 16 - drivers/crypto/qce/regs-v5.h | 4 drivers/crypto/qce/sha.c | 30 -- drivers/crypto/qce/sha.h | 1 drivers/crypto/qce/skcipher.c | 97 -------- drivers/crypto/qcom-rng.c | 156 ++----------- drivers/crypto/virtio/virtio_crypto_akcipher_algs.c | 3 drivers/fpga/dfl-fme-perf.c | 2 drivers/infiniband/sw/rxe/rxe_qp.c | 18 + drivers/net/gtp.c | 21 + drivers/net/vxlan/vxlan_core.c | 9 drivers/net/wireless/mediatek/mt76/mt7925/mac.c | 4 drivers/nvme/host/tcp.c | 8 drivers/target/target_core_fabric_configfs.c | 8 drivers/usb/c67x00/c67x00-sched.c | 4 drivers/usb/core/devio.c | 2 drivers/usb/core/hub.c | 7 drivers/usb/gadget/function/f_tcm.c | 2 drivers/usb/host/xhci-dbgtty.c | 15 - drivers/usb/host/xhci-ring.c | 20 + drivers/usb/host/xhci.c | 11 drivers/usb/misc/usbtest.c | 1 drivers/usb/serial/option.c | 20 + drivers/usb/serial/spcp8x5.c | 13 - fs/fuse/dev.c | 41 +-- fs/fuse/dev_uring.c | 20 - fs/fuse/dir.c | 9 fs/fuse/file.c | 4 include/kunit/run-in-irq-context.h | 10 include/linux/skbuff.h | 24 ++ include/net/ip.h | 25 ++ include/net/ip6_route.h | 37 +++ include/net/tcp.h | 5 include/target/target_core_fabric.h | 2 mm/swapfile.c | 7 net/8021q/vlan_dev.c | 39 --- net/batman-adv/tvlv.c | 5 net/bridge/br_multicast.c | 4 net/ipv4/route.c | 4 net/ipv4/tcp_ao.c | 19 + net/ipv4/tcp_ipv4.c | 2 net/ipv4/tcp_minisocks.c | 2 net/ipv4/tcp_output.c | 6 net/ipv6/ah6.c | 29 +- net/ipv6/route.c | 2 net/ipv6/seg6_local.c | 7 net/ipv6/tcp_ipv6.c | 2 net/netfilter/nf_tables_api.c | 36 +-- net/netfilter/nft_set_pipapo_avx2.c | 17 - net/packet/af_packet.c | 96 +++++++- net/tls/tls_device.c | 3 net/xfrm/espintcp.c | 9 net/xfrm/xfrm_nat_keepalive.c | 53 +++- net/xfrm/xfrm_user.c | 2 sound/usb/card.c | 14 - sound/usb/midi.c | 2 sound/usb/quirks-table.h | 10 tools/testing/selftests/bpf/progs/sockmap_verdict_prog.c | 14 + 83 files changed, 746 insertions(+), 1180 deletions(-)
Aleksandr Nogikh (1):
usb: usbtest: disable dynamic ID support
Asim Viladi Oglu Manizada (1):
xfrm: ah6: validate routing header segments_left
Baokun Li (2):
fuse: fix invalidate lock leak on setattr writeback failure
fuse: fix invalidate lock leak on open O_TRUNC DAX failure
Bartosz Golaszewski (1):
crypto: qce - Remove unsafe/deprecated algorithms
Breno Leitao (1):
usb: xhci: bail out of setup if the controller is inaccessible
Bryam Vargas (1):
crypto: virtio - bound the akcipher result length
Christian Borntraeger (1):
KVM: s390: vsie: zero stale crypto bits
Devin Wittmayer (1):
wifi: mt76: mt7925: ensure tx headroom in usb_sdio_tx_prepare_skb
Dmitry Bogdanov (1):
nvme-tcp: fix usage of page_frag_cache
Eric Biggers (8):
netfilter: nft_set_pipapo_avx2: add missing vzeroupper mm/swap: reject swapon() on filesystem-level encrypted files
kunit: irq: Continue increasing hrtimer interval for longer
crypto: qcom-rng - Enable clock in hwrng case
crypto: qcom-rng - Remove crypto_rng interface
crypto: qcom-rng - Allow zero as a random number
crypto: sun8i-ce - Remove crypto_rng interface
crypto: sun8i-ss - Remove crypto_rng interface
Eric Dumazet (1):
vlan: fix skb_under_panic and races when toggling HW VLAN offload
Fourie Zhang (1):
netfilter: nf_tables: don't queue packet path object notifications
Giovanni Cabiddu (1):
crypto: iaa - fall back to software for multi-entry scatterlists
Greg Kroah-Hartman (1):
Linux 7.2.3
Griffin Kroah-Hartman (3):
fpga: dfl: fme: add error handling
usb: core: Add lock to usb_wakeup_notification()
usb: core: Strengthen error handling in hub_hub_status()
Haoxiang Li (1):
accessibility: speakup: unregister tty ldisc on later init failures
Hyunwoo Kim (1):
net/tcp-ao: fix use-after-free of current_key on reconnect to another peer
Ibrahim Hashimov (1):
RDMA/rxe: Fix responder UAF on IB_QP_MAX_DEST_RD_ATOMIC modify_qp
Jan Sebastian Götte (1):
crypto: krb5 - use kfree_sensitive() for derived key buffers
Jiale Yao (1):
USB: serial: option: fix slab OOB read in interrupt URB callback
Jiayuan Chen (3):
selftests/bpf: Fix test_maps sockmap failure
tls: device: fix out-of-bounds write in tls_append_frag()
net: advertise TCP MSS from the configured MTU, not the learned PMTU
Joanne Koong (2):
fuse: fix missing barrier when checking io-uring readiness
fuse: publish io-uring queues with release semantics
Johan Hovold (1):
USB: serial: spcp8x5: drop broken carrier detect support
Kyle Zeng (4):
net/packet: defer vmalloc TX_RING free until skbs finish
ipv6: seg6: clear IPv4 control block on IPIP decapsulation
batman-adv: reject unrepresentable multicast TVLV offsets
vxlan: keep the last remote linked during FDB flush
Lucas De Marchi (2):
xhci: dbgtty: Fix unregister on tty_register_driver() failure
xhci: dbgtty: Fix unregister on tty_alloc_driver() failure
Marouane El Moufid (1):
ALSA: usb-audio: fix OOB write in snd_usbmidi_novation_output()
Md Sadre Alam (1):
crypto: qce - fix CCM AAD buffer underallocation
Michal Pecio (1):
usb: xhci: Handle bogus TRB pointers in Missed Service Error events
Miguel Peñaranda (1):
usb: usbfs: fix use-after-free of usb_device in usbdev_release()
Miklos Szeredi (1):
fuse: fix race between interrupt and resend
Norbert Szetei (1):
net: bridge: mcast: fix use-after-free of a master VLAN's multicast context
Pankaj Gupta (1):
KVM: SEV: Drop FOLL_WRITE for encrypted region registration
Peiyang He (1):
RDMA/rxe: Fix OOB in free_rd_atomic_resources()
Qing Ming (2):
gtp: serialize PDP context updates
tcp: fix AO info use-after-free in tcp_ao_connect_init()
Rastislav Szabo (1):
net/tcp: fix TCP-AO key deletion in VRFs
Rochan Avlur (1):
fuse: wait for FR_FINISHED on abort_on_kill to prevent use-after-free
Sabrina Dubroca (1):
xfrm: espintcp: fix UAF during close
Sean Christopherson (5):
KVM: SEV: Allocate full pages for {DE,EN}CRYPT ops on SNP-enabled hosts
KVM: SEV: Track the GPA of the guest-controlled VMSA used for SNP guests
KVM: SEV: Extract loading of guest-provided VMSA to a separate helper
KVM: SEV: Mark vCPU RUNNABLE after AP_CREATE, even if VMSA is unusable
KVM: SEV: Wire up kvm_x86_ops.gmem_xxx() if and only if CONFIG_KVM_AMD_SEV=y
Semih Baskan (1):
usb: xhci: Handle USB3 port events when there is one roothub
Shuangpeng Bai (2):
usb: gadget: f_tcm: keep port count until LUN teardown completes
USB: c67x00: fix use-after-free in c67x00_add_iso_urb()
Thorsten Blum (2):
crypto: atmel-tdes - use scatterlist length before DMA mapping
crypto: mxs-dcp - fix source scatterlist length access
Trevor Vorhees (1):
ALSA: usb-audio: Fix sample rates for PreSonus AudioBox USB
Will Porter (1):
ALSA: usb-audio: Complete cleanup after system-resume errors
Yong Wang (1):
tcp: clamp route advmss to TCP_MIN_MSS
Zhiling Zou (1):
xfrm: drop ESP-in-TCP packets with no ingress device
Zihan Xi (3):
xfrm: avoid lock inversion in nat keepalive work
xfrm: fix xfrm_state_construct() auth-trunc leak
xfrm: bound nat keepalive state collection
Greg Kroah-Hartman
maintainerDocumentation/filesystems/fscrypt.rst +4 -0
@@ -1238,6 +1238,10 @@ astute users may notice some differences in behavior: - DAX (Direct Access) is not supported on encrypted files. +- Encrypted files cannot be used directly as swap files. To swap to + an encrypted file, set up a loopback device on top of it. + Alternatively, encrypted swap can use a dm-crypt device. + - The maximum length of an encrypted symlink is 2 bytes shorter than the maximum length of an unencrypted symlink. For example, on an EXT4 filesystem with a 4K block size, unencrypted symlinks can be up
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 7 PATCHLEVEL = 2 -SUBLEVEL = 2 +SUBLEVEL = 3 EXTRAVERSION = NAME = Baby Opossum Posse
arch/s390/kvm/vsie.c +1 -0
@@ -173,6 +173,7 @@ static int setup_apcb10(struct kvm_vcpu *vcpu, struct kvm_s390_apcb1 *apcb_s, sizeof(struct kvm_s390_apcb0)))return -EFAULT ; +memset (apcb_s,0 ,sizeof (*apcb_s)); apcb_s->apm[0 ] = apcb_h->apm[0 ] & tmp.apm[0 ]; apcb_s->aqm[0 ] = apcb_h->aqm[0 ] & tmp.aqm[0 ] &0xffff000000000000UL ; apcb_s->adm[0 ] = apcb_h->adm[0 ] & tmp.adm[0 ] &0xffff000000000000UL ;
arch/x86/kvm/svm/sev.c +71 -28
177 lines not on this page · raw message
arch/x86/kvm/svm/svm.c +4 -4
@@ -5466,6 +5466,10 @@ struct kvm_x86_ops svm_x86_ops __initdata = { .vm_copy_enc_context_from = sev_vm_copy_enc_context_from, .vm_move_enc_context_from = sev_vm_move_enc_context_from, + + .gmem_prepare = sev_gmem_prepare, + .gmem_invalidate = sev_gmem_invalidate, + .gmem_max_mapping_level = sev_gmem_max_mapping_level, #endif .check_emulate_instruction = svm_check_emulate_instruction,
@@ -5477,10 +5481,6 @@ struct kvm_x86_ops svm_x86_ops __initdata = { .vcpu_deliver_sipi_vector = svm_vcpu_deliver_sipi_vector, .vcpu_get_apicv_inhibit_reasons = avic_vcpu_get_apicv_inhibit_reasons, .alloc_apic_backing_page = svm_alloc_apic_backing_page, - - .gmem_prepare = sev_gmem_prepare, - .gmem_invalidate = sev_gmem_invalidate, - .gmem_max_mapping_level = sev_gmem_max_mapping_level, };/*
arch/x86/kvm/svm/svm.h +2 -11
@@ -272,7 +272,8 @@ struct vcpu_sev_es_state {u64 ghcb_registered_gpa;struct mutex snp_vmsa_mutex;/* Used to handle concurrent updates of VMSA. */ -gpa_t snp_vmsa_gpa; +gpa_t snp_pending_vmsa_gpa; +gpa_t snp_guest_vmsa_gpa;bool snp_ap_waiting_for_reset;bool snp_has_guest_vmsa; };
@@ -1035,16 +1036,6 @@ static inline int sev_cpu_init(struct svm_cpu_data *sd) { return 0; }static inline int sev_dev_get_attr (u32 group,u64 attr,u64 *val) {return -ENXIO ; }#define max_sev_asid 0static inline void sev_handle_rmp_fault (struct kvm_vcpu *vcpu,gpa_t gpa,u64 error_code) {} -static inline int sev_gmem_prepare (struct kvm *kvm,kvm_pfn_t pfn,gfn_t gfn,int max_order) -{ -return 0 ; -} -static inline void sev_gmem_invalidate (kvm_pfn_t start,kvm_pfn_t end) {} -static inline int sev_gmem_max_mapping_level (struct kvm *kvm,kvm_pfn_t pfn,bool is_private) -{ -return 0 ; -} -static inline struct vmcb_save_area *sev_decrypt_vmsa (struct kvm_vcpu *vcpu) {return NULL ;
crypto/krb5/krb5_api.c +4 -4
@@ -263,10 +263,10 @@ struct crypto_aead *crypto_krb5_prepare_encryption(const struct krb5_enctype *kr goto err; } -kfree (keys.data); +kfree_sensitive (keys.data);return ci; err: -kfree (keys.data); +kfree_sensitive (keys.data);return ERR_PTR (ret); }EXPORT_SYMBOL (crypto_krb5_prepare_encryption);
@@ -333,10 +333,10 @@ struct crypto_shash *crypto_krb5_prepare_checksum(const struct krb5_enctype *krb goto err; } -kfree (keys.data); +kfree_sensitive (keys.data);return ci; err: -kfree (keys.data); +kfree_sensitive (keys.data);return ERR_PTR (ret); }EXPORT_SYMBOL (crypto_krb5_prepare_checksum);
drivers/accessibility/speakup/main.c +1 -0
@@ -2444,6 +2444,7 @@ static int __init speakup_init(void)mutex_lock (&spk_mutex);synth_release ();mutex_unlock (&spk_mutex); +spk_ttyio_unregister_ldisc ();speakup_kobj_exit (); error_kobjects:
drivers/crypto/Kconfig +0 -1
@@ -641,7 +641,6 @@ config CRYPTO_DEV_QCOM_RNG tristate "Qualcomm Random Number Generator Driver" depends on ARCH_QCOM || COMPILE_TEST depends on HW_RANDOM - select CRYPTO_RNG help This driver provides support for the Random Number Generator hardware found on Qualcomm SoCs.
drivers/crypto/allwinner/Kconfig +0 -16
@@ -70,14 +70,6 @@ config CRYPTO_DEV_SUN8I_CE_HASH help Say y to enable support for hash algorithms. -config CRYPTO_DEV_SUN8I_CE_PRNG - bool "Support for Allwinner Crypto Engine PRNG" - depends on CRYPTO_DEV_SUN8I_CE - select CRYPTO_RNG - help - Select this option if you want to provide kernel-side support for - the Pseudo-Random Number Generator found in the Crypto Engine. - config CRYPTO_DEV_SUN8I_CE_TRNG bool "Support for Allwinner Crypto Engine TRNG" depends on CRYPTO_DEV_SUN8I_CE
@@ -113,14 +105,6 @@ config CRYPTO_DEV_SUN8I_SS_DEBUG This will create /sys/kernel/debug/sun8i-ss/stats for displaying the number of requests per flow and per algorithm. -config CRYPTO_DEV_SUN8I_SS_PRNG - bool "Support for Allwinner Security System PRNG" - depends on CRYPTO_DEV_SUN8I_SS - select CRYPTO_RNG - help - Select this option if you want to provide kernel-side support for - the Pseudo-Random Number Generator found in the Security System. - config CRYPTO_DEV_SUN8I_SS_HASH bool "Enable support for hash on sun8i-ss" depends on CRYPTO_DEV_SUN8I_SS
drivers/crypto/allwinner/sun8i-ce/Makefile +0 -1
@@ -1,5 +1,4 @@ obj-$(CONFIG_CRYPTO_DEV_SUN8I_CE) += sun8i-ce.o sun8i-ce-y += sun8i-ce-core.o sun8i-ce-cipher.o sun8i-ce-$(CONFIG_CRYPTO_DEV_SUN8I_CE_HASH) += sun8i-ce-hash.o -sun8i-ce-$(CONFIG_CRYPTO_DEV_SUN8I_CE_PRNG) += sun8i-ce-prng.o sun8i-ce-$(CONFIG_CRYPTO_DEV_SUN8I_CE_TRNG) += sun8i-ce-trng.o
drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c +0 -63
147 lines not on this page · raw message
drivers/crypto/allwinner/sun8i-ce/sun8i-ce-prng.c deleted +0 -159
159 lines not on this page · raw message
drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h +0 -29
@@ -15,7 +15,6 @@#include <linux/hw_random.h> #include <crypto/internal/hash.h> #include <crypto/md5.h> -#include <crypto/rng.h> #include <crypto/sha1.h> #include <crypto/sha2.h>
@@ -58,9 +57,7 @@#define CE_ALG_SHA384 20#define CE_ALG_SHA512 21#define CE_ALG_TRNG 48 -#define CE_ALG_PRNG 49#define CE_ALG_TRNG_V2 0x1c -#define CE_ALG_PRNG_V2 0x1d/* Used in ce_variant */ #define CE_ID_NOTSUPP 0xFF
@@ -96,10 +93,6 @@#define ESR_H6 4#define ESR_D1 5 -#define PRNG_DATA_SIZE (160 / 8) -#define PRNG_SEED_SIZE DIV_ROUND_UP(175, 8) -#define PRNG_LD BIT(17) -#define CE_DIE_ID_SHIFT 16#define CE_DIE_ID_MASK 0x07
@@ -136,13 +129,10 @@ struct ce_clock {* bytes or words * @hash_t_dlen_in_bytes: Does the request size for hash is in * bits or words -* @prng_t_dlen_in_bytes: Does the request size for PRNG is in -* bytes or words * @trng_t_dlen_in_bytes: Does the request size for TRNG is in * bytes or words * @ce_clks: list of clocks needed by this variant * @esr: The type of error register -* @prng: The CE_ALG_XXX value for the PRNG * @trng: The CE_ALG_XXX value for the TRNG */ struct ce_variant {
@@ -151,12 +141,10 @@ struct ce_variant {u32 op_mode[CE_ID_OP_MAX ];bool cipher_t_dlen_in_bytes;bool hash_t_dlen_in_bits; -bool prng_t_dlen_in_bytes;bool trng_t_dlen_in_bytes;bool needs_word_addresses;struct ce_clock ce_clks[CE_MAX_CLOCKS ];int esr; -unsigned char prng;unsigned char trng; };
@@ -327,16 +315,6 @@ struct sun8i_ce_hash_reqctx {struct ahash_request fallback_req;// keep at the end }; -/* -* struct sun8i_ce_prng_ctx - context for PRNG TFM -* @seed: The seed to use -* @slen: The size of the seed -*/ -struct sun8i_ce_rng_tfm_ctx { -void *seed; -unsigned int slen; -}; -/* * struct sun8i_ce_alg_template - crypto_alg template * @type: the CRYPTO_ALG_TYPE for this template
@@ -357,7 +335,6 @@ struct sun8i_ce_alg_template {union {struct skcipher_engine_alg skcipher;struct ahash_engine_alg hash; -struct rng_alg rng; } alg;unsigned long stat_req;unsigned long stat_fb;
@@ -398,11 +375,5 @@ int sun8i_ce_hash_finup(struct ahash_request *areq);int sun8i_ce_hash_digest (struct ahash_request *areq);int sun8i_ce_hash_run (struct crypto_engine *engine,void *breq); -int sun8i_ce_prng_generate (struct crypto_rng *tfm,const u8 *src, -unsigned int slen,u8 *dst,unsigned int dlen); -int sun8i_ce_prng_seed (struct crypto_rng *tfm,const u8 *seed,unsigned int slen); -void sun8i_ce_prng_exit (struct crypto_tfm *tfm); -int sun8i_ce_prng_init (struct crypto_tfm *tfm); -int sun8i_ce_hwrng_register (struct sun8i_ce_dev *ce);void sun8i_ce_hwrng_unregister (struct sun8i_ce_dev *ce);
drivers/crypto/allwinner/sun8i-ss/Makefile +0 -1
@@ -1,4 +1,3 @@ obj-$(CONFIG_CRYPTO_DEV_SUN8I_SS) += sun8i-ss.o sun8i-ss-y += sun8i-ss-core.o sun8i-ss-cipher.o -sun8i-ss-$(CONFIG_CRYPTO_DEV_SUN8I_SS_PRNG) += sun8i-ss-prng.o sun8i-ss-$(CONFIG_CRYPTO_DEV_SUN8I_SS_HASH) += sun8i-ss-hash.o
drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c +0 -45
75 lines not on this page · raw message
drivers/crypto/allwinner/sun8i-ss/sun8i-ss-prng.c deleted +0 -177
177 lines not on this page · raw message
drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h +0 -23
@@ -8,7 +8,6 @@#include <crypto/aes.h> #include <crypto/des.h> #include <crypto/engine.h> -#include <crypto/rng.h> #include <crypto/skcipher.h> #include <linux/atomic.h> #include <linux/debugfs.h>
@@ -27,7 +26,6 @@#define SS_ALG_DES (1 << 2)#define SS_ALG_3DES (2 << 2)#define SS_ALG_MD5 (3 << 2) -#define SS_ALG_PRNG (4 << 2)#define SS_ALG_SHA1 (6 << 2)#define SS_ALG_SHA224 (7 << 2)#define SS_ALG_SHA256 (8 << 2)
@@ -68,8 +66,6 @@#define SS_FLOW0 BIT(30)#define SS_FLOW1 BIT(31) -#define SS_PRNG_CONTINUE BIT(18) -#define MAX_SG 8#define MAXFLOW 2
@@ -79,9 +75,6 @@#define SS_DIE_ID_SHIFT 20#define SS_DIE_ID_MASK 0x07 -#define PRNG_DATA_SIZE (160 / 8) -#define PRNG_SEED_SIZE DIV_ROUND_UP(175, 8) -#define MAX_PAD_SIZE 4096/*
@@ -213,16 +206,6 @@ struct sun8i_cipher_tfm_ctx {struct crypto_skcipher *fallback_tfm; }; -/* -* struct sun8i_ss_prng_ctx - context for PRNG TFM -* @seed: The seed to use -* @slen: The size of the seed -*/ -struct sun8i_ss_rng_tfm_ctx { -void *seed; -unsigned int slen; -}; -/* * struct sun8i_ss_hash_tfm_ctx - context for an ahash TFM * @fallback_tfm: pointer to the fallback TFM
@@ -274,7 +257,6 @@ struct sun8i_ss_alg_template {struct sun8i_ss_dev *ss;union {struct skcipher_engine_alg skcipher; -struct rng_alg rng;struct ahash_engine_alg hash; } alg;unsigned long stat_req;
@@ -300,11 +282,6 @@ int sun8i_ss_skencrypt(struct skcipher_request *areq);int sun8i_ss_get_engine_number (struct sun8i_ss_dev *ss);int sun8i_ss_run_task (struct sun8i_ss_dev *ss,struct sun8i_cipher_req_ctx *rctx,const char *name); -int sun8i_ss_prng_generate (struct crypto_rng *tfm,const u8 *src, -unsigned int slen,u8 *dst,unsigned int dlen); -int sun8i_ss_prng_seed (struct crypto_rng *tfm,const u8 *seed,unsigned int slen); -int sun8i_ss_prng_init (struct crypto_tfm *tfm); -void sun8i_ss_prng_exit (struct crypto_tfm *tfm);int sun8i_ss_hash_init_tfm (struct crypto_ahash *tfm);void sun8i_ss_hash_exit_tfm (struct crypto_ahash *tfm);
drivers/crypto/atmel-tdes.c +2 -3
@@ -462,14 +462,13 @@ static int atmel_tdes_crypt_start(struct atmel_tdes_dev *dd)IS_ALIGNED (dd->out_sg->length, dd->ctx->block_size); fast = in && out; -if (sg_dma_len (dd->in_sg) !=sg_dma_len (dd->out_sg)) +if (dd->in_sg->length != dd->out_sg->length) fast =0 ; }if (fast) { - count =min_t (size_t, dd->total,sg_dma_len (dd->in_sg)); - count =min_t (size_t, count,sg_dma_len (dd->out_sg)); + count =min_t (size_t, dd->total, dd->in_sg->length); err =dma_map_sg (dd->dev, dd->in_sg,1 ,DMA_TO_DEVICE );if (!err) {
drivers/crypto/intel/iaa/iaa_crypto_main.c +60 -51
195 lines not on this page · raw message
drivers/crypto/intel/iaa/iaa_crypto_stats.c +9 -0
@@ -19,6 +19,7 @@static atomic64_t total_comp_calls;static atomic64_t total_decomp_calls; +static atomic64_t total_sw_comp_calls;static atomic64_t total_sw_decomp_calls;static atomic64_t total_comp_bytes_out;static atomic64_t total_decomp_bytes_in;
@@ -43,6 +44,11 @@ void update_total_decomp_calls(void)atomic64_inc (&total_decomp_calls); } +void update_total_sw_comp_calls (void ) +{ +atomic64_inc (&total_sw_comp_calls); +} +void update_total_sw_decomp_calls (void ) {atomic64_inc (&total_sw_decomp_calls);
@@ -104,6 +110,7 @@ static void reset_iaa_crypto_stats(void) {atomic64_set (&total_comp_calls,0 );atomic64_set (&total_decomp_calls,0 ); +atomic64_set (&total_sw_comp_calls,0 );atomic64_set (&total_sw_decomp_calls,0 );atomic64_set (&total_comp_bytes_out,0 );atomic64_set (&total_decomp_bytes_in,0 );
@@ -174,6 +181,8 @@ static int global_stats_show(struct seq_file *m, void *v) atomic64_read(&total_comp_calls));seq_printf (m," total_decomp_calls: %llu\n" ,atomic64_read (&total_decomp_calls)); +seq_printf (m," total_sw_comp_calls: %llu\n" , +atomic64_read (&total_sw_comp_calls));seq_printf (m," total_sw_decomp_calls: %llu\n" ,atomic64_read (&total_sw_decomp_calls)); seq_printf(m, " total_comp_bytes_out: %llu\n",
drivers/crypto/intel/iaa/iaa_crypto_stats.h +2 -0
@@ -11,6 +11,7 @@ void iaa_crypto_debugfs_cleanup(void);void update_total_comp_calls (void );void update_total_comp_bytes_out (int n);void update_total_decomp_calls (void ); +void update_total_sw_comp_calls (void );void update_total_sw_decomp_calls (void );void update_total_decomp_bytes_in (int n);void update_completion_einval_errs (void );
@@ -29,6 +30,7 @@ static inline void iaa_crypto_debugfs_cleanup(void) {}static inline void update_total_comp_calls (void ) {}static inline void update_total_comp_bytes_out (int n) {}static inline void update_total_decomp_calls (void ) {} +static inline void update_total_sw_comp_calls (void ) {}static inline void update_total_sw_decomp_calls (void ) {}static inline void update_total_decomp_bytes_in (int n) {}static inline void update_completion_einval_errs (void ) {}
drivers/crypto/mxs-dcp.c +1 -1
@@ -353,7 +353,7 @@ static int mxs_dcp_aes_block_crypt(struct crypto_async_request *arq)for_each_sg (req->src, src,sg_nents (req->src), i) { src_buf =sg_virt (src); - len =sg_dma_len (src); + len = src->length; tlen += len; limit_hit = tlen > req->cryptlen;
drivers/crypto/qce/aead.c +2 -56
88 lines not on this page · raw message
drivers/crypto/qce/common.c +12 -43
113 lines not on this page · raw message
drivers/crypto/qce/common.h +3 -13
@@ -22,7 +22,7 @@/* IV length in bytes */ #define QCE_AES_IV_LENGTH AES_BLOCK_SIZE -/* max of AES_BLOCK_SIZE, DES3_EDE_BLOCK_SIZE */ +/* max of AES_BLOCK_SIZE */ #define QCE_MAX_IV_SIZE AES_BLOCK_SIZE/* maximum nonce bytes */
@@ -33,14 +33,10 @@#define QCE_MAX_ALIGN_SIZE 64/* cipher algorithms */ -#define QCE_ALG_DES BIT(0) -#define QCE_ALG_3DES BIT(1)#define QCE_ALG_AES BIT(2)/* hash and hmac algorithms */ -#define QCE_HASH_SHA1 BIT(3)#define QCE_HASH_SHA256 BIT(4) -#define QCE_HASH_SHA1_HMAC BIT(5)#define QCE_HASH_SHA256_HMAC BIT(6)#define QCE_HASH_AES_CMAC BIT(7)
@@ -58,21 +54,15 @@#define QCE_ENCRYPT BIT(30)#define QCE_DECRYPT BIT(31) -#define IS_DES (flags) (flags & QCE_ALG_DES) -#define IS_3DES (flags) (flags & QCE_ALG_3DES)#define IS_AES (flags) (flags & QCE_ALG_AES) -#define IS_SHA1 (flags) (flags & QCE_HASH_SHA1)#define IS_SHA256 (flags) (flags & QCE_HASH_SHA256) -#define IS_SHA1_HMAC (flags) (flags & QCE_HASH_SHA1_HMAC)#define IS_SHA256_HMAC (flags) (flags & QCE_HASH_SHA256_HMAC)#define IS_CMAC (flags) (flags & QCE_HASH_AES_CMAC) -#define IS_SHA (flags) (IS_SHA1(flags) || IS_SHA256(flags)) -#define IS_SHA_HMAC (flags) \ - (IS_SHA1_HMAC(flags) || IS_SHA256_HMAC(flags)) +#define IS_SHA (flags) IS_SHA256(flags) +#define IS_SHA_HMAC (flags) IS_SHA256_HMAC(flags)#define IS_CBC (mode) (mode & QCE_MODE_CBC) -#define IS_ECB (mode) (mode & QCE_MODE_ECB)#define IS_CTR (mode) (mode & QCE_MODE_CTR)#define IS_XTS (mode) (mode & QCE_MODE_XTS)#define IS_CCM (mode) (mode & QCE_MODE_CCM)
drivers/crypto/qce/regs-v5.h +0 -4
@@ -203,7 +203,6 @@#define AUTH_SIZE_SHIFT 9#define AUTH_SIZE_MASK GENMASK(13, 9) -#define AUTH_SIZE_SHA1 0#define AUTH_SIZE_SHA256 1#define AUTH_SIZE_ENUM_1_BYTES 0#define AUTH_SIZE_ENUM_2_BYTES 1
@@ -284,15 +283,12 @@#define ENCR_KEY_SZ_SHIFT 3#define ENCR_KEY_SZ_MASK GENMASK(5, 3) -#define ENCR_KEY_SZ_DES 0 -#define ENCR_KEY_SZ_3DES 1#define ENCR_KEY_SZ_AES128 0#define ENCR_KEY_SZ_AES256 2#define ENCR_ALG_SHIFT 0#define ENCR_ALG_MASK GENMASK(2, 0)#define ENCR_ALG_NONE 0 -#define ENCR_ALG_DES 1#define ENCR_ALG_AES 2#define ENCR_ALG_KASUMI 4#define ENCR_ALG_SNOW_3G 5
drivers/crypto/qce/sha.c +2 -28
@@ -25,10 +25,6 @@ struct qce_sha_saved_state {static LIST_HEAD (ahash_algs); -static const u32 std_iv_sha1[SHA256_DIGEST_SIZE /sizeof (u32)] = { -SHA1_H0 ,SHA1_H1 ,SHA1_H2 ,SHA1_H3 ,SHA1_H4 ,0 ,0 ,0 -}; -static const u32 std_iv_sha256[SHA256_DIGEST_SIZE /sizeof (u32)] = {SHA256_H0 ,SHA256_H1 ,SHA256_H2 ,SHA256_H3 ,SHA256_H4 ,SHA256_H5 ,SHA256_H6 ,SHA256_H7
@@ -349,9 +345,7 @@ static int qce_ahash_hmac_setkey(struct crypto_ahash *tfm, const u8 *key,return 0 ; } -if (digestsize ==SHA1_DIGEST_SIZE ) - alg_name ="sha1-qce" ; -else if (digestsize ==SHA256_DIGEST_SIZE ) +if (digestsize ==SHA256_DIGEST_SIZE ) alg_name ="sha256-qce" ;else return -EINVAL ;
@@ -412,15 +406,6 @@ struct qce_ahash_def { };static const struct qce_ahash_def ahash_def[] = { - { - .flags =QCE_HASH_SHA1 , - .name ="sha1" , - .drv_name ="sha1-qce" , - .digestsize =SHA1_DIGEST_SIZE , - .blocksize =SHA1_BLOCK_SIZE , - .statesize =sizeof (struct qce_sha_saved_state ), - .std_iv = std_iv_sha1, - }, { .flags =QCE_HASH_SHA256 , .name ="sha256" ,
@@ -430,15 +415,6 @@ static const struct qce_ahash_def ahash_def[] = { .statesize = sizeof(struct qce_sha_saved_state), .std_iv = std_iv_sha256, }, - { - .flags = QCE_HASH_SHA1_HMAC, - .name = "hmac(sha1)", - .drv_name = "hmac-sha1-qce", - .digestsize = SHA1_DIGEST_SIZE, - .blocksize = SHA1_BLOCK_SIZE, - .statesize = sizeof(struct qce_sha_saved_state), - .std_iv = std_iv_sha1, - }, { .flags = QCE_HASH_SHA256_HMAC, .name = "hmac(sha256)",
@@ -476,9 +452,7 @@ static int qce_ahash_register_one(const struct qce_ahash_def *def, alg->halg.digestsize = def->digestsize; alg->halg.statesize = def->statesize; -if (IS_SHA1 (def->flags)) - tmpl->hash_zero = sha1_zero_message_hash; -else if (IS_SHA256 (def->flags)) +if (IS_SHA256 (def->flags)) tmpl->hash_zero = sha256_zero_message_hash; base = &alg->halg.base;
drivers/crypto/qce/sha.h +0 -1
@@ -7,7 +7,6 @@#define _SHA_H_#include <crypto/scatterwalk.h> -#include <crypto/sha1.h> #include <crypto/sha2.h> #include "common.h"
drivers/crypto/qce/skcipher.c +2 -95
133 lines not on this page · raw message
drivers/crypto/qcom-rng.c +25 -131
236 lines not on this page · raw message
drivers/crypto/virtio/virtio_crypto_akcipher_algs.c +2 -1
@@ -88,7 +88,8 @@ static void virtio_crypto_dataq_akcipher_callback(struct virtio_crypto_request * }/* actual length may be less than dst buffer */ - akcipher_req->dst_len = len -sizeof (vc_req->status); + akcipher_req->dst_len = min_t(unsigned int, len - sizeof(vc_req->status), + akcipher_req->dst_len);sg_copy_from_buffer (akcipher_req->dst,sg_nents (akcipher_req->dst), vc_akcipher_req->dst_buf, akcipher_req->dst_len);virtio_crypto_akcipher_finalize_req (vc_akcipher_req, akcipher_req, error);
drivers/fpga/dfl-fme-perf.c +2 -0
@@ -925,6 +925,8 @@ static int fme_perf_pmu_register(struct platform_device *pdev,PERF_PMU_CAP_NO_EXCLUDE ; name =devm_kasprintf (priv->dev,GFP_KERNEL ,"dfl_fme%d" , pdev->id); +if (!name) +return -ENOMEM ; ret =perf_pmu_register (pmu, name,-1 );if (ret)
drivers/infiniband/sw/rxe/rxe_qp.c +15 -3
@@ -172,6 +172,7 @@ static void free_rd_atomic_resources(struct rxe_qp *qp) }kfree (qp->resp.resources); qp->resp.resources =NULL ; + qp->resp.res =NULL ; } }
@@ -707,13 +708,24 @@ int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr *attr, int mask,int max_dest_rd_atomic = attr->max_dest_rd_atomic ?roundup_pow_of_two (attr->max_dest_rd_atomic) :0 ; - qp->attr.max_dest_rd_atomic = max_dest_rd_atomic; - +/* +* Not gated by IB_QP_STATE, so the responder task is live. +* Quiesce recv_task like rxe_qp_reset() before swapping the +* rd_atomic array, so rxe_receiver() cannot race the free/ +* realloc. +*/ +rxe_disable_task (&qp->recv_task);free_rd_atomic_resources (qp); - + qp->attr.max_dest_rd_atomic = max_dest_rd_atomic; err =alloc_rd_atomic_resources (qp, max_dest_rd_atomic); +/* +* On ENOMEM leave recv_task quiesced: qp->resp.resources is +* NULL and rxe_prepare_res()/find_resource() would deref it. +* Re-enable only after a fresh array is installed. +*/ if (err)return err; +rxe_enable_task (&qp->recv_task); }if (mask &IB_QP_EN_SQD_ASYNC_NOTIFY )
drivers/net/gtp.c +17 -4
@@ -12,6 +12,7 @@#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt#include <linux/module.h> +#include <linux/mutex.h> #include <linux/skbuff.h> #include <linux/udp.h> #include <linux/rculist.h>
@@ -108,6 +109,7 @@ struct gtp_net { };static u32 gtp_h_initval; +static DEFINE_MUTEX (gtp_pdp_lock);static struct genl_family gtp_genl_family;
@@ -151,7 +153,8 @@ static struct pdp_ctx *gtp0_pdp_find(struct gtp_dev *gtp, u64 tid, u16 family) head = >p->tid_hash[gtp0_hashfn (tid) % gtp->hash_size]; -hlist_for_each_entry_rcu (pdp, head, hlist_tid) { +hlist_for_each_entry_rcu (pdp, head, hlist_tid, +lockdep_is_held (>p_pdp_lock)) {if (pdp->af == family && pdp->gtp_version ==GTP_V0 && pdp->u.v0.tid == tid)
@@ -168,7 +171,8 @@ static struct pdp_ctx *gtp1_pdp_find(struct gtp_dev *gtp, u32 tid, u16 family) head = >p->tid_hash[gtp1u_hashfn (tid) % gtp->hash_size]; -hlist_for_each_entry_rcu (pdp, head, hlist_tid) { +hlist_for_each_entry_rcu (pdp, head, hlist_tid, +lockdep_is_held (>p_pdp_lock)) {if (pdp->af == family && pdp->gtp_version ==GTP_V1 && pdp->u.v1.i_tei == tid)
@@ -185,7 +189,8 @@ static struct pdp_ctx *ipv4_pdp_find(struct gtp_dev *gtp, __be32 ms_addr) head = >p->addr_hash[ipv4_hashfn (ms_addr) % gtp->hash_size]; -hlist_for_each_entry_rcu (pdp, head, hlist_addr) { +hlist_for_each_entry_rcu (pdp, head, hlist_addr, +lockdep_is_held (>p_pdp_lock)) {if (pdp->af ==AF_INET && pdp->ms.addr.s_addr == ms_addr)return pdp;
@@ -220,7 +225,8 @@ static struct pdp_ctx *ipv6_pdp_find(struct gtp_dev *gtp, head = >p->addr_hash[ipv6_hashfn (ms_addr) % gtp->hash_size]; -hlist_for_each_entry_rcu (pdp, head, hlist_addr) { +hlist_for_each_entry_rcu (pdp, head, hlist_addr, +lockdep_is_held (>p_pdp_lock)) {if (pdp->af ==AF_INET6 &&ipv6_pdp_addr_equal (&pdp->ms.addr6, ms_addr))return pdp;
@@ -1555,9 +1561,11 @@ static void gtp_dellink(struct net_device *dev, struct list_head *head)struct pdp_ctx *pctx;int i; +mutex_lock (>p_pdp_lock);for (i =0 ; i < gtp->hash_size; i++)hlist_for_each_entry_safe (pctx, next, >p->tid_hash[i], hlist_tid)pdp_context_delete (pctx); +mutex_unlock (>p_pdp_lock);list_del (>p->list);unregister_netdevice_queue (dev, head);
@@ -2053,6 +2061,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info) goto out_unlock; } +mutex_lock (>p_pdp_lock); pctx =gtp_pdp_add (gtp, sk, info);if (IS_ERR (pctx)) { err =PTR_ERR (pctx);
@@ -2060,6 +2069,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info)gtp_tunnel_notify (pctx,GTP_CMD_NEWPDP ,GFP_KERNEL ); err =0 ; } +mutex_unlock (>p_pdp_lock); out_unlock:rtnl_unlock ();
@@ -2134,6 +2144,8 @@ static int gtp_genl_del_pdp(struct sk_buff *skb, struct genl_info *info)if (!info->attrs[GTPA_VERSION ])return -EINVAL ; +mutex_lock (>p_pdp_lock); +rcu_read_lock (); pctx =gtp_find_pdp (sock_net (skb->sk), info->attrs);
@@ -2154,6 +2166,7 @@ static int gtp_genl_del_pdp(struct sk_buff *skb, struct genl_info *info) out_unlock:rcu_read_unlock (); +mutex_unlock (>p_pdp_lock);return err; }
drivers/net/vxlan/vxlan_core.c +5 -4
@@ -3058,18 +3058,19 @@ vxlan_fdb_flush_match_remotes(struct vxlan_fdb *f, struct vxlan_dev *vxlan,const struct vxlan_fdb_flush_desc *desc, bool *p_destroy_fdb) { - bool remotes_flushed = false; struct vxlan_rdst *rd, *tmp;list_for_each_entry_safe (rd, tmp, &f->remotes, list) {if (!vxlan_fdb_flush_remote_matches (desc, rd))continue ; +if (list_is_singular (&f->remotes)) { + *p_destroy_fdb = true; +return ; + } +vxlan_fdb_dst_destroy (vxlan, f, rd, true); - remotes_flushed = true; } - - *p_destroy_fdb = remotes_flushed &&list_empty (&f->remotes); }/* Purge the forwarding table */
drivers/net/wireless/mediatek/mt76/mt7925/mac.c +4 -0
@@ -1434,6 +1434,10 @@ int mt7925_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,if (!wcid) wcid = &dev->mt76.global_wcid; + err =skb_cow_head (skb,MT_SDIO_TXD_SIZE +MT_SDIO_HDR_SIZE ); +if (err) +return err; +if (sta) {struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
drivers/nvme/host/tcp.c +8 -0
@@ -108,6 +108,7 @@ struct nvme_tcp_queue {struct mutex queue_lock;struct mutex send_mutex; +struct mutex pf_cache_lock;struct llist_head req_list;struct list_head send_list;
@@ -550,9 +551,11 @@ static int nvme_tcp_init_request(struct blk_mq_tag_set *set,struct nvme_tcp_queue *queue = &ctrl->queues[queue_idx];u8 hdgst =nvme_tcp_hdgst_len (queue); +mutex_lock (&queue->pf_cache_lock); req->pdu =page_frag_alloc (&queue->pf_cache,sizeof (struct nvme_tcp_cmd_pdu ) + hdgst,GFP_KERNEL | __GFP_ZERO); +mutex_unlock (&queue->pf_cache_lock);if (!req->pdu)return -ENOMEM ;
@@ -1417,9 +1420,11 @@ static int nvme_tcp_alloc_async_req(struct nvme_tcp_ctrl *ctrl)struct nvme_tcp_request *async = &ctrl->async_req;u8 hdgst =nvme_tcp_hdgst_len (queue); +mutex_lock (&queue->pf_cache_lock); async->pdu =page_frag_alloc (&queue->pf_cache,sizeof (struct nvme_tcp_cmd_pdu ) + hdgst,GFP_KERNEL | __GFP_ZERO); +mutex_unlock (&queue->pf_cache_lock);if (!async->pdu)return -ENOMEM ;
@@ -1461,6 +1466,7 @@ static void nvme_tcp_free_queue(struct nvme_ctrl *nctrl, int qid)kfree (queue->pdu);mutex_destroy (&queue->send_mutex);mutex_destroy (&queue->queue_lock); +mutex_destroy (&queue->pf_cache_lock);#ifdef CONFIG_DEBUG_LOCK_ALLOC lockdep_unregister_key (&queue->nvme_tcp_sk_key);
@@ -1788,6 +1794,7 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid,INIT_LIST_HEAD (&queue->send_list);mutex_init (&queue->send_mutex);INIT_WORK (&queue->io_work, nvme_tcp_io_work); +mutex_init (&queue->pf_cache_lock);if (qid >0 ) queue->cmnd_capsule_len = nctrl->ioccsz *16 ;
@@ -1928,6 +1935,7 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid, err_destroy_mutex:mutex_destroy (&queue->send_mutex);mutex_destroy (&queue->queue_lock); +mutex_destroy (&queue->pf_cache_lock);return ret; }
drivers/target/target_core_fabric_configfs.c +8 -0
@@ -690,6 +690,14 @@ static void target_fabric_port_unlink( }core_dev_del_lun (se_tpg, lun); + +if (tf->tf_ops->fabric_post_unlink) { +/* +* Allow fabrics to release state that must remain valid until +* core_dev_del_lun() has drained all active LUN references. +*/ + tf->tf_ops->fabric_post_unlink (se_tpg, lun); + } }static void target_fabric_port_release (struct config_item *item)
drivers/usb/c67x00/c67x00-sched.c +2 -2
@@ -761,13 +761,13 @@ static int c67x00_add_iso_urb(struct c67x00_hcd *c67x00, struct urb *urb) ret); urb->iso_frame_desc[urbp->cnt].actual_length =0 ; urb->iso_frame_desc[urbp->cnt].status = ret; -if (urbp->cnt +1 == urb->number_of_packets) -c67x00_giveback_urb (c67x00, urb,0 ); } urbp->ep_data->next_frame =frame_add (urbp->ep_data->next_frame, urb->interval); urbp->cnt++; +if (ret && urbp->cnt == urb->number_of_packets) +c67x00_giveback_urb (c67x00, urb,0 ); }return 0 ; }
drivers/usb/core/devio.c +1 -1
@@ -1113,7 +1113,6 @@ static int usbdev_release(struct inode *inode, struct file *file)if (!ps->suspend_allowed)usb_autosuspend_device (dev);usb_unlock_device (dev); -usb_put_dev (dev);put_pid (ps->disc_pid);put_cred (ps->cred);
@@ -1122,6 +1121,7 @@ static int usbdev_release(struct inode *inode, struct file *file)free_async (as); as =async_getcompleted (ps); } +usb_put_dev (dev);kfree (ps);return 0 ;
drivers/usb/core/hub.c +6 -1
@@ -753,10 +753,12 @@ void usb_wakeup_notification(struct usb_device *hdev, {struct usb_hub *hub;struct usb_port *port_dev; +unsigned long flags;if (!hdev)return ; +spin_lock_irqsave (&device_state_lock, flags); hub =usb_hub_to_struct_hub (hdev);if (hub) { port_dev = hub->ports[portnum -1 ];
@@ -766,6 +768,7 @@ void usb_wakeup_notification(struct usb_device *hdev,set_bit (portnum, hub->wakeup_bits);kick_hub_wq (hub); } +spin_unlock_irqrestore (&device_state_lock, flags); }EXPORT_SYMBOL_GPL (usb_wakeup_notification);
@@ -991,10 +994,12 @@ static int hub_hub_status(struct usb_hub *hub,mutex_lock (&hub->status_mutex); ret =get_hub_status (hub->hdev, &hub->status->hub); -if (ret <0 ) { +if (ret < (int )sizeof (hub->status->hub)) {if (ret != -ENODEV )dev_err (hub->intfdev,"%s failed (err = %d)\n" , __func__, ret); +if (ret >=0 ) + ret = -EIO ; }else { *status =le16_to_cpu (hub->status->hub.wHubStatus); *change =le16_to_cpu (hub->status->hub.wHubChange);
drivers/usb/gadget/function/f_tcm.c +1 -1
@@ -2024,7 +2024,7 @@ static const struct target_core_fabric_ops usbg_ops = { .fabric_enable_tpg = usbg_enable_tpg, .fabric_drop_tpg = usbg_drop_tpg, .fabric_post_link = usbg_port_link, - .fabric_pre_unlink = usbg_port_unlink, + .fabric_post_unlink = usbg_port_unlink, .fabric_init_nodeacl = usbg_init_nodeacl, .tfc_wwn_attrs = usbg_wwn_attrs,
drivers/usb/host/xhci-dbgtty.c +11 -4
@@ -628,8 +628,8 @@ int dbc_tty_init(void) dbc_tty_driver =tty_alloc_driver (64 ,TTY_DRIVER_REAL_RAW |TTY_DRIVER_DYNAMIC_DEV );if (IS_ERR (dbc_tty_driver)) { -idr_destroy (&dbc_tty_minors); -return PTR_ERR (dbc_tty_driver); + ret =PTR_ERR (dbc_tty_driver); + goto fail; } dbc_tty_driver->driver_name ="dbc_serial" ;
@@ -649,10 +649,17 @@ int dbc_tty_init(void) ret =tty_register_driver (dbc_tty_driver);if (ret) {pr_err ("Can't register dbc tty driver\n" ); -tty_driver_kref_put (dbc_tty_driver); -idr_destroy (&dbc_tty_minors); + goto fail_put; } +return ret; + +fail_put: +tty_driver_kref_put (dbc_tty_driver); +fail: +idr_destroy (&dbc_tty_minors); + dbc_tty_driver =NULL ; +return ret; }
drivers/usb/host/xhci-ring.c +17 -3
@@ -2025,7 +2025,7 @@ static void handle_port_status(struct xhci_hcd *xhci, union xhci_trb *event) vdev = xhci->devs[port->slot_id];/* We might get interrupts after shared_hcd is removed */ -if (port->rhub == &xhci->usb3_rhub && xhci->shared_hcd ==NULL ) { +if (port->rhub == &xhci->usb3_rhub &&xhci_get_usb3_hcd (xhci) ==NULL ) {xhci_dbg (xhci,"ignore port event for removed USB3 hcd\n" ); bogus_port_status = true; goto cleanup;
@@ -2600,6 +2600,17 @@ static bool xhci_spurious_success_tx_event(struct xhci_hcd *xhci, } } +static struct xhci_td *find_td_by_dma (struct xhci_ring *ep_ring,dma_addr_t dma) +{ +struct xhci_td *td; + +if (dma) +list_for_each_entry (td, &ep_ring->td_list, td_list) +if (trb_in_td (td, dma)) +return td; +return NULL ; +} +/* * If this function returns an error condition, it means it got a Transfer * event with a corrupted Slot ID, Endpoint ID, or TRB DMA address.
@@ -2794,8 +2805,11 @@ static int handle_tx_event(struct xhci_hcd *xhci,xhci_dequeue_td (xhci, td, ep_ring, td->status); } -/* If the TRB pointer is NULL, missed TDs will be skipped on the next event */ -if (trb_comp_code ==COMP_MISSED_SERVICE_ERROR && !ep_trb_dma) +/* +* We don't know how many TDs were missed when ep_trb_dma is zero (as permitted by +* xHCI 1.0) or bogus. Bail out leaving ep->skip set, next event will sort it out. +*/ +if (trb_comp_code ==COMP_MISSED_SERVICE_ERROR && !find_td_by_dma (ep_ring, ep_trb_dma))return 0 ;if (list_empty (&ep_ring->td_list)) {
drivers/usb/host/xhci.c +8 -3
@@ -5433,6 +5433,7 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)struct device *dev = hcd->self.sysdev;int retval;u32 hcs_params1; +u32 hc_capbase;/* Accept arbitrarily long scatter-gather lists */ hcd->self.sg_tablesize = ~0 ;
@@ -5453,15 +5454,19 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)mutex_init (&xhci->mutex); xhci->main_hcd = hcd; xhci->cap_regs = hcd->regs; - xhci->op_regs = hcd->regs + -HC_LENGTH (readl (&xhci->cap_regs->hc_capbase)); + hc_capbase =readl (&xhci->cap_regs->hc_capbase); +if (hc_capbase ==U32_MAX ) { +xhci_warn (xhci,"Host controller not accessible, removed?\n" ); +return -ENODEV ; + } + xhci->op_regs = hcd->regs +HC_LENGTH (hc_capbase); xhci->run_regs = hcd->regs + (readl (&xhci->cap_regs->run_regs_off) &RTSOFF_MASK );/* Cache read-only capability registers */ hcs_params1 =readl (&xhci->cap_regs->hcs_params1); xhci->hcs_params2 =readl (&xhci->cap_regs->hcs_params2); xhci->hcs_params3 =readl (&xhci->cap_regs->hcs_params3); - xhci->hci_version =HC_VERSION (readl (&xhci->cap_regs->hc_capbase)); + xhci->hci_version =HC_VERSION (hc_capbase); xhci->hcc_params =readl (&xhci->cap_regs->hcc_params);if (xhci->hci_version >0x100 ) xhci->hcc_params2 =readl (&xhci->cap_regs->hcc_params2);
drivers/usb/misc/usbtest.c +1 -0
@@ -3054,6 +3054,7 @@ static struct usb_driver usbtest_driver = { .disconnect = usbtest_disconnect, .suspend = usbtest_suspend, .resume = usbtest_resume, + .no_dynamic_id = 1, };/*-------------------------------------------------------------------------*/
drivers/usb/serial/option.c +17 -3
@@ -2689,12 +2689,26 @@ static void option_instat_callback(struct urb *urb)dev_dbg (dev,"%s: NULL req_pkt\n" , __func__);return ; } + +if (urb->actual_length <sizeof (*req_pkt)) { +dev_err (dev,"%s: short packet: %u bytes\n" , __func__, + urb->actual_length); +return ; + } +if ((req_pkt->bRequestType ==0xA1 ) && (req_pkt->bRequest ==0x20 )) { +unsigned char signals;int old_dcd_state; -unsigned char signals = *((unsigned char *) - urb->transfer_buffer + -sizeof (struct usb_ctrlrequest )); + +if (urb->actual_length <sizeof (*req_pkt) +1 ) { +dev_err (dev,"%s: short interrupt transfer: %u bytes\n" , + __func__, urb->actual_length); +return ; + } + + signals = *((unsigned char *)urb->transfer_buffer + +sizeof (*req_pkt));dev_dbg (dev,"%s: signal x%x\n" , __func__, signals);
drivers/usb/serial/spcp8x5.c +0 -13
@@ -235,18 +235,6 @@ static void spcp8x5_set_work_mode(struct usb_serial_port *port, u16 value,dev_err (&port->dev,"failed to set work mode: %d\n" , ret); } -static int spcp8x5_carrier_raised (struct usb_serial_port *port) -{ -u8 msr; -int ret; - - ret =spcp8x5_get_msr (port, &msr); -if (ret || msr &MSR_STATUS_LINE_DCD ) -return 1 ; - -return 0 ; -} -static void spcp8x5_dtr_rts (struct usb_serial_port *port,int on) {struct spcp8x5_private *priv =usb_get_serial_port_data (port);
@@ -458,7 +446,6 @@ static struct usb_serial_driver spcp8x5_device = { .num_bulk_out = 1, .open = spcp8x5_open, .dtr_rts = spcp8x5_dtr_rts, - .carrier_raised = spcp8x5_carrier_raised, .set_termios = spcp8x5_set_termios, .init_termios = spcp8x5_init_termios, .tiocmget = spcp8x5_tiocmget,
fs/fuse/dev.c +23 -18
96 lines not on this page · raw message
fs/fuse/dev_uring.c +11 -9
@@ -204,7 +204,7 @@ void fuse_uring_destruct(struct fuse_chan *fch)return ;for (qid =0 ; qid < ring->nr_queues; qid++) { -struct fuse_ring_queue *queue = ring->queues[qid]; +struct fuse_ring_queue *queue =READ_ONCE (ring->queues[qid]);struct fuse_ring_ent *ent, *next;if (!queue)
@@ -223,7 +223,7 @@ void fuse_uring_destruct(struct fuse_chan *fch)kfree (queue->fpq.processing);kfree (queue); - ring->queues[qid] =NULL ; +WRITE_ONCE (ring->queues[qid],NULL ); }kfree (ring->queues);
@@ -321,9 +321,11 @@ static struct fuse_ring_queue *fuse_uring_create_queue(struct fuse_ring *ring, }/* -* write_once and lock as the caller mostly doesn't take the lock at all +* fch->lock serializes concurrent creators for this qid. +* smp_store_release() are for the lockless readers who must see a +* fully initialized queue after &ring->queues[qid] is set */ -WRITE_ONCE (ring->queues[qid], queue); +smp_store_release (&ring->queues[qid], queue);spin_unlock (&fch->lock);return queue;
@@ -434,7 +436,7 @@ static void fuse_uring_log_ent_state(struct fuse_ring *ring)struct fuse_ring_ent *ent;for (qid =0 ; qid < ring->nr_queues; qid++) { -struct fuse_ring_queue *queue = ring->queues[qid]; +struct fuse_ring_queue *queue =READ_ONCE (ring->queues[qid]);if (!queue)continue ;
@@ -967,7 +969,7 @@ static int fuse_uring_commit_fetch(struct io_uring_cmd *cmd, int issue_flags,if (qid >= ring->nr_queues)return -EINVAL ; - queue = ring->queues[qid]; + queue =READ_ONCE (ring->queues[qid]);if (!queue)return err; fpq = &queue->fpq;
@@ -1035,7 +1037,7 @@ static bool is_ring_ready(struct fuse_ring *ring, int current_qid)if (current_qid == qid)continue ; - queue = ring->queues[qid]; + queue =READ_ONCE (ring->queues[qid]);if (!queue) { ready = false;break ;
@@ -1191,7 +1193,7 @@ static int fuse_uring_register(struct io_uring_cmd *cmd,return -EINVAL ; } - queue = ring->queues[qid]; + queue =READ_ONCE (ring->queues[qid]);if (!queue) { queue =fuse_uring_create_queue (ring, qid);if (!queue)
@@ -1330,7 +1332,7 @@ static struct fuse_ring_queue *fuse_uring_task_to_queue(struct fuse_ring *ring) ring->nr_queues)) qid =0 ; - queue = ring->queues[qid]; + queue =READ_ONCE (ring->queues[qid]);WARN_ONCE (!queue,"Missing queue for qid %d\n" , qid);return queue;
fs/fuse/dir.c +4 -5
@@ -2161,10 +2161,8 @@ int fuse_do_setattr(struct mnt_idmap *idmap, struct dentry *dentry,filemap_invalidate_lock (mapping); fault_blocked = true; err =fuse_dax_break_layouts (inode,0 ,-1 ); -if (err) { -filemap_invalidate_unlock (mapping); -return err; - } +if (err) + goto unlock; }if (attr->ia_valid &ATTR_OPEN ) {
@@ -2191,7 +2189,7 @@ int fuse_do_setattr(struct mnt_idmap *idmap, struct dentry *dentry, ATTR_TIMES_SET)) { err =write_inode_now (inode, true);if (err) -return err; + goto unlock;fuse_set_nowrite (inode);fuse_release_nowrite (inode);
@@ -2299,6 +2297,7 @@ int fuse_do_setattr(struct mnt_idmap *idmap, struct dentry *dentry,clear_bit (FUSE_I_SIZE_UNSTABLE , &fi->state); +unlock:if (fault_blocked)filemap_invalidate_unlock (mapping);return err;
fs/fuse/file.c +2 -2
@@ -272,7 +272,7 @@ static int fuse_open(struct inode *inode, struct file *file)filemap_invalidate_lock (inode->i_mapping); err =fuse_dax_break_layouts (inode,0 ,-1 );if (err) - goto out_inode_unlock; + goto out_unlock; }if (is_wb_truncate || dax_truncate)
@@ -296,9 +296,9 @@ static int fuse_open(struct inode *inode, struct file *file)else if (!(ff->open_flags &FOPEN_KEEP_CACHE ))invalidate_inode_pages2 (inode->i_mapping); } +out_unlock:if (dax_truncate)filemap_invalidate_unlock (inode->i_mapping); -out_inode_unlock:if (is_wb_truncate || dax_truncate)inode_unlock (inode);
include/kunit/run-in-irq-context.h +6 -4
@@ -38,11 +38,13 @@ static enum hrtimer_restart kunit_irq_test_timer_func(struct hrtimer *timer) softirq_calls =atomic_read (&state->softirq_func_calls);/* -* If the timer is firing too often for the softirq or task to ever have -* a chance to run, increase the timer interval. This is needed on very -* slow systems. +* If the hrtimer is running much faster than the bh_work or the task, +* then it is firing too fast and might be starving those contexts as +* well as the actual system timer tick. Increase the interval. */ -if (hardirq_calls >=20 && (softirq_calls ==0 || task_calls ==0 )) +if (hardirq_calls >=20 && + (hardirq_calls /2 > softirq_calls || + hardirq_calls /2 > task_calls)) state->interval =ktime_add_ns (state->interval,250 );if (!state->func (state->test_specific_state))
include/linux/skbuff.h +24 -0
@@ -3126,6 +3126,30 @@ static inline void skb_set_transport_header(struct sk_buff *skb, skb->transport_header += offset; } +/** +* skb_set_transport_header_careful - conditionally set transport header +* @skb: buffer to alter +* @offset: offset to add to skb->data +* +* Hardened version of skb_set_transport_header(). +* +* Returns: true if the operation was a success. +*/ +static inline bool __must_check +skb_set_transport_header_careful (struct sk_buff *skb,const int offset) +{ +long thoff = skb->data - skb->head + offset; + + if (unlikely(thoff != (typeof(skb->transport_header))thoff)) +return false; + + if (unlikely(thoff == (typeof(skb->transport_header))~0U)) +return false; + + skb->transport_header = thoff; +return true; +} +static inline unsigned char *skb_network_header (const struct sk_buff *skb) {return skb->head + skb->network_header;
include/net/ip.h +25 -0
@@ -506,6 +506,31 @@ static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst,return res; } +/* Configured/administrative MTU of a route, for advertising the TCP MSS. +* +* Unlike ip_dst_mtu_maybe_forward(), this deliberately ignores the +* ICMP-learned path MTU (rt->rt_pmtu). The advertised MSS bounds what the +* peer may send to us and must reflect our receive capability (the device or +* route-configured MTU), not a path MTU learned on the reverse (send) +* direction, which may not apply to the peer->us path and outlives the fnhe +* for the whole connection. See RFC 2923 section 2.3 and the comment above +* tcp_advertise_mss(). +*/ +static inline unsigned int ip_dst_mtu_configured (const struct dst_entry *dst) +{ +unsigned int mtu, res; + +rcu_read_lock (); + mtu =dst_metric_raw (dst,RTAX_MTU ); +if (!mtu) + mtu =READ_ONCE (dst_dev_rcu (dst)->mtu); + mtu = min_t(unsigned int, mtu, IP_MAX_MTU); + res = mtu -lwtunnel_headroom (dst->lwtstate, mtu); +rcu_read_unlock (); + +return res; +} +static inline unsigned int ip_skb_dst_mtu (struct sock *sk,const struct sk_buff *skb) {
include/net/ip6_route.h +37 -0
@@ -385,6 +385,43 @@ static inline unsigned int ip6_dst_mtu_maybe_forward(const struct dst_entry *dstreturn mtu -lwtunnel_headroom (dst->lwtstate, mtu); } +/* Configured/administrative MTU of a route, for advertising the TCP MSS. +* +* Unlike ip6_dst_mtu_maybe_forward(), this ignores any ICMPv6-learned path +* MTU (which is kept on the RTF_CACHE exception route) and returns the MTU of +* the underlying route (fib6_pmtu) or the egress device. The advertised MSS +* bounds what the peer may send to us and must reflect our receive +* capability, not a path MTU learned on the reverse (send) direction. See +* RFC 2923 section 2.3 and the comment above tcp_advertise_mss(). +*/ +static inline unsigned int ip6_dst_mtu_configured (const struct dst_entry *dst) +{ +const struct rt6_info *rt =dst_rt6_info (dst); +const struct fib6_info *from; +struct inet6_dev *idev; +unsigned int mtu =0 ; + +rcu_read_lock (); +/* IPv6 keeps the learned PMTU and the configured MTU in the same +* RTAX_MTU slot: the learned value sits on this (possibly RTF_CACHE) +* dst, the configured one on the underlying route. Reach the latter +* via ->from (fib6_pmtu), populated by ip6_route_info_create(). +*/ + from =rcu_dereference (rt->from); +if (from) + mtu = from->fib6_pmtu; +if (!mtu) { + mtu =IPV6_MIN_MTU ; + idev =__in6_dev_get (dst_dev_rcu (dst)); +if (idev) + mtu = max_t(unsigned int, mtu, READ_ONCE(idev->cnf.mtu6)); + } +rcu_read_unlock (); + + mtu = min_t(unsigned int, mtu, IP6_MAX_MTU); +return mtu -lwtunnel_headroom (dst->lwtstate, mtu); +} +u32 ip6_mtu_from_fib6 (const struct fib6_result *res,const struct in6_addr *daddr,const struct in6_addr *saddr);
include/net/tcp.h +5 -0
@@ -1782,6 +1782,11 @@ static inline int tcp_full_space(const struct sock *sk)return tcp_win_from_space (sk,READ_ONCE (sk->sk_rcvbuf)); } +static inline u32 tcp_dst_advmss (const struct dst_entry *dst) +{ +return max_t (u32,dst_metric_advmss (dst),TCP_MIN_MSS ); +} +static inline void __tcp_adjust_rcv_ssthresh (struct sock *sk,u32 new_ssthresh) {int unused_mem =sk_unused_reserved_mem (sk);
include/target/target_core_fabric.h +2 -0
@@ -95,6 +95,8 @@ struct target_core_fabric_ops { struct se_lun *);void (*fabric_pre_unlink)(struct se_portal_group *,struct se_lun *); +void (*fabric_post_unlink)(struct se_portal_group *se_tpg, +struct se_lun *lun);struct se_tpg_np *(*fabric_make_np)(struct se_portal_group *,struct config_group *,const char *);void (*fabric_drop_np)(struct se_tpg_np *);
mm/swapfile.c +7 -0
@@ -3650,6 +3650,13 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) error = -EBUSY ; goto bad_swap_unlock_inode; } +if (IS_ENCRYPTED (inode)) { +pr_warn_once ( +"Filesystem-level encrypted swapfile '%s' is unsupported. Create a loop device over it, or use dm-crypt\n" , + name->name); + error = -EINVAL ; + goto bad_swap_unlock_inode; + }/* * The swap subsystem needs a major overhaul to support this.
net/8021q/vlan_dev.c +7 -32
@@ -502,26 +502,6 @@ static const struct header_ops vlan_header_ops = { .parse_protocol = vlan_parse_protocol, }; -static int vlan_passthru_hard_header (struct sk_buff *skb,struct net_device *dev, -unsigned short type, -const void *daddr,const void *saddr, -unsigned int len) -{ -struct vlan_dev_priv *vlan =vlan_dev_priv (dev); -struct net_device *real_dev = vlan->real_dev; - -if (saddr ==NULL ) - saddr = dev->dev_addr; - -return dev_hard_header (skb, real_dev, type, daddr, saddr, len); -} - -static const struct header_ops vlan_passthru_header_ops = { - .create = vlan_passthru_hard_header, - .parse = eth_header_parse, - .parse_protocol = vlan_parse_protocol, -}; -static const struct device_type vlan_type = { .name ="vlan" , };
@@ -580,14 +560,10 @@ static int vlan_dev_init(struct net_device *dev) dev->fcoe_ddp_xid = real_dev->fcoe_ddp_xid;#endif - dev->needed_headroom = real_dev->needed_headroom; -if (vlan_hw_offload_capable (real_dev->features, vlan->vlan_proto)) { - dev->header_ops = &vlan_passthru_header_ops; - dev->hard_header_len = real_dev->hard_header_len; - }else { - dev->header_ops = &vlan_header_ops; - dev->hard_header_len = real_dev->hard_header_len +VLAN_HLEN ; - } + dev->needed_headroom = real_dev->needed_headroom +VLAN_HLEN ; + dev->needed_tailroom = real_dev->needed_tailroom; + dev->header_ops = &vlan_header_ops; + dev->hard_header_len = real_dev->hard_header_len; dev->netdev_ops = &vlan_netdev_ops;
@@ -1029,10 +1005,9 @@ static void vlan_transfer_features(struct net_device *dev,netif_inherit_tso_max (vlandev, dev); -if (vlan_hw_offload_capable (dev->features, vlan->vlan_proto)) - vlandev->hard_header_len = dev->hard_header_len; -else - vlandev->hard_header_len = dev->hard_header_len +VLAN_HLEN ; + vlandev->needed_headroom = dev->needed_headroom +VLAN_HLEN ; + vlandev->needed_tailroom = dev->needed_tailroom; + vlandev->hard_header_len = dev->hard_header_len;#if IS_ENABLED (CONFIG_FCOE ) vlandev->fcoe_ddp_xid = dev->fcoe_ddp_xid;
net/batman-adv/tvlv.c +4 -1
@@ -433,8 +433,11 @@ static int batadv_tvlv_call_handler(struct batadv_priv *bat_priv,return NET_RX_SUCCESS ; tvlv_offset = (unsigned char *)tvlv_value - skb->data; +if (!skb_set_transport_header_careful (skb, + tvlv_offset + tvlv_value_len)) +return -EINVAL ; +skb_set_network_header (skb, tvlv_offset); -skb_set_transport_header (skb, tvlv_offset + tvlv_value_len);return tvlv_handler->mcast_handler (bat_priv, skb); }
net/bridge/br_multicast.c +2 -2
@@ -4312,8 +4312,8 @@ void br_multicast_toggle_one_vlan(struct net_bridge_vlan *vlan, bool on)if (br_vlan_is_master (vlan)) { br = vlan->br; -if (!br_vlan_is_brentry (vlan) || - (on && +if (on && + (!br_vlan_is_brentry (vlan) ||br_multicast_ctx_vlan_global_disabled (&vlan->br_mcast_ctx)))return ;
net/ipv4/route.c +2 -2
@@ -1358,8 +1358,8 @@ static unsigned int ipv4_default_advmss(const struct dst_entry *dst)rcu_read_lock (); net =dst_dev_net_rcu (dst); - advmss = max_t(unsigned int, ipv4_mtu(dst) - header_size, - net->ipv4.ip_rt_min_advmss); + advmss = max_t(unsigned int, ip_dst_mtu_configured(dst) - header_size, + net->ipv4.ip_rt_min_advmss);rcu_read_unlock ();return min (advmss,IPV4_MAX_PMTU - header_size);
net/ipv4/tcp_ao.c +13 -6
@@ -1160,6 +1160,15 @@ void tcp_ao_connect_init(struct sock *sk) l3index =l3mdev_master_ifindex_by_index (sock_net (sk), sk->sk_bound_dev_if); +hlist_for_each_entry (key, &ao_info->head, node) { +if (tcp_ao_key_cmp (key, l3index, addr, key->prefixlen, + family,-1 ,-1 )) { +/* pairs with tcp_inbound_ao_hash() */ +synchronize_rcu (); +break ; + } + } +hlist_for_each_entry_safe (key, next, &ao_info->head, node) {if (!tcp_ao_key_cmp (key, l3index, addr, key->prefixlen, family,-1 ,-1 ))continue ;
@@ -1187,12 +1196,7 @@ void tcp_ao_connect_init(struct sock *sk) ao_info->lisn =htonl (tp->write_seq); ao_info->snd_sne =0 ; }else { -/* Can't happen: tcp_connect() verifies that there's -* at least one tcp-ao key that matches the remote peer. -*/ -WARN_ON_ONCE (1 ); -rcu_assign_pointer (tp->ao_info,NULL ); -kfree (ao_info); +tcp_ao_destroy_sock (sk, false); } }
@@ -1825,6 +1829,9 @@ static int tcp_ao_del_cmd(struct sock *sk, unsigned short int family,if (cmd.ifindex && !(cmd.keyflags &TCP_AO_KEYF_IFINDEX ))return -EINVAL ; +if (cmd.keyflags &TCP_AO_KEYF_IFINDEX ) + l3index = cmd.ifindex; + ao_info =setsockopt_ao_info (sk);if (IS_ERR (ao_info))return PTR_ERR (ao_info);
net/ipv4/tcp_ipv4.c +1 -1
@@ -1736,7 +1736,7 @@ struct sock *tcp_v4_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,tcp_ca_openreq_child (newsk, dst);tcp_sync_mss (newsk,dst4_mtu (dst)); - newtp->advmss =tcp_mss_clamp (tcp_sk (sk),dst_metric_advmss (dst)); + newtp->advmss =tcp_mss_clamp (tcp_sk (sk),tcp_dst_advmss (dst));tcp_initialize_rcv_mss (newsk);
net/ipv4/tcp_minisocks.c +1 -1
@@ -440,7 +440,7 @@ void tcp_openreq_init_rwin(struct request_sock *req,u32 rcv_wnd;int mss; - mss =tcp_mss_clamp (tp,dst_metric_advmss (dst)); + mss =tcp_mss_clamp (tp,tcp_dst_advmss (dst)); window_clamp =READ_ONCE (tp->window_clamp);/* Set this up on the first call only */ req->rsk_window_clamp = window_clamp ? :dst_metric (dst,RTAX_WINDOW );
net/ipv4/tcp_output.c +3 -3
@@ -143,7 +143,7 @@ static __u16 tcp_advertise_mss(struct sock *sk)int mss = tp->advmss;if (dst) { -unsigned int metric =dst_metric_advmss (dst); +unsigned int metric =tcp_dst_advmss (dst);if (metric < mss) { mss = metric;
@@ -3972,7 +3972,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst, }skb_dst_set (skb, dst); - mss =tcp_mss_clamp (tp,dst_metric_advmss (dst)); + mss =tcp_mss_clamp (tp,tcp_dst_advmss (dst));memset (&opts,0 ,sizeof (opts)); now =tcp_clock_ns ();
@@ -4127,7 +4127,7 @@ static void tcp_connect_init(struct sock *sk)if (!tp->window_clamp)WRITE_ONCE (tp->window_clamp,dst_metric (dst,RTAX_WINDOW )); - tp->advmss =tcp_mss_clamp (tp,dst_metric_advmss (dst)); + tp->advmss =tcp_mss_clamp (tp,tcp_dst_advmss (dst));tcp_initialize_rcv_mss (sk);
net/ipv6/ah6.c +18 -11
@@ -232,26 +232,28 @@ static void ipv6_rearrange_destopt(struct ipv6hdr *iph, struct ipv6_opt_hdr *des* Rearrange the destination address in @iph and the addresses in @rthdr * so that they appear in the order they will at the final destination. * See Appendix A2 of RFC 2402 for details. +* +* Return: 0 on success, -EINVAL if segments_left exceeds the number of +* addresses described by hdrlen. */
Lines of this file are not shown. View the raw message.
net/packet/af_packet.c +87 -9
96 lines not on this page · raw message
net/xfrm/xfrm_nat_keepalive.c +44 -9
53 lines not on this page · raw message
tools/testing/selftests/bpf/progs/sockmap_verdict_prog.c +12 -2
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.