Skip to content

Commit

Permalink
xen networking: add XDP offset adjustment to xen-netback
Browse files Browse the repository at this point in the history
the patch basically adds the offset adjustment and netfront
state reading to make XDP work on netfront side.

Reviewed-by: Paul Durrant <paul@xen.org>
Signed-off-by: Denis Kirjanov <kda@linux-powerpc.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Denis Kirjanov authored and David S. Miller committed Jul 1, 2020
1 parent 6c5aa6f commit 1c9535c
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 1 deletion.
4 changes: 4 additions & 0 deletions drivers/net/xen-netback/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,9 @@ struct xenvif {
u8 ipv6_csum:1;
u8 multicast_control:1;

/* headroom requested by xen-netfront */
u16 xdp_headroom;

/* Is this interface disabled? True when backend discovers
* frontend is rogue.
*/
Expand Down Expand Up @@ -395,6 +398,7 @@ static inline pending_ring_idx_t nr_pending_reqs(struct xenvif_queue *queue)
irqreturn_t xenvif_interrupt(int irq, void *dev_id);

extern bool separate_tx_rx_irq;
extern bool provides_xdp_headroom;

extern unsigned int rx_drain_timeout_msecs;
extern unsigned int rx_stall_timeout_msecs;
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/xen-netback/interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,8 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,
vif->queues = NULL;
vif->num_queues = 0;

vif->xdp_headroom = 0;

spin_lock_init(&vif->lock);
INIT_LIST_HEAD(&vif->fe_mcast_addr);

Expand Down
7 changes: 7 additions & 0 deletions drivers/net/xen-netback/netback.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,13 @@ unsigned int xenvif_hash_cache_size = XENVIF_HASH_CACHE_SIZE_DEFAULT;
module_param_named(hash_cache_size, xenvif_hash_cache_size, uint, 0644);
MODULE_PARM_DESC(hash_cache_size, "Number of flows in the hash cache");

/* The module parameter tells that we have to put data
* for xen-netfront with the XDP_PACKET_HEADROOM offset
* needed for XDP processing
*/
bool provides_xdp_headroom = true;
module_param(provides_xdp_headroom, bool, 0644);

static void xenvif_idx_release(struct xenvif_queue *queue, u16 pending_idx,
u8 status);

Expand Down
15 changes: 14 additions & 1 deletion drivers/net/xen-netback/rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,19 @@ static void xenvif_rx_next_skb(struct xenvif_queue *queue,
pkt->extra_count++;
}

if (queue->vif->xdp_headroom) {
struct xen_netif_extra_info *extra;

extra = &pkt->extras[XEN_NETIF_EXTRA_TYPE_XDP - 1];

memset(extra, 0, sizeof(struct xen_netif_extra_info));
extra->u.xdp.headroom = queue->vif->xdp_headroom;
extra->type = XEN_NETIF_EXTRA_TYPE_XDP;
extra->flags = 0;

pkt->extra_count++;
}

if (skb->sw_hash) {
struct xen_netif_extra_info *extra;

Expand Down Expand Up @@ -356,7 +369,7 @@ static void xenvif_rx_data_slot(struct xenvif_queue *queue,
struct xen_netif_rx_request *req,
struct xen_netif_rx_response *rsp)
{
unsigned int offset = 0;
unsigned int offset = queue->vif->xdp_headroom;
unsigned int flags;

do {
Expand Down
34 changes: 34 additions & 0 deletions drivers/net/xen-netback/xenbus.c
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,24 @@ static void set_backend_state(struct backend_info *be,
}
}

static void read_xenbus_frontend_xdp(struct backend_info *be,
struct xenbus_device *dev)
{
struct xenvif *vif = be->vif;
u16 headroom;
int err;

err = xenbus_scanf(XBT_NIL, dev->otherend,
"xdp-headroom", "%hu", &headroom);
if (err != 1) {
vif->xdp_headroom = 0;
return;
}
if (headroom > XEN_NETIF_MAX_XDP_HEADROOM)
headroom = XEN_NETIF_MAX_XDP_HEADROOM;
vif->xdp_headroom = headroom;
}

/**
* Callback received when the frontend's state changes.
*/
Expand All @@ -417,6 +435,11 @@ static void frontend_changed(struct xenbus_device *dev,
set_backend_state(be, XenbusStateConnected);
break;

case XenbusStateReconfiguring:
read_xenbus_frontend_xdp(be, dev);
xenbus_switch_state(dev, XenbusStateReconfigured);
break;

case XenbusStateClosing:
set_backend_state(be, XenbusStateClosing);
break;
Expand Down Expand Up @@ -947,6 +970,8 @@ static int read_xenbus_vif_flags(struct backend_info *be)
vif->ipv6_csum = !!xenbus_read_unsigned(dev->otherend,
"feature-ipv6-csum-offload", 0);

read_xenbus_frontend_xdp(be, dev);

return 0;
}

Expand Down Expand Up @@ -1036,6 +1061,15 @@ static int netback_probe(struct xenbus_device *dev,
goto abort_transaction;
}

/* we can adjust a headroom for netfront XDP processing */
err = xenbus_printf(xbt, dev->nodename,
"feature-xdp-headroom", "%d",
provides_xdp_headroom);
if (err) {
message = "writing feature-xdp-headroom";
goto abort_transaction;
}

/* We don't support rx-flip path (except old guests who
* don't grok this feature flag).
*/
Expand Down

0 comments on commit 1c9535c

Please sign in to comment.