Linux 5.4.204
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.4.204 kernel.
All users of the 5.4 kernel series must upgrade.
The updated 5.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.4.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/arm/xen/p2m.c | 6 arch/powerpc/include/asm/bpf_perf_event.h | 9 arch/powerpc/include/uapi/asm/bpf_perf_event.h | 9 arch/powerpc/kernel/prom_init_check.sh | 2 arch/s390/Kconfig | 1 arch/s390/crypto/arch_random.c | 111 ----- arch/s390/include/asm/archrandom.h | 21 - arch/s390/kernel/setup.c | 5 drivers/block/xen-blkfront.c | 56 ++ drivers/clocksource/timer-ixp4xx.c | 1 drivers/devfreq/event/exynos-ppmu.c | 8 drivers/hwmon/ibmaem.c | 12 drivers/infiniband/hw/qedr/qedr.h | 1 drivers/infiniband/hw/qedr/verbs.c | 4 drivers/md/dm-raid.c | 34 - drivers/md/raid5.c | 1 drivers/net/bonding/bond_3ad.c | 3 drivers/net/bonding/bond_alb.c | 2 drivers/net/caif/caif_virtio.c | 10 drivers/net/dsa/bcm_sf2.c | 5 drivers/net/tun.c | 15 drivers/net/usb/ax88179_178a.c | 101 ++++- drivers/net/usb/qmi_wwan.c | 2 drivers/net/usb/usbnet.c | 4 drivers/net/virtio_net.c | 8 drivers/net/xen-netfront.c | 52 ++ drivers/nfc/nfcmrvl/i2c.c | 6 drivers/nfc/nfcmrvl/spi.c | 6 drivers/nfc/nxp-nci/i2c.c | 3 drivers/nvdimm/bus.c | 4 drivers/xen/gntdev-common.h | 8 drivers/xen/gntdev.c | 147 +++++-- include/linux/dim.h | 2 net/ipv6/addrconf.c | 4 net/ipv6/route.c | 9 net/ipv6/seg6_hmac.c | 1 net/ipv6/sit.c | 10 net/netfilter/nft_set_hash.c | 2 net/rose/rose_timer.c | 34 + net/sched/act_api.c | 22 - net/sunrpc/xdr.c | 2 tools/testing/selftests/net/udpgso_bench.sh | 2 tools/testing/selftests/rseq/Makefile | 2 tools/testing/selftests/rseq/basic_percpu_ops_test.c | 5 tools/testing/selftests/rseq/compiler.h | 30 + tools/testing/selftests/rseq/param_test.c | 8 tools/testing/selftests/rseq/rseq-abi.h | 151 +++++++ tools/testing/selftests/rseq/rseq-arm.h | 110 ++--- tools/testing/selftests/rseq/rseq-arm64.h | 79 ++-- tools/testing/selftests/rseq/rseq-generic-thread-pointer.h | 25 + tools/testing/selftests/rseq/rseq-mips.h | 71 --- tools/testing/selftests/rseq/rseq-ppc-thread-pointer.h | 30 + tools/testing/selftests/rseq/rseq-ppc.h | 128 ++++-- tools/testing/selftests/rseq/rseq-s390.h | 55 ++ tools/testing/selftests/rseq/rseq-skip.h | 2 tools/testing/selftests/rseq/rseq-thread-pointer.h | 19 + tools/testing/selftests/rseq/rseq-x86-thread-pointer.h | 40 ++ tools/testing/selftests/rseq/rseq-x86.h | 247 +++++++++---- tools/testing/selftests/rseq/rseq.c | 165 ++++---- tools/testing/selftests/rseq/rseq.h | 30 + 61 files changed, 1289 insertions(+), 655 deletions(-)
Carlo Lobrano (1):
net: usb: qmi_wwan: add Telit 0x1060 composition
Chris Ye (1):
nvdimm: Fix badblocks clear off-by-one error
Chuck Lever (1):
SUNRPC: Fix READ_PLUS crasher
Daniele Palmas (1):
net: usb: qmi_wwan: add Telit 0x1070 composition
Demi Marie Obenour (1):
xen/gntdev: Avoid blocking in unmap_grant_pages()
Dimitris Michailidis (1):
selftests/net: pass ipv6_args to udpgso_bench's IPv6 TCP test
Doug Berger (1):
net: dsa: bcm_sf2: force pause link settings
Duoming Zhou (1):
net: rose: fix UAF bugs caused by timer handler
Eric Dumazet (1):
net: bonding: fix possible NULL deref in rlb code
Greg Kroah-Hartman (2):
clocksource/drivers/ixp4xx: remove EXPORT_SYMBOL_GPL from ixp4xx_timer_setup() Linux 5.4.204
Heinz Mauelshagen (1):
dm raid: fix accesses beyond end of raid member array
Jakub Kicinski (3):
net: tun: unlink NAPI from device on destruction
net: tun: stop NAPI when detaching queues
net: tun: avoid disabling NAPI twice
Jason A. Donenfeld (1):
s390/archrandom: simplify back to earlier design and initialize earlier
Jason Wang (2):
virtio-net: fix race between ndo_open() and virtio_device_ready()
caif_virtio: fix race between virtio_device_ready() and ndo_open()
Jose Alonso (1):
net: usb: ax88179_178a: Fix packet receiving
Kamal Heib (1):
RDMA/qedr: Fix reporting QP timeout attribute
Krzysztof Kozlowski (1):
nfc: nfcmrvl: Fix irq_of_parse_and_map() return value
Liam Howlett (1):
powerpc/prom_init: Fix kernel config grep
Masahiro Yamada (1):
s390: remove unneeded 'select BUILD_BIN2C'
Mathieu Desnoyers (15):
selftests/rseq: introduce own copy of rseq uapi header selftests/rseq: Remove useless assignment to cpu variable selftests/rseq: Remove volatile from __rseq_abi
selftests/rseq: Introduce rseq_get_abi() helper
selftests/rseq: Introduce thread pointer getters
selftests/rseq: Uplift rseq selftests for compatibility with glibc-2.35 selftests/rseq: Fix ppc32: wrong rseq_cs 32-bit field pointer on big endian selftests/rseq: Fix ppc32 missing instruction selection "u" and "x" for load/store selftests/rseq: Fix ppc32 offsets by using long rather than off_t selftests/rseq: Fix warnings about #if checks of undefined tokens selftests/rseq: Remove arm/mips asm goto compiler work-around selftests/rseq: Fix: work-around asm goto compiler bugs selftests/rseq: x86-64: use %fs segment selector for accessing rseq thread area selftests/rseq: x86-32: use %gs segment selector for accessing rseq thread area selftests/rseq: Change type of rseq_offset to ptrdiff_t
Miaoqian Lin (1):
PM / devfreq: exynos-ppmu: Fix refcount leak in of_get_devfreq_events
Michael Walle (1):
NFC: nxp-nci: Don't issue a zero length i2c_master_read()
Mikulas Patocka (1):
dm raid: fix KASAN warning in raid5_add_disks
Naveen N. Rao (1):
powerpc/bpf: Fix use of user_pt_regs in uapi
Nicolas Dichtel (1):
ipv6: take care of disable_policy when restoring routes
Oleksandr Tyshchenko (1):
xen/arm: Fix race in RB-tree based P2M accounting
Oliver Neukum (1):
usbnet: fix memory allocation in helpers
Pablo Neira Ayuso (1):
netfilter: nft_dynset: restore set element counter when failing to update
Peter Oskolkov (1):
rseq/selftests,x86_64: Add rseq_offset_deref_addv()
Roger Pau Monne (4):
xen/blkfront: fix leaking data in shared pages xen/netfront: fix leaking data in shared pages xen/netfront: force data bouncing when backend is untrusted xen/blkfront: force data bouncing when backend is untrusted
Shuah Khan (1):
selftests/rseq: remove ARRAY_SIZE define from individual tests
Tao Liu (1):
linux/dim: Fix divide by 0 in RDMA DIM
Victor Nogueira (1):
net/sched: act_api: Notify user space if any actions were flushed before error
Yang Yingliang (1):
hwmon: (ibmaem) don't call platform_device_del() if platform_device_add() fails
Yevhen Orlov (1):
net: bonding: fix use-after-free after 802.3ad slave unbind
YueHaibing (1):
net: ipv6: unexport __init-annotated seg6_hmac_net_init()
katrinzhou (1):
ipv6/sit: fix ipip6_tunnel_get_prl return value
kernel test robot (1):
sit: use min
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 203 +SUBLEVEL = 204 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/arm/xen/p2m.c +4 -2
@@ -62,11 +62,12 @@ static int xen_add_phys_to_mach_entry(struct xen_p2m_entry *new)unsigned long __pfn_to_mfn (unsigned long pfn) { -struct rb_node *n = phys_to_mach.rb_node; +struct rb_node *n;struct xen_p2m_entry *entry;unsigned long irqflags;read_lock_irqsave (&p2m_lock, irqflags); + n = phys_to_mach.rb_node;while (n) { entry = rb_entry(n, struct xen_p2m_entry, rbnode_phys); if (entry->pfn <= pfn &&
@@ -153,10 +154,11 @@ bool __set_phys_to_machine_multi(unsigned long pfn,int rc;unsigned long irqflags;struct xen_p2m_entry *p2m_entry; -struct rb_node *n = phys_to_mach.rb_node; +struct rb_node *n;if (mfn ==INVALID_P2M_ENTRY ) {write_lock_irqsave (&p2m_lock, irqflags); + n = phys_to_mach.rb_node;while (n) { p2m_entry = rb_entry(n, struct xen_p2m_entry, rbnode_phys); if (p2m_entry->pfn <= pfn &&
arch/powerpc/include/asm/bpf_perf_event.h new file +9 -0
@@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _ASM_POWERPC_BPF_PERF_EVENT_H +#define _ASM_POWERPC_BPF_PERF_EVENT_H + +#include <asm/ptrace.h> + +typedef struct user_pt_regs bpf_user_pt_regs_t ; + +#endif /* _ASM_POWERPC_BPF_PERF_EVENT_H */
arch/powerpc/include/uapi/asm/bpf_perf_event.h deleted +0 -9
@@ -1,9 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _UAPI__ASM_BPF_PERF_EVENT_H__ -#define _UAPI__ASM_BPF_PERF_EVENT_H__ - -#include <asm/ptrace.h> - -typedef struct user_pt_regs bpf_user_pt_regs_t ; - -#endif /* _UAPI__ASM_BPF_PERF_EVENT_H__ */
arch/powerpc/kernel/prom_init_check.sh +1 -1
@@ -13,7 +13,7 @@ # If you really need to reference something from prom_init.o add # it to the list below: -grep "^CONFIG_KASAN=y$" .config >/dev/null +grep "^CONFIG_KASAN=y$" ${KCONFIG_CONFIG} >/dev/null if [ $? -eq 0 ] then MEM_FUNCS="__memcpy __memset"
arch/s390/Kconfig +0 -1
@@ -541,7 +541,6 @@ config KEXEC config KEXEC_FILE bool "kexec file based system call" select KEXEC_CORE - select BUILD_BIN2C depends on CRYPTO depends on CRYPTO_SHA256 depends on CRYPTO_SHA256_S390
arch/s390/crypto/arch_random.c +1 -110
127 lines not on this page · raw message
arch/s390/include/asm/archrandom.h +12 -9
@@ -2,7 +2,7 @@/* * Kernel interface for the s390 arch_random_* functions * -* Copyright IBM Corp. 2017 +* Copyright IBM Corp. 2017, 2020 * * Author: Harald Freudenberger <[email protected]> *
@@ -15,34 +15,37 @@#include <linux/static_key.h> #include <linux/atomic.h> +#include <asm/cpacf.h> DECLARE_STATIC_KEY_FALSE (s390_arch_random_available);extern atomic64_t s390_arch_random_counter; -bool s390_arch_random_generate (u8 *buf,unsigned int nbytes); - -static inline bool arch_get_random_long (unsigned long *v) +static inline bool __must_check arch_get_random_long (unsigned long *v) {return false; } -static inline bool arch_get_random_int (unsigned int *v) +static inline bool __must_check arch_get_random_int (unsigned int *v) {return false; } -static inline bool arch_get_random_seed_long (unsigned long *v) +static inline bool __must_check arch_get_random_seed_long (unsigned long *v) {if (static_branch_likely (&s390_arch_random_available)) { -return s390_arch_random_generate ((u8 *)v,sizeof (*v)); +cpacf_trng (NULL ,0 , (u8 *)v,sizeof (*v)); +atomic64_add (sizeof (*v), &s390_arch_random_counter); +return true; }return false; } -static inline bool arch_get_random_seed_int (unsigned int *v) +static inline bool __must_check arch_get_random_seed_int (unsigned int *v) {if (static_branch_likely (&s390_arch_random_available)) { -return s390_arch_random_generate ((u8 *)v,sizeof (*v)); +cpacf_trng (NULL ,0 , (u8 *)v,sizeof (*v)); +atomic64_add (sizeof (*v), &s390_arch_random_counter); +return true; }return false; }
arch/s390/kernel/setup.c +5 -0
@@ -1005,6 +1005,11 @@ static void __init setup_randomness(void)if (stsi (vmms,3 ,2 ,2 ) ==0 && vmms->count)add_device_randomness (&vmms->vm,sizeof (vmms->vm[0 ]) * vmms->count);memblock_free ((unsigned long ) vmms,PAGE_SIZE ); + +#ifdef CONFIG_ARCH_RANDOM +if (cpacf_query_func (CPACF_PRNO ,CPACF_PRNO_TRNG )) +static_branch_enable (&s390_arch_random_available); +#endif }/*
drivers/block/xen-blkfront.c +38 -18
174 lines not on this page · raw message
drivers/clocksource/timer-ixp4xx.c +0 -1
@@ -258,7 +258,6 @@ void __init ixp4xx_timer_setup(resource_size_t timerbase, }ixp4xx_timer_register (base, timer_irq, timer_freq); } -EXPORT_SYMBOL_GPL (ixp4xx_timer_setup);#ifdef CONFIG_OF static __init int ixp4xx_of_timer_init (struct device_node *np)
drivers/devfreq/event/exynos-ppmu.c +6 -2
@@ -514,15 +514,19 @@ static int of_get_devfreq_events(struct device_node *np, count =of_get_child_count (events_np); desc =devm_kcalloc (dev, count,sizeof (*desc),GFP_KERNEL ); -if (!desc) +if (!desc) { +of_node_put (events_np);return -ENOMEM ; + } info->num_events = count; of_id =of_match_device (exynos_ppmu_id_match, dev);if (of_id) info->ppmu_type = (enum exynos_ppmu_type )of_id->data; -else +else { +of_node_put (events_np);return -EINVAL ; + } j =0 ;for_each_child_of_node (events_np, node) {
drivers/hwmon/ibmaem.c +8 -4
@@ -550,7 +550,7 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle) res =platform_device_add (data->pdev);if (res) - goto ipmi_err; + goto dev_add_err;platform_set_drvdata (data->pdev, data);
@@ -598,7 +598,9 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle)ipmi_destroy_user (data->ipmi.user); ipmi_err:platform_set_drvdata (data->pdev,NULL ); -platform_device_unregister (data->pdev); +platform_device_del (data->pdev); +dev_add_err: +platform_device_put (data->pdev); dev_err:ida_simple_remove (&aem_ida, data->id); id_err:
@@ -690,7 +692,7 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe, res =platform_device_add (data->pdev);if (res) - goto ipmi_err; + goto dev_add_err;platform_set_drvdata (data->pdev, data);
@@ -738,7 +740,9 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe,ipmi_destroy_user (data->ipmi.user); ipmi_err:platform_set_drvdata (data->pdev,NULL ); -platform_device_unregister (data->pdev); +platform_device_del (data->pdev); +dev_add_err: +platform_device_put (data->pdev); dev_err:ida_simple_remove (&aem_ida, data->id); id_err:
drivers/infiniband/hw/qedr/qedr.h +1 -0
@@ -416,6 +416,7 @@ struct qedr_qp {u32 sq_psn;u32 qkey;u32 dest_qp_num; +u8 timeout;/* Relevant to qps created from kernel space only (ULPs) */ u8 prev_wqe_size;
drivers/infiniband/hw/qedr/verbs.c +3 -1
@@ -2259,6 +2259,8 @@ int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,1 <<max_t (int, attr->timeout -8 ,0 ); else qp_params.ack_timeout = 0; + + qp->timeout = attr->timeout; }if (attr_mask &IB_QP_RETRY_CNT ) {
@@ -2418,7 +2420,7 @@ int qedr_query_qp(struct ib_qp *ibqp,rdma_ah_set_dgid_raw (&qp_attr->ah_attr, ¶ms.dgid.bytes[0 ]);rdma_ah_set_port_num (&qp_attr->ah_attr,1 );rdma_ah_set_sl (&qp_attr->ah_attr,0 ); - qp_attr->timeout = params.timeout; + qp_attr->timeout = qp->timeout; qp_attr->rnr_retry = params.rnr_retry; qp_attr->retry_cnt = params.retry_cnt; qp_attr->min_rnr_timer = params.min_rnr_nak_timer;
drivers/md/dm-raid.c +18 -16
@@ -998,12 +998,13 @@ static int validate_region_size(struct raid_set *rs, unsigned long region_size)static int validate_raid_redundancy (struct raid_set *rs) {unsigned int i, rebuild_cnt =0 ; -unsigned int rebuilds_per_group =0 , copies; +unsigned int rebuilds_per_group =0 , copies, raid_disks;unsigned int group_size, last_group_start; -for (i =0 ; i < rs->md.raid_disks; i++) -if (!test_bit (In_sync, &rs->dev[i].rdev.flags) || - !rs->dev[i].rdev.sb_page) +for (i =0 ; i < rs->raid_disks; i++) +if (!test_bit (FirstUse, &rs->dev[i].rdev.flags) && + ((!test_bit (In_sync, &rs->dev[i].rdev.flags) || + !rs->dev[i].rdev.sb_page))) rebuild_cnt++;switch (rs->md.level) {
@@ -1043,8 +1044,9 @@ static int validate_raid_redundancy(struct raid_set *rs)* A A B B C * C D D E E */ + raid_disks =min (rs->raid_disks, rs->md.raid_disks);if (__is_raid10_near (rs->md.new_layout)) { -for (i =0 ; i < rs->md.raid_disks; i++) { +for (i =0 ; i < raid_disks; i++) {if (!(i % copies)) rebuilds_per_group =0 ; if ((!rs->dev[i].rdev.sb_page ||
@@ -1067,10 +1069,10 @@ static int validate_raid_redundancy(struct raid_set *rs)* results in the need to treat the last (potentially larger) * set differently. */ - group_size = (rs->md.raid_disks / copies); - last_group_start = (rs->md.raid_disks / group_size) -1 ; + group_size = (raid_disks / copies); + last_group_start = (raid_disks / group_size) -1 ; last_group_start *= group_size; -for (i =0 ; i < rs->md.raid_disks; i++) { +for (i =0 ; i < raid_disks; i++) {if (!(i % copies) && !(i > last_group_start)) rebuilds_per_group =0 ; if ((!rs->dev[i].rdev.sb_page ||
@@ -1585,7 +1587,7 @@ static sector_t __rdev_sectors(struct raid_set *rs) {int i; -for (i =0 ; i < rs->md.raid_disks; i++) { +for (i =0 ; i < rs->raid_disks; i++) {struct md_rdev *rdev = &rs->dev[i].rdev; if (!test_bit(Journal, &rdev->flags) &&
@@ -3746,13 +3748,13 @@ static int raid_iterate_devices(struct dm_target *ti,unsigned int i;int r =0 ; -for (i =0 ; !r && i < rs->md.raid_disks; i++) -if (rs->dev[i].data_dev) - r =fn (ti, - rs->dev[i].data_dev, -0 ,/* No offset on data devs */ - rs->md.dev_sectors, - data); +for (i =0 ; !r && i < rs->raid_disks; i++) { +if (rs->dev[i].data_dev) { + r =fn (ti, rs->dev[i].data_dev, +0 ,/* No offset on data devs */ + rs->md.dev_sectors, data); + } + }return r; }
drivers/md/raid5.c +1 -0
@@ -7722,6 +7722,7 @@ static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev)*/ if (rdev->saved_raid_disk >=0 && rdev->saved_raid_disk >= first && + rdev->saved_raid_disk <= last && conf->disks[rdev->saved_raid_disk].rdev ==NULL ) first = rdev->saved_raid_disk;
drivers/net/bonding/bond_3ad.c +2 -1
@@ -2218,7 +2218,8 @@ void bond_3ad_unbind_slave(struct slave *slave) temp_aggregator->num_of_ports--;if (__agg_active_ports (temp_aggregator) ==0 ) { select_new_active_agg = temp_aggregator->is_active; -ad_clear_agg (temp_aggregator); +if (temp_aggregator->num_of_ports ==0 ) +ad_clear_agg (temp_aggregator);if (select_new_active_agg) {slave_info (bond->dev, slave->dev,"Removing an active aggregator\n" );/* select new active aggregator */
drivers/net/bonding/bond_alb.c +1 -1
@@ -1276,12 +1276,12 @@ int bond_alb_initialize(struct bonding *bond, int rlb_enabled)return res;if (rlb_enabled) { - bond->alb_info.rlb_enabled =1 ; res =rlb_initialize (bond);if (res) {tlb_deinitialize (bond);return res; } + bond->alb_info.rlb_enabled =1 ; }else { bond->alb_info.rlb_enabled =0 ; }
drivers/net/caif/caif_virtio.c +9 -1
@@ -723,13 +723,21 @@ static int cfv_probe(struct virtio_device *vdev)/* Carrier is off until netdevice is opened */ netif_carrier_off (netdev); +/* serialize netdev register + virtio_device_ready() with ndo_open() */ +rtnl_lock (); +/* register Netdev */ - err =register_netdev (netdev); + err =register_netdevice (netdev);if (err) { +rtnl_unlock ();dev_err (&vdev->dev,"Unable to register netdev (%d)\n" , err); goto err; } +virtio_device_ready (vdev); + +rtnl_unlock (); +debugfs_init (cfv);return 0 ;
drivers/net/dsa/bcm_sf2.c +5 -0
@@ -602,6 +602,11 @@ static void bcm_sf2_sw_mac_config(struct dsa_switch *ds, int port, reg |=LINK_STS ;if (state->duplex ==DUPLEX_FULL ) reg |=DUPLX_MODE ; +if (state->pause &MLO_PAUSE_TXRX_MASK ) { +if (state->pause &MLO_PAUSE_TX ) + reg |=TXFLOW_CNTL ; + reg |=RXFLOW_CNTL ; + }core_writel (priv, reg, offset); }
drivers/net/tun.c +13 -2
@@ -327,6 +327,12 @@ static void tun_napi_init(struct tun_struct *tun, struct tun_file *tfile, } } +static void tun_napi_enable (struct tun_file *tfile) +{ +if (tfile->napi_enabled) +napi_enable (&tfile->napi); +} +static void tun_napi_disable (struct tun_file *tfile) {if (tfile->napi_enabled)
@@ -690,7 +696,8 @@ static void __tun_detach(struct tun_file *tfile, bool clean) tun =rtnl_dereference (tfile->tun);if (tun && clean) { -tun_napi_disable (tfile); +if (!tfile->detached) +tun_napi_disable (tfile);tun_napi_del (tfile); }
@@ -709,8 +716,10 @@ static void __tun_detach(struct tun_file *tfile, bool clean)if (clean) {RCU_INIT_POINTER (tfile->tun,NULL );sock_put (&tfile->sk); - }else + }else {tun_disable_queue (tun, tfile); +tun_napi_disable (tfile); + }synchronize_net ();tun_flow_delete_by_queue (tun, tun->numqueues +1 );
@@ -783,6 +792,7 @@ static void tun_detach_all(struct net_device *dev)sock_put (&tfile->sk); }list_for_each_entry_safe (tfile, tmp, &tun->disabled, next) { +tun_napi_del (tfile);tun_enable_queue (tfile);tun_queue_purge (tfile);xdp_rxq_info_unreg (&tfile->xdp_rxq);
@@ -863,6 +873,7 @@ static int tun_attach(struct tun_struct *tun, struct file *file,if (tfile->detached) {tun_enable_queue (tfile); +tun_napi_enable (tfile); }else {sock_hold (&tfile->sk);tun_napi_init (tun, tfile, napi, napi_frags);
drivers/net/usb/ax88179_178a.c +76 -25
133 lines not on this page · raw message
drivers/net/usb/qmi_wwan.c +2 -0
@@ -1315,6 +1315,8 @@ static const struct usb_device_id products[] = { {QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1060, 2)}, /* Telit LN920 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1070, 2)}, /* Telit FN990 */ {QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */ {QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */ {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
drivers/net/usb/usbnet.c +2 -2
@@ -1987,7 +1987,7 @@ static int __usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, cmd, reqtype, value, index, size);if (size) { - buf =kmalloc (size,GFP_KERNEL ); + buf =kmalloc (size,GFP_NOIO );if (!buf) goto out; }
@@ -2019,7 +2019,7 @@ static int __usbnet_write_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, cmd, reqtype, value, index, size);if (data) { - buf =kmemdup (data, size,GFP_KERNEL ); + buf =kmemdup (data, size,GFP_NOIO );if (!buf) goto out; }else {
drivers/net/virtio_net.c +7 -1
@@ -3219,14 +3219,20 @@ static int virtnet_probe(struct virtio_device *vdev) } } - err =register_netdev (dev); +/* serialize netdev register + virtio_device_ready() with ndo_open() */ +rtnl_lock (); + + err =register_netdevice (dev);if (err) {pr_debug ("virtio_net: registering device failed\n" ); +rtnl_unlock (); goto free_failover; }virtio_device_ready (vdev); +rtnl_unlock (); + err =virtnet_cpu_notif_add (vi);if (err) {pr_debug ("virtio_net: registering cpu notifier failed\n" );
drivers/net/xen-netfront.c +49 -3
95 lines not on this page · raw message
drivers/nfc/nfcmrvl/i2c.c +3 -3
@@ -186,9 +186,9 @@ static int nfcmrvl_i2c_parse_dt(struct device_node *node, pdata->irq_polarity =IRQF_TRIGGER_RISING ; ret =irq_of_parse_and_map (node,0 ); -if (ret <0 ) { -pr_err ("Unable to get irq, error: %d\n" , ret); -return ret; +if (!ret) { +pr_err ("Unable to get irq\n" ); +return -EINVAL ; } pdata->irq = ret;
drivers/nfc/nfcmrvl/spi.c +3 -3
@@ -129,9 +129,9 @@ static int nfcmrvl_spi_parse_dt(struct device_node *node, } ret =irq_of_parse_and_map (node,0 ); -if (ret <0 ) { -pr_err ("Unable to get irq, error: %d\n" , ret); -return ret; +if (!ret) { +pr_err ("Unable to get irq\n" ); +return -EINVAL ; } pdata->irq = ret;
drivers/nfc/nxp-nci/i2c.c +3 -0
@@ -162,6 +162,9 @@ static int nxp_nci_i2c_nci_read(struct nxp_nci_i2c_phy *phy,skb_put_data (*skb, (void *)&header,NCI_CTRL_HDR_SIZE ); +if (!header.plen) +return 0 ; + r =i2c_master_recv (client,skb_put (*skb, header.plen), header.plen);if (r != header.plen) { nfc_err(&client->dev,
drivers/nvdimm/bus.c +2 -2
@@ -187,8 +187,8 @@ static int nvdimm_clear_badblocks_region(struct device *dev, void *data) ndr_end = nd_region->ndr_start + nd_region->ndr_size -1 ;/* make sure we are in the region */ -if (ctx->phys < nd_region->ndr_start - || (ctx->phys + ctx->cleared) > ndr_end) +if (ctx->phys < nd_region->ndr_start || + (ctx->phys + ctx->cleared -1 ) > ndr_end)return 0 ; sector = (ctx->phys - nd_region->ndr_start) /512 ;
drivers/xen/gntdev-common.h +8 -0
@@ -15,6 +15,8 @@#include <linux/mman.h> #include <linux/mmu_notifier.h> #include <linux/types.h> +#include <xen/interface/event_channel.h> +#include <xen/grant_table.h> struct gntdev_dmabuf_priv ;
@@ -61,6 +63,7 @@ struct gntdev_grant_map {struct gnttab_unmap_grant_ref *unmap_ops;struct gnttab_map_grant_ref *kmap_ops;struct gnttab_unmap_grant_ref *kunmap_ops; +bool *being_removed;struct page **pages;unsigned long pages_vm_start;
@@ -78,6 +81,11 @@ struct gntdev_grant_map {/* Needed to avoid allocation in gnttab_dma_free_pages(). */ xen_pfn_t *frames;#endif + +/* Number of live grants */ +atomic_t live_grants; +/* Needed to avoid allocation in __unmap_grant_pages */ +struct gntab_unmap_queue_data unmap_data; }; struct gntdev_grant_map *gntdev_alloc_map(struct gntdev_priv *priv, int count,
drivers/xen/gntdev.c +102 -45
282 lines not on this page · raw message
include/linux/dim.h +1 -1
@@ -17,7 +17,7 @@* We consider 10% difference as significant. */ #define IS_SIGNIFICANT_DIFF (val, ref) \ - (((100UL * abs((val) - (ref))) / (ref)) > 10) + ((ref) && (((100UL * abs((val) - (ref))) / (ref)) > 10))/** * Calculate the gap between two values.
net/ipv6/addrconf.c +0 -4
@@ -1102,10 +1102,6 @@ ipv6_add_addr(struct inet6_dev *idev, struct ifa6_config *cfg, goto out; } -if (net->ipv6.devconf_all->disable_policy || - idev->cnf.disable_policy) - f6i->dst_nopolicy = true; -neigh_parms_data_state_setall (idev->nd_parms); ifa->addr = *cfg->pfx;
net/ipv6/route.c +8 -1
@@ -4483,8 +4483,15 @@ struct fib6_info *addrconf_f6i_alloc(struct net *net, } f6i =ip6_route_info_create (&cfg, gfp_flags,NULL ); -if (!IS_ERR (f6i)) +if (!IS_ERR (f6i)) { f6i->dst_nocount = true; + +if (!anycast && + (net->ipv6.devconf_all->disable_policy || + idev->cnf.disable_policy)) + f6i->dst_nopolicy = true; + } +return f6i; }
net/ipv6/seg6_hmac.c +0 -1
@@ -410,7 +410,6 @@ int __net_init seg6_hmac_net_init(struct net *net)return 0 ; } -EXPORT_SYMBOL (seg6_hmac_net_init);void seg6_hmac_exit (void ) {
net/ipv6/sit.c +4 -6
@@ -310,9 +310,7 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t, kcalloc(cmax, sizeof(*kp), GFP_KERNEL | __GFP_NOWARN) : NULL; -rcu_read_lock (); - - ca = t->prl_count < cmax ? t->prl_count : cmax; + ca =min (t->prl_count, cmax);if (!kp) {/* We don't try hard to allocate much memory for
@@ -327,7 +325,7 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t, } } - c =0 ; +rcu_read_lock ();for_each_prl_rcu (t->prl) {if (c >= cmax)break ;
@@ -339,7 +337,7 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t,if (kprl.addr !=htonl (INADDR_ANY ))break ; } -out: +rcu_read_unlock (); len =sizeof (*kp) * c;
@@ -348,7 +346,7 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t, ret = -EFAULT ;kfree (kp); - +out:return ret; }
net/netfilter/nft_set_hash.c +2 -0
@@ -142,6 +142,7 @@ static bool nft_rhash_update(struct nft_set *set, const u32 *key,/* Another cpu may race to insert the element with the same key */ if (prev) {nft_set_elem_destroy (set, he, true); +atomic_dec (&set->nelems); he = prev; }
@@ -151,6 +152,7 @@ static bool nft_rhash_update(struct nft_set *set, const u32 *key, err2:nft_set_elem_destroy (set, he, true); +atomic_dec (&set->nelems); err1:return false; }
net/rose/rose_timer.c +19 -15
@@ -31,89 +31,89 @@ static void rose_idletimer_expiry(struct timer_list *);void rose_start_heartbeat (struct sock *sk) { -del_timer (&sk->sk_timer); +sk_stop_timer (sk, &sk->sk_timer); sk->sk_timer.function = rose_heartbeat_expiry; sk->sk_timer.expires = jiffies +5 *HZ ; -add_timer (&sk->sk_timer); +sk_reset_timer (sk, &sk->sk_timer, sk->sk_timer.expires); }void rose_start_t1timer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.function = rose_timer_expiry; rose->timer.expires = jiffies + rose->t1; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_t2timer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.function = rose_timer_expiry; rose->timer.expires = jiffies + rose->t2; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_t3timer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.function = rose_timer_expiry; rose->timer.expires = jiffies + rose->t3; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_hbtimer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.function = rose_timer_expiry; rose->timer.expires = jiffies + rose->hb; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_idletimer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->idletimer); +sk_stop_timer (sk, &rose->idletimer);if (rose->idle >0 ) { rose->idletimer.function = rose_idletimer_expiry; rose->idletimer.expires = jiffies + rose->idle; -add_timer (&rose->idletimer); +sk_reset_timer (sk, &rose->idletimer, rose->idletimer.expires); } }void rose_stop_heartbeat (struct sock *sk) { -del_timer (&sk->sk_timer); +sk_stop_timer (sk, &sk->sk_timer); }void rose_stop_timer (struct sock *sk) { -del_timer (&rose_sk (sk)->timer); +sk_stop_timer (sk, &rose_sk (sk)->timer); }void rose_stop_idletimer (struct sock *sk) { -del_timer (&rose_sk (sk)->idletimer); +sk_stop_timer (sk, &rose_sk (sk)->idletimer); }static void rose_heartbeat_expiry (struct timer_list *t)
@@ -130,6 +130,7 @@ static void rose_heartbeat_expiry(struct timer_list *t) (sk->sk_state == TCP_LISTEN && sock_flag(sk, SOCK_DEAD))) {bh_unlock_sock (sk);rose_destroy_socket (sk); +sock_put (sk);return ; }break ;
@@ -152,6 +153,7 @@ static void rose_heartbeat_expiry(struct timer_list *t)rose_start_heartbeat (sk);bh_unlock_sock (sk); +sock_put (sk); }static void rose_timer_expiry (struct timer_list *t)
@@ -181,6 +183,7 @@ static void rose_timer_expiry(struct timer_list *t)break ; }bh_unlock_sock (sk); +sock_put (sk); }static void rose_idletimer_expiry (struct timer_list *t)
@@ -205,4 +208,5 @@ static void rose_idletimer_expiry(struct timer_list *t)sock_set_flag (sk,SOCK_DEAD ); }bh_unlock_sock (sk); +sock_put (sk); }
net/sched/act_api.c +14 -8
@@ -287,7 +287,8 @@ static int tcf_idr_release_unsafe(struct tc_action *p) }static int tcf_del_walker (struct tcf_idrinfo *idrinfo,struct sk_buff *skb, -const struct tc_action_ops *ops) +const struct tc_action_ops *ops, +struct netlink_ext_ack *extack) {struct nlattr *nest;int n_i =0 ;
@@ -303,20 +304,25 @@ static int tcf_del_walker(struct tcf_idrinfo *idrinfo, struct sk_buff *skb,if (nla_put_string (skb,TCA_KIND , ops->kind)) goto nla_put_failure; + ret =0 ;mutex_lock (&idrinfo->lock);idr_for_each_entry_ul (idr, p, tmp, id) {if (IS_ERR (p))continue ; ret =tcf_idr_release_unsafe (p); -if (ret ==ACT_P_DELETED ) { +if (ret ==ACT_P_DELETED )module_put (ops->owner); - n_i++; - }else if (ret <0 ) { -mutex_unlock (&idrinfo->lock); - goto nla_put_failure; - } +else if (ret <0 ) +break ; + n_i++; }mutex_unlock (&idrinfo->lock); +if (ret <0 ) { +if (n_i) +NL_SET_ERR_MSG (extack,"Unable to flush all TC actions" ); +else + goto nla_put_failure; + } ret =nla_put_u32 (skb,TCA_FCNT , n_i);if (ret)
@@ -337,7 +343,7 @@ int tcf_generic_walker(struct tc_action_net *tn, struct sk_buff *skb,struct tcf_idrinfo *idrinfo = tn->idrinfo;if (type ==RTM_DELACTION ) { -return tcf_del_walker (idrinfo, skb, ops); +return tcf_del_walker (idrinfo, skb, ops, extack); }else if (type ==RTM_GETACTION ) {return tcf_dump_walker (idrinfo, skb, cb); }else {
net/sunrpc/xdr.c +1 -1
@@ -608,7 +608,7 @@ static __be32 *xdr_get_next_encode_buffer(struct xdr_stream *xdr,*/ xdr->p = (void *)p + frag2bytes; space_left = xdr->buf->buflen - xdr->buf->len; -if (space_left - nbytes >=PAGE_SIZE ) +if (space_left - frag1bytes >=PAGE_SIZE ) xdr->end = (void *)p +PAGE_SIZE ;else xdr->end = (void *)p + space_left - frag1bytes;
tools/testing/selftests/net/udpgso_bench.sh +1 -1
@@ -120,7 +120,7 @@ run_all() { run_udp "${ipv4_args}" echo "ipv6" - run_tcp "${ipv4_args}" + run_tcp "${ipv6_args}" run_udp "${ipv6_args}" }
tools/testing/selftests/rseq/Makefile +1 -1
@@ -6,7 +6,7 @@ endif CFLAGS += -O2 -Wall -g -I./ -I../../../../usr/include/ -L$(OUTPUT) -Wl,-rpath=./ \ $(CLANG_FLAGS) -LDLIBS += -lpthread +LDLIBS += -lpthread -ldl # Own dependencies because we only want to build against 1st prerequisite, but # still track changes to header files and depend on shared object.
tools/testing/selftests/rseq/basic_percpu_ops_test.c +2 -3
@@ -9,10 +9,9 @@#include <string.h> #include <stddef.h> +#include "../kselftest.h" #include "rseq.h" -#define ARRAY_SIZE (arr) (sizeof(arr) / sizeof((arr)[0])) -struct percpu_lock_entry {intptr_t v; } __attribute__((aligned (128 )));
@@ -168,7 +167,7 @@ struct percpu_list_node *this_cpu_list_pop(struct percpu_list *list,for (;;) {struct percpu_list_node *head;intptr_t *targetptr, expectnot, *load; -off_t offset; +long offset;int ret, cpu; cpu =rseq_cpu_start ();
tools/testing/selftests/rseq/compiler.h new file +30 -0
@@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: LGPL-2.1-only OR MIT */ +/* +* rseq/compiler.h +* +* Work-around asm goto compiler bugs. +* +* (C) Copyright 2021 - Mathieu Desnoyers <[email protected]> +*/ + +#ifndef RSEQ_COMPILER_H +#define RSEQ_COMPILER_H + +/* +* gcc prior to 4.8.2 miscompiles asm goto. +* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 +* +* gcc prior to 8.1.0 miscompiles asm goto at O1. +* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103908 +* +* clang prior to version 13.0.1 miscompiles asm goto at O2. +* https://github.com/llvm/llvm-project/issues/52735 +* +* Work around these issues by adding a volatile inline asm with +* memory clobber in the fallthrough after the asm goto and at each +* label target. Emit this for all compilers in case other similar +* issues are found in the future. +*/ +#define rseq_after_asm_goto () asm volatile ("" : : : "memory") + +#endif /* RSEQ_COMPILER_H_ */
tools/testing/selftests/rseq/param_test.c +3 -5
@@ -159,7 +159,7 @@ unsigned int yield_mod_cnt, nr_abort;" cbnz " INJECT_ASM_REG ", 222b\n" \ "333:\n" -#elif __PPC__ +#elif defined(__PPC__)#define RSEQ_INJECT_INPUT \ , [loop_cnt_1]"m"(loop_cnt[1]) \
@@ -366,9 +366,7 @@ void *test_percpu_spinlock_thread(void *arg)abort (); reps = thread_data->reps;for (i =0 ; i < reps; i++) { -int cpu =rseq_cpu_start (); - - cpu =rseq_this_cpu_lock (&data->lock); +int cpu =rseq_this_cpu_lock (&data->lock); data->c[cpu].count++;rseq_percpu_unlock (&data->lock, cpu);#ifndef BENCHMARK
@@ -549,7 +547,7 @@ struct percpu_list_node *this_cpu_list_pop(struct percpu_list *list,for (;;) {struct percpu_list_node *head;intptr_t *targetptr, expectnot, *load; -off_t offset; +long offset;int ret; cpu =rseq_cpu_start ();
tools/testing/selftests/rseq/rseq-abi.h new file +151 -0
151 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-arm.h +56 -54
340 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-arm64.h +56 -23
259 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-generic-thread-pointer.h new file +25 -0
@@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: LGPL-2.1-only OR MIT */ +/* +* rseq-generic-thread-pointer.h +* +* (C) Copyright 2021 - Mathieu Desnoyers <[email protected]> +*/ + +#ifndef _RSEQ_GENERIC_THREAD_POINTER +#define _RSEQ_GENERIC_THREAD_POINTER + +#ifdef __cplusplus +extern "C" { +#endif + +/* Use gcc builtin thread pointer. */ +static inline void *rseq_thread_pointer (void ) +{ +return __builtin_thread_pointer (); +} + +#ifdef __cplusplus +} +#endif + +#endif
tools/testing/selftests/rseq/rseq-mips.h +17 -54
270 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-ppc-thread-pointer.h new file +30 -0
@@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: LGPL-2.1-only OR MIT */ +/* +* rseq-ppc-thread-pointer.h +* +* (C) Copyright 2021 - Mathieu Desnoyers <[email protected]> +*/ + +#ifndef _RSEQ_PPC_THREAD_POINTER +#define _RSEQ_PPC_THREAD_POINTER + +#ifdef __cplusplus +extern "C" { +#endif + +static inline void *rseq_thread_pointer (void ) +{ +#ifdef __powerpc64__ + registervoid *__result asm ("r13" ); +#else + registervoid *__result asm ("r2" ); +#endif + asm ("" :"=r" (__result)); +return __result; +} + +#ifdef __cplusplus +} +#endif + +#endif
tools/testing/selftests/rseq/rseq-ppc.h +84 -44
241 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-s390.h +42 -13
55 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-skip.h +1 -1
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rseq/rseq-thread-pointer.h new file +19 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rseq/rseq-x86-thread-pointer.h new file +40 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rseq/rseq-x86.h +188 -59
247 lines not on this page · raw message
tools/testing/selftests/rseq/rseq.c +79 -86
165 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.