inet: remove some sk_listener dependencies
listener can be source of false sharing. request sock has some useful information like : ireq->ir_iif, ireq->ir_num, ireq->ireq_net This patch does not solve the major problem of having to read sk->sk_protocol which is sharing a cache line with sk->sk_wmem_alloc. (This same field is read later in ip_build_and_send_pkt()) One idea would be to move sk_protocol close to sk_family (using 8 bits instead of 16 for sk_family seems enough) Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
42cb80a235
commit
8b929ab12f
|
@ -403,18 +403,17 @@ struct dst_entry *inet_csk_route_req(struct sock *sk,
|
||||||
struct flowi4 *fl4,
|
struct flowi4 *fl4,
|
||||||
const struct request_sock *req)
|
const struct request_sock *req)
|
||||||
{
|
{
|
||||||
struct rtable *rt;
|
|
||||||
const struct inet_request_sock *ireq = inet_rsk(req);
|
const struct inet_request_sock *ireq = inet_rsk(req);
|
||||||
struct ip_options_rcu *opt = inet_rsk(req)->opt;
|
struct net *net = read_pnet(&ireq->ireq_net);
|
||||||
struct net *net = sock_net(sk);
|
struct ip_options_rcu *opt = ireq->opt;
|
||||||
int flags = inet_sk_flowi_flags(sk);
|
struct rtable *rt;
|
||||||
|
|
||||||
flowi4_init_output(fl4, sk->sk_bound_dev_if, ireq->ir_mark,
|
flowi4_init_output(fl4, ireq->ir_iif, ireq->ir_mark,
|
||||||
RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE,
|
RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE,
|
||||||
sk->sk_protocol,
|
sk->sk_protocol, inet_sk_flowi_flags(sk),
|
||||||
flags,
|
|
||||||
(opt && opt->opt.srr) ? opt->opt.faddr : ireq->ir_rmt_addr,
|
(opt && opt->opt.srr) ? opt->opt.faddr : ireq->ir_rmt_addr,
|
||||||
ireq->ir_loc_addr, ireq->ir_rmt_port, inet_sk(sk)->inet_sport);
|
ireq->ir_loc_addr, ireq->ir_rmt_port,
|
||||||
|
htons(ireq->ir_num));
|
||||||
security_req_classify_flow(req, flowi4_to_flowi(fl4));
|
security_req_classify_flow(req, flowi4_to_flowi(fl4));
|
||||||
rt = ip_route_output_flow(net, fl4, sk);
|
rt = ip_route_output_flow(net, fl4, sk);
|
||||||
if (IS_ERR(rt))
|
if (IS_ERR(rt))
|
||||||
|
@ -436,9 +435,9 @@ struct dst_entry *inet_csk_route_child_sock(struct sock *sk,
|
||||||
const struct request_sock *req)
|
const struct request_sock *req)
|
||||||
{
|
{
|
||||||
const struct inet_request_sock *ireq = inet_rsk(req);
|
const struct inet_request_sock *ireq = inet_rsk(req);
|
||||||
|
struct net *net = read_pnet(&ireq->ireq_net);
|
||||||
struct inet_sock *newinet = inet_sk(newsk);
|
struct inet_sock *newinet = inet_sk(newsk);
|
||||||
struct ip_options_rcu *opt;
|
struct ip_options_rcu *opt;
|
||||||
struct net *net = sock_net(sk);
|
|
||||||
struct flowi4 *fl4;
|
struct flowi4 *fl4;
|
||||||
struct rtable *rt;
|
struct rtable *rt;
|
||||||
|
|
||||||
|
@ -446,11 +445,12 @@ struct dst_entry *inet_csk_route_child_sock(struct sock *sk,
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
opt = rcu_dereference(newinet->inet_opt);
|
opt = rcu_dereference(newinet->inet_opt);
|
||||||
flowi4_init_output(fl4, sk->sk_bound_dev_if, inet_rsk(req)->ir_mark,
|
flowi4_init_output(fl4, ireq->ir_iif, ireq->ir_mark,
|
||||||
RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE,
|
RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE,
|
||||||
sk->sk_protocol, inet_sk_flowi_flags(sk),
|
sk->sk_protocol, inet_sk_flowi_flags(sk),
|
||||||
(opt && opt->opt.srr) ? opt->opt.faddr : ireq->ir_rmt_addr,
|
(opt && opt->opt.srr) ? opt->opt.faddr : ireq->ir_rmt_addr,
|
||||||
ireq->ir_loc_addr, ireq->ir_rmt_port, inet_sk(sk)->inet_sport);
|
ireq->ir_loc_addr, ireq->ir_rmt_port,
|
||||||
|
htons(ireq->ir_num));
|
||||||
security_req_classify_flow(req, flowi4_to_flowi(fl4));
|
security_req_classify_flow(req, flowi4_to_flowi(fl4));
|
||||||
rt = ip_route_output_flow(net, fl4, sk);
|
rt = ip_route_output_flow(net, fl4, sk);
|
||||||
if (IS_ERR(rt))
|
if (IS_ERR(rt))
|
||||||
|
|
Loading…
Reference in New Issue