diff options
Diffstat (limited to 'drivers/net/xen-netback')
| -rw-r--r-- | drivers/net/xen-netback/common.h | 5 | ||||
| -rw-r--r-- | drivers/net/xen-netback/interface.c | 4 | ||||
| -rw-r--r-- | drivers/net/xen-netback/netback.c | 12 | 
3 files changed, 13 insertions, 8 deletions
| diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h index 1fcbd83f7ff2..17421da139f2 100644 --- a/drivers/net/xen-netback/common.h +++ b/drivers/net/xen-netback/common.h @@ -390,9 +390,8 @@ bool xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb);  void xenvif_carrier_on(struct xenvif *vif); -/* Callback from stack when TX packet can be released */ -void xenvif_zerocopy_callback(struct sk_buff *skb, struct ubuf_info *ubuf, -			      bool zerocopy_success); +/* Callbacks from stack when TX packet can be released */ +extern const struct ubuf_info_ops xenvif_ubuf_ops;  static inline pending_ring_idx_t nr_pending_reqs(struct xenvif_queue *queue)  { diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index 7cff90aa8d24..325fcb3d1075 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c @@ -358,7 +358,7 @@ static int xenvif_change_mtu(struct net_device *dev, int mtu)  	if (mtu > max)  		return -EINVAL; -	dev->mtu = mtu; +	WRITE_ONCE(dev->mtu, mtu);  	return 0;  } @@ -593,7 +593,7 @@ int xenvif_init_queue(struct xenvif_queue *queue)  	for (i = 0; i < MAX_PENDING_REQS; i++) {  		queue->pending_tx_info[i].callback_struct = (struct ubuf_info_msgzc) -			{ { .callback = xenvif_zerocopy_callback }, +			{ { .ops = &xenvif_ubuf_ops },  			  { { .ctx = NULL,  			      .desc = i } } };  		queue->grant_tx_handle[i] = NETBACK_INVALID_HANDLE; diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index ef76850d9bcd..5836995d6774 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c @@ -38,6 +38,7 @@  #include <linux/if_vlan.h>  #include <linux/udp.h>  #include <linux/highmem.h> +#include <linux/skbuff_ref.h>  #include <net/tcp.h> @@ -1156,7 +1157,7 @@ static int xenvif_handle_frag_list(struct xenvif_queue *queue, struct sk_buff *s  	uarg = skb_shinfo(skb)->destructor_arg;  	/* increase inflight counter to offset decrement in callback */  	atomic_inc(&queue->inflight_packets); -	uarg->callback(NULL, uarg, true); +	uarg->ops->complete(NULL, uarg, true);  	skb_shinfo(skb)->destructor_arg = NULL;  	/* Fill the skb with the new (local) frags. */ @@ -1278,8 +1279,9 @@ static int xenvif_tx_submit(struct xenvif_queue *queue)  	return work_done;  } -void xenvif_zerocopy_callback(struct sk_buff *skb, struct ubuf_info *ubuf_base, -			      bool zerocopy_success) +static void xenvif_zerocopy_callback(struct sk_buff *skb, +				     struct ubuf_info *ubuf_base, +				     bool zerocopy_success)  {  	unsigned long flags;  	pending_ring_idx_t index; @@ -1312,6 +1314,10 @@ void xenvif_zerocopy_callback(struct sk_buff *skb, struct ubuf_info *ubuf_base,  	xenvif_skb_zerocopy_complete(queue);  } +const struct ubuf_info_ops xenvif_ubuf_ops = { +	.complete = xenvif_zerocopy_callback, +}; +  static inline void xenvif_tx_dealloc_action(struct xenvif_queue *queue)  {  	struct gnttab_unmap_grant_ref *gop; | 
