Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/ethernet/renesas/ravb_main.c kernel/bpf/syscall.c net/ipv4/ipmr.c All three conflicts were cases of overlapping changes. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -2126,7 +2126,7 @@ int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr)
|
||||
ASSERT_RTNL();
|
||||
|
||||
in_dev = ip_mc_find_dev(net, imr);
|
||||
if (!in_dev) {
|
||||
if (!imr->imr_ifindex && !imr->imr_address.s_addr && !in_dev) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
@@ -2147,7 +2147,8 @@ int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr)
|
||||
|
||||
*imlp = iml->next_rcu;
|
||||
|
||||
ip_mc_dec_group(in_dev, group);
|
||||
if (in_dev)
|
||||
ip_mc_dec_group(in_dev, group);
|
||||
|
||||
/* decrease mem now to avoid the memleak warning */
|
||||
atomic_sub(sizeof(*iml), &sk->sk_omem_alloc);
|
||||
|
||||
@@ -109,7 +109,7 @@ static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb,
|
||||
struct mfc_cache *c, struct rtmsg *rtm);
|
||||
static void mroute_netlink_event(struct mr_table *mrt, struct mfc_cache *mfc,
|
||||
int cmd);
|
||||
static void mroute_clean_tables(struct mr_table *mrt);
|
||||
static void mroute_clean_tables(struct mr_table *mrt, bool all);
|
||||
static void ipmr_expire_process(unsigned long arg);
|
||||
|
||||
#ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES
|
||||
@@ -332,7 +332,7 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id)
|
||||
static void ipmr_free_table(struct mr_table *mrt)
|
||||
{
|
||||
del_timer_sync(&mrt->ipmr_expire_timer);
|
||||
mroute_clean_tables(mrt);
|
||||
mroute_clean_tables(mrt, true);
|
||||
kfree(mrt);
|
||||
}
|
||||
|
||||
@@ -431,10 +431,6 @@ static struct net_device *ipmr_new_tunnel(struct net *net, struct vifctl *v)
|
||||
return dev;
|
||||
|
||||
failure:
|
||||
/* allow the register to be completed before unregistering. */
|
||||
rtnl_unlock();
|
||||
rtnl_lock();
|
||||
|
||||
unregister_netdevice(dev);
|
||||
return NULL;
|
||||
}
|
||||
@@ -518,10 +514,6 @@ static struct net_device *ipmr_reg_vif(struct net *net, struct mr_table *mrt)
|
||||
return dev;
|
||||
|
||||
failure:
|
||||
/* allow the register to be completed before unregistering. */
|
||||
rtnl_unlock();
|
||||
rtnl_lock();
|
||||
|
||||
unregister_netdevice(dev);
|
||||
return NULL;
|
||||
}
|
||||
@@ -1189,7 +1181,7 @@ static int ipmr_mfc_add(struct net *net, struct mr_table *mrt,
|
||||
}
|
||||
|
||||
/* Close the multicast socket, and clear the vif tables etc */
|
||||
static void mroute_clean_tables(struct mr_table *mrt)
|
||||
static void mroute_clean_tables(struct mr_table *mrt, bool all)
|
||||
{
|
||||
int i;
|
||||
LIST_HEAD(list);
|
||||
@@ -1197,15 +1189,16 @@ static void mroute_clean_tables(struct mr_table *mrt)
|
||||
|
||||
/* Shut down all active vif entries */
|
||||
for (i = 0; i < mrt->maxvif; i++) {
|
||||
if (!(mrt->vif_table[i].flags & VIFF_STATIC))
|
||||
vif_delete(mrt, i, 0, &list);
|
||||
if (!all && (mrt->vif_table[i].flags & VIFF_STATIC))
|
||||
continue;
|
||||
vif_delete(mrt, i, 0, &list);
|
||||
}
|
||||
unregister_netdevice_many(&list);
|
||||
|
||||
/* Wipe the cache */
|
||||
for (i = 0; i < MFC_LINES; i++) {
|
||||
list_for_each_entry_safe(c, next, &mrt->mfc_cache_array[i], list) {
|
||||
if (c->mfc_flags & MFC_STATIC)
|
||||
if (!all && (c->mfc_flags & MFC_STATIC))
|
||||
continue;
|
||||
list_del_rcu(&c->list);
|
||||
mroute_netlink_event(mrt, c, RTM_DELROUTE);
|
||||
@@ -1240,7 +1233,7 @@ static void mrtsock_destruct(struct sock *sk)
|
||||
NETCONFA_IFINDEX_ALL,
|
||||
net->ipv4.devconf_all);
|
||||
RCU_INIT_POINTER(mrt->mroute_sk, NULL);
|
||||
mroute_clean_tables(mrt);
|
||||
mroute_clean_tables(mrt, false);
|
||||
}
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
@@ -517,8 +517,7 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
|
||||
if (sk_stream_is_writeable(sk)) {
|
||||
mask |= POLLOUT | POLLWRNORM;
|
||||
} else { /* send SIGIO later */
|
||||
set_bit(SOCK_ASYNC_NOSPACE,
|
||||
&sk->sk_socket->flags);
|
||||
sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
|
||||
set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
|
||||
|
||||
/* Race breaker. If space is freed after
|
||||
@@ -906,7 +905,7 @@ static ssize_t do_tcp_sendpages(struct sock *sk, struct page *page, int offset,
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
|
||||
sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk);
|
||||
|
||||
mss_now = tcp_send_mss(sk, &size_goal, flags);
|
||||
copied = 0;
|
||||
@@ -1134,7 +1133,7 @@ int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
|
||||
}
|
||||
|
||||
/* This should be in poll */
|
||||
clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
|
||||
sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk);
|
||||
|
||||
mss_now = tcp_send_mss(sk, &size_goal, flags);
|
||||
|
||||
|
||||
@@ -4481,19 +4481,34 @@ static int __must_check tcp_queue_rcv(struct sock *sk, struct sk_buff *skb, int
|
||||
int tcp_send_rcvq(struct sock *sk, struct msghdr *msg, size_t size)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
int err = -ENOMEM;
|
||||
int data_len = 0;
|
||||
bool fragstolen;
|
||||
|
||||
if (size == 0)
|
||||
return 0;
|
||||
|
||||
skb = alloc_skb(size, sk->sk_allocation);
|
||||
if (size > PAGE_SIZE) {
|
||||
int npages = min_t(size_t, size >> PAGE_SHIFT, MAX_SKB_FRAGS);
|
||||
|
||||
data_len = npages << PAGE_SHIFT;
|
||||
size = data_len + (size & ~PAGE_MASK);
|
||||
}
|
||||
skb = alloc_skb_with_frags(size - data_len, data_len,
|
||||
PAGE_ALLOC_COSTLY_ORDER,
|
||||
&err, sk->sk_allocation);
|
||||
if (!skb)
|
||||
goto err;
|
||||
|
||||
skb_put(skb, size - data_len);
|
||||
skb->data_len = data_len;
|
||||
skb->len = size;
|
||||
|
||||
if (tcp_try_rmem_schedule(sk, skb, skb->truesize))
|
||||
goto err_free;
|
||||
|
||||
if (memcpy_from_msg(skb_put(skb, size), msg, size))
|
||||
err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, size);
|
||||
if (err)
|
||||
goto err_free;
|
||||
|
||||
TCP_SKB_CB(skb)->seq = tcp_sk(sk)->rcv_nxt;
|
||||
@@ -4509,7 +4524,8 @@ int tcp_send_rcvq(struct sock *sk, struct msghdr *msg, size_t size)
|
||||
err_free:
|
||||
kfree_skb(skb);
|
||||
err:
|
||||
return -ENOMEM;
|
||||
return err;
|
||||
|
||||
}
|
||||
|
||||
static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
|
||||
@@ -5667,6 +5683,7 @@ discard:
|
||||
}
|
||||
|
||||
tp->rcv_nxt = TCP_SKB_CB(skb)->seq + 1;
|
||||
tp->copied_seq = tp->rcv_nxt;
|
||||
tp->rcv_wup = TCP_SKB_CB(skb)->seq + 1;
|
||||
|
||||
/* RFC1323: The window in SYN & SYN/ACK segments is
|
||||
|
||||
@@ -921,7 +921,8 @@ int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr,
|
||||
}
|
||||
|
||||
md5sig = rcu_dereference_protected(tp->md5sig_info,
|
||||
sock_owned_by_user(sk));
|
||||
sock_owned_by_user(sk) ||
|
||||
lockdep_is_held(&sk->sk_lock.slock));
|
||||
if (!md5sig) {
|
||||
md5sig = kmalloc(sizeof(*md5sig), gfp);
|
||||
if (!md5sig)
|
||||
|
||||
@@ -168,7 +168,7 @@ static int tcp_write_timeout(struct sock *sk)
|
||||
dst_negative_advice(sk);
|
||||
if (tp->syn_fastopen || tp->syn_data)
|
||||
tcp_fastopen_cache_set(sk, 0, NULL, true, 0);
|
||||
if (tp->syn_data)
|
||||
if (tp->syn_data && icsk->icsk_retransmits == 1)
|
||||
NET_INC_STATS_BH(sock_net(sk),
|
||||
LINUX_MIB_TCPFASTOPENACTIVEFAIL);
|
||||
}
|
||||
@@ -176,6 +176,18 @@ static int tcp_write_timeout(struct sock *sk)
|
||||
syn_set = true;
|
||||
} else {
|
||||
if (retransmits_timed_out(sk, sysctl_tcp_retries1, 0, 0)) {
|
||||
/* Some middle-boxes may black-hole Fast Open _after_
|
||||
* the handshake. Therefore we conservatively disable
|
||||
* Fast Open on this path on recurring timeouts with
|
||||
* few or zero bytes acked after Fast Open.
|
||||
*/
|
||||
if (tp->syn_data_acked &&
|
||||
tp->bytes_acked <= tp->rx_opt.mss_clamp) {
|
||||
tcp_fastopen_cache_set(sk, 0, NULL, true, 0);
|
||||
if (icsk->icsk_retransmits == sysctl_tcp_retries1)
|
||||
NET_INC_STATS_BH(sock_net(sk),
|
||||
LINUX_MIB_TCPFASTOPENACTIVEFAIL);
|
||||
}
|
||||
/* Black hole detection */
|
||||
tcp_mtu_probing(icsk, sk);
|
||||
|
||||
|
||||
@@ -100,7 +100,6 @@
|
||||
#include <linux/slab.h>
|
||||
#include <net/tcp_states.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <net/net_namespace.h>
|
||||
|
||||
Reference in New Issue
Block a user