diff options
| author | Ingo Molnar <mingo@kernel.org> | 2018-10-09 02:50:10 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2018-10-09 02:50:10 -0400 |
| commit | fc8eaa85681fa72dc6a4e46f01c92e4fba83d0ab (patch) | |
| tree | b044fab426f2167ceeb37ed6fe58f7f11b10cebd /net/ipv4 | |
| parent | 2cc81c6992248ea37d0241bc325977bab310bc3b (diff) | |
| parent | 49e00eee00612b1357596fed8a88b621a7648c14 (diff) | |
Merge branch 'x86/urgent' into x86/cache, to pick up dependent fix
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'net/ipv4')
| -rw-r--r-- | net/ipv4/inet_connection_sock.c | 5 | ||||
| -rw-r--r-- | net/ipv4/ip_sockglue.c | 3 | ||||
| -rw-r--r-- | net/ipv4/sysctl_net_ipv4.c | 6 | ||||
| -rw-r--r-- | net/ipv4/tcp_input.c | 4 | ||||
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 4 | ||||
| -rw-r--r-- | net/ipv4/xfrm4_input.c | 1 | ||||
| -rw-r--r-- | net/ipv4/xfrm4_mode_transport.c | 4 |
7 files changed, 17 insertions, 10 deletions
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index dfd5009f96ef..15e7f7915a21 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
| @@ -544,7 +544,8 @@ struct dst_entry *inet_csk_route_req(const struct sock *sk, | |||
| 544 | struct ip_options_rcu *opt; | 544 | struct ip_options_rcu *opt; |
| 545 | struct rtable *rt; | 545 | struct rtable *rt; |
| 546 | 546 | ||
| 547 | opt = ireq_opt_deref(ireq); | 547 | rcu_read_lock(); |
| 548 | opt = rcu_dereference(ireq->ireq_opt); | ||
| 548 | 549 | ||
| 549 | flowi4_init_output(fl4, ireq->ir_iif, ireq->ir_mark, | 550 | flowi4_init_output(fl4, ireq->ir_iif, ireq->ir_mark, |
| 550 | RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE, | 551 | RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE, |
| @@ -558,11 +559,13 @@ struct dst_entry *inet_csk_route_req(const struct sock *sk, | |||
| 558 | goto no_route; | 559 | goto no_route; |
| 559 | if (opt && opt->opt.is_strictroute && rt->rt_uses_gateway) | 560 | if (opt && opt->opt.is_strictroute && rt->rt_uses_gateway) |
| 560 | goto route_err; | 561 | goto route_err; |
| 562 | rcu_read_unlock(); | ||
| 561 | return &rt->dst; | 563 | return &rt->dst; |
| 562 | 564 | ||
| 563 | route_err: | 565 | route_err: |
| 564 | ip_rt_put(rt); | 566 | ip_rt_put(rt); |
| 565 | no_route: | 567 | no_route: |
| 568 | rcu_read_unlock(); | ||
| 566 | __IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES); | 569 | __IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES); |
| 567 | return NULL; | 570 | return NULL; |
| 568 | } | 571 | } |
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index c0fe5ad996f2..26c36cccabdc 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c | |||
| @@ -149,7 +149,6 @@ static void ip_cmsg_recv_security(struct msghdr *msg, struct sk_buff *skb) | |||
| 149 | static void ip_cmsg_recv_dstaddr(struct msghdr *msg, struct sk_buff *skb) | 149 | static void ip_cmsg_recv_dstaddr(struct msghdr *msg, struct sk_buff *skb) |
| 150 | { | 150 | { |
| 151 | struct sockaddr_in sin; | 151 | struct sockaddr_in sin; |
| 152 | const struct iphdr *iph = ip_hdr(skb); | ||
| 153 | __be16 *ports; | 152 | __be16 *ports; |
| 154 | int end; | 153 | int end; |
| 155 | 154 | ||
| @@ -164,7 +163,7 @@ static void ip_cmsg_recv_dstaddr(struct msghdr *msg, struct sk_buff *skb) | |||
| 164 | ports = (__be16 *)skb_transport_header(skb); | 163 | ports = (__be16 *)skb_transport_header(skb); |
| 165 | 164 | ||
| 166 | sin.sin_family = AF_INET; | 165 | sin.sin_family = AF_INET; |
| 167 | sin.sin_addr.s_addr = iph->daddr; | 166 | sin.sin_addr.s_addr = ip_hdr(skb)->daddr; |
| 168 | sin.sin_port = ports[1]; | 167 | sin.sin_port = ports[1]; |
| 169 | memset(sin.sin_zero, 0, sizeof(sin.sin_zero)); | 168 | memset(sin.sin_zero, 0, sizeof(sin.sin_zero)); |
| 170 | 169 | ||
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index b92f422f2fa8..891ed2f91467 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c | |||
| @@ -48,6 +48,7 @@ static int tcp_syn_retries_max = MAX_TCP_SYNCNT; | |||
| 48 | static int ip_ping_group_range_min[] = { 0, 0 }; | 48 | static int ip_ping_group_range_min[] = { 0, 0 }; |
| 49 | static int ip_ping_group_range_max[] = { GID_T_MAX, GID_T_MAX }; | 49 | static int ip_ping_group_range_max[] = { GID_T_MAX, GID_T_MAX }; |
| 50 | static int comp_sack_nr_max = 255; | 50 | static int comp_sack_nr_max = 255; |
| 51 | static u32 u32_max_div_HZ = UINT_MAX / HZ; | ||
| 51 | 52 | ||
| 52 | /* obsolete */ | 53 | /* obsolete */ |
| 53 | static int sysctl_tcp_low_latency __read_mostly; | 54 | static int sysctl_tcp_low_latency __read_mostly; |
| @@ -745,9 +746,10 @@ static struct ctl_table ipv4_net_table[] = { | |||
| 745 | { | 746 | { |
| 746 | .procname = "tcp_probe_interval", | 747 | .procname = "tcp_probe_interval", |
| 747 | .data = &init_net.ipv4.sysctl_tcp_probe_interval, | 748 | .data = &init_net.ipv4.sysctl_tcp_probe_interval, |
| 748 | .maxlen = sizeof(int), | 749 | .maxlen = sizeof(u32), |
| 749 | .mode = 0644, | 750 | .mode = 0644, |
| 750 | .proc_handler = proc_dointvec, | 751 | .proc_handler = proc_douintvec_minmax, |
| 752 | .extra2 = &u32_max_div_HZ, | ||
| 751 | }, | 753 | }, |
| 752 | { | 754 | { |
| 753 | .procname = "igmp_link_local_mcast_reports", | 755 | .procname = "igmp_link_local_mcast_reports", |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 4cf2f7bb2802..47e08c1b5bc3 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -6009,11 +6009,13 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) | |||
| 6009 | if (th->fin) | 6009 | if (th->fin) |
| 6010 | goto discard; | 6010 | goto discard; |
| 6011 | /* It is possible that we process SYN packets from backlog, | 6011 | /* It is possible that we process SYN packets from backlog, |
| 6012 | * so we need to make sure to disable BH right there. | 6012 | * so we need to make sure to disable BH and RCU right there. |
| 6013 | */ | 6013 | */ |
| 6014 | rcu_read_lock(); | ||
| 6014 | local_bh_disable(); | 6015 | local_bh_disable(); |
| 6015 | acceptable = icsk->icsk_af_ops->conn_request(sk, skb) >= 0; | 6016 | acceptable = icsk->icsk_af_ops->conn_request(sk, skb) >= 0; |
| 6016 | local_bh_enable(); | 6017 | local_bh_enable(); |
| 6018 | rcu_read_unlock(); | ||
| 6017 | 6019 | ||
| 6018 | if (!acceptable) | 6020 | if (!acceptable) |
| 6019 | return 1; | 6021 | return 1; |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 44c09eddbb78..cd426313a298 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -943,9 +943,11 @@ static int tcp_v4_send_synack(const struct sock *sk, struct dst_entry *dst, | |||
| 943 | if (skb) { | 943 | if (skb) { |
| 944 | __tcp_v4_send_check(skb, ireq->ir_loc_addr, ireq->ir_rmt_addr); | 944 | __tcp_v4_send_check(skb, ireq->ir_loc_addr, ireq->ir_rmt_addr); |
| 945 | 945 | ||
| 946 | rcu_read_lock(); | ||
| 946 | err = ip_build_and_send_pkt(skb, sk, ireq->ir_loc_addr, | 947 | err = ip_build_and_send_pkt(skb, sk, ireq->ir_loc_addr, |
| 947 | ireq->ir_rmt_addr, | 948 | ireq->ir_rmt_addr, |
| 948 | ireq_opt_deref(ireq)); | 949 | rcu_dereference(ireq->ireq_opt)); |
| 950 | rcu_read_unlock(); | ||
| 949 | err = net_xmit_eval(err); | 951 | err = net_xmit_eval(err); |
| 950 | } | 952 | } |
| 951 | 953 | ||
diff --git a/net/ipv4/xfrm4_input.c b/net/ipv4/xfrm4_input.c index bcfc00e88756..f8de2482a529 100644 --- a/net/ipv4/xfrm4_input.c +++ b/net/ipv4/xfrm4_input.c | |||
| @@ -67,6 +67,7 @@ int xfrm4_transport_finish(struct sk_buff *skb, int async) | |||
| 67 | 67 | ||
| 68 | if (xo && (xo->flags & XFRM_GRO)) { | 68 | if (xo && (xo->flags & XFRM_GRO)) { |
| 69 | skb_mac_header_rebuild(skb); | 69 | skb_mac_header_rebuild(skb); |
| 70 | skb_reset_transport_header(skb); | ||
| 70 | return 0; | 71 | return 0; |
| 71 | } | 72 | } |
| 72 | 73 | ||
diff --git a/net/ipv4/xfrm4_mode_transport.c b/net/ipv4/xfrm4_mode_transport.c index 3d36644890bb..1ad2c2c4e250 100644 --- a/net/ipv4/xfrm4_mode_transport.c +++ b/net/ipv4/xfrm4_mode_transport.c | |||
| @@ -46,7 +46,6 @@ static int xfrm4_transport_output(struct xfrm_state *x, struct sk_buff *skb) | |||
| 46 | static int xfrm4_transport_input(struct xfrm_state *x, struct sk_buff *skb) | 46 | static int xfrm4_transport_input(struct xfrm_state *x, struct sk_buff *skb) |
| 47 | { | 47 | { |
| 48 | int ihl = skb->data - skb_transport_header(skb); | 48 | int ihl = skb->data - skb_transport_header(skb); |
| 49 | struct xfrm_offload *xo = xfrm_offload(skb); | ||
| 50 | 49 | ||
| 51 | if (skb->transport_header != skb->network_header) { | 50 | if (skb->transport_header != skb->network_header) { |
| 52 | memmove(skb_transport_header(skb), | 51 | memmove(skb_transport_header(skb), |
| @@ -54,8 +53,7 @@ static int xfrm4_transport_input(struct xfrm_state *x, struct sk_buff *skb) | |||
| 54 | skb->network_header = skb->transport_header; | 53 | skb->network_header = skb->transport_header; |
| 55 | } | 54 | } |
| 56 | ip_hdr(skb)->tot_len = htons(skb->len + ihl); | 55 | ip_hdr(skb)->tot_len = htons(skb->len + ihl); |
| 57 | if (!xo || !(xo->flags & XFRM_GRO)) | 56 | skb_reset_transport_header(skb); |
| 58 | skb_reset_transport_header(skb); | ||
| 59 | return 0; | 57 | return 0; |
| 60 | } | 58 | } |
| 61 | 59 | ||
