net: Record receive queue number for a connection
This patch adds a new field to sock_common 'skc_rx_queue_mapping' which holds the receive queue number for the connection. The Rx queue is marked in tcp_finish_connect() to allow a client app to do SO_INCOMING_NAPI_ID after a connect() call to get the right queue association for a socket. Rx queue is also marked in tcp_conn_request() to allow syn-ack to go on the right tx-queue associated with the queue on which syn is received. Signed-off-by: Amritha Nambiar <amritha.nambiar@intel.com> Signed-off-by: Sridhar Samudrala <sridhar.samudrala@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
755c31cd85
commit
c6345ce7d3
@@ -151,6 +151,7 @@ static inline void sk_mark_napi_id(struct sock *sk, const struct sk_buff *skb)
|
|||||||
#ifdef CONFIG_NET_RX_BUSY_POLL
|
#ifdef CONFIG_NET_RX_BUSY_POLL
|
||||||
sk->sk_napi_id = skb->napi_id;
|
sk->sk_napi_id = skb->napi_id;
|
||||||
#endif
|
#endif
|
||||||
|
sk_rx_queue_set(sk, skb);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* variant used for unconnected sockets */
|
/* variant used for unconnected sockets */
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ typedef __u64 __bitwise __addrpair;
|
|||||||
* @skc_node: main hash linkage for various protocol lookup tables
|
* @skc_node: main hash linkage for various protocol lookup tables
|
||||||
* @skc_nulls_node: main hash linkage for TCP/UDP/UDP-Lite protocol
|
* @skc_nulls_node: main hash linkage for TCP/UDP/UDP-Lite protocol
|
||||||
* @skc_tx_queue_mapping: tx queue number for this connection
|
* @skc_tx_queue_mapping: tx queue number for this connection
|
||||||
|
* @skc_rx_queue_mapping: rx queue number for this connection
|
||||||
* @skc_flags: place holder for sk_flags
|
* @skc_flags: place holder for sk_flags
|
||||||
* %SO_LINGER (l_onoff), %SO_BROADCAST, %SO_KEEPALIVE,
|
* %SO_LINGER (l_onoff), %SO_BROADCAST, %SO_KEEPALIVE,
|
||||||
* %SO_OOBINLINE settings, %SO_TIMESTAMPING settings
|
* %SO_OOBINLINE settings, %SO_TIMESTAMPING settings
|
||||||
@@ -215,6 +216,9 @@ struct sock_common {
|
|||||||
struct hlist_nulls_node skc_nulls_node;
|
struct hlist_nulls_node skc_nulls_node;
|
||||||
};
|
};
|
||||||
unsigned short skc_tx_queue_mapping;
|
unsigned short skc_tx_queue_mapping;
|
||||||
|
#ifdef CONFIG_XPS
|
||||||
|
unsigned short skc_rx_queue_mapping;
|
||||||
|
#endif
|
||||||
union {
|
union {
|
||||||
int skc_incoming_cpu;
|
int skc_incoming_cpu;
|
||||||
u32 skc_rcv_wnd;
|
u32 skc_rcv_wnd;
|
||||||
@@ -326,6 +330,9 @@ struct sock {
|
|||||||
#define sk_nulls_node __sk_common.skc_nulls_node
|
#define sk_nulls_node __sk_common.skc_nulls_node
|
||||||
#define sk_refcnt __sk_common.skc_refcnt
|
#define sk_refcnt __sk_common.skc_refcnt
|
||||||
#define sk_tx_queue_mapping __sk_common.skc_tx_queue_mapping
|
#define sk_tx_queue_mapping __sk_common.skc_tx_queue_mapping
|
||||||
|
#ifdef CONFIG_XPS
|
||||||
|
#define sk_rx_queue_mapping __sk_common.skc_rx_queue_mapping
|
||||||
|
#endif
|
||||||
|
|
||||||
#define sk_dontcopy_begin __sk_common.skc_dontcopy_begin
|
#define sk_dontcopy_begin __sk_common.skc_dontcopy_begin
|
||||||
#define sk_dontcopy_end __sk_common.skc_dontcopy_end
|
#define sk_dontcopy_end __sk_common.skc_dontcopy_end
|
||||||
@@ -1702,6 +1709,27 @@ static inline int sk_tx_queue_get(const struct sock *sk)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void sk_rx_queue_set(struct sock *sk, const struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_XPS
|
||||||
|
if (skb_rx_queue_recorded(skb)) {
|
||||||
|
u16 rx_queue = skb_get_rx_queue(skb);
|
||||||
|
|
||||||
|
if (WARN_ON_ONCE(rx_queue == NO_QUEUE_MAPPING))
|
||||||
|
return;
|
||||||
|
|
||||||
|
sk->sk_rx_queue_mapping = rx_queue;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void sk_rx_queue_clear(struct sock *sk)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_XPS
|
||||||
|
sk->sk_rx_queue_mapping = NO_QUEUE_MAPPING;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static inline void sk_set_socket(struct sock *sk, struct socket *sock)
|
static inline void sk_set_socket(struct sock *sk, struct socket *sock)
|
||||||
{
|
{
|
||||||
sk_tx_queue_clear(sk);
|
sk_tx_queue_clear(sk);
|
||||||
|
|||||||
@@ -2818,6 +2818,8 @@ void sock_init_data(struct socket *sock, struct sock *sk)
|
|||||||
sk->sk_pacing_rate = ~0U;
|
sk->sk_pacing_rate = ~0U;
|
||||||
sk->sk_pacing_shift = 10;
|
sk->sk_pacing_shift = 10;
|
||||||
sk->sk_incoming_cpu = -1;
|
sk->sk_incoming_cpu = -1;
|
||||||
|
|
||||||
|
sk_rx_queue_clear(sk);
|
||||||
/*
|
/*
|
||||||
* Before updating sk_refcnt, we must commit prior changes to memory
|
* Before updating sk_refcnt, we must commit prior changes to memory
|
||||||
* (Documentation/RCU/rculist_nulls.txt for details)
|
* (Documentation/RCU/rculist_nulls.txt for details)
|
||||||
|
|||||||
@@ -78,6 +78,7 @@
|
|||||||
#include <linux/errqueue.h>
|
#include <linux/errqueue.h>
|
||||||
#include <trace/events/tcp.h>
|
#include <trace/events/tcp.h>
|
||||||
#include <linux/static_key.h>
|
#include <linux/static_key.h>
|
||||||
|
#include <net/busy_poll.h>
|
||||||
|
|
||||||
int sysctl_tcp_max_orphans __read_mostly = NR_FILE;
|
int sysctl_tcp_max_orphans __read_mostly = NR_FILE;
|
||||||
|
|
||||||
@@ -5592,6 +5593,7 @@ void tcp_finish_connect(struct sock *sk, struct sk_buff *skb)
|
|||||||
if (skb) {
|
if (skb) {
|
||||||
icsk->icsk_af_ops->sk_rx_dst_set(sk, skb);
|
icsk->icsk_af_ops->sk_rx_dst_set(sk, skb);
|
||||||
security_inet_conn_established(sk, skb);
|
security_inet_conn_established(sk, skb);
|
||||||
|
sk_mark_napi_id(sk, skb);
|
||||||
}
|
}
|
||||||
|
|
||||||
tcp_init_transfer(sk, BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB);
|
tcp_init_transfer(sk, BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB);
|
||||||
@@ -6420,6 +6422,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
|
|||||||
tcp_rsk(req)->snt_isn = isn;
|
tcp_rsk(req)->snt_isn = isn;
|
||||||
tcp_rsk(req)->txhash = net_tx_rndhash();
|
tcp_rsk(req)->txhash = net_tx_rndhash();
|
||||||
tcp_openreq_init_rwin(req, sk, dst);
|
tcp_openreq_init_rwin(req, sk, dst);
|
||||||
|
sk_rx_queue_set(req_to_sk(req), skb);
|
||||||
if (!want_cookie) {
|
if (!want_cookie) {
|
||||||
tcp_reqsk_record_syn(sk, req, skb);
|
tcp_reqsk_record_syn(sk, req, skb);
|
||||||
fastopen_sk = tcp_try_fastopen(sk, skb, req, &foc, dst);
|
fastopen_sk = tcp_try_fastopen(sk, skb, req, &foc, dst);
|
||||||
|
|||||||
Reference in New Issue
Block a user