Linux 5.15.59
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.15.59 kernel.
All users of the 5.15 kernel series must upgrade.
The updated 5.15.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.15.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/admin-guide/kernel-parameters.txt | 2 Documentation/networking/ip-sysctl.rst | 9 + Makefile | 2 arch/arm/include/asm/dma.h | 2 arch/arm/lib/xor-neon.c | 3 arch/s390/include/asm/archrandom.h | 9 + arch/x86/kernel/cpu/bugs.c | 1 drivers/edac/ghes_edac.c | 11 + drivers/gpu/drm/nouveau/nouveau_dmem.c | 6 - drivers/gpu/drm/tiny/simpledrm.c | 2 drivers/net/ethernet/intel/i40e/i40e_main.c | 4 drivers/net/ethernet/intel/ice/ice_ethtool.c | 3 drivers/net/ethernet/intel/ice/ice_main.c | 8 - drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c | 106 +++++++++++++------ drivers/net/ethernet/sfc/ptp.c | 22 +++ drivers/net/macsec.c | 33 +++-- drivers/net/pcs/pcs-xpcs.c | 2 drivers/net/sungem_phy.c | 1 drivers/net/virtio_net.c | 37 ++++++ drivers/scsi/mpt3sas/mpt3sas_scsih.c | 1 drivers/scsi/scsi_ioctl.c | 2 drivers/scsi/ufs/ufshcd-pltfrm.c | 15 ++ fs/ntfs/attrib.c | 8 + fs/ocfs2/ocfs2.h | 4 fs/ocfs2/slot_map.c | 46 +++----- fs/ocfs2/super.c | 21 --- fs/read_write.c | 3 include/asm-generic/io.h | 2 include/net/addrconf.h | 3 include/net/bluetooth/l2cap.h | 1 include/net/inet_connection_sock.h | 10 - include/net/sock.h | 8 - include/net/tcp.h | 2 kernel/locking/rwsem.c | 30 +++-- kernel/watch_queue.c | 58 ++++++---- mm/hmm.c | 19 +-- mm/hugetlb.c | 1 mm/memory.c | 7 - mm/page_alloc.c | 12 +- mm/secretmem.c | 33 ++++- net/bluetooth/l2cap_core.c | 61 ++++++++-- net/decnet/af_decnet.c | 4 net/ipv4/fib_trie.c | 7 - net/ipv4/igmp.c | 24 ++-- net/ipv4/tcp.c | 8 - net/ipv4/tcp_input.c | 41 +++---- net/ipv4/tcp_ipv4.c | 4 net/ipv4/tcp_metrics.c | 10 - net/ipv4/tcp_output.c | 21 +-- net/ipv6/mcast.c | 14 +- net/ipv6/ping.c | 6 + net/ipv6/tcp_ipv6.c | 4 net/mptcp/protocol.c | 8 - net/netfilter/nfnetlink_queue.c | 7 + net/sctp/associola.c | 5 net/sctp/stream.c | 19 --- net/sctp/stream_sched.c | 2 net/tipc/socket.c | 2 net/tls/tls_device.c | 7 + tools/perf/util/symbol-elf.c | 45 +++++++- 60 files changed, 546 insertions(+), 302 deletions(-)
Alejandro Lucero (1):
sfc: disable softirqs for ptp TX
Alistair Popple (1):
nouveau/svm: Fix to migrate all requested pages
Andrei Vagin (1):
fs: sendfile handles O_NONBLOCK of out_fd
ChenXiaoSong (1):
ntfs: fix use-after-free in ntfs_ucsncmp()
David Howells (1):
watch_queue: Fix missing rcu annotation
David Jeffery (1):
scsi: mpt3sas: Stop fw fault watchdog work item during system shutdown
Duoming Zhou (1):
sctp: fix sleep in atomic context bug in timer handlers
Eiichi Tsukata (1):
docs/kernel-parameters: Update descriptions for "mitigations=" param with retbleed
Florian Fainelli (1):
ARM: 9216/1: Fix MAX_DMA_ADDRESS overflow
Florian Westphal (1):
netfilter: nf_queue: do not allow packet truncation below transport header offset
Greg Kroah-Hartman (2):
ARM: crypto: comment out gcc warning that breaks clang builds Linux 5.15.59
Harald Freudenberger (1):
s390/archrandom: prevent CPACF trng invocations in interrupt context
Jaewon Kim (1):
page_alloc: fix invalid watermark check on a negative value
Jason Wang (1):
virtio-net: fix the race between refill work and close
Jason Yan (1):
scsi: core: Fix warning in scsi_alloc_sgtables()
Jianglei Nie (1):
net: macsec: fix potential resource leak in macsec_add_rxsa() and macsec_add_txsa()
Josef Bacik (1):
mm: fix page leak with multiple threads mapping the same page
Junxiao Bi (1):
Revert "ocfs2: mount shared volume without ha stack"
Kuniyuki Iwashima (22):
tcp: Fix data-races around sysctl_tcp_dsack.
tcp: Fix a data-race around sysctl_tcp_app_win.
tcp: Fix a data-race around sysctl_tcp_adv_win_scale.
tcp: Fix a data-race around sysctl_tcp_frto.
tcp: Fix a data-race around sysctl_tcp_nometrics_save.
tcp: Fix data-races around sysctl_tcp_no_ssthresh_metrics_save.
tcp: Fix data-races around sysctl_tcp_moderate_rcvbuf.
tcp: Fix a data-race around sysctl_tcp_limit_output_bytes.
tcp: Fix a data-race around sysctl_tcp_challenge_ack_limit.
net: ping6: Fix memleak in ipv6_renew_options().
igmp: Fix data-races around sysctl_igmp_qrv.
tcp: Fix a data-race around sysctl_tcp_min_tso_segs.
tcp: Fix a data-race around sysctl_tcp_min_rtt_wlen.
tcp: Fix a data-race around sysctl_tcp_autocorking.
tcp: Fix a data-race around sysctl_tcp_invalid_ratelimit.
tcp: Fix data-races around sk_pacing_rate.
net: Fix data-races around sysctl_[rw]mem(_offset)?.
tcp: Fix a data-race around sysctl_tcp_comp_sack_delay_ns.
tcp: Fix a data-race around sysctl_tcp_comp_sack_slack_ns.
tcp: Fix a data-race around sysctl_tcp_comp_sack_nr.
tcp: Fix data-races around sysctl_tcp_reflect_tos.
ipv4: Fix data-races around sysctl_fib_notify_on_flag_change.
Leo Yan (1):
perf symbol: Correct address for bss symbols
Liang He (2):
scsi: ufs: host: Hold reference returned by of_parse_phandle()
net: sungem_phy: Add of_node_put() for reference returned by of_get_parent()
Linus Torvalds (1):
watch_queue: Fix missing locking in add_watch_to_object()
Luiz Augusto von Dentz (1):
Bluetooth: L2CAP: Fix use-after-free caused by l2cap_chan_put
Lukas Bulwahn (1):
asm-generic: remove a broken and needless ifdef conditional
Maciej Fijalkowski (2):
ice: check (DD | EOF) bits on Rx descriptor rather than (EOP | RS)
ice: do not setup vlan for loopback VSI
Maxim Mikityanskiy (1):
net/tls: Remove the context from the list in tls_device_down
Miaohe Lin (1):
hugetlb: fix memoryleak in hugetlb_mcopy_atomic_pte
Michal Maloszewski (1):
i40e: Fix interface init with MSI interrupts (no MSI-X)
Mike Rapoport (1):
secretmem: fix unhandled fault in truncate
Nathan Chancellor (1):
drm/simpledrm: Fix return type of simpledrm_simple_display_pipe_mode_valid()
Ralph Campbell (1):
mm/hmm: fault non-owner device private entries
Sabrina Dubroca (4):
macsec: fix NULL deref in macsec_add_rxsa
macsec: fix error message in macsec_add_rxsa and _txsa
macsec: limit replay window size with XPN
macsec: always read MACSEC_SA_ATTR_PN as a u64
Subbaraya Sundeep (1):
octeontx2-pf: Fix UDP/TCP src and dst port tc filters
Sunil Goutham (1):
octeontx2-pf: cn10k: Fix egress ratelimit configuration
Taehee Yoo (1):
net: mld: fix reference count leak in mld_{query | report}_work()
Thadeu Lima de Souza Cascardo (1):
x86/bugs: Do not enable IBPB at firmware entry when IBPB is not available
Toshi Kani (1):
EDAC/ghes: Set the DIMM label unconditionally
Vladimir Oltean (1):
net: pcs: xpcs: propagate xpcs_read error to xpcs_get_state_c37_sgmii
Waiman Long (1):
locking/rwsem: Allow slowpath writer to ignore handoff bit if not set by first waiter
Wei Wang (1):
Revert "tcp: change pingpong threshold to 3"
Xin Long (2):
Documentation: fix sctp_wmem in ip-sysctl.rst
sctp: leave the err path free in sctp_stream_init to sctp_stream_free
Ziyang Xuan (1):
ipv6/addrconf: fix a null-ptr-deref bug for ip6_ptr
Greg Kroah-Hartman
maintainerDocumentation/admin-guide/kernel-parameters.txt +2 -0
@@ -3020,6 +3020,7 @@ no_entry_flush [PPC] no_uaccess_flush [PPC] mmio_stale_data=off [X86] + retbleed=off [X86] Exceptions: This does not have any effect on
@@ -3042,6 +3043,7 @@ mds=full,nosmt [X86] tsx_async_abort=full,nosmt [X86] mmio_stale_data=full,nosmt [X86] + retbleed=auto,nosmt [X86] mminit_loglevel= [KNL] When CONFIG_DEBUG_MEMORY_INIT is set, this
Documentation/networking/ip-sysctl.rst +8 -1
@@ -2808,7 +2808,14 @@ sctp_rmem - vector of 3 INTEGERs: min, default, max Default: 4K sctp_wmem - vector of 3 INTEGERs: min, default, max - Currently this tunable has no effect. + Only the first value ("min") is used, "default" and "max" are + ignored. + + min: Minimum size of send buffer that can be used by SCTP sockets. + It is guaranteed to each SCTP socket (but not association) even + under moderate memory pressure. + + Default: 4K addr_scope_policy - INTEGER Control IPv4 address scoping - draft-stewart-tsvwg-sctp-ipv4-00
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 15 -SUBLEVEL = 58 +SUBLEVEL = 59 EXTRAVERSION = NAME = Trick or Treat
arch/arm/include/asm/dma.h +1 -1
@@ -10,7 +10,7 @@#else #define MAX_DMA_ADDRESS ({ \ extern phys_addr_t arm_dma_zone_size; \ - arm_dma_zone_size && arm_dma_zone_size < (0x10000000 - PAGE_OFFSET) ? \ + arm_dma_zone_size && arm_dma_zone_size < (0x100000000ULL - PAGE_OFFSET) ? \ (PAGE_OFFSET + arm_dma_zone_size) : 0xffffffffUL; })#endif
arch/arm/lib/xor-neon.c +2 -1
@@ -26,8 +26,9 @@ MODULE_LICENSE("GPL");* While older versions of GCC do not generate incorrect code, they fail to * recognize the parallel nature of these functions, and emit plain ARM code, * which is known to be slower than the optimized ARM code in asm-arm/xor.h. +* +* #warning This code requires at least version 4.6 of GCC */ -#warning This code requires at least version 4.6 of GCC#endif #pragma GCC diagnostic ignored "-Wunused-variable"
arch/s390/include/asm/archrandom.h +6 -3
@@ -2,7 +2,7 @@/* * Kernel interface for the s390 arch_random_* functions * -* Copyright IBM Corp. 2017, 2020 +* Copyright IBM Corp. 2017, 2022 * * Author: Harald Freudenberger <[email protected]> *
@@ -14,6 +14,7 @@#ifdef CONFIG_ARCH_RANDOM #include <linux/static_key.h> +#include <linux/preempt.h> #include <linux/atomic.h> #include <asm/cpacf.h>
@@ -32,7 +33,8 @@ static inline bool __must_check arch_get_random_int(unsigned int *v)static inline bool __must_check arch_get_random_seed_long (unsigned long *v) { -if (static_branch_likely (&s390_arch_random_available)) { +if (static_branch_likely (&s390_arch_random_available) && +in_task ()) {cpacf_trng (NULL ,0 , (u8 *)v,sizeof (*v));atomic64_add (sizeof (*v), &s390_arch_random_counter);return true;
@@ -42,7 +44,8 @@ static inline bool __must_check arch_get_random_seed_long(unsigned long *v)static inline bool __must_check arch_get_random_seed_int (unsigned int *v) { -if (static_branch_likely (&s390_arch_random_available)) { +if (static_branch_likely (&s390_arch_random_available) && +in_task ()) {cpacf_trng (NULL ,0 , (u8 *)v,sizeof (*v));atomic64_add (sizeof (*v), &s390_arch_random_counter);return true;
arch/x86/kernel/cpu/bugs.c +1 -0
@@ -1513,6 +1513,7 @@ static void __init spectre_v2_select_mitigation(void)* enable IBRS around firmware calls. */ if (boot_cpu_has_bug (X86_BUG_RETBLEED ) && +boot_cpu_has (X86_FEATURE_IBPB ) && (boot_cpu_data.x86_vendor ==X86_VENDOR_AMD || boot_cpu_data.x86_vendor ==X86_VENDOR_HYGON )) {
drivers/edac/ghes_edac.c +8 -3
@@ -101,9 +101,14 @@ static void dimm_setup_label(struct dimm_info *dimm, u16 handle)dmi_memdev_name (handle, &bank, &device); -/* both strings must be non-zero */ -if (bank && *bank && device && *device) -snprintf (dimm->label,sizeof (dimm->label),"%s %s" , bank, device); +/* +* Set to a NULL string when both bank and device are zero. In this case, +* the label assigned by default will be preserved. +*/ +snprintf (dimm->label,sizeof (dimm->label),"%s%s%s" , + (bank && *bank) ? bank :"" , + (bank && *bank && device && *device) ?" " :"" , + (device && *device) ? device :"" ); }static void assign_dmi_dimm_info (struct dimm_info *dimm,struct memdev_dmi_entry *entry)
drivers/gpu/drm/nouveau/nouveau_dmem.c +5 -1
@@ -679,7 +679,11 @@ nouveau_dmem_migrate_vma(struct nouveau_drm *drm, goto out_free_dma;for (i =0 ; i < npages; i += max) { - args.end = start + (max <<PAGE_SHIFT ); +if (args.start + (max <<PAGE_SHIFT ) > end) + args.end = end; +else + args.end = args.start + (max <<PAGE_SHIFT ); + ret =migrate_vma_setup (&args);if (ret) goto out_free_pfns;
drivers/gpu/drm/tiny/simpledrm.c +1 -1
@@ -614,7 +614,7 @@ static const struct drm_connector_funcs simpledrm_connector_funcs = { .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, }; -static int +static enum drm_mode_status simpledrm_simple_display_pipe_mode_valid (struct drm_simple_display_pipe *pipe,const struct drm_display_mode *mode) {
drivers/net/ethernet/intel/i40e/i40e_main.c +4 -0
@@ -1908,11 +1908,15 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,* non-zero req_queue_pairs says that user requested a new * queue count via ethtool's set_channels, so use this * value for queues distribution across traffic classes +* We need at least one queue pair for the interface +* to be usable as we see in else statement. */ if (vsi->req_queue_pairs >0 ) vsi->num_queue_pairs = vsi->req_queue_pairs;else if (pf->flags &I40E_FLAG_MSIX_ENABLED ) vsi->num_queue_pairs = pf->num_lan_msix; +else + vsi->num_queue_pairs =1 ; }/* Number of queues per enabled TC */
drivers/net/ethernet/intel/ice/ice_ethtool.c +2 -1
@@ -651,7 +651,8 @@ static int ice_lbtest_receive_frames(struct ice_ring *rx_ring) rx_desc =ICE_RX_DESC (rx_ring, i);if (!(rx_desc->wb.status_error0 & -cpu_to_le16 (ICE_TX_DESC_CMD_EOP |ICE_TX_DESC_CMD_RS ))) + (cpu_to_le16 (BIT (ICE_RX_FLEX_DESC_STATUS0_DD_S )) | +cpu_to_le16 (BIT (ICE_RX_FLEX_DESC_STATUS0_EOF_S )))))continue ; rx_buf = &rx_ring->rx_buf[i];
drivers/net/ethernet/intel/ice/ice_main.c +5 -3
@@ -5481,10 +5481,12 @@ int ice_vsi_cfg(struct ice_vsi *vsi)if (vsi->netdev) {ice_set_rx_mode (vsi->netdev); - err =ice_vsi_vlan_setup (vsi); +if (vsi->type !=ICE_VSI_LB ) { + err =ice_vsi_vlan_setup (vsi); -if (err) -return err; +if (err) +return err; + } }ice_vsi_cfg_dcb_rings (vsi);
drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c +73 -33
185 lines not on this page · raw message
drivers/net/ethernet/sfc/ptp.c +22 -0
@@ -1100,7 +1100,29 @@ static void efx_ptp_xmit_skb_queue(struct efx_nic *efx, struct sk_buff *skb) tx_queue =efx_channel_get_tx_queue (ptp_data->channel, type);if (tx_queue && tx_queue->timestamping) { +/* This code invokes normal driver TX code which is always +* protected from softirqs when called from generic TX code, +* which in turn disables preemption. Look at __dev_queue_xmit +* which uses rcu_read_lock_bh disabling preemption for RCU +* plus disabling softirqs. We do not need RCU reader +* protection here. +* +* Although it is theoretically safe for current PTP TX/RX code +* running without disabling softirqs, there are three good +* reasond for doing so: +* +* 1) The code invoked is mainly implemented for non-PTP +* packets and it is always executed with softirqs +* disabled. +* 2) This being a single PTP packet, better to not +* interrupt its processing by softirqs which can lead +* to high latencies. +* 3) netdev_xmit_more checks preemption is disabled and +* triggers a BUG_ON if not. +*/ +local_bh_disable ();efx_enqueue_skb (tx_queue, skb); +local_bh_enable (); }else {WARN_ONCE (1 ,"PTP channel has no timestamped tx queue\n" );dev_kfree_skb_any (skb);
drivers/net/macsec.c +21 -12
@@ -241,6 +241,7 @@ static struct macsec_cb *macsec_skb_cb(struct sk_buff *skb)#define DEFAULT_SEND_SCI true#define DEFAULT_ENCRYPT false#define DEFAULT_ENCODING_SA 0 +#define MACSEC_XPN_MAX_REPLAY_WINDOW (((1 << 30) - 1))static bool send_sci (const struct macsec_secy *secy) {
@@ -1695,7 +1696,7 @@ static bool validate_add_rxsa(struct nlattr **attrs)return false;if (attrs[MACSEC_SA_ATTR_PN ] && - *(u64 *)nla_data (attrs[MACSEC_SA_ATTR_PN ]) ==0 ) +nla_get_u64 (attrs[MACSEC_SA_ATTR_PN ]) ==0 )return false;if (attrs[MACSEC_SA_ATTR_ACTIVE ]) {
@@ -1751,7 +1752,8 @@ static int macsec_add_rxsa(struct sk_buff *skb, struct genl_info *info) } pn_len = secy->xpn ?MACSEC_XPN_PN_LEN :MACSEC_DEFAULT_PN_LEN ; -if (nla_len (tb_sa[MACSEC_SA_ATTR_PN ]) != pn_len) { +if (tb_sa[MACSEC_SA_ATTR_PN ] && +nla_len (tb_sa[MACSEC_SA_ATTR_PN ]) != pn_len) {pr_notice ("macsec: nl: add_rxsa: bad pn length: %d != %d\n" ,nla_len (tb_sa[MACSEC_SA_ATTR_PN ]), pn_len);rtnl_unlock ();
@@ -1767,7 +1769,7 @@ static int macsec_add_rxsa(struct sk_buff *skb, struct genl_info *info)if (nla_len (tb_sa[MACSEC_SA_ATTR_SALT ]) !=MACSEC_SALT_LEN ) {pr_notice ("macsec: nl: add_rxsa: bad salt length: %d != %d\n" ,nla_len (tb_sa[MACSEC_SA_ATTR_SALT ]), -MACSEC_SA_ATTR_SALT ); +MACSEC_SALT_LEN );rtnl_unlock ();return -EINVAL ; }
@@ -1840,7 +1842,7 @@ static int macsec_add_rxsa(struct sk_buff *skb, struct genl_info *info)return 0 ; cleanup: -kfree (rx_sa); +macsec_rxsa_put (rx_sa);rtnl_unlock ();return err; }
@@ -1937,7 +1939,7 @@ static bool validate_add_txsa(struct nlattr **attrs)if (nla_get_u8 (attrs[MACSEC_SA_ATTR_AN ]) >=MACSEC_NUM_AN )return false; -if (nla_get_u32 (attrs[MACSEC_SA_ATTR_PN ]) ==0 ) +if (nla_get_u64 (attrs[MACSEC_SA_ATTR_PN ]) ==0 )return false;if (attrs[MACSEC_SA_ATTR_ACTIVE ]) {
@@ -2009,7 +2011,7 @@ static int macsec_add_txsa(struct sk_buff *skb, struct genl_info *info)if (nla_len (tb_sa[MACSEC_SA_ATTR_SALT ]) !=MACSEC_SALT_LEN ) {pr_notice ("macsec: nl: add_txsa: bad salt length: %d != %d\n" ,nla_len (tb_sa[MACSEC_SA_ATTR_SALT ]), -MACSEC_SA_ATTR_SALT ); +MACSEC_SALT_LEN );rtnl_unlock ();return -EINVAL ; }
@@ -2083,7 +2085,7 @@ static int macsec_add_txsa(struct sk_buff *skb, struct genl_info *info) cleanup: secy->operational = was_operational; -kfree (tx_sa); +macsec_txsa_put (tx_sa);rtnl_unlock ();return err; }
@@ -2291,7 +2293,7 @@ static bool validate_upd_sa(struct nlattr **attrs)if (nla_get_u8 (attrs[MACSEC_SA_ATTR_AN ]) >=MACSEC_NUM_AN )return false; -if (attrs[MACSEC_SA_ATTR_PN ] &&nla_get_u32 (attrs[MACSEC_SA_ATTR_PN ]) ==0 ) +if (attrs[MACSEC_SA_ATTR_PN ] &&nla_get_u64 (attrs[MACSEC_SA_ATTR_PN ]) ==0 )return false;if (attrs[MACSEC_SA_ATTR_ACTIVE ]) {
@@ -3738,9 +3740,6 @@ static int macsec_changelink_common(struct net_device *dev, secy->operational = tx_sa && tx_sa->active; } -if (data[IFLA_MACSEC_WINDOW ]) - secy->replay_window =nla_get_u32 (data[IFLA_MACSEC_WINDOW ]); -if (data[IFLA_MACSEC_ENCRYPT ]) tx_sc->encrypt = !!nla_get_u8 (data[IFLA_MACSEC_ENCRYPT ]);
@@ -3786,6 +3785,16 @@ static int macsec_changelink_common(struct net_device *dev, } } +if (data[IFLA_MACSEC_WINDOW ]) { + secy->replay_window =nla_get_u32 (data[IFLA_MACSEC_WINDOW ]); + +/* IEEE 802.1AEbw-2013 10.7.8 - maximum replay window +* for XPN cipher suites */ +if (secy->xpn && + secy->replay_window >MACSEC_XPN_MAX_REPLAY_WINDOW ) +return -EINVAL ; + } +return 0 ; }
@@ -3815,7 +3824,7 @@ static int macsec_changelink(struct net_device *dev, struct nlattr *tb[], ret =macsec_changelink_common (dev, data);if (ret) -return ret; + goto cleanup;/* If h/w offloading is available, propagate to the device */ if (macsec_is_offloaded (macsec)) {
drivers/net/pcs/pcs-xpcs.c +1 -1
@@ -890,7 +890,7 @@ static int xpcs_get_state_c37_sgmii(struct dw_xpcs *xpcs,*/ ret =xpcs_read (xpcs,MDIO_MMD_VEND2 ,DW_VR_MII_AN_INTR_STS );if (ret <0 ) -return false; +return ret;if (ret &DW_VR_MII_C37_ANSGM_SP_LNKSTS ) {int speed_value;
drivers/net/sungem_phy.c +1 -0
@@ -454,6 +454,7 @@ static int bcm5421_init(struct mii_phy* phy)int can_low_power =1 ;if (np ==NULL ||of_get_property (np,"no-autolowpower" ,NULL )) can_low_power =0 ; +of_node_put (np);if (can_low_power) {/* Enable automatic low-power */ sungem_phy_write (phy,0x1c ,0x9002 );
drivers/net/virtio_net.c +34 -3
@@ -213,9 +213,15 @@ struct virtnet_info {/* Packet virtio header size */ u8 hdr_len; -/* Work struct for refilling if we run low on memory. */ +/* Work struct for delayed refilling if we run low on memory. */ struct delayed_work refill; +/* Is delayed refill enabled? */ +bool refill_enabled; + +/* The lock to synchronize the access to refill_enabled */ +spinlock_t refill_lock; +/* Work struct for config space updates */ struct work_struct config_work;
@@ -319,6 +325,20 @@ static struct page *get_a_page(struct receive_queue *rq, gfp_t gfp_mask)return p; } +static void enable_delayed_refill (struct virtnet_info *vi) +{ +spin_lock_bh (&vi->refill_lock); + vi->refill_enabled = true; +spin_unlock_bh (&vi->refill_lock); +} + +static void disable_delayed_refill (struct virtnet_info *vi) +{ +spin_lock_bh (&vi->refill_lock); + vi->refill_enabled = false; +spin_unlock_bh (&vi->refill_lock); +} +static void virtqueue_napi_schedule (struct napi_struct *napi,struct virtqueue *vq) {
@@ -1454,8 +1474,12 @@ static int virtnet_receive(struct receive_queue *rq, int budget, }if (rq->vq->num_free >min ((unsigned int )budget,virtqueue_get_vring_size (rq->vq)) /2 ) { -if (!try_fill_recv (vi, rq,GFP_ATOMIC )) -schedule_delayed_work (&vi->refill,0 ); +if (!try_fill_recv (vi, rq,GFP_ATOMIC )) { +spin_lock (&vi->refill_lock); +if (vi->refill_enabled) +schedule_delayed_work (&vi->refill,0 ); +spin_unlock (&vi->refill_lock); + } }u64_stats_update_begin (&rq->stats.syncp);
@@ -1578,6 +1602,8 @@ static int virtnet_open(struct net_device *dev)struct virtnet_info *vi =netdev_priv (dev);int i, err; +enable_delayed_refill (vi); +for (i =0 ; i < vi->max_queue_pairs; i++) {if (i < vi->curr_queue_pairs)/* Make sure we have some buffers: if oom use wq. */
@@ -1958,6 +1984,8 @@ static int virtnet_close(struct net_device *dev)struct virtnet_info *vi =netdev_priv (dev);int i; +/* Make sure NAPI doesn't schedule refill work */ +disable_delayed_refill (vi);/* Make sure refill_work doesn't re-enable napi! */ cancel_delayed_work_sync (&vi->refill);
@@ -2455,6 +2483,8 @@ static int virtnet_restore_up(struct virtio_device *vdev)virtio_device_ready (vdev); +enable_delayed_refill (vi); +if (netif_running (vi->dev)) { err =virtnet_open (vi->dev);if (err)
@@ -3162,6 +3192,7 @@ static int virtnet_probe(struct virtio_device *vdev) vdev->priv = vi;INIT_WORK (&vi->config_work, virtnet_config_changed_work); +spin_lock_init (&vi->refill_lock);/* If we can receive ANY GSO packets, we must allocate large ones. */ if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) ||
drivers/scsi/mpt3sas/mpt3sas_scsih.c +1 -0
@@ -11386,6 +11386,7 @@ scsih_shutdown(struct pci_dev *pdev)_scsih_ir_shutdown (ioc);_scsih_nvme_shutdown (ioc);mpt3sas_base_mask_interrupts (ioc); +mpt3sas_base_stop_watchdog (ioc); ioc->shost_recovery =1 ;mpt3sas_base_make_ioc_ready (ioc,SOFT_RESET ); ioc->shost_recovery =0 ;
drivers/scsi/scsi_ioctl.c +1 -1
@@ -457,7 +457,7 @@ static int sg_io(struct scsi_device *sdev, struct gendisk *disk, goto out_free_cdb; ret =0 ; -if (hdr->iovec_count) { +if (hdr->iovec_count && hdr->dxfer_len) {struct iov_iter i;struct iovec *iov =NULL ;
drivers/scsi/ufs/ufshcd-pltfrm.c +13 -2
@@ -107,9 +107,20 @@ static int ufshcd_parse_clock_info(struct ufs_hba *hba)return ret; } +static bool phandle_exists (const struct device_node *np, +const char *phandle_name,int index) +{ +struct device_node *parse_np =of_parse_phandle (np, phandle_name, index); + +if (parse_np) +of_node_put (parse_np); + +return parse_np !=NULL ; +} +#define MAX_PROP_SIZE 32static int ufshcd_populate_vreg (struct device *dev,const char *name, -struct ufs_vreg **out_vreg) +struct ufs_vreg **out_vreg) {char prop_name[MAX_PROP_SIZE ];struct ufs_vreg *vreg =NULL ;
@@ -121,7 +132,7 @@ static int ufshcd_populate_vreg(struct device *dev, const char *name, }snprintf (prop_name,MAX_PROP_SIZE ,"%s-supply" , name); -if (!of_parse_phandle (np, prop_name,0 )) { +if (!phandle_exists (np, prop_name,0 )) {dev_info (dev,"%s: Unable to find %s regulator, assuming enabled\n" , __func__, prop_name); goto out;
fs/ntfs/attrib.c +6 -2
@@ -592,8 +592,12 @@ static int ntfs_attr_find(const ATTR_TYPE type, const ntfschar *name, a = (ATTR_RECORD *)((u8 *)ctx->attr +le32_to_cpu (ctx->attr->length));for (;; a = (ATTR_RECORD *)((u8 *)a +le32_to_cpu (a->length))) { -if ((u8 *)a < (u8 *)ctx->mrec || (u8 *)a > (u8 *)ctx->mrec + -le32_to_cpu (ctx->mrec->bytes_allocated)) +u8 *mrec_end = (u8 *)ctx->mrec + +le32_to_cpu (ctx->mrec->bytes_allocated); +u8 *name_end = (u8 *)a +le16_to_cpu (a->name_offset) + + a->name_length *sizeof (ntfschar); +if ((u8 *)a < (u8 *)ctx->mrec || (u8 *)a > mrec_end || + name_end > mrec_end)break ; ctx->attr = a; if (unlikely(le32_to_cpu(a->type) > le32_to_cpu(type) ||
fs/ocfs2/ocfs2.h +1 -3
@@ -277,7 +277,6 @@ enum ocfs2_mount_optionsOCFS2_MOUNT_JOURNAL_ASYNC_COMMIT =1 <<15 ,/* Journal Async Commit */ OCFS2_MOUNT_ERRORS_CONT =1 <<16 ,/* Return EIO to the calling process on error */ OCFS2_MOUNT_ERRORS_ROFS = 1 << 17, /* Change filesystem to read-only on error */ - OCFS2_MOUNT_NOCLUSTER = 1 << 18, /* No cluster aware filesystem mount */ };#define OCFS2_OSB_SOFT_RO 0x0001
@@ -673,8 +672,7 @@ static inline int ocfs2_cluster_o2cb_global_heartbeat(struct ocfs2_super *osb)static inline int ocfs2_mount_local (struct ocfs2_super *osb) { -return ((osb->s_feature_incompat &OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT ) - || (osb->s_mount_opt &OCFS2_MOUNT_NOCLUSTER )); +return (osb->s_feature_incompat &OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT ); }static inline int ocfs2_uses_extended_slot_map (struct ocfs2_super *osb)
fs/ocfs2/slot_map.c +19 -27
65 lines not on this page · raw message
fs/ocfs2/super.c +0 -21
@@ -173,7 +173,6 @@ enum { Opt_dir_resv_level, Opt_journal_async_commit, Opt_err_cont, - Opt_nocluster, Opt_err, };
@@ -207,7 +206,6 @@ static const match_table_t tokens = { {Opt_dir_resv_level, "dir_resv_level=%u"}, {Opt_journal_async_commit, "journal_async_commit"}, {Opt_err_cont, "errors=continue"}, - {Opt_nocluster, "nocluster"}, {Opt_err, NULL} };
@@ -619,13 +617,6 @@ static int ocfs2_remount(struct super_block *sb, int *flags, char *data) goto out; } - tmp =OCFS2_MOUNT_NOCLUSTER ; -if ((osb->s_mount_opt & tmp) != (parsed_options.mount_opt & tmp)) { - ret = -EINVAL ; -mlog (ML_ERROR ,"Cannot change nocluster option on remount\n" ); - goto out; - } - tmp =OCFS2_MOUNT_HB_LOCAL |OCFS2_MOUNT_HB_GLOBAL |OCFS2_MOUNT_HB_NONE ;if ((osb->s_mount_opt & tmp) != (parsed_options.mount_opt & tmp)) {
@@ -866,7 +857,6 @@ static int ocfs2_verify_userspace_stack(struct ocfs2_super *osb, }if (ocfs2_userspace_stack (osb) && - !(osb->s_mount_opt &OCFS2_MOUNT_NOCLUSTER ) &&strncmp (osb->osb_cluster_stack, mopt->cluster_stack,OCFS2_STACK_LABEL_LEN )) { mlog(ML_ERROR,
@@ -1145,11 +1135,6 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) osb->s_mount_opt &OCFS2_MOUNT_DATA_WRITEBACK ?"writeback" : "ordered"); -if ((osb->s_mount_opt &OCFS2_MOUNT_NOCLUSTER ) && - !(osb->s_feature_incompat &OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT )) -printk (KERN_NOTICE "ocfs2: The shared device (%s) is mounted " -"without cluster aware mode.\n" , osb->dev_str); -atomic_set (&osb->vol_state,VOLUME_MOUNTED );wake_up (&osb->osb_mount_event);
@@ -1456,9 +1441,6 @@ static int ocfs2_parse_options(struct super_block *sb,case Opt_journal_async_commit: mopt->mount_opt |=OCFS2_MOUNT_JOURNAL_ASYNC_COMMIT ;break ; -case Opt_nocluster: - mopt->mount_opt |=OCFS2_MOUNT_NOCLUSTER ; -break ;default :mlog (ML_ERROR , "Unrecognized mount option \"%s\" "
@@ -1570,9 +1552,6 @@ static int ocfs2_show_options(struct seq_file *s, struct dentry *root)if (opts &OCFS2_MOUNT_JOURNAL_ASYNC_COMMIT )seq_printf (s,",journal_async_commit" ); -if (opts &OCFS2_MOUNT_NOCLUSTER ) -seq_printf (s,",nocluster" ); -return 0 ; }
fs/read_write.c +3 -0
@@ -1250,6 +1250,9 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, count, fl);file_end_write (out.file); }else { +if (out.file->f_flags &O_NONBLOCK ) + fl |=SPLICE_F_NONBLOCK ; + retval =splice_file_to_pipe (in.file, opipe, &pos, count, fl); }
include/asm-generic/io.h +0 -2
@@ -1125,9 +1125,7 @@ static inline void memcpy_toio(volatile void __iomem *addr, const void *buffer, }#endif -#ifndef CONFIG_GENERIC_DEVMEM_IS_ALLOWED extern int devmem_is_allowed (unsigned long pfn); -#endif #endif /* __KERNEL__ */
include/net/addrconf.h +3 -0
@@ -403,6 +403,9 @@ static inline bool ip6_ignore_linkdown(const struct net_device *dev) {const struct inet6_dev *idev =__in6_dev_get (dev); +if (unlikely (!idev)) +return true; +return !!idev->cnf.ignore_routes_with_linkdown; }
include/net/bluetooth/l2cap.h +1 -0
@@ -847,6 +847,7 @@ enum { };void l2cap_chan_hold (struct l2cap_chan *c); +struct l2cap_chan *l2cap_chan_hold_unless_zero (struct l2cap_chan *c);void l2cap_chan_put (struct l2cap_chan *c);static inline void l2cap_chan_lock (struct l2cap_chan *chan)
include/net/inet_connection_sock.h +1 -9
@@ -315,7 +315,7 @@ void inet_csk_update_fastreuse(struct inet_bind_bucket *tb,struct dst_entry *inet_csk_update_pmtu (struct sock *sk,u32 mtu); -#define TCP_PINGPONG_THRESH 3 +#define TCP_PINGPONG_THRESH 1static inline void inet_csk_enter_pingpong_mode (struct sock *sk) {
@@ -332,14 +332,6 @@ static inline bool inet_csk_in_pingpong_mode(struct sock *sk)return inet_csk (sk)->icsk_ack.pingpong >=TCP_PINGPONG_THRESH ; } -static inline void inet_csk_inc_pingpong_cnt (struct sock *sk) -{ -struct inet_connection_sock *icsk =inet_csk (sk); - -if (icsk->icsk_ack.pingpong <U8_MAX ) - icsk->icsk_ack.pingpong++; -} -static inline bool inet_csk_has_ulp (struct sock *sk) {return inet_sk (sk)->is_icsk && !!inet_csk (sk)->icsk_ulp_ops;
include/net/sock.h +4 -4
@@ -2765,18 +2765,18 @@ static inline int sk_get_wmem0(const struct sock *sk, const struct proto *proto) {/* Does this proto have per netns sysctl_wmem ? */ if (proto->sysctl_wmem_offset) -return *(int *)((void *)sock_net (sk) + proto->sysctl_wmem_offset); +return READ_ONCE (*(int *)((void *)sock_net (sk) + proto->sysctl_wmem_offset)); -return *proto->sysctl_wmem; +return READ_ONCE (*proto->sysctl_wmem); }static inline int sk_get_rmem0 (const struct sock *sk,const struct proto *proto) {/* Does this proto have per netns sysctl_rmem ? */ if (proto->sysctl_rmem_offset) -return *(int *)((void *)sock_net (sk) + proto->sysctl_rmem_offset); +return READ_ONCE (*(int *)((void *)sock_net (sk) + proto->sysctl_rmem_offset)); -return *proto->sysctl_rmem; +return READ_ONCE (*proto->sysctl_rmem); }/* Default TCP Small queue budget is ~1 ms of data (1sec >> 10)
include/net/tcp.h +1 -1
@@ -1406,7 +1406,7 @@ void tcp_select_initial_window(const struct sock *sk, int __space,static inline int tcp_win_from_space (const struct sock *sk,int space) { -int tcp_adv_win_scale =sock_net (sk)->ipv4.sysctl_tcp_adv_win_scale; +int tcp_adv_win_scale =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_adv_win_scale);return tcp_adv_win_scale <=0 ? (space>>(-tcp_adv_win_scale)) :
kernel/locking/rwsem.c +20 -10
@@ -335,8 +335,6 @@ struct rwsem_waiter {struct task_struct *task;enum rwsem_waiter_type type;unsigned long timeout; - -/* Writer only, not initialized in reader */ bool handoff_set; };#define rwsem_first_waiter (sem) \
@@ -456,10 +454,12 @@ static void rwsem_mark_wake(struct rw_semaphore *sem,* to give up the lock), request a HANDOFF to * force the issue. */ -if (!(oldcount &RWSEM_FLAG_HANDOFF ) && -time_after (jiffies, waiter->timeout)) { - adjustment -=RWSEM_FLAG_HANDOFF ; -lockevent_inc (rwsem_rlock_handoff); +if (time_after (jiffies, waiter->timeout)) { +if (!(oldcount &RWSEM_FLAG_HANDOFF )) { + adjustment -=RWSEM_FLAG_HANDOFF ; +lockevent_inc (rwsem_rlock_handoff); + } + waiter->handoff_set = true; }atomic_long_add (-adjustment, &sem->count);
@@ -569,7 +569,7 @@ static void rwsem_mark_wake(struct rw_semaphore *sem,static inline bool rwsem_try_write_lock (struct rw_semaphore *sem,struct rwsem_waiter *waiter) { -bool first =rwsem_first_waiter (sem) == waiter; +struct rwsem_waiter *first =rwsem_first_waiter (sem);long count, new;lockdep_assert_held (&sem->wait_lock);
@@ -579,11 +579,20 @@ static inline bool rwsem_try_write_lock(struct rw_semaphore *sem,bool has_handoff = !!(count &RWSEM_FLAG_HANDOFF );if (has_handoff) { -if (!first) +/* +* Honor handoff bit and yield only when the first +* waiter is the one that set it. Otherwisee, we +* still try to acquire the rwsem. +*/ +if (first->handoff_set && (waiter != first))return false; -/* First waiter inherits a previously set handoff bit */ - waiter->handoff_set = true; +/* +* First waiter can inherit a previously set handoff +* bit and spin on rwsem if lock acquisition fails. +*/ +if (waiter == first) + waiter->handoff_set = true; } new = count;
@@ -978,6 +987,7 @@ rwsem_down_read_slowpath(struct rw_semaphore *sem, long count, unsigned int stat waiter.task = current; waiter.type =RWSEM_WAITING_FOR_READ ; waiter.timeout = jiffies +RWSEM_WAIT_TIMEOUT ; + waiter.handoff_set = false;raw_spin_lock_irq (&sem->wait_lock);if (list_empty (&sem->wait_list)) {
kernel/watch_queue.c +36 -22
76 lines not on this page · raw message
mm/hmm.c +8 -11
@@ -212,14 +212,6 @@ int hmm_vma_handle_pmd(struct mm_walk *walk, unsigned long addr, unsigned long end, unsigned long hmm_pfns[], pmd_t pmd);#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ -static inline bool hmm_is_device_private_entry (struct hmm_range *range, -swp_entry_t entry) -{ -return is_device_private_entry (entry) && -pfn_swap_entry_to_page (entry)->pgmap->owner == - range->dev_private_owner; -} -static inline unsigned long pte_to_hmm_pfn_flags (struct hmm_range *range,pte_t pte) {
@@ -252,10 +244,12 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr,swp_entry_t entry =pte_to_swp_entry (pte);/* -* Never fault in device private pages, but just report -* the PFN even if not present. +* Don't fault in device private pages owned by the caller, +* just report the PFN. */ -if (hmm_is_device_private_entry (range, entry)) { +if (is_device_private_entry (entry) && +pfn_swap_entry_to_page (entry)->pgmap->owner == + range->dev_private_owner) { cpu_flags =HMM_PFN_VALID ;if (is_writable_device_private_entry (entry)) cpu_flags |=HMM_PFN_WRITE ;
@@ -273,6 +267,9 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr,if (!non_swap_entry (entry)) goto fault; +if (is_device_private_entry (entry)) + goto fault; +if (is_device_exclusive_entry (entry)) goto fault;
mm/hugetlb.c +1 -0
@@ -5314,6 +5314,7 @@ int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm, page =alloc_huge_page (dst_vma, dst_addr,0 );if (IS_ERR (page)) { +put_page (*pagep); ret = -ENOMEM ; *pagep =NULL ; goto out;
mm/memory.c +5 -2
@@ -4071,9 +4071,12 @@ vm_fault_t finish_fault(struct vm_fault *vmf) } } -/* See comment in handle_pte_fault() */ +/* +* See comment in handle_pte_fault() for how this scenario happens, we +* need to return NOPAGE so that we drop this page. +*/ if (pmd_devmap_trans_unstable (vmf->pmd)) -return 0 ; +return VM_FAULT_NOPAGE ; vmf->pte =pte_offset_map_lock (vma->vm_mm, vmf->pmd, vmf->address, &vmf->ptl);
mm/page_alloc.c +8 -4
@@ -3928,11 +3928,15 @@ static inline bool zone_watermark_fast(struct zone *z, unsigned int order,* need to be calculated. */ if (!order) { -long fast_free; +long usable_free; +long reserved; - fast_free = free_pages; - fast_free -=__zone_watermark_unusable_free (z,0 , alloc_flags); -if (fast_free > mark + z->lowmem_reserve[highest_zoneidx]) + usable_free = free_pages; + reserved =__zone_watermark_unusable_free (z,0 , alloc_flags); + +/* reserved may over estimate high-atomic reserves. */ + usable_free -=min (usable_free, reserved); +if (usable_free > mark + z->lowmem_reserve[highest_zoneidx])return true; }
mm/secretmem.c +26 -7
@@ -55,22 +55,28 @@ static vm_fault_t secretmem_fault(struct vm_fault *vmf)gfp_t gfp = vmf->gfp_mask;unsigned long addr;struct page *page; +vm_fault_t ret;int err;if (((loff_t )vmf->pgoff <<PAGE_SHIFT ) >=i_size_read (inode))return vmf_error (-EINVAL ); +filemap_invalidate_lock_shared (mapping); + retry: page =find_lock_page (mapping, offset);if (!page) { page =alloc_page (gfp | __GFP_ZERO); -if (!page) -return VM_FAULT_OOM ; +if (!page) { + ret =VM_FAULT_OOM ; + goto out; + } err =set_direct_map_invalid_noflush (page);if (err) {put_page (page); -return vmf_error (err); + ret =vmf_error (err); + goto out; }__SetPageUptodate (page);
@@ -86,7 +92,8 @@ static vm_fault_t secretmem_fault(struct vm_fault *vmf)if (err == -EEXIST ) goto retry; -return vmf_error (err); + ret =vmf_error (err); + goto out; } addr = (unsigned long )page_address (page);
@@ -94,7 +101,11 @@ static vm_fault_t secretmem_fault(struct vm_fault *vmf) } vmf->page = page; -return VM_FAULT_LOCKED ; + ret =VM_FAULT_LOCKED ; + +out: +filemap_invalidate_unlock_shared (mapping); +return ret; }static const struct vm_operations_struct secretmem_vm_ops = {
@@ -162,12 +173,20 @@ static int secretmem_setattr(struct user_namespace *mnt_userns, struct dentry *dentry, struct iattr *iattr) { struct inode *inode = d_inode(dentry); +struct address_space *mapping = inode->i_mapping;unsigned int ia_valid = iattr->ia_valid; +int ret; + +filemap_invalidate_lock (mapping);if ((ia_valid &ATTR_SIZE ) && inode->i_size) -return -EINVAL ; + ret = -EINVAL ; +else + ret =simple_setattr (mnt_userns, dentry, iattr); -return simple_setattr (mnt_userns, dentry, iattr); +filemap_invalidate_unlock (mapping); + +return ret; } static const struct inode_operations secretmem_iops = {
net/bluetooth/l2cap_core.c +48 -13
180 lines not on this page · raw message
net/decnet/af_decnet.c +2 -2
@@ -480,8 +480,8 @@ static struct sock *dn_alloc_sock(struct net *net, struct socket *sock, gfp_t gf sk->sk_family = PF_DECnet; sk->sk_protocol =0 ; sk->sk_allocation = gfp; - sk->sk_sndbuf = sysctl_decnet_wmem[1 ]; - sk->sk_rcvbuf = sysctl_decnet_rmem[1 ]; + sk->sk_sndbuf =READ_ONCE (sysctl_decnet_wmem[1 ]); + sk->sk_rcvbuf =READ_ONCE (sysctl_decnet_rmem[1 ]);/* Initialization of DECnet Session Control Port */ scp =DN_SK (sk);
net/ipv4/fib_trie.c +5 -2
@@ -1037,6 +1037,7 @@ fib_find_matching_alias(struct net *net, const struct fib_rt_info *fri)void fib_alias_hw_flags_set (struct net *net,const struct fib_rt_info *fri) { +u8 fib_notify_on_flag_change;struct fib_alias *fa_match;struct sk_buff *skb;int err;
@@ -1058,14 +1059,16 @@ void fib_alias_hw_flags_set(struct net *net, const struct fib_rt_info *fri)WRITE_ONCE (fa_match->offload, fri->offload);WRITE_ONCE (fa_match->trap, fri->trap); + fib_notify_on_flag_change =READ_ONCE (net->ipv4.sysctl_fib_notify_on_flag_change); +/* 2 means send notifications only if offload_failed was changed. */ -if (net->ipv4.sysctl_fib_notify_on_flag_change ==2 && +if (fib_notify_on_flag_change ==2 &&READ_ONCE (fa_match->offload_failed) == fri->offload_failed) goto out;WRITE_ONCE (fa_match->offload_failed, fri->offload_failed); -if (!net->ipv4.sysctl_fib_notify_on_flag_change) +if (!fib_notify_on_flag_change) goto out; skb =nlmsg_new (fib_nlmsg_size (fa_match->fa_info),GFP_ATOMIC );
net/ipv4/igmp.c +13 -11
@@ -827,7 +827,7 @@ static void igmp_ifc_event(struct in_device *in_dev)struct net *net =dev_net (in_dev->dev);if (IGMP_V1_SEEN (in_dev) ||IGMP_V2_SEEN (in_dev))return ; -WRITE_ONCE (in_dev->mr_ifc_count, in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv); +WRITE_ONCE (in_dev->mr_ifc_count, in_dev->mr_qrv ?:READ_ONCE (net->ipv4.sysctl_igmp_qrv));igmp_ifc_start_timer (in_dev,1 ); }
@@ -1009,7 +1009,7 @@ static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,* received value was zero, use the default or statically * configured value. */ - in_dev->mr_qrv = ih3->qrv ?: net->ipv4.sysctl_igmp_qrv; + in_dev->mr_qrv = ih3->qrv ?:READ_ONCE (net->ipv4.sysctl_igmp_qrv); in_dev->mr_qi =IGMPV3_QQIC (ih3->qqic)*HZ ?:IGMP_QUERY_INTERVAL ;/* RFC3376, 8.3. Query Response Interval:
@@ -1189,7 +1189,7 @@ static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im, pmc->interface = im->interface;in_dev_hold (in_dev); pmc->multiaddr = im->multiaddr; - pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; + pmc->crcount = in_dev->mr_qrv ?:READ_ONCE (net->ipv4.sysctl_igmp_qrv); pmc->sfmode = im->sfmode;if (pmc->sfmode ==MCAST_INCLUDE ) {struct ip_sf_list *psf;
@@ -1240,9 +1240,11 @@ static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im)swap (im->tomb, pmc->tomb);swap (im->sources, pmc->sources);for (psf = im->sources; psf; psf = psf->sf_next) - psf->sf_crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; + psf->sf_crcount = in_dev->mr_qrv ?: +READ_ONCE (net->ipv4.sysctl_igmp_qrv); }else { - im->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; + im->crcount = in_dev->mr_qrv ?: +READ_ONCE (net->ipv4.sysctl_igmp_qrv); }in_dev_put (pmc->interface);kfree_pmc (pmc);
@@ -1349,7 +1351,7 @@ static void igmp_group_added(struct ip_mc_list *im)if (in_dev->dead)return ; - im->unsolicit_count = net->ipv4.sysctl_igmp_qrv; + im->unsolicit_count =READ_ONCE (net->ipv4.sysctl_igmp_qrv);if (IGMP_V1_SEEN (in_dev) ||IGMP_V2_SEEN (in_dev)) {spin_lock_bh (&im->lock);igmp_start_timer (im,IGMP_INITIAL_REPORT_DELAY );
@@ -1363,7 +1365,7 @@ static void igmp_group_added(struct ip_mc_list *im)* IN() to IN(A). */ if (im->sfmode ==MCAST_EXCLUDE ) - im->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; + im->crcount = in_dev->mr_qrv ?:READ_ONCE (net->ipv4.sysctl_igmp_qrv);igmp_ifc_event (in_dev);#endif
@@ -1754,7 +1756,7 @@ static void ip_mc_reset(struct in_device *in_dev) in_dev->mr_qi =IGMP_QUERY_INTERVAL ; in_dev->mr_qri =IGMP_QUERY_RESPONSE_INTERVAL ; - in_dev->mr_qrv = net->ipv4.sysctl_igmp_qrv; + in_dev->mr_qrv = READ_ONCE(net->ipv4.sysctl_igmp_qrv); }#else static void ip_mc_reset (struct in_device *in_dev)
@@ -1888,7 +1890,7 @@ static int ip_mc_del1_src(struct ip_mc_list *pmc, int sfmode,#ifdef CONFIG_IP_MULTICAST if (psf->sf_oldin && !IGMP_V1_SEEN (in_dev) && !IGMP_V2_SEEN (in_dev)) { - psf->sf_crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; + psf->sf_crcount = in_dev->mr_qrv ?:READ_ONCE (net->ipv4.sysctl_igmp_qrv); psf->sf_next = pmc->tomb; pmc->tomb = psf; rv =1 ;
@@ -1952,7 +1954,7 @@ static int ip_mc_del_src(struct in_device *in_dev, __be32 *pmca, int sfmode,/* filter mode change */ pmc->sfmode =MCAST_INCLUDE ;#ifdef CONFIG_IP_MULTICAST - pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; + pmc->crcount = in_dev->mr_qrv ?:READ_ONCE (net->ipv4.sysctl_igmp_qrv);WRITE_ONCE (in_dev->mr_ifc_count, pmc->crcount);for (psf = pmc->sources; psf; psf = psf->sf_next) psf->sf_crcount =0 ;
@@ -2131,7 +2133,7 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,#ifdef CONFIG_IP_MULTICAST /* else no filters; keep old mode for reports */ - pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; + pmc->crcount = in_dev->mr_qrv ?:READ_ONCE (net->ipv4.sysctl_igmp_qrv);WRITE_ONCE (in_dev->mr_ifc_count, pmc->crcount);for (psf = pmc->sources; psf; psf = psf->sf_next) psf->sf_crcount =0 ;
net/ipv4/tcp.c +4 -4
@@ -458,8 +458,8 @@ void tcp_init_sock(struct sock *sk) icsk->icsk_sync_mss = tcp_sync_mss; -WRITE_ONCE (sk->sk_sndbuf,sock_net (sk)->ipv4.sysctl_tcp_wmem[1 ]); -WRITE_ONCE (sk->sk_rcvbuf,sock_net (sk)->ipv4.sysctl_tcp_rmem[1 ]); +WRITE_ONCE (sk->sk_sndbuf,READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_wmem[1 ])); +WRITE_ONCE (sk->sk_rcvbuf,READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_rmem[1 ]));sk_sockets_allocated_inc (sk); sk->sk_route_forced_caps =NETIF_F_GSO ;
@@ -694,7 +694,7 @@ static bool tcp_should_autocork(struct sock *sk, struct sk_buff *skb, int size_goal) {return skb->len < size_goal && -sock_net (sk)->ipv4.sysctl_tcp_autocorking && +READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_autocorking) && !tcp_rtx_queue_empty (sk) &&refcount_read (&sk->sk_wmem_alloc) > skb->truesize; }
@@ -1722,7 +1722,7 @@ int tcp_set_rcvlowat(struct sock *sk, int val)if (sk->sk_userlocks &SOCK_RCVBUF_LOCK ) cap = sk->sk_rcvbuf >>1 ;else - cap =sock_net (sk)->ipv4.sysctl_tcp_rmem[2 ] >>1 ; + cap =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_rmem[2 ]) >>1 ; val =min (val, cap);WRITE_ONCE (sk->sk_rcvlowat, val ? :1 );
net/ipv4/tcp_input.c +22 -19
142 lines not on this page · raw message
net/ipv4/tcp_ipv4.c +2 -2
@@ -1004,7 +1004,7 @@ static int tcp_v4_send_synack(const struct sock *sk, struct dst_entry *dst,if (skb) {__tcp_v4_send_check (skb, ireq->ir_loc_addr, ireq->ir_rmt_addr); - tos =sock_net (sk)->ipv4.sysctl_tcp_reflect_tos ? + tos =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_reflect_tos) ? (tcp_rsk (req)->syn_tos & ~INET_ECN_MASK ) | (inet_sk (sk)->tos &INET_ECN_MASK ) :inet_sk (sk)->tos;
@@ -1590,7 +1590,7 @@ struct sock *tcp_v4_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,/* Set ToS of the new socket based upon the value of incoming SYN. * ECT bits are set later in tcp_init_transfer(). */ -if (sock_net (sk)->ipv4.sysctl_tcp_reflect_tos) +if (READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_reflect_tos)) newinet->tos =tcp_rsk (req)->syn_tos & ~INET_ECN_MASK ;if (!dst) {
net/ipv4/tcp_metrics.c +5 -5
@@ -329,7 +329,7 @@ void tcp_update_metrics(struct sock *sk)int m;sk_dst_confirm (sk); -if (net->ipv4.sysctl_tcp_nometrics_save || !dst) +if (READ_ONCE (net->ipv4.sysctl_tcp_nometrics_save) || !dst)return ;rcu_read_lock ();
@@ -385,7 +385,7 @@ void tcp_update_metrics(struct sock *sk)if (tcp_in_initial_slowstart (tp)) {/* Slow start still did not finish. */ -if (!net->ipv4.sysctl_tcp_no_ssthresh_metrics_save && +if (!READ_ONCE (net->ipv4.sysctl_tcp_no_ssthresh_metrics_save) && !tcp_metric_locked (tm,TCP_METRIC_SSTHRESH )) { val =tcp_metric_get (tm,TCP_METRIC_SSTHRESH );if (val && (tcp_snd_cwnd (tp) >>1 ) > val)
@@ -401,7 +401,7 @@ void tcp_update_metrics(struct sock *sk) }else if (!tcp_in_slow_start (tp) && icsk->icsk_ca_state == TCP_CA_Open) {/* Cong. avoidance phase, cwnd is reliable. */ -if (!net->ipv4.sysctl_tcp_no_ssthresh_metrics_save && +if (!READ_ONCE (net->ipv4.sysctl_tcp_no_ssthresh_metrics_save) && !tcp_metric_locked (tm,TCP_METRIC_SSTHRESH ))tcp_metric_set (tm,TCP_METRIC_SSTHRESH ,max (tcp_snd_cwnd (tp) >>1 , tp->snd_ssthresh));
@@ -418,7 +418,7 @@ void tcp_update_metrics(struct sock *sk)tcp_metric_set (tm,TCP_METRIC_CWND , (val + tp->snd_ssthresh) >>1 ); } -if (!net->ipv4.sysctl_tcp_no_ssthresh_metrics_save && +if (!READ_ONCE (net->ipv4.sysctl_tcp_no_ssthresh_metrics_save) && !tcp_metric_locked (tm,TCP_METRIC_SSTHRESH )) { val =tcp_metric_get (tm,TCP_METRIC_SSTHRESH );if (val && tp->snd_ssthresh > val)
@@ -463,7 +463,7 @@ void tcp_init_metrics(struct sock *sk)if (tcp_metric_locked (tm,TCP_METRIC_CWND )) tp->snd_cwnd_clamp =tcp_metric_get (tm,TCP_METRIC_CWND ); - val = net->ipv4.sysctl_tcp_no_ssthresh_metrics_save ? + val =READ_ONCE (net->ipv4.sysctl_tcp_no_ssthresh_metrics_save) ?0 :tcp_metric_get (tm,TCP_METRIC_SSTHRESH );if (val) { tp->snd_ssthresh = val;
net/ipv4/tcp_output.c +9 -12
@@ -167,16 +167,13 @@ static void tcp_event_data_sent(struct tcp_sock *tp,if (tcp_packets_in_flight (tp) ==0 )tcp_ca_event (sk,CA_EVENT_TX_START ); -/* If this is the first data packet sent in response to the -* previous received data, -* and it is a reply for ato after last received packet, -* increase pingpong count. -*/ -if (before (tp->lsndtime, icsk->icsk_ack.lrcvtime) && - (u32)(now - icsk->icsk_ack.lrcvtime) < icsk->icsk_ack.ato) -inet_csk_inc_pingpong_cnt (sk); - tp->lsndtime = now; + +/* If it is a reply for ato after last received +* packet, enter pingpong mode. +*/ +if ((u32)(now - icsk->icsk_ack.lrcvtime) < icsk->icsk_ack.ato) +inet_csk_enter_pingpong_mode (sk); }/* Account for an ACK we sent. */
@@ -241,7 +238,7 @@ void tcp_select_initial_window(const struct sock *sk, int __space, __u32 mss, *rcv_wscale =0 ;if (wscale_ok) {/* Set window scaling on max possible window */ - space =max_t (u32, space,sock_net (sk)->ipv4.sysctl_tcp_rmem[2 ]); + space =max_t (u32, space,READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_rmem[2 ])); space =max_t (u32, space, sysctl_rmem_max); space =min_t (u32, space, *window_clamp); *rcv_wscale = clamp_t(int, ilog2(space) - 15,
@@ -1989,7 +1986,7 @@ static u32 tcp_tso_segs(struct sock *sk, unsigned int mss_now) min_tso = ca_ops->min_tso_segs ? ca_ops->min_tso_segs (sk) : -sock_net (sk)->ipv4.sysctl_tcp_min_tso_segs; +READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_min_tso_segs); tso_segs =tcp_tso_autosize (sk, mss_now, min_tso);return min_t (u32, tso_segs, sk->sk_gso_max_segs);
@@ -2506,7 +2503,7 @@ static bool tcp_small_queue_check(struct sock *sk, const struct sk_buff *skb, sk->sk_pacing_rate >> READ_ONCE(sk->sk_pacing_shift));if (sk->sk_pacing_status ==SK_PACING_NONE ) limit = min_t(unsigned long, limit, -sock_net (sk)->ipv4.sysctl_tcp_limit_output_bytes); +READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_limit_output_bytes)); limit <<= factor; if (static_branch_unlikely(&tcp_tx_delay_enabled) &&
net/ipv6/mcast.c +8 -6
@@ -1522,7 +1522,6 @@ static void mld_query_work(struct work_struct *work)if (++cnt >=MLD_MAX_QUEUE ) { rework = true; -schedule_delayed_work (&idev->mc_query_work,0 );break ; } }
@@ -1533,8 +1532,10 @@ static void mld_query_work(struct work_struct *work)__mld_query_work (skb);mutex_unlock (&idev->mc_lock); -if (!rework) -in6_dev_put (idev); +if (rework &&queue_delayed_work (mld_wq, &idev->mc_query_work,0 )) +return ; + +in6_dev_put (idev); }/* called with rcu_read_lock() */
@@ -1624,7 +1625,6 @@ static void mld_report_work(struct work_struct *work)if (++cnt >=MLD_MAX_QUEUE ) { rework = true; -schedule_delayed_work (&idev->mc_report_work,0 );break ; } }
@@ -1635,8 +1635,10 @@ static void mld_report_work(struct work_struct *work)__mld_report_work (skb);mutex_unlock (&idev->mc_lock); -if (!rework) -in6_dev_put (idev); +if (rework &&queue_delayed_work (mld_wq, &idev->mc_report_work,0 )) +return ; + +in6_dev_put (idev); } static bool is_in(struct ifmcaddr6 *pmc, struct ip6_sf_list *psf, int type,
net/ipv6/ping.c +6 -0
@@ -22,6 +22,11 @@#include <linux/proc_fs.h> #include <net/ping.h> +static void ping_v6_destroy (struct sock *sk) +{ +inet6_destroy_sock (sk); +} +/* Compatibility glue so we can support IPv6 when it's compiled as a module */ static int dummy_ipv6_recv_error (struct sock *sk,struct msghdr *msg,int len,int *addr_len)
@@ -166,6 +171,7 @@ struct proto pingv6_prot = { .owner = THIS_MODULE, .init = ping_init_sock, .close = ping_close, + .destroy = ping_v6_destroy, .connect = ip6_datagram_connect_v6_only, .disconnect = __udp_disconnect, .setsockopt = ipv6_setsockopt,
net/ipv6/tcp_ipv6.c +2 -2
@@ -542,7 +542,7 @@ static int tcp_v6_send_synack(const struct sock *sk, struct dst_entry *dst,if (np->repflow && ireq->pktopts) fl6->flowlabel =ip6_flowlabel (ipv6_hdr (ireq->pktopts)); - tclass =sock_net (sk)->ipv4.sysctl_tcp_reflect_tos ? + tclass =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_reflect_tos) ? (tcp_rsk (req)->syn_tos & ~INET_ECN_MASK ) | (np->tclass &INET_ECN_MASK ) : np->tclass;
@@ -1364,7 +1364,7 @@ static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff */* Set ToS of the new socket based upon the value of incoming SYN. * ECT bits are set later in tcp_init_transfer(). */ -if (sock_net (sk)->ipv4.sysctl_tcp_reflect_tos) +if (READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_reflect_tos)) newnp->tclass =tcp_rsk (req)->syn_tos & ~INET_ECN_MASK ;/* Clone native IPv6 options from listening socket (if any)
net/mptcp/protocol.c +4 -4
@@ -1881,7 +1881,7 @@ static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied)if (msk->rcvq_space.copied <= msk->rcvq_space.space) goto new_measure; -if (sock_net (sk)->ipv4.sysctl_tcp_moderate_rcvbuf && +if (READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_moderate_rcvbuf) && !(sk->sk_userlocks &SOCK_RCVBUF_LOCK )) {int rcvmem, rcvbuf;u64 rcvwin, grow;
@@ -1899,7 +1899,7 @@ static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied)do_div (rcvwin, advmss); rcvbuf =min_t (u64, rcvwin * rcvmem, -sock_net (sk)->ipv4.sysctl_tcp_rmem[2 ]); +READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_rmem[2 ]));if (rcvbuf > sk->sk_rcvbuf) {u32 window_clamp;
@@ -2532,8 +2532,8 @@ static int mptcp_init_sock(struct sock *sk) icsk->icsk_ca_ops =NULL ;sk_sockets_allocated_inc (sk); - sk->sk_rcvbuf =sock_net (sk)->ipv4.sysctl_tcp_rmem[1 ]; - sk->sk_sndbuf =sock_net (sk)->ipv4.sysctl_tcp_wmem[1 ]; + sk->sk_rcvbuf =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_rmem[1 ]); + sk->sk_sndbuf =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_wmem[1 ]);return 0 ; }
net/netfilter/nfnetlink_queue.c +6 -1
@@ -836,11 +836,16 @@ nfqnl_enqueue_packet(struct nf_queue_entry *entry, unsigned int queuenum) }static int -nfqnl_mangle (void *data,int data_len,struct nf_queue_entry *e,int diff) +nfqnl_mangle (void *data,unsigned int data_len,struct nf_queue_entry *e,int diff) {struct sk_buff *nskb;if (diff <0 ) { +unsigned int min_len =skb_transport_offset (e->skb); + +if (data_len < min_len) +return -EINVAL ; +if (pskb_trim (e->skb, data_len))return -ENOMEM ; }else if (diff >0 ) {
net/sctp/associola.c +2 -3
@@ -229,9 +229,8 @@ static struct sctp_association *sctp_association_init(if (!sctp_ulpq_init (&asoc->ulpq, asoc)) goto fail_init; -if (sctp_stream_init (&asoc->stream, asoc->c.sinit_num_ostreams, -0 , gfp)) - goto fail_init; +if (sctp_stream_init (&asoc->stream, asoc->c.sinit_num_ostreams,0 , gfp)) + goto stream_free;/* Initialize default path MTU. */ asoc->pathmtu = sp->pathmtu;
net/sctp/stream.c +3 -16
@@ -137,7 +137,7 @@ int sctp_stream_init(struct sctp_stream *stream, __u16 outcnt, __u16 incnt, ret =sctp_stream_alloc_out (stream, outcnt, gfp);if (ret) - goto out_err; +return ret;for (i =0 ; i < stream->outcnt; i++)SCTP_SO (stream, i)->state =SCTP_STREAM_OPEN ;
@@ -145,22 +145,9 @@ int sctp_stream_init(struct sctp_stream *stream, __u16 outcnt, __u16 incnt, handle_in:sctp_stream_interleave_init (stream);if (!incnt) - goto out; - - ret =sctp_stream_alloc_in (stream, incnt, gfp); -if (ret) - goto in_err; - - goto out; +return 0 ; -in_err: - sched->free (stream); -genradix_free (&stream->in); -out_err: -genradix_free (&stream->out); - stream->outcnt =0 ; -out: -return ret; +return sctp_stream_alloc_in (stream, incnt, gfp); }int sctp_stream_init_ext (struct sctp_stream *stream,__u16 sid)
net/sctp/stream_sched.c +1 -1
@@ -163,7 +163,7 @@ int sctp_sched_set_sched(struct sctp_association *asoc,if (!SCTP_SO (&asoc->stream, i)->ext)continue ; - ret = n->init_sid (&asoc->stream, i,GFP_KERNEL ); + ret = n->init_sid (&asoc->stream, i,GFP_ATOMIC );if (ret) goto err; }
net/tipc/socket.c +1 -1
@@ -517,7 +517,7 @@ static int tipc_sk_create(struct net *net, struct socket *sock,timer_setup (&sk->sk_timer, tipc_sk_timeout,0 ); sk->sk_shutdown =0 ; sk->sk_backlog_rcv = tipc_sk_backlog_rcv; - sk->sk_rcvbuf = sysctl_tipc_rmem[1 ]; + sk->sk_rcvbuf =READ_ONCE (sysctl_tipc_rmem[1 ]); sk->sk_data_ready = tipc_data_ready; sk->sk_write_space = tipc_write_space; sk->sk_destruct = tipc_sock_destruct;
net/tls/tls_device.c +6 -1
@@ -1351,8 +1351,13 @@ static int tls_device_down(struct net_device *netdev)* by tls_device_free_ctx. rx_conf and tx_conf stay in TLS_HW. * Now release the ref taken above. */ -if (refcount_dec_and_test (&ctx->refcount)) +if (refcount_dec_and_test (&ctx->refcount)) { +/* sk_destruct ran after tls_device_down took a ref, and +* it returned early. Complete the destruction here. +*/ +list_del (&ctx->list);tls_device_free_ctx (ctx); + } }up_write (&device_offload_lock);
tools/perf/util/symbol-elf.c +41 -4
64 lines not on this page · raw message