|
@@ -2262,7 +2262,7 @@ static struct sk_buff *ixgbe_build_skb(struct ixgbe_ring *rx_ring,
|
|
#define IXGBE_XDP_TX 2
|
|
#define IXGBE_XDP_TX 2
|
|
|
|
|
|
static int ixgbe_xmit_xdp_ring(struct ixgbe_adapter *adapter,
|
|
static int ixgbe_xmit_xdp_ring(struct ixgbe_adapter *adapter,
|
|
- struct xdp_buff *xdp);
|
|
|
|
|
|
+ struct xdp_frame *xdpf);
|
|
|
|
|
|
static struct sk_buff *ixgbe_run_xdp(struct ixgbe_adapter *adapter,
|
|
static struct sk_buff *ixgbe_run_xdp(struct ixgbe_adapter *adapter,
|
|
struct ixgbe_ring *rx_ring,
|
|
struct ixgbe_ring *rx_ring,
|
|
@@ -2270,6 +2270,7 @@ static struct sk_buff *ixgbe_run_xdp(struct ixgbe_adapter *adapter,
|
|
{
|
|
{
|
|
int err, result = IXGBE_XDP_PASS;
|
|
int err, result = IXGBE_XDP_PASS;
|
|
struct bpf_prog *xdp_prog;
|
|
struct bpf_prog *xdp_prog;
|
|
|
|
+ struct xdp_frame *xdpf;
|
|
u32 act;
|
|
u32 act;
|
|
|
|
|
|
rcu_read_lock();
|
|
rcu_read_lock();
|
|
@@ -2278,12 +2279,19 @@ static struct sk_buff *ixgbe_run_xdp(struct ixgbe_adapter *adapter,
|
|
if (!xdp_prog)
|
|
if (!xdp_prog)
|
|
goto xdp_out;
|
|
goto xdp_out;
|
|
|
|
|
|
|
|
+ prefetchw(xdp->data_hard_start); /* xdp_frame write */
|
|
|
|
+
|
|
act = bpf_prog_run_xdp(xdp_prog, xdp);
|
|
act = bpf_prog_run_xdp(xdp_prog, xdp);
|
|
switch (act) {
|
|
switch (act) {
|
|
case XDP_PASS:
|
|
case XDP_PASS:
|
|
break;
|
|
break;
|
|
case XDP_TX:
|
|
case XDP_TX:
|
|
- result = ixgbe_xmit_xdp_ring(adapter, xdp);
|
|
|
|
|
|
+ xdpf = convert_to_xdp_frame(xdp);
|
|
|
|
+ if (unlikely(!xdpf)) {
|
|
|
|
+ result = IXGBE_XDP_CONSUMED;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ result = ixgbe_xmit_xdp_ring(adapter, xdpf);
|
|
break;
|
|
break;
|
|
case XDP_REDIRECT:
|
|
case XDP_REDIRECT:
|
|
err = xdp_do_redirect(adapter->netdev, xdp, xdp_prog);
|
|
err = xdp_do_redirect(adapter->netdev, xdp, xdp_prog);
|
|
@@ -2386,7 +2394,6 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|
xdp.data_hard_start = xdp.data -
|
|
xdp.data_hard_start = xdp.data -
|
|
ixgbe_rx_offset(rx_ring);
|
|
ixgbe_rx_offset(rx_ring);
|
|
xdp.data_end = xdp.data + size;
|
|
xdp.data_end = xdp.data + size;
|
|
- prefetchw(xdp.data_hard_start); /* xdp_frame write */
|
|
|
|
|
|
|
|
skb = ixgbe_run_xdp(adapter, rx_ring, &xdp);
|
|
skb = ixgbe_run_xdp(adapter, rx_ring, &xdp);
|
|
}
|
|
}
|
|
@@ -8344,20 +8351,15 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb,
|
|
}
|
|
}
|
|
|
|
|
|
static int ixgbe_xmit_xdp_ring(struct ixgbe_adapter *adapter,
|
|
static int ixgbe_xmit_xdp_ring(struct ixgbe_adapter *adapter,
|
|
- struct xdp_buff *xdp)
|
|
|
|
|
|
+ struct xdp_frame *xdpf)
|
|
{
|
|
{
|
|
struct ixgbe_ring *ring = adapter->xdp_ring[smp_processor_id()];
|
|
struct ixgbe_ring *ring = adapter->xdp_ring[smp_processor_id()];
|
|
struct ixgbe_tx_buffer *tx_buffer;
|
|
struct ixgbe_tx_buffer *tx_buffer;
|
|
union ixgbe_adv_tx_desc *tx_desc;
|
|
union ixgbe_adv_tx_desc *tx_desc;
|
|
- struct xdp_frame *xdpf;
|
|
|
|
u32 len, cmd_type;
|
|
u32 len, cmd_type;
|
|
dma_addr_t dma;
|
|
dma_addr_t dma;
|
|
u16 i;
|
|
u16 i;
|
|
|
|
|
|
- xdpf = convert_to_xdp_frame(xdp);
|
|
|
|
- if (unlikely(!xdpf))
|
|
|
|
- return -EOVERFLOW;
|
|
|
|
-
|
|
|
|
len = xdpf->len;
|
|
len = xdpf->len;
|
|
|
|
|
|
if (unlikely(!ixgbe_desc_unused(ring)))
|
|
if (unlikely(!ixgbe_desc_unused(ring)))
|
|
@@ -10010,7 +10012,7 @@ static int ixgbe_xdp(struct net_device *dev, struct netdev_bpf *xdp)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-static int ixgbe_xdp_xmit(struct net_device *dev, struct xdp_buff *xdp)
|
|
|
|
|
|
+static int ixgbe_xdp_xmit(struct net_device *dev, struct xdp_frame *xdpf)
|
|
{
|
|
{
|
|
struct ixgbe_adapter *adapter = netdev_priv(dev);
|
|
struct ixgbe_adapter *adapter = netdev_priv(dev);
|
|
struct ixgbe_ring *ring;
|
|
struct ixgbe_ring *ring;
|
|
@@ -10026,7 +10028,7 @@ static int ixgbe_xdp_xmit(struct net_device *dev, struct xdp_buff *xdp)
|
|
if (unlikely(!ring))
|
|
if (unlikely(!ring))
|
|
return -ENXIO;
|
|
return -ENXIO;
|
|
|
|
|
|
- err = ixgbe_xmit_xdp_ring(adapter, xdp);
|
|
|
|
|
|
+ err = ixgbe_xmit_xdp_ring(adapter, xdpf);
|
|
if (err != IXGBE_XDP_TX)
|
|
if (err != IXGBE_XDP_TX)
|
|
return -ENOSPC;
|
|
return -ENOSPC;
|
|
|
|
|