Skip to content

Commit 241949e

Browse files
committed
Alexei Starovoitov says: ==================== pull-request: bpf-next 2021-03-24 The following pull-request contains BPF updates for your *net-next* tree. We've added 37 non-merge commits during the last 15 day(s) which contain a total of 65 files changed, 3200 insertions(+), 738 deletions(-). The main changes are: 1) Static linking of multiple BPF ELF files, from Andrii. 2) Move drop error path to devmap for XDP_REDIRECT, from Lorenzo. 3) Spelling fixes from various folks. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents efd13b7 + e2c69f3 commit 241949e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+3200
-738
lines changed

arch/s390/net/bpf_jit_comp.c

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,21 +1209,67 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp,
12091209
*/
12101210
case BPF_STX | BPF_ATOMIC | BPF_DW:
12111211
case BPF_STX | BPF_ATOMIC | BPF_W:
1212-
if (insn->imm != BPF_ADD) {
1212+
{
1213+
bool is32 = BPF_SIZE(insn->code) == BPF_W;
1214+
1215+
switch (insn->imm) {
1216+
/* {op32|op64} {%w0|%src},%src,off(%dst) */
1217+
#define EMIT_ATOMIC(op32, op64) do { \
1218+
EMIT6_DISP_LH(0xeb000000, is32 ? (op32) : (op64), \
1219+
(insn->imm & BPF_FETCH) ? src_reg : REG_W0, \
1220+
src_reg, dst_reg, off); \
1221+
if (is32 && (insn->imm & BPF_FETCH)) \
1222+
EMIT_ZERO(src_reg); \
1223+
} while (0)
1224+
case BPF_ADD:
1225+
case BPF_ADD | BPF_FETCH:
1226+
/* {laal|laalg} */
1227+
EMIT_ATOMIC(0x00fa, 0x00ea);
1228+
break;
1229+
case BPF_AND:
1230+
case BPF_AND | BPF_FETCH:
1231+
/* {lan|lang} */
1232+
EMIT_ATOMIC(0x00f4, 0x00e4);
1233+
break;
1234+
case BPF_OR:
1235+
case BPF_OR | BPF_FETCH:
1236+
/* {lao|laog} */
1237+
EMIT_ATOMIC(0x00f6, 0x00e6);
1238+
break;
1239+
case BPF_XOR:
1240+
case BPF_XOR | BPF_FETCH:
1241+
/* {lax|laxg} */
1242+
EMIT_ATOMIC(0x00f7, 0x00e7);
1243+
break;
1244+
#undef EMIT_ATOMIC
1245+
case BPF_XCHG:
1246+
/* {ly|lg} %w0,off(%dst) */
1247+
EMIT6_DISP_LH(0xe3000000,
1248+
is32 ? 0x0058 : 0x0004, REG_W0, REG_0,
1249+
dst_reg, off);
1250+
/* 0: {csy|csg} %w0,%src,off(%dst) */
1251+
EMIT6_DISP_LH(0xeb000000, is32 ? 0x0014 : 0x0030,
1252+
REG_W0, src_reg, dst_reg, off);
1253+
/* brc 4,0b */
1254+
EMIT4_PCREL_RIC(0xa7040000, 4, jit->prg - 6);
1255+
/* {llgfr|lgr} %src,%w0 */
1256+
EMIT4(is32 ? 0xb9160000 : 0xb9040000, src_reg, REG_W0);
1257+
if (is32 && insn_is_zext(&insn[1]))
1258+
insn_count = 2;
1259+
break;
1260+
case BPF_CMPXCHG:
1261+
/* 0: {csy|csg} %b0,%src,off(%dst) */
1262+
EMIT6_DISP_LH(0xeb000000, is32 ? 0x0014 : 0x0030,
1263+
BPF_REG_0, src_reg, dst_reg, off);
1264+
break;
1265+
default:
12131266
pr_err("Unknown atomic operation %02x\n", insn->imm);
12141267
return -1;
12151268
}
12161269

1217-
/* *(u32/u64 *)(dst + off) += src
1218-
*
1219-
* BFW_W: laal %w0,%src,off(%dst)
1220-
* BPF_DW: laalg %w0,%src,off(%dst)
1221-
*/
1222-
EMIT6_DISP_LH(0xeb000000,
1223-
BPF_SIZE(insn->code) == BPF_W ? 0x00fa : 0x00ea,
1224-
REG_W0, src_reg, dst_reg, off);
12251270
jit->seen |= SEEN_MEM;
12261271
break;
1272+
}
12271273
/*
12281274
* BPF_LDX
12291275
*/

drivers/net/ethernet/amazon/ena/ena_netdev.c

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ static int ena_xdp_xmit_frame(struct ena_ring *xdp_ring,
300300

301301
rc = ena_xdp_tx_map_frame(xdp_ring, tx_info, xdpf, &push_hdr, &push_len);
302302
if (unlikely(rc))
303-
goto error_drop_packet;
303+
return rc;
304304

305305
ena_tx_ctx.ena_bufs = tx_info->bufs;
306306
ena_tx_ctx.push_header = push_hdr;
@@ -330,17 +330,15 @@ static int ena_xdp_xmit_frame(struct ena_ring *xdp_ring,
330330
error_unmap_dma:
331331
ena_unmap_tx_buff(xdp_ring, tx_info);
332332
tx_info->xdpf = NULL;
333-
error_drop_packet:
334-
xdp_return_frame(xdpf);
335333
return rc;
336334
}
337335

338336
static int ena_xdp_xmit(struct net_device *dev, int n,
339337
struct xdp_frame **frames, u32 flags)
340338
{
341339
struct ena_adapter *adapter = netdev_priv(dev);
342-
int qid, i, err, drops = 0;
343340
struct ena_ring *xdp_ring;
341+
int qid, i, nxmit = 0;
344342

345343
if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
346344
return -EINVAL;
@@ -360,12 +358,9 @@ static int ena_xdp_xmit(struct net_device *dev, int n,
360358
spin_lock(&xdp_ring->xdp_tx_lock);
361359

362360
for (i = 0; i < n; i++) {
363-
err = ena_xdp_xmit_frame(xdp_ring, dev, frames[i], 0);
364-
/* The descriptor is freed by ena_xdp_xmit_frame in case
365-
* of an error.
366-
*/
367-
if (err)
368-
drops++;
361+
if (ena_xdp_xmit_frame(xdp_ring, dev, frames[i], 0))
362+
break;
363+
nxmit++;
369364
}
370365

371366
/* Ring doorbell to make device aware of the packets */
@@ -378,7 +373,7 @@ static int ena_xdp_xmit(struct net_device *dev, int n,
378373
spin_unlock(&xdp_ring->xdp_tx_lock);
379374

380375
/* Return number of packets sent */
381-
return n - drops;
376+
return nxmit;
382377
}
383378

384379
static int ena_xdp_execute(struct ena_ring *rx_ring, struct xdp_buff *xdp)
@@ -415,7 +410,9 @@ static int ena_xdp_execute(struct ena_ring *rx_ring, struct xdp_buff *xdp)
415410
/* The XDP queues are shared between XDP_TX and XDP_REDIRECT */
416411
spin_lock(&xdp_ring->xdp_tx_lock);
417412

418-
ena_xdp_xmit_frame(xdp_ring, rx_ring->netdev, xdpf, XDP_XMIT_FLUSH);
413+
if (ena_xdp_xmit_frame(xdp_ring, rx_ring->netdev, xdpf,
414+
XDP_XMIT_FLUSH))
415+
xdp_return_frame(xdpf);
419416

420417
spin_unlock(&xdp_ring->xdp_tx_lock);
421418
xdp_stat = &rx_ring->rx_stats.xdp_tx;

drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ int bnxt_xdp_xmit(struct net_device *dev, int num_frames,
217217
struct pci_dev *pdev = bp->pdev;
218218
struct bnxt_tx_ring_info *txr;
219219
dma_addr_t mapping;
220-
int drops = 0;
220+
int nxmit = 0;
221221
int ring;
222222
int i;
223223

@@ -233,21 +233,17 @@ int bnxt_xdp_xmit(struct net_device *dev, int num_frames,
233233
struct xdp_frame *xdp = frames[i];
234234

235235
if (!txr || !bnxt_tx_avail(bp, txr) ||
236-
!(bp->bnapi[ring]->flags & BNXT_NAPI_FLAG_XDP)) {
237-
xdp_return_frame_rx_napi(xdp);
238-
drops++;
239-
continue;
240-
}
236+
!(bp->bnapi[ring]->flags & BNXT_NAPI_FLAG_XDP))
237+
break;
241238

242239
mapping = dma_map_single(&pdev->dev, xdp->data, xdp->len,
243240
DMA_TO_DEVICE);
244241

245-
if (dma_mapping_error(&pdev->dev, mapping)) {
246-
xdp_return_frame_rx_napi(xdp);
247-
drops++;
248-
continue;
249-
}
242+
if (dma_mapping_error(&pdev->dev, mapping))
243+
break;
244+
250245
__bnxt_xmit_xdp_redirect(bp, txr, mapping, xdp->len, xdp);
246+
nxmit++;
251247
}
252248

253249
if (flags & XDP_XMIT_FLUSH) {
@@ -256,7 +252,7 @@ int bnxt_xdp_xmit(struct net_device *dev, int num_frames,
256252
bnxt_db_write(bp, &txr->tx_db, txr->tx_prod);
257253
}
258254

259-
return num_frames - drops;
255+
return nxmit;
260256
}
261257

262258
/* Under rtnl_lock */

drivers/net/ethernet/freescale/dpaa/dpaa_eth.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3081,7 +3081,7 @@ static int dpaa_xdp_xmit(struct net_device *net_dev, int n,
30813081
struct xdp_frame **frames, u32 flags)
30823082
{
30833083
struct xdp_frame *xdpf;
3084-
int i, err, drops = 0;
3084+
int i, nxmit = 0;
30853085

30863086
if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
30873087
return -EINVAL;
@@ -3091,14 +3091,12 @@ static int dpaa_xdp_xmit(struct net_device *net_dev, int n,
30913091

30923092
for (i = 0; i < n; i++) {
30933093
xdpf = frames[i];
3094-
err = dpaa_xdp_xmit_frame(net_dev, xdpf);
3095-
if (err) {
3096-
xdp_return_frame_rx_napi(xdpf);
3097-
drops++;
3098-
}
3094+
if (dpaa_xdp_xmit_frame(net_dev, xdpf))
3095+
break;
3096+
nxmit++;
30993097
}
31003098

3101-
return n - drops;
3099+
return nxmit;
31023100
}
31033101

31043102
static int dpaa_ts_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)

drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2431,8 +2431,6 @@ static int dpaa2_eth_xdp_xmit(struct net_device *net_dev, int n,
24312431
percpu_stats->tx_packets += enqueued;
24322432
for (i = 0; i < enqueued; i++)
24332433
percpu_stats->tx_bytes += dpaa2_fd_get_len(&fds[i]);
2434-
for (i = enqueued; i < n; i++)
2435-
xdp_return_frame_rx_napi(frames[i]);
24362434

24372435
return enqueued;
24382436
}

drivers/net/ethernet/intel/i40e/i40e_txrx.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3835,8 +3835,8 @@ netdev_tx_t i40e_lan_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
38353835
* @frames: array of XDP buffer pointers
38363836
* @flags: XDP extra info
38373837
*
3838-
* Returns number of frames successfully sent. Frames that fail are
3839-
* free'ed via XDP return API.
3838+
* Returns number of frames successfully sent. Failed frames
3839+
* will be free'ed by XDP core.
38403840
*
38413841
* For error cases, a negative errno code is returned and no-frames
38423842
* are transmitted (caller must handle freeing frames).
@@ -3849,7 +3849,7 @@ int i40e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
38493849
struct i40e_vsi *vsi = np->vsi;
38503850
struct i40e_pf *pf = vsi->back;
38513851
struct i40e_ring *xdp_ring;
3852-
int drops = 0;
3852+
int nxmit = 0;
38533853
int i;
38543854

38553855
if (test_bit(__I40E_VSI_DOWN, vsi->state))
@@ -3869,14 +3869,13 @@ int i40e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
38693869
int err;
38703870

38713871
err = i40e_xmit_xdp_ring(xdpf, xdp_ring);
3872-
if (err != I40E_XDP_TX) {
3873-
xdp_return_frame_rx_napi(xdpf);
3874-
drops++;
3875-
}
3872+
if (err != I40E_XDP_TX)
3873+
break;
3874+
nxmit++;
38763875
}
38773876

38783877
if (unlikely(flags & XDP_XMIT_FLUSH))
38793878
i40e_xdp_ring_update_tail(xdp_ring);
38803879

3881-
return n - drops;
3880+
return nxmit;
38823881
}

drivers/net/ethernet/intel/ice/ice_txrx.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -554,8 +554,8 @@ ice_run_xdp(struct ice_ring *rx_ring, struct xdp_buff *xdp,
554554
* @frames: XDP frames to be transmitted
555555
* @flags: transmit flags
556556
*
557-
* Returns number of frames successfully sent. Frames that fail are
558-
* free'ed via XDP return API.
557+
* Returns number of frames successfully sent. Failed frames
558+
* will be free'ed by XDP core.
559559
* For error cases, a negative errno code is returned and no-frames
560560
* are transmitted (caller must handle freeing frames).
561561
*/
@@ -567,7 +567,7 @@ ice_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
567567
unsigned int queue_index = smp_processor_id();
568568
struct ice_vsi *vsi = np->vsi;
569569
struct ice_ring *xdp_ring;
570-
int drops = 0, i;
570+
int nxmit = 0, i;
571571

572572
if (test_bit(__ICE_DOWN, vsi->state))
573573
return -ENETDOWN;
@@ -584,16 +584,15 @@ ice_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
584584
int err;
585585

586586
err = ice_xmit_xdp_ring(xdpf->data, xdpf->len, xdp_ring);
587-
if (err != ICE_XDP_TX) {
588-
xdp_return_frame_rx_napi(xdpf);
589-
drops++;
590-
}
587+
if (err != ICE_XDP_TX)
588+
break;
589+
nxmit++;
591590
}
592591

593592
if (unlikely(flags & XDP_XMIT_FLUSH))
594593
ice_xdp_ring_update_tail(xdp_ring);
595594

596-
return n - drops;
595+
return nxmit;
597596
}
598597

599598
/**

drivers/net/ethernet/intel/igb/igb_main.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2934,7 +2934,7 @@ static int igb_xdp_xmit(struct net_device *dev, int n,
29342934
int cpu = smp_processor_id();
29352935
struct igb_ring *tx_ring;
29362936
struct netdev_queue *nq;
2937-
int drops = 0;
2937+
int nxmit = 0;
29382938
int i;
29392939

29402940
if (unlikely(test_bit(__IGB_DOWN, &adapter->state)))
@@ -2961,18 +2961,17 @@ static int igb_xdp_xmit(struct net_device *dev, int n,
29612961
int err;
29622962

29632963
err = igb_xmit_xdp_ring(adapter, tx_ring, xdpf);
2964-
if (err != IGB_XDP_TX) {
2965-
xdp_return_frame_rx_napi(xdpf);
2966-
drops++;
2967-
}
2964+
if (err != IGB_XDP_TX)
2965+
break;
2966+
nxmit++;
29682967
}
29692968

29702969
__netif_tx_unlock(nq);
29712970

29722971
if (unlikely(flags & XDP_XMIT_FLUSH))
29732972
igb_xdp_ring_update_tail(tx_ring);
29742973

2975-
return n - drops;
2974+
return nxmit;
29762975
}
29772976

29782977
static const struct net_device_ops igb_netdev_ops = {

drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10189,7 +10189,7 @@ static int ixgbe_xdp_xmit(struct net_device *dev, int n,
1018910189
{
1019010190
struct ixgbe_adapter *adapter = netdev_priv(dev);
1019110191
struct ixgbe_ring *ring;
10192-
int drops = 0;
10192+
int nxmit = 0;
1019310193
int i;
1019410194

1019510195
if (unlikely(test_bit(__IXGBE_DOWN, &adapter->state)))
@@ -10213,16 +10213,15 @@ static int ixgbe_xdp_xmit(struct net_device *dev, int n,
1021310213
int err;
1021410214

1021510215
err = ixgbe_xmit_xdp_ring(adapter, xdpf);
10216-
if (err != IXGBE_XDP_TX) {
10217-
xdp_return_frame_rx_napi(xdpf);
10218-
drops++;
10219-
}
10216+
if (err != IXGBE_XDP_TX)
10217+
break;
10218+
nxmit++;
1022010219
}
1022110220

1022210221
if (unlikely(flags & XDP_XMIT_FLUSH))
1022310222
ixgbe_xdp_ring_update_tail(ring);
1022410223

10225-
return n - drops;
10224+
return nxmit;
1022610225
}
1022710226

1022810227
static const struct net_device_ops ixgbe_netdev_ops = {

drivers/net/ethernet/marvell/mvneta.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2137,7 +2137,7 @@ mvneta_xdp_xmit(struct net_device *dev, int num_frame,
21372137
{
21382138
struct mvneta_port *pp = netdev_priv(dev);
21392139
struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats);
2140-
int i, nxmit_byte = 0, nxmit = num_frame;
2140+
int i, nxmit_byte = 0, nxmit = 0;
21412141
int cpu = smp_processor_id();
21422142
struct mvneta_tx_queue *txq;
21432143
struct netdev_queue *nq;
@@ -2155,12 +2155,11 @@ mvneta_xdp_xmit(struct net_device *dev, int num_frame,
21552155
__netif_tx_lock(nq, cpu);
21562156
for (i = 0; i < num_frame; i++) {
21572157
ret = mvneta_xdp_submit_frame(pp, txq, frames[i], true);
2158-
if (ret == MVNETA_XDP_TX) {
2159-
nxmit_byte += frames[i]->len;
2160-
} else {
2161-
xdp_return_frame_rx_napi(frames[i]);
2162-
nxmit--;
2163-
}
2158+
if (ret != MVNETA_XDP_TX)
2159+
break;
2160+
2161+
nxmit_byte += frames[i]->len;
2162+
nxmit++;
21642163
}
21652164

21662165
if (unlikely(flags & XDP_XMIT_FLUSH))

0 commit comments

Comments
 (0)