Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from David Miller:
"I was battling a cold after some recent trips, so quite a bit piled up
meanwhile, sorry about that.
Highlights:
1) Fix fd leak in various bpf selftests, from Brian Vazquez.
2) Fix crash in xsk when device doesn't support some methods, from
Magnus Karlsson.
3) Fix various leaks and use-after-free in rxrpc, from David Howells.
4) Fix several SKB leaks due to confusion of who owns an SKB and who
should release it in the llc code. From Eric Biggers.
5) Kill a bunc of KCSAN warnings in TCP, from Eric Dumazet.
6) Jumbo packets don't work after resume on r8169, as the BIOS resets
the chip into non-jumbo mode during suspend. From Heiner Kallweit.
7) Corrupt L2 header during MPLS push, from Davide Caratti.
8) Prevent possible infinite loop in tc_ctl_action, from Eric
Dumazet.
9) Get register bits right in bcmgenet driver, based upon chip
version. From Florian Fainelli.
10) Fix mutex problems in microchip DSA driver, from Marek Vasut.
11) Cure race between route lookup and invalidation in ipv4, from Wei
Wang.
12) Fix performance regression due to false sharing in 'net'
structure, from Eric Dumazet"
* git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (145 commits)
net: reorder 'struct net' fields to avoid false sharing
net: dsa: fix switch tree list
net: ethernet: dwmac-sun8i: show message only when switching to promisc
net: aquantia: add an error handling in aq_nic_set_multicast_list
net: netem: correct the parent's backlog when corrupted packet was dropped
net: netem: fix error path for corrupted GSO frames
macb: propagate errors when getting optional clocks
xen/netback: fix error path of xenvif_connect_data()
net: hns3: fix mis-counting IRQ vector numbers issue
net: usb: lan78xx: Connect PHY before registering MAC
vsock/virtio: discard packets if credit is not respected
vsock/virtio: send a credit update when buffer size is changed
mlxsw: spectrum_trap: Push Ethernet header before reporting trap
net: ensure correct skb->tstamp in various fragmenters
net: bcmgenet: reset 40nm EPHY on energy detect
net: bcmgenet: soft reset 40nm EPHYs before MAC init
net: phy: bcm7xxx: define soft_reset for 40nm EPHY
net: bcmgenet: don't set phydev->link from MAC
net: Update address for MediaTek ethernet driver in MAINTAINERS
ipv4: fix race condition between route lookup and invalidation
...
This commit is contained in:
commit
531e93d114
179 changed files with 1487 additions and 893 deletions
|
|
@ -31,7 +31,7 @@
|
|||
#define PHY_ID_KSZ886X 0x00221430
|
||||
#define PHY_ID_KSZ8863 0x00221435
|
||||
|
||||
#define PHY_ID_KSZ8795 0x00221550
|
||||
#define PHY_ID_KSZ87XX 0x00221550
|
||||
|
||||
#define PHY_ID_KSZ9477 0x00221631
|
||||
|
||||
|
|
|
|||
|
|
@ -3510,8 +3510,9 @@ int skb_ensure_writable(struct sk_buff *skb, int write_len);
|
|||
int __skb_vlan_pop(struct sk_buff *skb, u16 *vlan_tci);
|
||||
int skb_vlan_pop(struct sk_buff *skb);
|
||||
int skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci);
|
||||
int skb_mpls_push(struct sk_buff *skb, __be32 mpls_lse, __be16 mpls_proto);
|
||||
int skb_mpls_pop(struct sk_buff *skb, __be16 next_proto);
|
||||
int skb_mpls_push(struct sk_buff *skb, __be32 mpls_lse, __be16 mpls_proto,
|
||||
int mac_len);
|
||||
int skb_mpls_pop(struct sk_buff *skb, __be16 next_proto, int mac_len);
|
||||
int skb_mpls_update_lse(struct sk_buff *skb, __be32 mpls_lse);
|
||||
int skb_mpls_dec_ttl(struct sk_buff *skb);
|
||||
struct sk_buff *pskb_extract(struct sk_buff *skb, int off, int to_copy,
|
||||
|
|
|
|||
|
|
@ -393,7 +393,7 @@ struct tcp_sock {
|
|||
/* fastopen_rsk points to request_sock that resulted in this big
|
||||
* socket. Used to retransmit SYNACKs etc.
|
||||
*/
|
||||
struct request_sock *fastopen_rsk;
|
||||
struct request_sock __rcu *fastopen_rsk;
|
||||
u32 *saved_syn;
|
||||
};
|
||||
|
||||
|
|
@ -447,8 +447,8 @@ static inline struct tcp_timewait_sock *tcp_twsk(const struct sock *sk)
|
|||
|
||||
static inline bool tcp_passive_fastopen(const struct sock *sk)
|
||||
{
|
||||
return (sk->sk_state == TCP_SYN_RECV &&
|
||||
tcp_sk(sk)->fastopen_rsk != NULL);
|
||||
return sk->sk_state == TCP_SYN_RECV &&
|
||||
rcu_access_pointer(tcp_sk(sk)->fastopen_rsk) != NULL;
|
||||
}
|
||||
|
||||
static inline void fastopen_queue_tune(struct sock *sk, int backlog)
|
||||
|
|
|
|||
|
|
@ -5549,6 +5549,14 @@ const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy,
|
|||
*/
|
||||
const char *reg_initiator_name(enum nl80211_reg_initiator initiator);
|
||||
|
||||
/**
|
||||
* regulatory_pre_cac_allowed - check if pre-CAC allowed in the current regdom
|
||||
* @wiphy: wiphy for which pre-CAC capability is checked.
|
||||
*
|
||||
* Pre-CAC is allowed only in some regdomains (notable ETSI).
|
||||
*/
|
||||
bool regulatory_pre_cac_allowed(struct wiphy *wiphy);
|
||||
|
||||
/**
|
||||
* DOC: Internal regulatory db functions
|
||||
*
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ void llc_sk_reset(struct sock *sk);
|
|||
|
||||
/* Access to a connection */
|
||||
int llc_conn_state_process(struct sock *sk, struct sk_buff *skb);
|
||||
int llc_conn_send_pdu(struct sock *sk, struct sk_buff *skb);
|
||||
void llc_conn_send_pdu(struct sock *sk, struct sk_buff *skb);
|
||||
void llc_conn_rtn_pdu(struct sock *sk, struct sk_buff *skb);
|
||||
void llc_conn_resend_i_pdu_as_cmd(struct sock *sk, u8 nr, u8 first_p_bit);
|
||||
void llc_conn_resend_i_pdu_as_rsp(struct sock *sk, u8 nr, u8 first_f_bit);
|
||||
|
|
|
|||
|
|
@ -52,6 +52,9 @@ struct bpf_prog;
|
|||
#define NETDEV_HASHENTRIES (1 << NETDEV_HASHBITS)
|
||||
|
||||
struct net {
|
||||
/* First cache line can be often dirtied.
|
||||
* Do not place here read-mostly fields.
|
||||
*/
|
||||
refcount_t passive; /* To decide when the network
|
||||
* namespace should be freed.
|
||||
*/
|
||||
|
|
@ -60,7 +63,13 @@ struct net {
|
|||
*/
|
||||
spinlock_t rules_mod_lock;
|
||||
|
||||
u32 hash_mix;
|
||||
unsigned int dev_unreg_count;
|
||||
|
||||
unsigned int dev_base_seq; /* protected by rtnl_mutex */
|
||||
int ifindex;
|
||||
|
||||
spinlock_t nsid_lock;
|
||||
atomic_t fnhe_genid;
|
||||
|
||||
struct list_head list; /* list of network namespaces */
|
||||
struct list_head exit_list; /* To linked to call pernet exit
|
||||
|
|
@ -76,11 +85,11 @@ struct net {
|
|||
#endif
|
||||
struct user_namespace *user_ns; /* Owning user namespace */
|
||||
struct ucounts *ucounts;
|
||||
spinlock_t nsid_lock;
|
||||
struct idr netns_ids;
|
||||
|
||||
struct ns_common ns;
|
||||
|
||||
struct list_head dev_base_head;
|
||||
struct proc_dir_entry *proc_net;
|
||||
struct proc_dir_entry *proc_net_stat;
|
||||
|
||||
|
|
@ -93,17 +102,18 @@ struct net {
|
|||
|
||||
struct uevent_sock *uevent_sock; /* uevent socket */
|
||||
|
||||
struct list_head dev_base_head;
|
||||
struct hlist_head *dev_name_head;
|
||||
struct hlist_head *dev_index_head;
|
||||
unsigned int dev_base_seq; /* protected by rtnl_mutex */
|
||||
int ifindex;
|
||||
unsigned int dev_unreg_count;
|
||||
/* Note that @hash_mix can be read millions times per second,
|
||||
* it is critical that it is on a read_mostly cache line.
|
||||
*/
|
||||
u32 hash_mix;
|
||||
|
||||
struct net_device *loopback_dev; /* The loopback */
|
||||
|
||||
/* core fib_rules */
|
||||
struct list_head rules_ops;
|
||||
|
||||
struct net_device *loopback_dev; /* The loopback */
|
||||
struct netns_core core;
|
||||
struct netns_mib mib;
|
||||
struct netns_packet packet;
|
||||
|
|
@ -171,7 +181,6 @@ struct net {
|
|||
struct sock *crypto_nlsk;
|
||||
#endif
|
||||
struct sock *diag_nlsk;
|
||||
atomic_t fnhe_genid;
|
||||
} __randomize_layout;
|
||||
|
||||
#include <linux/seq_file_net.h>
|
||||
|
|
|
|||
|
|
@ -185,7 +185,7 @@ void reqsk_fastopen_remove(struct sock *sk, struct request_sock *req,
|
|||
|
||||
static inline bool reqsk_queue_empty(const struct request_sock_queue *queue)
|
||||
{
|
||||
return queue->rskq_accept_head == NULL;
|
||||
return READ_ONCE(queue->rskq_accept_head) == NULL;
|
||||
}
|
||||
|
||||
static inline struct request_sock *reqsk_queue_remove(struct request_sock_queue *queue,
|
||||
|
|
@ -197,7 +197,7 @@ static inline struct request_sock *reqsk_queue_remove(struct request_sock_queue
|
|||
req = queue->rskq_accept_head;
|
||||
if (req) {
|
||||
sk_acceptq_removed(parent);
|
||||
queue->rskq_accept_head = req->dl_next;
|
||||
WRITE_ONCE(queue->rskq_accept_head, req->dl_next);
|
||||
if (queue->rskq_accept_head == NULL)
|
||||
queue->rskq_accept_tail = NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -610,4 +610,9 @@ static inline __u32 sctp_min_frag_point(struct sctp_sock *sp, __u16 datasize)
|
|||
return sctp_mtu_payload(sp, SCTP_DEFAULT_MINSEGMENT, datasize);
|
||||
}
|
||||
|
||||
static inline bool sctp_newsk_ready(const struct sock *sk)
|
||||
{
|
||||
return sock_flag(sk, SOCK_DEAD) || sk->sk_socket;
|
||||
}
|
||||
|
||||
#endif /* __net_sctp_h__ */
|
||||
|
|
|
|||
|
|
@ -878,12 +878,17 @@ static inline bool sk_acceptq_is_full(const struct sock *sk)
|
|||
*/
|
||||
static inline int sk_stream_min_wspace(const struct sock *sk)
|
||||
{
|
||||
return sk->sk_wmem_queued >> 1;
|
||||
return READ_ONCE(sk->sk_wmem_queued) >> 1;
|
||||
}
|
||||
|
||||
static inline int sk_stream_wspace(const struct sock *sk)
|
||||
{
|
||||
return sk->sk_sndbuf - sk->sk_wmem_queued;
|
||||
return READ_ONCE(sk->sk_sndbuf) - READ_ONCE(sk->sk_wmem_queued);
|
||||
}
|
||||
|
||||
static inline void sk_wmem_queued_add(struct sock *sk, int val)
|
||||
{
|
||||
WRITE_ONCE(sk->sk_wmem_queued, sk->sk_wmem_queued + val);
|
||||
}
|
||||
|
||||
void sk_stream_write_space(struct sock *sk);
|
||||
|
|
@ -1207,7 +1212,7 @@ static inline void sk_refcnt_debug_release(const struct sock *sk)
|
|||
|
||||
static inline bool __sk_stream_memory_free(const struct sock *sk, int wake)
|
||||
{
|
||||
if (sk->sk_wmem_queued >= sk->sk_sndbuf)
|
||||
if (READ_ONCE(sk->sk_wmem_queued) >= READ_ONCE(sk->sk_sndbuf))
|
||||
return false;
|
||||
|
||||
return sk->sk_prot->stream_memory_free ?
|
||||
|
|
@ -1467,7 +1472,7 @@ DECLARE_STATIC_KEY_FALSE(tcp_tx_skb_cache_key);
|
|||
static inline void sk_wmem_free_skb(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
sock_set_flag(sk, SOCK_QUEUE_SHRUNK);
|
||||
sk->sk_wmem_queued -= skb->truesize;
|
||||
sk_wmem_queued_add(sk, -skb->truesize);
|
||||
sk_mem_uncharge(sk, skb->truesize);
|
||||
if (static_branch_unlikely(&tcp_tx_skb_cache_key) &&
|
||||
!sk->sk_tx_skb_cache && !skb_cloned(skb)) {
|
||||
|
|
@ -2014,7 +2019,7 @@ static inline int skb_copy_to_page_nocache(struct sock *sk, struct iov_iter *fro
|
|||
skb->len += copy;
|
||||
skb->data_len += copy;
|
||||
skb->truesize += copy;
|
||||
sk->sk_wmem_queued += copy;
|
||||
sk_wmem_queued_add(sk, copy);
|
||||
sk_mem_charge(sk, copy);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -2220,10 +2225,14 @@ static inline void sk_wake_async(const struct sock *sk, int how, int band)
|
|||
|
||||
static inline void sk_stream_moderate_sndbuf(struct sock *sk)
|
||||
{
|
||||
if (!(sk->sk_userlocks & SOCK_SNDBUF_LOCK)) {
|
||||
sk->sk_sndbuf = min(sk->sk_sndbuf, sk->sk_wmem_queued >> 1);
|
||||
sk->sk_sndbuf = max_t(u32, sk->sk_sndbuf, SOCK_MIN_SNDBUF);
|
||||
}
|
||||
u32 val;
|
||||
|
||||
if (sk->sk_userlocks & SOCK_SNDBUF_LOCK)
|
||||
return;
|
||||
|
||||
val = min(sk->sk_sndbuf, sk->sk_wmem_queued >> 1);
|
||||
|
||||
WRITE_ONCE(sk->sk_sndbuf, max_t(u32, val, SOCK_MIN_SNDBUF));
|
||||
}
|
||||
|
||||
struct sk_buff *sk_stream_alloc_skb(struct sock *sk, int size, gfp_t gfp,
|
||||
|
|
@ -2251,7 +2260,7 @@ bool sk_page_frag_refill(struct sock *sk, struct page_frag *pfrag);
|
|||
*/
|
||||
static inline bool sock_writeable(const struct sock *sk)
|
||||
{
|
||||
return refcount_read(&sk->sk_wmem_alloc) < (sk->sk_sndbuf >> 1);
|
||||
return refcount_read(&sk->sk_wmem_alloc) < (READ_ONCE(sk->sk_sndbuf) >> 1);
|
||||
}
|
||||
|
||||
static inline gfp_t gfp_any(void)
|
||||
|
|
@ -2271,7 +2280,9 @@ static inline long sock_sndtimeo(const struct sock *sk, bool noblock)
|
|||
|
||||
static inline int sock_rcvlowat(const struct sock *sk, int waitall, int len)
|
||||
{
|
||||
return (waitall ? len : min_t(int, sk->sk_rcvlowat, len)) ? : 1;
|
||||
int v = waitall ? len : min_t(int, READ_ONCE(sk->sk_rcvlowat), len);
|
||||
|
||||
return v ?: 1;
|
||||
}
|
||||
|
||||
/* Alas, with timeout socket operations are not restartable.
|
||||
|
|
|
|||
|
|
@ -258,7 +258,7 @@ static inline bool tcp_under_memory_pressure(const struct sock *sk)
|
|||
mem_cgroup_under_socket_pressure(sk->sk_memcg))
|
||||
return true;
|
||||
|
||||
return tcp_memory_pressure;
|
||||
return READ_ONCE(tcp_memory_pressure);
|
||||
}
|
||||
/*
|
||||
* The next routines deal with comparing 32 bit unsigned ints
|
||||
|
|
@ -1380,13 +1380,14 @@ static inline int tcp_win_from_space(const struct sock *sk, int space)
|
|||
/* Note: caller must be prepared to deal with negative returns */
|
||||
static inline int tcp_space(const struct sock *sk)
|
||||
{
|
||||
return tcp_win_from_space(sk, sk->sk_rcvbuf - sk->sk_backlog.len -
|
||||
return tcp_win_from_space(sk, READ_ONCE(sk->sk_rcvbuf) -
|
||||
READ_ONCE(sk->sk_backlog.len) -
|
||||
atomic_read(&sk->sk_rmem_alloc));
|
||||
}
|
||||
|
||||
static inline int tcp_full_space(const struct sock *sk)
|
||||
{
|
||||
return tcp_win_from_space(sk, sk->sk_rcvbuf);
|
||||
return tcp_win_from_space(sk, READ_ONCE(sk->sk_rcvbuf));
|
||||
}
|
||||
|
||||
extern void tcp_openreq_init_rwin(struct request_sock *req,
|
||||
|
|
@ -1916,7 +1917,8 @@ static inline u32 tcp_notsent_lowat(const struct tcp_sock *tp)
|
|||
static inline bool tcp_stream_memory_free(const struct sock *sk, int wake)
|
||||
{
|
||||
const struct tcp_sock *tp = tcp_sk(sk);
|
||||
u32 notsent_bytes = tp->write_seq - tp->snd_nxt;
|
||||
u32 notsent_bytes = READ_ONCE(tp->write_seq) -
|
||||
READ_ONCE(tp->snd_nxt);
|
||||
|
||||
return (notsent_bytes << wake) < tcp_notsent_lowat(tp);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -519,10 +519,10 @@ TRACE_EVENT(rxrpc_local,
|
|||
);
|
||||
|
||||
TRACE_EVENT(rxrpc_peer,
|
||||
TP_PROTO(struct rxrpc_peer *peer, enum rxrpc_peer_trace op,
|
||||
TP_PROTO(unsigned int peer_debug_id, enum rxrpc_peer_trace op,
|
||||
int usage, const void *where),
|
||||
|
||||
TP_ARGS(peer, op, usage, where),
|
||||
TP_ARGS(peer_debug_id, op, usage, where),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, peer )
|
||||
|
|
@ -532,7 +532,7 @@ TRACE_EVENT(rxrpc_peer,
|
|||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->peer = peer->debug_id;
|
||||
__entry->peer = peer_debug_id;
|
||||
__entry->op = op;
|
||||
__entry->usage = usage;
|
||||
__entry->where = where;
|
||||
|
|
@ -546,10 +546,10 @@ TRACE_EVENT(rxrpc_peer,
|
|||
);
|
||||
|
||||
TRACE_EVENT(rxrpc_conn,
|
||||
TP_PROTO(struct rxrpc_connection *conn, enum rxrpc_conn_trace op,
|
||||
TP_PROTO(unsigned int conn_debug_id, enum rxrpc_conn_trace op,
|
||||
int usage, const void *where),
|
||||
|
||||
TP_ARGS(conn, op, usage, where),
|
||||
TP_ARGS(conn_debug_id, op, usage, where),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, conn )
|
||||
|
|
@ -559,7 +559,7 @@ TRACE_EVENT(rxrpc_conn,
|
|||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->conn = conn->debug_id;
|
||||
__entry->conn = conn_debug_id;
|
||||
__entry->op = op;
|
||||
__entry->usage = usage;
|
||||
__entry->where = where;
|
||||
|
|
@ -606,10 +606,10 @@ TRACE_EVENT(rxrpc_client,
|
|||
);
|
||||
|
||||
TRACE_EVENT(rxrpc_call,
|
||||
TP_PROTO(struct rxrpc_call *call, enum rxrpc_call_trace op,
|
||||
TP_PROTO(unsigned int call_debug_id, enum rxrpc_call_trace op,
|
||||
int usage, const void *where, const void *aux),
|
||||
|
||||
TP_ARGS(call, op, usage, where, aux),
|
||||
TP_ARGS(call_debug_id, op, usage, where, aux),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, call )
|
||||
|
|
@ -620,7 +620,7 @@ TRACE_EVENT(rxrpc_call,
|
|||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->call = call->debug_id;
|
||||
__entry->call = call_debug_id;
|
||||
__entry->op = op;
|
||||
__entry->usage = usage;
|
||||
__entry->where = where;
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ TRACE_EVENT(sock_rcvqueue_full,
|
|||
TP_fast_assign(
|
||||
__entry->rmem_alloc = atomic_read(&sk->sk_rmem_alloc);
|
||||
__entry->truesize = skb->truesize;
|
||||
__entry->sk_rcvbuf = sk->sk_rcvbuf;
|
||||
__entry->sk_rcvbuf = READ_ONCE(sk->sk_rcvbuf);
|
||||
),
|
||||
|
||||
TP_printk("rmem_alloc=%d truesize=%u sk_rcvbuf=%d",
|
||||
|
|
@ -115,7 +115,7 @@ TRACE_EVENT(sock_exceed_buf_limit,
|
|||
__entry->rmem_alloc = atomic_read(&sk->sk_rmem_alloc);
|
||||
__entry->sysctl_wmem = sk_get_wmem0(sk, prot);
|
||||
__entry->wmem_alloc = refcount_read(&sk->sk_wmem_alloc);
|
||||
__entry->wmem_queued = sk->sk_wmem_queued;
|
||||
__entry->wmem_queued = READ_ONCE(sk->sk_wmem_queued);
|
||||
__entry->kind = kind;
|
||||
),
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue