Skip to content
22 changes: 21 additions & 1 deletion drivers/net/xen-netback/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,14 @@ struct xenvif_copy_state {
struct sk_buff_head *completed;
};

struct persistent_gnt {
struct page *page;
grant_ref_t gnt;
grant_handle_t handle;
bool active;
struct rb_node node;
};

struct xenvif_queue { /* Per-queue data for xenvif */
unsigned int id; /* Queue ID, 0-based */
char name[QUEUE_NAME_SIZE]; /* DEVNAME-qN */
Expand Down Expand Up @@ -213,6 +221,12 @@ struct xenvif_queue { /* Per-queue data for xenvif */
u64 credit_window_start;
bool rate_limited;

/* Persistent grants */
struct rb_root persistent_gnts;
unsigned int persistent_gnt_c;
struct gnttab_page_cache persistent_pages;
struct persistent_gnt *tx_pgrants[MAX_PENDING_REQS];

/* Statistics */
struct xenvif_stats stats;
};
Expand Down Expand Up @@ -291,6 +305,7 @@ struct xenvif {
u8 can_sg:1;
u8 ip_csum:1;
u8 ipv6_csum:1;
u8 persistent_grants:1;
u8 multicast_control:1;

/* headroom requested by xen-netfront */
Expand Down Expand Up @@ -408,6 +423,7 @@ extern bool provides_xdp_headroom;
extern unsigned int rx_drain_timeout_msecs;
extern unsigned int rx_stall_timeout_msecs;
extern unsigned int xenvif_max_queues;
extern unsigned int xenvif_max_pgrants;
extern unsigned int xenvif_hash_cache_size;

#ifdef CONFIG_DEBUG_FS
Expand All @@ -416,12 +432,16 @@ extern struct dentry *xen_netback_dbg_root;

void xenvif_skb_zerocopy_prepare(struct xenvif_queue *queue,
struct sk_buff *skb);
void xenvif_skb_zerocopy_complete(struct xenvif_queue *queue);
void xenvif_skb_zerocopy_complete(struct xenvif_queue *queue,
unsigned int pending_dealloc);

/* Multicast control */
bool xenvif_mcast_match(struct xenvif *vif, const u8 *addr);
void xenvif_mcast_addr_list_free(struct xenvif *vif);

/* Persistent grants */
void xenvif_pgrants_destroy(struct xenvif_queue *queue);

/* Hash */
void xenvif_init_hash(struct xenvif *vif);
void xenvif_deinit_hash(struct xenvif *vif);
Expand Down
16 changes: 14 additions & 2 deletions drivers/net/xen-netback/interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,17 @@ void xenvif_skb_zerocopy_prepare(struct xenvif_queue *queue,
atomic_inc(&queue->inflight_packets);
}

void xenvif_skb_zerocopy_complete(struct xenvif_queue *queue)
void xenvif_skb_zerocopy_complete(struct xenvif_queue *queue,
unsigned int pending_dealloc)
{
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);
if (pending_dealloc)
wake_up(&queue->dealloc_wq);
}

static int xenvif_schedulable(struct xenvif *vif)
Expand Down Expand Up @@ -588,12 +590,18 @@ int xenvif_init_queue(struct xenvif_queue *queue)
return -ENOMEM;
}

if (queue->vif->persistent_grants) {
queue->persistent_gnts.rb_node = NULL;
queue->persistent_gnt_c = 0;
}

for (i = 0; i < MAX_PENDING_REQS; i++) {
queue->pending_tx_info[i].callback_struct = (struct ubuf_info_msgzc)
{ { .callback = xenvif_zerocopy_callback },
{ { .ctx = NULL,
.desc = i } } };
queue->grant_tx_handle[i] = NETBACK_INVALID_HANDLE;
queue->tx_pgrants[i] = NULL;
}

return 0;
Expand Down Expand Up @@ -696,6 +704,10 @@ static void xenvif_disconnect_queue(struct xenvif_queue *queue)
}

xenvif_unmap_frontend_data_rings(queue);

if (queue->vif->persistent_grants) {
xenvif_pgrants_destroy(queue);
}
}

int xenvif_connect_data(struct xenvif_queue *queue,
Expand Down
Loading