From: David S. Miller Date: Sat, 1 Aug 2015 06:52:20 +0000 (-0700) Subject: Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=5510b3c2a173921374ec847848fb20b98e1c698a;p=linux-beck.git Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net Conflicts: arch/s390/net/bpf_jit_comp.c drivers/net/ethernet/ti/netcp_ethss.c net/bridge/br_multicast.c net/ipv4/ip_fragment.c All four conflicts were cases of simple overlapping changes. Signed-off-by: David S. Miller --- 5510b3c2a173921374ec847848fb20b98e1c698a diff --cc net/bridge/br_multicast.c index fd238587e032,0b39dcc65b94..0752796fe0ba --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c @@@ -1441,6 -1424,31 +1440,32 @@@ br_multicast_leave_group(struct net_bri if (!mp) goto out; + if (port && (port->flags & BR_MULTICAST_FAST_LEAVE)) { + struct net_bridge_port_group __rcu **pp; + + for (pp = &mp->ports; + (p = mlock_dereference(*pp, br)) != NULL; + pp = &p->next) { + if (p->port != port) + continue; + + rcu_assign_pointer(*pp, p->next); + hlist_del_init(&p->mglist); + del_timer(&p->timer); + call_rcu_bh(&p->rcu, br_multicast_free_pg); - br_mdb_notify(br->dev, port, group, RTM_DELMDB); ++ br_mdb_notify(br->dev, port, group, RTM_DELMDB, ++ p->state); + + if (!mp->ports && !mp->mglist && + netif_running(br->dev)) + mod_timer(&mp->timer, jiffies); + } + goto out; + } + + if (timer_pending(&other_query->timer)) + goto out; + if (br->multicast_querier) { __br_multicast_send_query(br, port, &mp->addr); diff --cc net/ipv4/ip_fragment.c index f44bccc42494,921138f6c97c..d96722ae8979 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c @@@ -586,22 -587,35 +586,22 @@@ static int ip_frag_reasm(struct ipq *qp head->len -= clone->len; clone->csum = 0; clone->ip_summed = head->ip_summed; - add_frag_mem_limit(&qp->q, clone->truesize); + add_frag_mem_limit(qp->q.net, clone->truesize); } + skb_shinfo(head)->frag_list = head->next; skb_push(head, head->data - skb_network_header(head)); - sum_truesize = head->truesize; - for (fp = head->next; fp;) { - bool headstolen; - int delta; - struct sk_buff *next = fp->next; - - sum_truesize += fp->truesize; + for (fp=head->next; fp; fp = fp->next) { + head->data_len += fp->len; + head->len += fp->len; if (head->ip_summed != fp->ip_summed) head->ip_summed = CHECKSUM_NONE; else if (head->ip_summed == CHECKSUM_COMPLETE) head->csum = csum_add(head->csum, fp->csum); - - if (skb_try_coalesce(head, fp, &headstolen, &delta)) { - kfree_skb_partial(fp, headstolen); - } else { - if (!skb_shinfo(head)->frag_list) - skb_shinfo(head)->frag_list = fp; - head->data_len += fp->len; - head->len += fp->len; - head->truesize += fp->truesize; - } - fp = next; + head->truesize += fp->truesize; } - sub_frag_mem_limit(&qp->q, head->truesize); - sub_frag_mem_limit(qp->q.net, sum_truesize); ++ sub_frag_mem_limit(qp->q.net, head->truesize); head->next = NULL; head->dev = dev;