diff options
| author | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
| commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
| tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /drivers/net/xen-netback/interface.c | |
| parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
| parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff) | |
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'drivers/net/xen-netback/interface.c')
| -rw-r--r-- | drivers/net/xen-netback/interface.c | 16 | 
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index 1a83e190fc15..e7bd63eb2876 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c @@ -61,6 +61,12 @@ void xenvif_skb_zerocopy_prepare(struct xenvif_queue *queue,  void xenvif_skb_zerocopy_complete(struct xenvif_queue *queue)  {  	atomic_dec(&queue->inflight_packets); + +	/* Wake the dealloc thread _after_ decrementing inflight_packets so +	 * that if kthread_stop() has already been called, the dealloc thread +	 * does not wait forever with nothing to wake it. +	 */ +	wake_up(&queue->dealloc_wq);  }  int xenvif_schedulable(struct xenvif *vif) @@ -165,6 +171,13 @@ static int xenvif_start_xmit(struct sk_buff *skb, struct net_device *dev)  	    !xenvif_schedulable(vif))  		goto drop; +	if (vif->multicast_control && skb->pkt_type == PACKET_MULTICAST) { +		struct ethhdr *eth = (struct ethhdr *)skb->data; + +		if (!xenvif_mcast_match(vif, eth->h_dest)) +			goto drop; +	} +  	cb = XENVIF_RX_CB(skb);  	cb->expires = jiffies + vif->drain_timeout; @@ -421,6 +434,7 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,  	vif->num_queues = 0;  	spin_lock_init(&vif->lock); +	INIT_LIST_HEAD(&vif->fe_mcast_addr);  	dev->netdev_ops	= &xenvif_netdev_ops;  	dev->hw_features = NETIF_F_SG | @@ -655,6 +669,8 @@ void xenvif_disconnect(struct xenvif *vif)  		xenvif_unmap_frontend_rings(queue);  	} + +	xenvif_mcast_addr_list_free(vif);  }  /* Reverse the relevant parts of xenvif_init_queue().  |