Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'ena-driver-xdp-changes'

David Arinzon says:

====================
ENA driver XDP changes

This patchset contains multiple XDP-related changes
in the ENA driver, including moving the XDP code to
dedicated files.
====================

Link: https://lore.kernel.org/r/20240101190855.18739-1-darinzon@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+736 -692
+1
Documentation/networking/device_drivers/ethernet/amazon/ena.rst
··· 54 54 ena_regs_defs.h Definition of ENA PCI memory-mapped (MMIO) registers. 55 55 ena_netdev.[ch] Main Linux kernel driver. 56 56 ena_ethtool.c ethtool callbacks. 57 + ena_xdp.[ch] XDP files 57 58 ena_pci_id_tbl.h Supported device IDs. 58 59 ================= ====================================================== 59 60
+1 -1
drivers/net/ethernet/amazon/ena/Makefile
··· 5 5 6 6 obj-$(CONFIG_ENA_ETHERNET) += ena.o 7 7 8 - ena-y := ena_netdev.o ena_com.o ena_eth_com.o ena_ethtool.o 8 + ena-y := ena_netdev.o ena_com.o ena_eth_com.o ena_ethtool.o ena_xdp.o
+8 -10
drivers/net/ethernet/amazon/ena/ena_ethtool.c
··· 7 7 #include <linux/pci.h> 8 8 9 9 #include "ena_netdev.h" 10 + #include "ena_xdp.h" 10 11 11 12 struct ena_stats { 12 13 char name[ETH_GSTRING_LEN]; ··· 263 262 ena_stats->name); 264 263 } 265 264 266 - if (!is_xdp) { 267 - /* RX stats, in XDP there isn't a RX queue 268 - * counterpart 269 - */ 270 - for (j = 0; j < ENA_STATS_ARRAY_RX; j++) { 271 - ena_stats = &ena_stats_rx_strings[j]; 265 + /* In XDP there isn't an RX queue counterpart */ 266 + if (is_xdp) 267 + continue; 272 268 273 - ethtool_sprintf(data, 274 - "queue_%u_rx_%s", i, 275 - ena_stats->name); 276 - } 269 + for (j = 0; j < ENA_STATS_ARRAY_RX; j++) { 270 + ena_stats = &ena_stats_rx_strings[j]; 271 + 272 + ethtool_sprintf(data, "queue_%u_rx_%s", i, ena_stats->name); 277 273 } 278 274 } 279 275 }
+64 -625
drivers/net/ethernet/amazon/ena/ena_netdev.c
··· 19 19 #include <net/ip.h> 20 20 21 21 #include "ena_netdev.h" 22 - #include <linux/bpf_trace.h> 23 22 #include "ena_pci_id_tbl.h" 23 + #include "ena_xdp.h" 24 24 25 25 MODULE_AUTHOR("Amazon.com, Inc. or its affiliates"); 26 26 MODULE_DESCRIPTION(DEVICE_NAME); ··· 44 44 static void check_for_admin_com_state(struct ena_adapter *adapter); 45 45 static void ena_destroy_device(struct ena_adapter *adapter, bool graceful); 46 46 static int ena_restore_device(struct ena_adapter *adapter); 47 - 48 - static void ena_init_io_rings(struct ena_adapter *adapter, 49 - int first_index, int count); 50 - static void ena_init_napi_in_range(struct ena_adapter *adapter, int first_index, 51 - int count); 52 - static void ena_del_napi_in_range(struct ena_adapter *adapter, int first_index, 53 - int count); 54 - static int ena_setup_tx_resources(struct ena_adapter *adapter, int qid); 55 - static int ena_setup_tx_resources_in_range(struct ena_adapter *adapter, 56 - int first_index, 57 - int count); 58 - static int ena_create_io_tx_queue(struct ena_adapter *adapter, int qid); 59 - static void ena_free_tx_resources(struct ena_adapter *adapter, int qid); 60 - static int ena_clean_xdp_irq(struct ena_ring *xdp_ring, u32 budget); 61 - static void ena_destroy_all_tx_queues(struct ena_adapter *adapter); 62 - static void ena_free_all_io_tx_resources(struct ena_adapter *adapter); 63 - static void ena_napi_disable_in_range(struct ena_adapter *adapter, 64 - int first_index, int count); 65 - static void ena_napi_enable_in_range(struct ena_adapter *adapter, 66 - int first_index, int count); 67 - static int ena_up(struct ena_adapter *adapter); 68 - static void ena_down(struct ena_adapter *adapter); 69 - static void ena_unmask_interrupt(struct ena_ring *tx_ring, 70 - struct ena_ring *rx_ring); 71 - static void ena_update_ring_numa_node(struct ena_ring *tx_ring, 72 - struct ena_ring *rx_ring); 73 - static void ena_unmap_tx_buff(struct ena_ring *tx_ring, 74 - struct ena_tx_buffer *tx_info); 75 - static int ena_create_io_tx_queues_in_range(struct ena_adapter *adapter, 76 - int first_index, int count); 77 - static void ena_free_all_io_tx_resources_in_range(struct ena_adapter *adapter, 78 - int first_index, int count); 79 - 80 - /* Increase a stat by cnt while holding syncp seqlock on 32bit machines */ 81 - static void ena_increase_stat(u64 *statp, u64 cnt, 82 - struct u64_stats_sync *syncp) 83 - { 84 - u64_stats_update_begin(syncp); 85 - (*statp) += cnt; 86 - u64_stats_update_end(syncp); 87 - } 88 - 89 - static void ena_ring_tx_doorbell(struct ena_ring *tx_ring) 90 - { 91 - ena_com_write_sq_doorbell(tx_ring->ena_com_io_sq); 92 - ena_increase_stat(&tx_ring->tx_stats.doorbells, 1, &tx_ring->syncp); 93 - } 94 47 95 48 static void ena_tx_timeout(struct net_device *dev, unsigned int txqueue) 96 49 { ··· 88 135 return ret; 89 136 } 90 137 91 - static int ena_xmit_common(struct net_device *dev, 92 - struct ena_ring *ring, 93 - struct ena_tx_buffer *tx_info, 94 - struct ena_com_tx_ctx *ena_tx_ctx, 95 - u16 next_to_use, 96 - u32 bytes) 138 + int ena_xmit_common(struct ena_adapter *adapter, 139 + struct ena_ring *ring, 140 + struct ena_tx_buffer *tx_info, 141 + struct ena_com_tx_ctx *ena_tx_ctx, 142 + u16 next_to_use, 143 + u32 bytes) 97 144 { 98 - struct ena_adapter *adapter = netdev_priv(dev); 99 145 int rc, nb_hw_desc; 100 146 101 147 if (unlikely(ena_com_is_doorbell_needed(ring->ena_com_io_sq, 102 148 ena_tx_ctx))) { 103 - netif_dbg(adapter, tx_queued, dev, 149 + netif_dbg(adapter, tx_queued, adapter->netdev, 104 150 "llq tx max burst size of queue %d achieved, writing doorbell to send burst\n", 105 151 ring->qid); 106 152 ena_ring_tx_doorbell(ring); ··· 114 162 * ena_com_prepare_tx() are fatal and therefore require a device reset. 115 163 */ 116 164 if (unlikely(rc)) { 117 - netif_err(adapter, tx_queued, dev, 165 + netif_err(adapter, tx_queued, adapter->netdev, 118 166 "Failed to prepare tx bufs\n"); 119 167 ena_increase_stat(&ring->tx_stats.prepare_ctx_err, 1, 120 168 &ring->syncp); ··· 130 178 u64_stats_update_end(&ring->syncp); 131 179 132 180 tx_info->tx_descs = nb_hw_desc; 181 + tx_info->total_tx_size = bytes; 133 182 tx_info->last_jiffies = jiffies; 134 183 tx_info->print_once = 0; 135 184 136 185 ring->next_to_use = ENA_TX_RING_IDX_NEXT(next_to_use, 137 186 ring->ring_size); 138 - return 0; 139 - } 140 - 141 - /* This is the XDP napi callback. XDP queues use a separate napi callback 142 - * than Rx/Tx queues. 143 - */ 144 - static int ena_xdp_io_poll(struct napi_struct *napi, int budget) 145 - { 146 - struct ena_napi *ena_napi = container_of(napi, struct ena_napi, napi); 147 - u32 xdp_work_done, xdp_budget; 148 - struct ena_ring *xdp_ring; 149 - int napi_comp_call = 0; 150 - int ret; 151 - 152 - xdp_ring = ena_napi->xdp_ring; 153 - 154 - xdp_budget = budget; 155 - 156 - if (!test_bit(ENA_FLAG_DEV_UP, &xdp_ring->adapter->flags) || 157 - test_bit(ENA_FLAG_TRIGGER_RESET, &xdp_ring->adapter->flags)) { 158 - napi_complete_done(napi, 0); 159 - return 0; 160 - } 161 - 162 - xdp_work_done = ena_clean_xdp_irq(xdp_ring, xdp_budget); 163 - 164 - /* If the device is about to reset or down, avoid unmask 165 - * the interrupt and return 0 so NAPI won't reschedule 166 - */ 167 - if (unlikely(!test_bit(ENA_FLAG_DEV_UP, &xdp_ring->adapter->flags))) { 168 - napi_complete_done(napi, 0); 169 - ret = 0; 170 - } else if (xdp_budget > xdp_work_done) { 171 - napi_comp_call = 1; 172 - if (napi_complete_done(napi, xdp_work_done)) 173 - ena_unmask_interrupt(xdp_ring, NULL); 174 - ena_update_ring_numa_node(xdp_ring, NULL); 175 - ret = xdp_work_done; 176 - } else { 177 - ret = xdp_budget; 178 - } 179 - 180 - u64_stats_update_begin(&xdp_ring->syncp); 181 - xdp_ring->tx_stats.napi_comp += napi_comp_call; 182 - xdp_ring->tx_stats.tx_poll++; 183 - u64_stats_update_end(&xdp_ring->syncp); 184 - xdp_ring->tx_stats.last_napi_jiffies = jiffies; 185 - 186 - return ret; 187 - } 188 - 189 - static int ena_xdp_tx_map_frame(struct ena_ring *xdp_ring, 190 - struct ena_tx_buffer *tx_info, 191 - struct xdp_frame *xdpf, 192 - struct ena_com_tx_ctx *ena_tx_ctx) 193 - { 194 - struct ena_adapter *adapter = xdp_ring->adapter; 195 - struct ena_com_buf *ena_buf; 196 - int push_len = 0; 197 - dma_addr_t dma; 198 - void *data; 199 - u32 size; 200 - 201 - tx_info->xdpf = xdpf; 202 - data = tx_info->xdpf->data; 203 - size = tx_info->xdpf->len; 204 - 205 - if (xdp_ring->tx_mem_queue_type == ENA_ADMIN_PLACEMENT_POLICY_DEV) { 206 - /* Designate part of the packet for LLQ */ 207 - push_len = min_t(u32, size, xdp_ring->tx_max_header_size); 208 - 209 - ena_tx_ctx->push_header = data; 210 - 211 - size -= push_len; 212 - data += push_len; 213 - } 214 - 215 - ena_tx_ctx->header_len = push_len; 216 - 217 - if (size > 0) { 218 - dma = dma_map_single(xdp_ring->dev, 219 - data, 220 - size, 221 - DMA_TO_DEVICE); 222 - if (unlikely(dma_mapping_error(xdp_ring->dev, dma))) 223 - goto error_report_dma_error; 224 - 225 - tx_info->map_linear_data = 0; 226 - 227 - ena_buf = tx_info->bufs; 228 - ena_buf->paddr = dma; 229 - ena_buf->len = size; 230 - 231 - ena_tx_ctx->ena_bufs = ena_buf; 232 - ena_tx_ctx->num_bufs = tx_info->num_of_bufs = 1; 233 - } 234 - 235 - return 0; 236 - 237 - error_report_dma_error: 238 - ena_increase_stat(&xdp_ring->tx_stats.dma_mapping_err, 1, 239 - &xdp_ring->syncp); 240 - netif_warn(adapter, tx_queued, adapter->netdev, "Failed to map xdp buff\n"); 241 - 242 - return -EINVAL; 243 - } 244 - 245 - static int ena_xdp_xmit_frame(struct ena_ring *xdp_ring, 246 - struct net_device *dev, 247 - struct xdp_frame *xdpf, 248 - int flags) 249 - { 250 - struct ena_com_tx_ctx ena_tx_ctx = {}; 251 - struct ena_tx_buffer *tx_info; 252 - u16 next_to_use, req_id; 253 - int rc; 254 - 255 - next_to_use = xdp_ring->next_to_use; 256 - req_id = xdp_ring->free_ids[next_to_use]; 257 - tx_info = &xdp_ring->tx_buffer_info[req_id]; 258 - tx_info->num_of_bufs = 0; 259 - 260 - rc = ena_xdp_tx_map_frame(xdp_ring, tx_info, xdpf, &ena_tx_ctx); 261 - if (unlikely(rc)) 262 - return rc; 263 - 264 - ena_tx_ctx.req_id = req_id; 265 - 266 - rc = ena_xmit_common(dev, 267 - xdp_ring, 268 - tx_info, 269 - &ena_tx_ctx, 270 - next_to_use, 271 - xdpf->len); 272 - if (rc) 273 - goto error_unmap_dma; 274 - 275 - /* trigger the dma engine. ena_ring_tx_doorbell() 276 - * calls a memory barrier inside it. 277 - */ 278 - if (flags & XDP_XMIT_FLUSH) 279 - ena_ring_tx_doorbell(xdp_ring); 280 - 281 - return rc; 282 - 283 - error_unmap_dma: 284 - ena_unmap_tx_buff(xdp_ring, tx_info); 285 - tx_info->xdpf = NULL; 286 - return rc; 287 - } 288 - 289 - static int ena_xdp_xmit(struct net_device *dev, int n, 290 - struct xdp_frame **frames, u32 flags) 291 - { 292 - struct ena_adapter *adapter = netdev_priv(dev); 293 - struct ena_ring *xdp_ring; 294 - int qid, i, nxmit = 0; 295 - 296 - if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) 297 - return -EINVAL; 298 - 299 - if (!test_bit(ENA_FLAG_DEV_UP, &adapter->flags)) 300 - return -ENETDOWN; 301 - 302 - /* We assume that all rings have the same XDP program */ 303 - if (!READ_ONCE(adapter->rx_ring->xdp_bpf_prog)) 304 - return -ENXIO; 305 - 306 - qid = smp_processor_id() % adapter->xdp_num_queues; 307 - qid += adapter->xdp_first_ring; 308 - xdp_ring = &adapter->tx_ring[qid]; 309 - 310 - /* Other CPU ids might try to send thorugh this queue */ 311 - spin_lock(&xdp_ring->xdp_tx_lock); 312 - 313 - for (i = 0; i < n; i++) { 314 - if (ena_xdp_xmit_frame(xdp_ring, dev, frames[i], 0)) 315 - break; 316 - nxmit++; 317 - } 318 - 319 - /* Ring doorbell to make device aware of the packets */ 320 - if (flags & XDP_XMIT_FLUSH) 321 - ena_ring_tx_doorbell(xdp_ring); 322 - 323 - spin_unlock(&xdp_ring->xdp_tx_lock); 324 - 325 - /* Return number of packets sent */ 326 - return nxmit; 327 - } 328 - 329 - static int ena_xdp_execute(struct ena_ring *rx_ring, struct xdp_buff *xdp) 330 - { 331 - u32 verdict = ENA_XDP_PASS; 332 - struct bpf_prog *xdp_prog; 333 - struct ena_ring *xdp_ring; 334 - struct xdp_frame *xdpf; 335 - u64 *xdp_stat; 336 - 337 - xdp_prog = READ_ONCE(rx_ring->xdp_bpf_prog); 338 - 339 - if (!xdp_prog) 340 - goto out; 341 - 342 - verdict = bpf_prog_run_xdp(xdp_prog, xdp); 343 - 344 - switch (verdict) { 345 - case XDP_TX: 346 - xdpf = xdp_convert_buff_to_frame(xdp); 347 - if (unlikely(!xdpf)) { 348 - trace_xdp_exception(rx_ring->netdev, xdp_prog, verdict); 349 - xdp_stat = &rx_ring->rx_stats.xdp_aborted; 350 - verdict = ENA_XDP_DROP; 351 - break; 352 - } 353 - 354 - /* Find xmit queue */ 355 - xdp_ring = rx_ring->xdp_ring; 356 - 357 - /* The XDP queues are shared between XDP_TX and XDP_REDIRECT */ 358 - spin_lock(&xdp_ring->xdp_tx_lock); 359 - 360 - if (ena_xdp_xmit_frame(xdp_ring, rx_ring->netdev, xdpf, 361 - XDP_XMIT_FLUSH)) 362 - xdp_return_frame(xdpf); 363 - 364 - spin_unlock(&xdp_ring->xdp_tx_lock); 365 - xdp_stat = &rx_ring->rx_stats.xdp_tx; 366 - verdict = ENA_XDP_TX; 367 - break; 368 - case XDP_REDIRECT: 369 - if (likely(!xdp_do_redirect(rx_ring->netdev, xdp, xdp_prog))) { 370 - xdp_stat = &rx_ring->rx_stats.xdp_redirect; 371 - verdict = ENA_XDP_REDIRECT; 372 - break; 373 - } 374 - trace_xdp_exception(rx_ring->netdev, xdp_prog, verdict); 375 - xdp_stat = &rx_ring->rx_stats.xdp_aborted; 376 - verdict = ENA_XDP_DROP; 377 - break; 378 - case XDP_ABORTED: 379 - trace_xdp_exception(rx_ring->netdev, xdp_prog, verdict); 380 - xdp_stat = &rx_ring->rx_stats.xdp_aborted; 381 - verdict = ENA_XDP_DROP; 382 - break; 383 - case XDP_DROP: 384 - xdp_stat = &rx_ring->rx_stats.xdp_drop; 385 - verdict = ENA_XDP_DROP; 386 - break; 387 - case XDP_PASS: 388 - xdp_stat = &rx_ring->rx_stats.xdp_pass; 389 - verdict = ENA_XDP_PASS; 390 - break; 391 - default: 392 - bpf_warn_invalid_xdp_action(rx_ring->netdev, xdp_prog, verdict); 393 - xdp_stat = &rx_ring->rx_stats.xdp_invalid; 394 - verdict = ENA_XDP_DROP; 395 - } 396 - 397 - ena_increase_stat(xdp_stat, 1, &rx_ring->syncp); 398 - out: 399 - return verdict; 400 - } 401 - 402 - static void ena_init_all_xdp_queues(struct ena_adapter *adapter) 403 - { 404 - adapter->xdp_first_ring = adapter->num_io_queues; 405 - adapter->xdp_num_queues = adapter->num_io_queues; 406 - 407 - ena_init_io_rings(adapter, 408 - adapter->xdp_first_ring, 409 - adapter->xdp_num_queues); 410 - } 411 - 412 - static int ena_setup_and_create_all_xdp_queues(struct ena_adapter *adapter) 413 - { 414 - u32 xdp_first_ring = adapter->xdp_first_ring; 415 - u32 xdp_num_queues = adapter->xdp_num_queues; 416 - int rc = 0; 417 - 418 - rc = ena_setup_tx_resources_in_range(adapter, xdp_first_ring, xdp_num_queues); 419 - if (rc) 420 - goto setup_err; 421 - 422 - rc = ena_create_io_tx_queues_in_range(adapter, xdp_first_ring, xdp_num_queues); 423 - if (rc) 424 - goto create_err; 425 - 426 - return 0; 427 - 428 - create_err: 429 - ena_free_all_io_tx_resources_in_range(adapter, xdp_first_ring, xdp_num_queues); 430 - setup_err: 431 - return rc; 432 - } 433 - 434 - /* Provides a way for both kernel and bpf-prog to know 435 - * more about the RX-queue a given XDP frame arrived on. 436 - */ 437 - static int ena_xdp_register_rxq_info(struct ena_ring *rx_ring) 438 - { 439 - int rc; 440 - 441 - rc = xdp_rxq_info_reg(&rx_ring->xdp_rxq, rx_ring->netdev, rx_ring->qid, 0); 442 - 443 - if (rc) { 444 - netif_err(rx_ring->adapter, ifup, rx_ring->netdev, 445 - "Failed to register xdp rx queue info. RX queue num %d rc: %d\n", 446 - rx_ring->qid, rc); 447 - goto err; 448 - } 449 - 450 - rc = xdp_rxq_info_reg_mem_model(&rx_ring->xdp_rxq, MEM_TYPE_PAGE_SHARED, 451 - NULL); 452 - 453 - if (rc) { 454 - netif_err(rx_ring->adapter, ifup, rx_ring->netdev, 455 - "Failed to register xdp rx queue info memory model. RX queue num %d rc: %d\n", 456 - rx_ring->qid, rc); 457 - xdp_rxq_info_unreg(&rx_ring->xdp_rxq); 458 - } 459 - 460 - err: 461 - return rc; 462 - } 463 - 464 - static void ena_xdp_unregister_rxq_info(struct ena_ring *rx_ring) 465 - { 466 - xdp_rxq_info_unreg_mem_model(&rx_ring->xdp_rxq); 467 - xdp_rxq_info_unreg(&rx_ring->xdp_rxq); 468 - } 469 - 470 - static void ena_xdp_exchange_program_rx_in_range(struct ena_adapter *adapter, 471 - struct bpf_prog *prog, 472 - int first, int count) 473 - { 474 - struct bpf_prog *old_bpf_prog; 475 - struct ena_ring *rx_ring; 476 - int i = 0; 477 - 478 - for (i = first; i < count; i++) { 479 - rx_ring = &adapter->rx_ring[i]; 480 - old_bpf_prog = xchg(&rx_ring->xdp_bpf_prog, prog); 481 - 482 - if (!old_bpf_prog && prog) { 483 - ena_xdp_register_rxq_info(rx_ring); 484 - rx_ring->rx_headroom = XDP_PACKET_HEADROOM; 485 - } else if (old_bpf_prog && !prog) { 486 - ena_xdp_unregister_rxq_info(rx_ring); 487 - rx_ring->rx_headroom = NET_SKB_PAD; 488 - } 489 - } 490 - } 491 - 492 - static void ena_xdp_exchange_program(struct ena_adapter *adapter, 493 - struct bpf_prog *prog) 494 - { 495 - struct bpf_prog *old_bpf_prog = xchg(&adapter->xdp_bpf_prog, prog); 496 - 497 - ena_xdp_exchange_program_rx_in_range(adapter, 498 - prog, 499 - 0, 500 - adapter->num_io_queues); 501 - 502 - if (old_bpf_prog) 503 - bpf_prog_put(old_bpf_prog); 504 - } 505 - 506 - static int ena_destroy_and_free_all_xdp_queues(struct ena_adapter *adapter) 507 - { 508 - bool was_up; 509 - int rc; 510 - 511 - was_up = test_bit(ENA_FLAG_DEV_UP, &adapter->flags); 512 - 513 - if (was_up) 514 - ena_down(adapter); 515 - 516 - adapter->xdp_first_ring = 0; 517 - adapter->xdp_num_queues = 0; 518 - ena_xdp_exchange_program(adapter, NULL); 519 - if (was_up) { 520 - rc = ena_up(adapter); 521 - if (rc) 522 - return rc; 523 - } 524 - return 0; 525 - } 526 - 527 - static int ena_xdp_set(struct net_device *netdev, struct netdev_bpf *bpf) 528 - { 529 - struct ena_adapter *adapter = netdev_priv(netdev); 530 - struct bpf_prog *prog = bpf->prog; 531 - struct bpf_prog *old_bpf_prog; 532 - int rc, prev_mtu; 533 - bool is_up; 534 - 535 - is_up = test_bit(ENA_FLAG_DEV_UP, &adapter->flags); 536 - rc = ena_xdp_allowed(adapter); 537 - if (rc == ENA_XDP_ALLOWED) { 538 - old_bpf_prog = adapter->xdp_bpf_prog; 539 - if (prog) { 540 - if (!is_up) { 541 - ena_init_all_xdp_queues(adapter); 542 - } else if (!old_bpf_prog) { 543 - ena_down(adapter); 544 - ena_init_all_xdp_queues(adapter); 545 - } 546 - ena_xdp_exchange_program(adapter, prog); 547 - 548 - if (is_up && !old_bpf_prog) { 549 - rc = ena_up(adapter); 550 - if (rc) 551 - return rc; 552 - } 553 - xdp_features_set_redirect_target(netdev, false); 554 - } else if (old_bpf_prog) { 555 - xdp_features_clear_redirect_target(netdev); 556 - rc = ena_destroy_and_free_all_xdp_queues(adapter); 557 - if (rc) 558 - return rc; 559 - } 560 - 561 - prev_mtu = netdev->max_mtu; 562 - netdev->max_mtu = prog ? ENA_XDP_MAX_MTU : adapter->max_mtu; 563 - 564 - if (!old_bpf_prog) 565 - netif_info(adapter, drv, adapter->netdev, 566 - "XDP program is set, changing the max_mtu from %d to %d", 567 - prev_mtu, netdev->max_mtu); 568 - 569 - } else if (rc == ENA_XDP_CURRENT_MTU_TOO_LARGE) { 570 - netif_err(adapter, drv, adapter->netdev, 571 - "Failed to set xdp program, the current MTU (%d) is larger than the maximum allowed MTU (%lu) while xdp is on", 572 - netdev->mtu, ENA_XDP_MAX_MTU); 573 - NL_SET_ERR_MSG_MOD(bpf->extack, 574 - "Failed to set xdp program, the current MTU is larger than the maximum allowed MTU. Check the dmesg for more info"); 575 - return -EINVAL; 576 - } else if (rc == ENA_XDP_NO_ENOUGH_QUEUES) { 577 - netif_err(adapter, drv, adapter->netdev, 578 - "Failed to set xdp program, the Rx/Tx channel count should be at most half of the maximum allowed channel count. The current queue count (%d), the maximal queue count (%d)\n", 579 - adapter->num_io_queues, adapter->max_num_io_queues); 580 - NL_SET_ERR_MSG_MOD(bpf->extack, 581 - "Failed to set xdp program, there is no enough space for allocating XDP queues, Check the dmesg for more info"); 582 - return -EINVAL; 583 - } 584 - 585 - return 0; 586 - } 587 - 588 - /* This is the main xdp callback, it's used by the kernel to set/unset the xdp 589 - * program as well as to query the current xdp program id. 590 - */ 591 - static int ena_xdp(struct net_device *netdev, struct netdev_bpf *bpf) 592 - { 593 - switch (bpf->command) { 594 - case XDP_SETUP_PROG: 595 - return ena_xdp_set(netdev, bpf); 596 - default: 597 - return -EINVAL; 598 - } 599 187 return 0; 600 188 } 601 189 ··· 180 688 u64_stats_init(&ring->syncp); 181 689 } 182 690 183 - static void ena_init_io_rings(struct ena_adapter *adapter, 184 - int first_index, int count) 691 + void ena_init_io_rings(struct ena_adapter *adapter, 692 + int first_index, int count) 185 693 { 186 694 struct ena_com_dev *ena_dev; 187 695 struct ena_ring *txr, *rxr; ··· 312 820 tx_ring->push_buf_intermediate_buf = NULL; 313 821 } 314 822 315 - static int ena_setup_tx_resources_in_range(struct ena_adapter *adapter, 316 - int first_index, 317 - int count) 823 + int ena_setup_tx_resources_in_range(struct ena_adapter *adapter, 824 + int first_index, int count) 318 825 { 319 826 int i, rc = 0; 320 827 ··· 336 845 return rc; 337 846 } 338 847 339 - static void ena_free_all_io_tx_resources_in_range(struct ena_adapter *adapter, 340 - int first_index, int count) 848 + void ena_free_all_io_tx_resources_in_range(struct ena_adapter *adapter, 849 + int first_index, int count) 341 850 { 342 851 int i; 343 852 ··· 350 859 * 351 860 * Free all transmit software resources 352 861 */ 353 - static void ena_free_all_io_tx_resources(struct ena_adapter *adapter) 862 + void ena_free_all_io_tx_resources(struct ena_adapter *adapter) 354 863 { 355 864 ena_free_all_io_tx_resources_in_range(adapter, 356 865 0, ··· 660 1169 ena_free_rx_bufs(adapter, i); 661 1170 } 662 1171 663 - static void ena_unmap_tx_buff(struct ena_ring *tx_ring, 664 - struct ena_tx_buffer *tx_info) 1172 + void ena_unmap_tx_buff(struct ena_ring *tx_ring, 1173 + struct ena_tx_buffer *tx_info) 665 1174 { 666 1175 struct ena_com_buf *ena_buf; 667 1176 u32 cnt; ··· 753 1262 for (i = 0; i < adapter->num_io_queues; i++) { 754 1263 ena_qid = ENA_IO_RXQ_IDX(i); 755 1264 cancel_work_sync(&adapter->ena_napi[i].dim.work); 1265 + ena_xdp_unregister_rxq_info(&adapter->rx_ring[i]); 756 1266 ena_com_destroy_io_queue(adapter->ena_dev, ena_qid); 757 1267 } 758 1268 } ··· 764 1272 ena_destroy_all_rx_queues(adapter); 765 1273 } 766 1274 767 - static int handle_invalid_req_id(struct ena_ring *ring, u16 req_id, 768 - struct ena_tx_buffer *tx_info, bool is_xdp) 1275 + int handle_invalid_req_id(struct ena_ring *ring, u16 req_id, 1276 + struct ena_tx_buffer *tx_info, bool is_xdp) 769 1277 { 770 1278 if (tx_info) 771 1279 netif_err(ring->adapter, ··· 795 1303 return 0; 796 1304 797 1305 return handle_invalid_req_id(tx_ring, req_id, tx_info, false); 798 - } 799 - 800 - static int validate_xdp_req_id(struct ena_ring *xdp_ring, u16 req_id) 801 - { 802 - struct ena_tx_buffer *tx_info; 803 - 804 - tx_info = &xdp_ring->tx_buffer_info[req_id]; 805 - if (likely(tx_info->xdpf)) 806 - return 0; 807 - 808 - return handle_invalid_req_id(xdp_ring, req_id, tx_info, true); 809 1306 } 810 1307 811 1308 static int ena_clean_tx_irq(struct ena_ring *tx_ring, u32 budget) ··· 844 1363 "tx_poll: q %d skb %p completed\n", tx_ring->qid, 845 1364 skb); 846 1365 847 - tx_bytes += skb->len; 1366 + tx_bytes += tx_info->total_tx_size; 848 1367 dev_kfree_skb(skb); 849 1368 tx_pkts++; 850 1369 total_done += tx_info->tx_descs; ··· 1169 1688 1170 1689 return ret; 1171 1690 } 1691 + 1172 1692 /* ena_clean_rx_irq - Cleanup RX irq 1173 1693 * @rx_ring: RX ring to clean 1174 1694 * @napi: napi handler ··· 1362 1880 rx_ring->per_napi_packets = 0; 1363 1881 } 1364 1882 1365 - static void ena_unmask_interrupt(struct ena_ring *tx_ring, 1366 - struct ena_ring *rx_ring) 1883 + void ena_unmask_interrupt(struct ena_ring *tx_ring, 1884 + struct ena_ring *rx_ring) 1367 1885 { 1368 1886 u32 rx_interval = tx_ring->smoothed_interval; 1369 1887 struct ena_eth_io_intr_reg intr_reg; ··· 1395 1913 ena_com_unmask_intr(tx_ring->ena_com_io_cq, &intr_reg); 1396 1914 } 1397 1915 1398 - static void ena_update_ring_numa_node(struct ena_ring *tx_ring, 1399 - struct ena_ring *rx_ring) 1916 + void ena_update_ring_numa_node(struct ena_ring *tx_ring, 1917 + struct ena_ring *rx_ring) 1400 1918 { 1401 1919 int cpu = get_cpu(); 1402 1920 int numa_node; ··· 1429 1947 return; 1430 1948 out: 1431 1949 put_cpu(); 1432 - } 1433 - 1434 - static int ena_clean_xdp_irq(struct ena_ring *xdp_ring, u32 budget) 1435 - { 1436 - u32 total_done = 0; 1437 - u16 next_to_clean; 1438 - int tx_pkts = 0; 1439 - u16 req_id; 1440 - int rc; 1441 - 1442 - if (unlikely(!xdp_ring)) 1443 - return 0; 1444 - next_to_clean = xdp_ring->next_to_clean; 1445 - 1446 - while (tx_pkts < budget) { 1447 - struct ena_tx_buffer *tx_info; 1448 - struct xdp_frame *xdpf; 1449 - 1450 - rc = ena_com_tx_comp_req_id_get(xdp_ring->ena_com_io_cq, 1451 - &req_id); 1452 - if (rc) { 1453 - if (unlikely(rc == -EINVAL)) 1454 - handle_invalid_req_id(xdp_ring, req_id, NULL, 1455 - true); 1456 - break; 1457 - } 1458 - 1459 - /* validate that the request id points to a valid xdp_frame */ 1460 - rc = validate_xdp_req_id(xdp_ring, req_id); 1461 - if (rc) 1462 - break; 1463 - 1464 - tx_info = &xdp_ring->tx_buffer_info[req_id]; 1465 - xdpf = tx_info->xdpf; 1466 - 1467 - tx_info->xdpf = NULL; 1468 - tx_info->last_jiffies = 0; 1469 - ena_unmap_tx_buff(xdp_ring, tx_info); 1470 - 1471 - netif_dbg(xdp_ring->adapter, tx_done, xdp_ring->netdev, 1472 - "tx_poll: q %d skb %p completed\n", xdp_ring->qid, 1473 - xdpf); 1474 - 1475 - tx_pkts++; 1476 - total_done += tx_info->tx_descs; 1477 - 1478 - xdp_return_frame(xdpf); 1479 - xdp_ring->free_ids[next_to_clean] = req_id; 1480 - next_to_clean = ENA_TX_RING_IDX_NEXT(next_to_clean, 1481 - xdp_ring->ring_size); 1482 - } 1483 - 1484 - xdp_ring->next_to_clean = next_to_clean; 1485 - ena_com_comp_ack(xdp_ring->ena_com_io_sq, total_done); 1486 - ena_com_update_dev_comp_head(xdp_ring->ena_com_io_cq); 1487 - 1488 - netif_dbg(xdp_ring->adapter, tx_done, xdp_ring->netdev, 1489 - "tx_poll: q %d done. total pkts: %d\n", 1490 - xdp_ring->qid, tx_pkts); 1491 - 1492 - return tx_pkts; 1493 1950 } 1494 1951 1495 1952 static int ena_io_poll(struct napi_struct *napi, int budget) ··· 1747 2326 for (i = first_index; i < first_index + count; i++) { 1748 2327 netif_napi_del(&adapter->ena_napi[i].napi); 1749 2328 1750 - WARN_ON(!ENA_IS_XDP_INDEX(adapter, i) && 1751 - adapter->ena_napi[i].xdp_ring); 2329 + WARN_ON(ENA_IS_XDP_INDEX(adapter, i) && 2330 + adapter->ena_napi[i].rx_ring); 1752 2331 } 1753 2332 } 1754 2333 1755 2334 static void ena_init_napi_in_range(struct ena_adapter *adapter, 1756 2335 int first_index, int count) 1757 2336 { 2337 + int (*napi_handler)(struct napi_struct *napi, int budget); 1758 2338 int i; 1759 2339 1760 2340 for (i = first_index; i < first_index + count; i++) { 1761 2341 struct ena_napi *napi = &adapter->ena_napi[i]; 2342 + struct ena_ring *rx_ring, *tx_ring; 1762 2343 1763 - netif_napi_add(adapter->netdev, &napi->napi, 1764 - ENA_IS_XDP_INDEX(adapter, i) ? ena_xdp_io_poll : ena_io_poll); 2344 + memset(napi, 0, sizeof(*napi)); 1765 2345 1766 - if (!ENA_IS_XDP_INDEX(adapter, i)) { 1767 - napi->rx_ring = &adapter->rx_ring[i]; 1768 - napi->tx_ring = &adapter->tx_ring[i]; 1769 - } else { 1770 - napi->xdp_ring = &adapter->tx_ring[i]; 1771 - } 2346 + rx_ring = &adapter->rx_ring[i]; 2347 + tx_ring = &adapter->tx_ring[i]; 2348 + 2349 + napi_handler = ena_io_poll; 2350 + if (ENA_IS_XDP_INDEX(adapter, i)) 2351 + napi_handler = ena_xdp_io_poll; 2352 + 2353 + netif_napi_add(adapter->netdev, &napi->napi, napi_handler); 2354 + 2355 + if (!ENA_IS_XDP_INDEX(adapter, i)) 2356 + napi->rx_ring = rx_ring; 2357 + 2358 + napi->tx_ring = tx_ring; 1772 2359 napi->qid = i; 1773 2360 } 1774 2361 } ··· 1904 2475 return rc; 1905 2476 } 1906 2477 1907 - static int ena_create_io_tx_queues_in_range(struct ena_adapter *adapter, 1908 - int first_index, int count) 2478 + int ena_create_io_tx_queues_in_range(struct ena_adapter *adapter, 2479 + int first_index, int count) 1909 2480 { 1910 2481 struct ena_com_dev *ena_dev = adapter->ena_dev; 1911 2482 int rc, i; ··· 1985 2556 if (rc) 1986 2557 goto create_err; 1987 2558 INIT_WORK(&adapter->ena_napi[i].dim.work, ena_dim_work); 2559 + 2560 + ena_xdp_register_rxq_info(&adapter->rx_ring[i]); 1988 2561 } 1989 2562 1990 2563 return 0; 1991 2564 1992 2565 create_err: 1993 2566 while (i--) { 2567 + ena_xdp_unregister_rxq_info(&adapter->rx_ring[i]); 1994 2568 cancel_work_sync(&adapter->ena_napi[i].dim.work); 1995 2569 ena_com_destroy_io_queue(ena_dev, ENA_IO_RXQ_IDX(i)); 1996 2570 } ··· 2118 2686 } 2119 2687 } 2120 2688 2121 - static int ena_up(struct ena_adapter *adapter) 2689 + int ena_up(struct ena_adapter *adapter) 2122 2690 { 2123 2691 int io_queue_count, rc, i; 2124 2692 ··· 2180 2748 return rc; 2181 2749 } 2182 2750 2183 - static void ena_down(struct ena_adapter *adapter) 2751 + void ena_down(struct ena_adapter *adapter) 2184 2752 { 2185 2753 int io_queue_count = adapter->num_io_queues + adapter->xdp_num_queues; 2186 2754 ··· 2611 3179 /* set flags and meta data */ 2612 3180 ena_tx_csum(&ena_tx_ctx, skb, tx_ring->disable_meta_caching); 2613 3181 2614 - rc = ena_xmit_common(dev, 3182 + rc = ena_xmit_common(adapter, 2615 3183 tx_ring, 2616 3184 tx_info, 2617 3185 &ena_tx_ctx, ··· 2795 3363 { 2796 3364 struct ena_adapter *adapter = netdev_priv(netdev); 2797 3365 struct ena_ring *rx_ring, *tx_ring; 3366 + u64 total_xdp_rx_drops = 0; 2798 3367 unsigned int start; 2799 3368 u64 rx_drops; 2800 3369 u64 tx_drops; ··· 2804 3371 if (!test_bit(ENA_FLAG_DEV_UP, &adapter->flags)) 2805 3372 return; 2806 3373 2807 - for (i = 0; i < adapter->num_io_queues; i++) { 2808 - u64 bytes, packets; 3374 + for (i = 0; i < adapter->num_io_queues + adapter->xdp_num_queues; i++) { 3375 + u64 bytes, packets, xdp_rx_drops; 2809 3376 2810 3377 tx_ring = &adapter->tx_ring[i]; 2811 3378 ··· 2818 3385 stats->tx_packets += packets; 2819 3386 stats->tx_bytes += bytes; 2820 3387 3388 + /* In XDP there isn't an RX queue counterpart */ 3389 + if (ENA_IS_XDP_INDEX(adapter, i)) 3390 + continue; 3391 + 2821 3392 rx_ring = &adapter->rx_ring[i]; 2822 3393 2823 3394 do { 2824 3395 start = u64_stats_fetch_begin(&rx_ring->syncp); 2825 3396 packets = rx_ring->rx_stats.cnt; 2826 3397 bytes = rx_ring->rx_stats.bytes; 3398 + xdp_rx_drops = rx_ring->rx_stats.xdp_drop; 2827 3399 } while (u64_stats_fetch_retry(&rx_ring->syncp, start)); 2828 3400 2829 3401 stats->rx_packets += packets; 2830 3402 stats->rx_bytes += bytes; 3403 + total_xdp_rx_drops += xdp_rx_drops; 2831 3404 } 2832 3405 2833 3406 do { ··· 2842 3403 tx_drops = adapter->dev_stats.tx_drops; 2843 3404 } while (u64_stats_fetch_retry(&adapter->syncp, start)); 2844 3405 2845 - stats->rx_dropped = rx_drops; 3406 + stats->rx_dropped = rx_drops + total_xdp_rx_drops; 2846 3407 stats->tx_dropped = tx_drops; 2847 3408 2848 3409 stats->multicast = 0;
+43 -56
drivers/net/ethernet/amazon/ena/ena_netdev.h
··· 110 110 111 111 #define ENA_MMIO_DISABLE_REG_READ BIT(0) 112 112 113 - /* The max MTU size is configured to be the ethernet frame size without 114 - * the overhead of the ethernet header, which can have a VLAN header, and 115 - * a frame check sequence (FCS). 116 - * The buffer size we share with the device is defined to be ENA_PAGE_SIZE 117 - */ 118 - 119 - #define ENA_XDP_MAX_MTU (ENA_PAGE_SIZE - ETH_HLEN - ETH_FCS_LEN - \ 120 - VLAN_HLEN - XDP_PACKET_HEADROOM - \ 121 - SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) 122 - 123 - #define ENA_IS_XDP_INDEX(adapter, index) (((index) >= (adapter)->xdp_first_ring) && \ 124 - ((index) < (adapter)->xdp_first_ring + (adapter)->xdp_num_queues)) 125 - 126 113 struct ena_irq { 127 114 irq_handler_t handler; 128 115 void *data; ··· 125 138 struct napi_struct napi; 126 139 struct ena_ring *tx_ring; 127 140 struct ena_ring *rx_ring; 128 - struct ena_ring *xdp_ring; 129 141 u32 qid; 130 142 struct dim dim; 131 143 }; 132 144 133 145 struct ena_tx_buffer { 134 - struct sk_buff *skb; 146 + union { 147 + struct sk_buff *skb; 148 + /* XDP buffer structure which is used for sending packets in 149 + * the xdp queues 150 + */ 151 + struct xdp_frame *xdpf; 152 + }; 135 153 /* num of ena desc for this specific skb 136 154 * (includes data desc and metadata desc) 137 155 */ ··· 144 152 /* num of buffers used by this skb */ 145 153 u32 num_of_bufs; 146 154 147 - /* XDP buffer structure which is used for sending packets in 148 - * the xdp queues 149 - */ 150 - struct xdp_frame *xdpf; 155 + /* Total size of all buffers in bytes */ 156 + u32 total_tx_size; 151 157 152 158 /* Indicate if bufs[0] map the linear data of the skb. */ 153 159 u8 map_linear_data; 154 160 155 161 /* Used for detect missing tx packets to limit the number of prints */ 156 - u32 print_once; 162 + u8 print_once; 157 163 /* Save the last jiffies to detect missing tx packets 158 164 * 159 165 * sets to non zero value on ena_start_xmit and set to zero on ··· 411 421 set_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags); 412 422 } 413 423 414 - enum ena_xdp_errors_t { 415 - ENA_XDP_ALLOWED = 0, 416 - ENA_XDP_CURRENT_MTU_TOO_LARGE, 417 - ENA_XDP_NO_ENOUGH_QUEUES, 418 - }; 424 + int handle_invalid_req_id(struct ena_ring *ring, u16 req_id, 425 + struct ena_tx_buffer *tx_info, bool is_xdp); 419 426 420 - enum ENA_XDP_ACTIONS { 421 - ENA_XDP_PASS = 0, 422 - ENA_XDP_TX = BIT(0), 423 - ENA_XDP_REDIRECT = BIT(1), 424 - ENA_XDP_DROP = BIT(2) 425 - }; 426 - 427 - #define ENA_XDP_FORWARDED (ENA_XDP_TX | ENA_XDP_REDIRECT) 428 - 429 - static inline bool ena_xdp_present(struct ena_adapter *adapter) 427 + /* Increase a stat by cnt while holding syncp seqlock on 32bit machines */ 428 + static inline void ena_increase_stat(u64 *statp, u64 cnt, 429 + struct u64_stats_sync *syncp) 430 430 { 431 - return !!adapter->xdp_bpf_prog; 431 + u64_stats_update_begin(syncp); 432 + (*statp) += cnt; 433 + u64_stats_update_end(syncp); 432 434 } 433 435 434 - static inline bool ena_xdp_present_ring(struct ena_ring *ring) 436 + static inline void ena_ring_tx_doorbell(struct ena_ring *tx_ring) 435 437 { 436 - return !!ring->xdp_bpf_prog; 438 + ena_com_write_sq_doorbell(tx_ring->ena_com_io_sq); 439 + ena_increase_stat(&tx_ring->tx_stats.doorbells, 1, &tx_ring->syncp); 437 440 } 438 441 439 - static inline bool ena_xdp_legal_queue_count(struct ena_adapter *adapter, 440 - u32 queues) 441 - { 442 - return 2 * queues <= adapter->max_num_io_queues; 443 - } 444 - 445 - static inline enum ena_xdp_errors_t ena_xdp_allowed(struct ena_adapter *adapter) 446 - { 447 - enum ena_xdp_errors_t rc = ENA_XDP_ALLOWED; 448 - 449 - if (adapter->netdev->mtu > ENA_XDP_MAX_MTU) 450 - rc = ENA_XDP_CURRENT_MTU_TOO_LARGE; 451 - else if (!ena_xdp_legal_queue_count(adapter, adapter->num_io_queues)) 452 - rc = ENA_XDP_NO_ENOUGH_QUEUES; 453 - 454 - return rc; 455 - } 456 - 442 + int ena_xmit_common(struct ena_adapter *adapter, 443 + struct ena_ring *ring, 444 + struct ena_tx_buffer *tx_info, 445 + struct ena_com_tx_ctx *ena_tx_ctx, 446 + u16 next_to_use, 447 + u32 bytes); 448 + void ena_unmap_tx_buff(struct ena_ring *tx_ring, 449 + struct ena_tx_buffer *tx_info); 450 + void ena_init_io_rings(struct ena_adapter *adapter, 451 + int first_index, int count); 452 + int ena_create_io_tx_queues_in_range(struct ena_adapter *adapter, 453 + int first_index, int count); 454 + int ena_setup_tx_resources_in_range(struct ena_adapter *adapter, 455 + int first_index, int count); 456 + void ena_free_all_io_tx_resources_in_range(struct ena_adapter *adapter, 457 + int first_index, int count); 458 + void ena_free_all_io_tx_resources(struct ena_adapter *adapter); 459 + void ena_down(struct ena_adapter *adapter); 460 + int ena_up(struct ena_adapter *adapter); 461 + void ena_unmask_interrupt(struct ena_ring *tx_ring, struct ena_ring *rx_ring); 462 + void ena_update_ring_numa_node(struct ena_ring *tx_ring, 463 + struct ena_ring *rx_ring); 457 464 #endif /* !(ENA_H) */
+468
drivers/net/ethernet/amazon/ena/ena_xdp.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB 2 + /* 3 + * Copyright 2015-2021 Amazon.com, Inc. or its affiliates. All rights reserved. 4 + */ 5 + 6 + #include "ena_xdp.h" 7 + 8 + static int validate_xdp_req_id(struct ena_ring *tx_ring, u16 req_id) 9 + { 10 + struct ena_tx_buffer *tx_info; 11 + 12 + tx_info = &tx_ring->tx_buffer_info[req_id]; 13 + if (likely(tx_info->xdpf)) 14 + return 0; 15 + 16 + return handle_invalid_req_id(tx_ring, req_id, tx_info, true); 17 + } 18 + 19 + static int ena_xdp_tx_map_frame(struct ena_ring *tx_ring, 20 + struct ena_tx_buffer *tx_info, 21 + struct xdp_frame *xdpf, 22 + struct ena_com_tx_ctx *ena_tx_ctx) 23 + { 24 + struct ena_adapter *adapter = tx_ring->adapter; 25 + struct ena_com_buf *ena_buf; 26 + int push_len = 0; 27 + dma_addr_t dma; 28 + void *data; 29 + u32 size; 30 + 31 + tx_info->xdpf = xdpf; 32 + data = tx_info->xdpf->data; 33 + size = tx_info->xdpf->len; 34 + 35 + if (tx_ring->tx_mem_queue_type == ENA_ADMIN_PLACEMENT_POLICY_DEV) { 36 + /* Designate part of the packet for LLQ */ 37 + push_len = min_t(u32, size, tx_ring->tx_max_header_size); 38 + 39 + ena_tx_ctx->push_header = data; 40 + 41 + size -= push_len; 42 + data += push_len; 43 + } 44 + 45 + ena_tx_ctx->header_len = push_len; 46 + 47 + if (size > 0) { 48 + dma = dma_map_single(tx_ring->dev, 49 + data, 50 + size, 51 + DMA_TO_DEVICE); 52 + if (unlikely(dma_mapping_error(tx_ring->dev, dma))) 53 + goto error_report_dma_error; 54 + 55 + tx_info->map_linear_data = 0; 56 + 57 + ena_buf = tx_info->bufs; 58 + ena_buf->paddr = dma; 59 + ena_buf->len = size; 60 + 61 + ena_tx_ctx->ena_bufs = ena_buf; 62 + ena_tx_ctx->num_bufs = tx_info->num_of_bufs = 1; 63 + } 64 + 65 + return 0; 66 + 67 + error_report_dma_error: 68 + ena_increase_stat(&tx_ring->tx_stats.dma_mapping_err, 1, 69 + &tx_ring->syncp); 70 + netif_warn(adapter, tx_queued, adapter->netdev, "Failed to map xdp buff\n"); 71 + 72 + return -EINVAL; 73 + } 74 + 75 + int ena_xdp_xmit_frame(struct ena_ring *tx_ring, 76 + struct ena_adapter *adapter, 77 + struct xdp_frame *xdpf, 78 + int flags) 79 + { 80 + struct ena_com_tx_ctx ena_tx_ctx = {}; 81 + struct ena_tx_buffer *tx_info; 82 + u16 next_to_use, req_id; 83 + int rc; 84 + 85 + next_to_use = tx_ring->next_to_use; 86 + req_id = tx_ring->free_ids[next_to_use]; 87 + tx_info = &tx_ring->tx_buffer_info[req_id]; 88 + tx_info->num_of_bufs = 0; 89 + 90 + rc = ena_xdp_tx_map_frame(tx_ring, tx_info, xdpf, &ena_tx_ctx); 91 + if (unlikely(rc)) 92 + return rc; 93 + 94 + ena_tx_ctx.req_id = req_id; 95 + 96 + rc = ena_xmit_common(adapter, 97 + tx_ring, 98 + tx_info, 99 + &ena_tx_ctx, 100 + next_to_use, 101 + xdpf->len); 102 + if (rc) 103 + goto error_unmap_dma; 104 + 105 + /* trigger the dma engine. ena_ring_tx_doorbell() 106 + * calls a memory barrier inside it. 107 + */ 108 + if (flags & XDP_XMIT_FLUSH) 109 + ena_ring_tx_doorbell(tx_ring); 110 + 111 + return rc; 112 + 113 + error_unmap_dma: 114 + ena_unmap_tx_buff(tx_ring, tx_info); 115 + tx_info->xdpf = NULL; 116 + return rc; 117 + } 118 + 119 + int ena_xdp_xmit(struct net_device *dev, int n, 120 + struct xdp_frame **frames, u32 flags) 121 + { 122 + struct ena_adapter *adapter = netdev_priv(dev); 123 + struct ena_ring *tx_ring; 124 + int qid, i, nxmit = 0; 125 + 126 + if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) 127 + return -EINVAL; 128 + 129 + if (!test_bit(ENA_FLAG_DEV_UP, &adapter->flags)) 130 + return -ENETDOWN; 131 + 132 + /* We assume that all rings have the same XDP program */ 133 + if (!READ_ONCE(adapter->rx_ring->xdp_bpf_prog)) 134 + return -ENXIO; 135 + 136 + qid = smp_processor_id() % adapter->xdp_num_queues; 137 + qid += adapter->xdp_first_ring; 138 + tx_ring = &adapter->tx_ring[qid]; 139 + 140 + /* Other CPU ids might try to send thorugh this queue */ 141 + spin_lock(&tx_ring->xdp_tx_lock); 142 + 143 + for (i = 0; i < n; i++) { 144 + if (ena_xdp_xmit_frame(tx_ring, adapter, frames[i], 0)) 145 + break; 146 + nxmit++; 147 + } 148 + 149 + /* Ring doorbell to make device aware of the packets */ 150 + if (flags & XDP_XMIT_FLUSH) 151 + ena_ring_tx_doorbell(tx_ring); 152 + 153 + spin_unlock(&tx_ring->xdp_tx_lock); 154 + 155 + /* Return number of packets sent */ 156 + return nxmit; 157 + } 158 + 159 + static void ena_init_all_xdp_queues(struct ena_adapter *adapter) 160 + { 161 + adapter->xdp_first_ring = adapter->num_io_queues; 162 + adapter->xdp_num_queues = adapter->num_io_queues; 163 + 164 + ena_init_io_rings(adapter, 165 + adapter->xdp_first_ring, 166 + adapter->xdp_num_queues); 167 + } 168 + 169 + int ena_setup_and_create_all_xdp_queues(struct ena_adapter *adapter) 170 + { 171 + u32 xdp_first_ring = adapter->xdp_first_ring; 172 + u32 xdp_num_queues = adapter->xdp_num_queues; 173 + int rc = 0; 174 + 175 + rc = ena_setup_tx_resources_in_range(adapter, xdp_first_ring, xdp_num_queues); 176 + if (rc) 177 + goto setup_err; 178 + 179 + rc = ena_create_io_tx_queues_in_range(adapter, xdp_first_ring, xdp_num_queues); 180 + if (rc) 181 + goto create_err; 182 + 183 + return 0; 184 + 185 + create_err: 186 + ena_free_all_io_tx_resources_in_range(adapter, xdp_first_ring, xdp_num_queues); 187 + setup_err: 188 + return rc; 189 + } 190 + 191 + /* Provides a way for both kernel and bpf-prog to know 192 + * more about the RX-queue a given XDP frame arrived on. 193 + */ 194 + int ena_xdp_register_rxq_info(struct ena_ring *rx_ring) 195 + { 196 + int rc; 197 + 198 + rc = xdp_rxq_info_reg(&rx_ring->xdp_rxq, rx_ring->netdev, rx_ring->qid, 0); 199 + 200 + netif_dbg(rx_ring->adapter, ifup, rx_ring->netdev, "Registering RX info for queue %d", 201 + rx_ring->qid); 202 + if (rc) { 203 + netif_err(rx_ring->adapter, ifup, rx_ring->netdev, 204 + "Failed to register xdp rx queue info. RX queue num %d rc: %d\n", 205 + rx_ring->qid, rc); 206 + goto err; 207 + } 208 + 209 + rc = xdp_rxq_info_reg_mem_model(&rx_ring->xdp_rxq, MEM_TYPE_PAGE_SHARED, NULL); 210 + 211 + if (rc) { 212 + netif_err(rx_ring->adapter, ifup, rx_ring->netdev, 213 + "Failed to register xdp rx queue info memory model. RX queue num %d rc: %d\n", 214 + rx_ring->qid, rc); 215 + xdp_rxq_info_unreg(&rx_ring->xdp_rxq); 216 + } 217 + 218 + err: 219 + return rc; 220 + } 221 + 222 + void ena_xdp_unregister_rxq_info(struct ena_ring *rx_ring) 223 + { 224 + netif_dbg(rx_ring->adapter, ifdown, rx_ring->netdev, 225 + "Unregistering RX info for queue %d", 226 + rx_ring->qid); 227 + xdp_rxq_info_unreg_mem_model(&rx_ring->xdp_rxq); 228 + xdp_rxq_info_unreg(&rx_ring->xdp_rxq); 229 + } 230 + 231 + void ena_xdp_exchange_program_rx_in_range(struct ena_adapter *adapter, 232 + struct bpf_prog *prog, 233 + int first, int count) 234 + { 235 + struct bpf_prog *old_bpf_prog; 236 + struct ena_ring *rx_ring; 237 + int i = 0; 238 + 239 + for (i = first; i < count; i++) { 240 + rx_ring = &adapter->rx_ring[i]; 241 + old_bpf_prog = xchg(&rx_ring->xdp_bpf_prog, prog); 242 + 243 + if (!old_bpf_prog && prog) { 244 + rx_ring->rx_headroom = XDP_PACKET_HEADROOM; 245 + } else if (old_bpf_prog && !prog) { 246 + rx_ring->rx_headroom = NET_SKB_PAD; 247 + } 248 + } 249 + } 250 + 251 + static void ena_xdp_exchange_program(struct ena_adapter *adapter, 252 + struct bpf_prog *prog) 253 + { 254 + struct bpf_prog *old_bpf_prog = xchg(&adapter->xdp_bpf_prog, prog); 255 + 256 + ena_xdp_exchange_program_rx_in_range(adapter, 257 + prog, 258 + 0, 259 + adapter->num_io_queues); 260 + 261 + if (old_bpf_prog) 262 + bpf_prog_put(old_bpf_prog); 263 + } 264 + 265 + static int ena_destroy_and_free_all_xdp_queues(struct ena_adapter *adapter) 266 + { 267 + bool was_up; 268 + int rc; 269 + 270 + was_up = test_bit(ENA_FLAG_DEV_UP, &adapter->flags); 271 + 272 + if (was_up) 273 + ena_down(adapter); 274 + 275 + adapter->xdp_first_ring = 0; 276 + adapter->xdp_num_queues = 0; 277 + ena_xdp_exchange_program(adapter, NULL); 278 + if (was_up) { 279 + rc = ena_up(adapter); 280 + if (rc) 281 + return rc; 282 + } 283 + return 0; 284 + } 285 + 286 + static int ena_xdp_set(struct net_device *netdev, struct netdev_bpf *bpf) 287 + { 288 + struct ena_adapter *adapter = netdev_priv(netdev); 289 + struct bpf_prog *prog = bpf->prog; 290 + struct bpf_prog *old_bpf_prog; 291 + int rc, prev_mtu; 292 + bool is_up; 293 + 294 + is_up = test_bit(ENA_FLAG_DEV_UP, &adapter->flags); 295 + rc = ena_xdp_allowed(adapter); 296 + if (rc == ENA_XDP_ALLOWED) { 297 + old_bpf_prog = adapter->xdp_bpf_prog; 298 + if (prog) { 299 + if (!is_up) { 300 + ena_init_all_xdp_queues(adapter); 301 + } else if (!old_bpf_prog) { 302 + ena_down(adapter); 303 + ena_init_all_xdp_queues(adapter); 304 + } 305 + ena_xdp_exchange_program(adapter, prog); 306 + 307 + netif_dbg(adapter, drv, adapter->netdev, "Set a new XDP program\n"); 308 + 309 + if (is_up && !old_bpf_prog) { 310 + rc = ena_up(adapter); 311 + if (rc) 312 + return rc; 313 + } 314 + xdp_features_set_redirect_target(netdev, false); 315 + } else if (old_bpf_prog) { 316 + xdp_features_clear_redirect_target(netdev); 317 + netif_dbg(adapter, drv, adapter->netdev, "Removing XDP program\n"); 318 + 319 + rc = ena_destroy_and_free_all_xdp_queues(adapter); 320 + if (rc) 321 + return rc; 322 + } 323 + 324 + prev_mtu = netdev->max_mtu; 325 + netdev->max_mtu = prog ? ENA_XDP_MAX_MTU : adapter->max_mtu; 326 + 327 + if (!old_bpf_prog) 328 + netif_info(adapter, drv, adapter->netdev, 329 + "XDP program is set, changing the max_mtu from %d to %d", 330 + prev_mtu, netdev->max_mtu); 331 + 332 + } else if (rc == ENA_XDP_CURRENT_MTU_TOO_LARGE) { 333 + netif_err(adapter, drv, adapter->netdev, 334 + "Failed to set xdp program, the current MTU (%d) is larger than the maximum allowed MTU (%lu) while xdp is on", 335 + netdev->mtu, ENA_XDP_MAX_MTU); 336 + NL_SET_ERR_MSG_MOD(bpf->extack, 337 + "Failed to set xdp program, the current MTU is larger than the maximum allowed MTU. Check the dmesg for more info"); 338 + return -EINVAL; 339 + } else if (rc == ENA_XDP_NO_ENOUGH_QUEUES) { 340 + netif_err(adapter, drv, adapter->netdev, 341 + "Failed to set xdp program, the Rx/Tx channel count should be at most half of the maximum allowed channel count. The current queue count (%d), the maximal queue count (%d)\n", 342 + adapter->num_io_queues, adapter->max_num_io_queues); 343 + NL_SET_ERR_MSG_MOD(bpf->extack, 344 + "Failed to set xdp program, there is no enough space for allocating XDP queues, Check the dmesg for more info"); 345 + return -EINVAL; 346 + } 347 + 348 + return 0; 349 + } 350 + 351 + /* This is the main xdp callback, it's used by the kernel to set/unset the xdp 352 + * program as well as to query the current xdp program id. 353 + */ 354 + int ena_xdp(struct net_device *netdev, struct netdev_bpf *bpf) 355 + { 356 + switch (bpf->command) { 357 + case XDP_SETUP_PROG: 358 + return ena_xdp_set(netdev, bpf); 359 + default: 360 + return -EINVAL; 361 + } 362 + return 0; 363 + } 364 + 365 + static int ena_clean_xdp_irq(struct ena_ring *tx_ring, u32 budget) 366 + { 367 + u32 total_done = 0; 368 + u16 next_to_clean; 369 + int tx_pkts = 0; 370 + u16 req_id; 371 + int rc; 372 + 373 + if (unlikely(!tx_ring)) 374 + return 0; 375 + next_to_clean = tx_ring->next_to_clean; 376 + 377 + while (tx_pkts < budget) { 378 + struct ena_tx_buffer *tx_info; 379 + struct xdp_frame *xdpf; 380 + 381 + rc = ena_com_tx_comp_req_id_get(tx_ring->ena_com_io_cq, 382 + &req_id); 383 + if (rc) { 384 + if (unlikely(rc == -EINVAL)) 385 + handle_invalid_req_id(tx_ring, req_id, NULL, true); 386 + break; 387 + } 388 + 389 + /* validate that the request id points to a valid xdp_frame */ 390 + rc = validate_xdp_req_id(tx_ring, req_id); 391 + if (rc) 392 + break; 393 + 394 + tx_info = &tx_ring->tx_buffer_info[req_id]; 395 + 396 + tx_info->last_jiffies = 0; 397 + 398 + xdpf = tx_info->xdpf; 399 + tx_info->xdpf = NULL; 400 + ena_unmap_tx_buff(tx_ring, tx_info); 401 + xdp_return_frame(xdpf); 402 + 403 + tx_pkts++; 404 + total_done += tx_info->tx_descs; 405 + tx_ring->free_ids[next_to_clean] = req_id; 406 + next_to_clean = ENA_TX_RING_IDX_NEXT(next_to_clean, 407 + tx_ring->ring_size); 408 + 409 + netif_dbg(tx_ring->adapter, tx_done, tx_ring->netdev, 410 + "tx_poll: q %d pkt #%d req_id %d\n", tx_ring->qid, tx_pkts, req_id); 411 + } 412 + 413 + tx_ring->next_to_clean = next_to_clean; 414 + ena_com_comp_ack(tx_ring->ena_com_io_sq, total_done); 415 + ena_com_update_dev_comp_head(tx_ring->ena_com_io_cq); 416 + 417 + netif_dbg(tx_ring->adapter, tx_done, tx_ring->netdev, 418 + "tx_poll: q %d done. total pkts: %d\n", 419 + tx_ring->qid, tx_pkts); 420 + 421 + return tx_pkts; 422 + } 423 + 424 + /* This is the XDP napi callback. XDP queues use a separate napi callback 425 + * than Rx/Tx queues. 426 + */ 427 + int ena_xdp_io_poll(struct napi_struct *napi, int budget) 428 + { 429 + struct ena_napi *ena_napi = container_of(napi, struct ena_napi, napi); 430 + struct ena_ring *tx_ring; 431 + u32 work_done; 432 + int ret; 433 + 434 + tx_ring = ena_napi->tx_ring; 435 + 436 + if (!test_bit(ENA_FLAG_DEV_UP, &tx_ring->adapter->flags) || 437 + test_bit(ENA_FLAG_TRIGGER_RESET, &tx_ring->adapter->flags)) { 438 + napi_complete_done(napi, 0); 439 + return 0; 440 + } 441 + 442 + work_done = ena_clean_xdp_irq(tx_ring, budget); 443 + 444 + /* If the device is about to reset or down, avoid unmask 445 + * the interrupt and return 0 so NAPI won't reschedule 446 + */ 447 + if (unlikely(!test_bit(ENA_FLAG_DEV_UP, &tx_ring->adapter->flags))) { 448 + napi_complete_done(napi, 0); 449 + ret = 0; 450 + } else if (budget > work_done) { 451 + ena_increase_stat(&tx_ring->tx_stats.napi_comp, 1, 452 + &tx_ring->syncp); 453 + if (napi_complete_done(napi, work_done)) 454 + ena_unmask_interrupt(tx_ring, NULL); 455 + 456 + ena_update_ring_numa_node(tx_ring, NULL); 457 + ret = work_done; 458 + } else { 459 + ret = budget; 460 + } 461 + 462 + u64_stats_update_begin(&tx_ring->syncp); 463 + tx_ring->tx_stats.tx_poll++; 464 + u64_stats_update_end(&tx_ring->syncp); 465 + tx_ring->tx_stats.last_napi_jiffies = jiffies; 466 + 467 + return ret; 468 + }
+151
drivers/net/ethernet/amazon/ena/ena_xdp.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 2 + /* 3 + * Copyright 2015-2021 Amazon.com, Inc. or its affiliates. All rights reserved. 4 + */ 5 + 6 + #ifndef ENA_XDP_H 7 + #define ENA_XDP_H 8 + 9 + #include "ena_netdev.h" 10 + #include <linux/bpf_trace.h> 11 + 12 + /* The max MTU size is configured to be the ethernet frame size without 13 + * the overhead of the ethernet header, which can have a VLAN header, and 14 + * a frame check sequence (FCS). 15 + * The buffer size we share with the device is defined to be ENA_PAGE_SIZE 16 + */ 17 + #define ENA_XDP_MAX_MTU (ENA_PAGE_SIZE - ETH_HLEN - ETH_FCS_LEN - \ 18 + VLAN_HLEN - XDP_PACKET_HEADROOM - \ 19 + SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) 20 + 21 + #define ENA_IS_XDP_INDEX(adapter, index) (((index) >= (adapter)->xdp_first_ring) && \ 22 + ((index) < (adapter)->xdp_first_ring + (adapter)->xdp_num_queues)) 23 + 24 + enum ENA_XDP_ACTIONS { 25 + ENA_XDP_PASS = 0, 26 + ENA_XDP_TX = BIT(0), 27 + ENA_XDP_REDIRECT = BIT(1), 28 + ENA_XDP_DROP = BIT(2) 29 + }; 30 + 31 + #define ENA_XDP_FORWARDED (ENA_XDP_TX | ENA_XDP_REDIRECT) 32 + 33 + int ena_setup_and_create_all_xdp_queues(struct ena_adapter *adapter); 34 + void ena_xdp_exchange_program_rx_in_range(struct ena_adapter *adapter, 35 + struct bpf_prog *prog, 36 + int first, int count); 37 + int ena_xdp_io_poll(struct napi_struct *napi, int budget); 38 + int ena_xdp_xmit_frame(struct ena_ring *tx_ring, 39 + struct ena_adapter *adapter, 40 + struct xdp_frame *xdpf, 41 + int flags); 42 + int ena_xdp_xmit(struct net_device *dev, int n, 43 + struct xdp_frame **frames, u32 flags); 44 + int ena_xdp(struct net_device *netdev, struct netdev_bpf *bpf); 45 + int ena_xdp_register_rxq_info(struct ena_ring *rx_ring); 46 + void ena_xdp_unregister_rxq_info(struct ena_ring *rx_ring); 47 + 48 + enum ena_xdp_errors_t { 49 + ENA_XDP_ALLOWED = 0, 50 + ENA_XDP_CURRENT_MTU_TOO_LARGE, 51 + ENA_XDP_NO_ENOUGH_QUEUES, 52 + }; 53 + 54 + static inline bool ena_xdp_present(struct ena_adapter *adapter) 55 + { 56 + return !!adapter->xdp_bpf_prog; 57 + } 58 + 59 + static inline bool ena_xdp_present_ring(struct ena_ring *ring) 60 + { 61 + return !!ring->xdp_bpf_prog; 62 + } 63 + 64 + static inline bool ena_xdp_legal_queue_count(struct ena_adapter *adapter, 65 + u32 queues) 66 + { 67 + return 2 * queues <= adapter->max_num_io_queues; 68 + } 69 + 70 + static inline enum ena_xdp_errors_t ena_xdp_allowed(struct ena_adapter *adapter) 71 + { 72 + enum ena_xdp_errors_t rc = ENA_XDP_ALLOWED; 73 + 74 + if (adapter->netdev->mtu > ENA_XDP_MAX_MTU) 75 + rc = ENA_XDP_CURRENT_MTU_TOO_LARGE; 76 + else if (!ena_xdp_legal_queue_count(adapter, adapter->num_io_queues)) 77 + rc = ENA_XDP_NO_ENOUGH_QUEUES; 78 + 79 + return rc; 80 + } 81 + 82 + static inline int ena_xdp_execute(struct ena_ring *rx_ring, struct xdp_buff *xdp) 83 + { 84 + u32 verdict = ENA_XDP_PASS; 85 + struct bpf_prog *xdp_prog; 86 + struct ena_ring *xdp_ring; 87 + struct xdp_frame *xdpf; 88 + u64 *xdp_stat; 89 + 90 + xdp_prog = READ_ONCE(rx_ring->xdp_bpf_prog); 91 + 92 + verdict = bpf_prog_run_xdp(xdp_prog, xdp); 93 + 94 + switch (verdict) { 95 + case XDP_TX: 96 + xdpf = xdp_convert_buff_to_frame(xdp); 97 + if (unlikely(!xdpf)) { 98 + trace_xdp_exception(rx_ring->netdev, xdp_prog, verdict); 99 + xdp_stat = &rx_ring->rx_stats.xdp_aborted; 100 + verdict = ENA_XDP_DROP; 101 + break; 102 + } 103 + 104 + /* Find xmit queue */ 105 + xdp_ring = rx_ring->xdp_ring; 106 + 107 + /* The XDP queues are shared between XDP_TX and XDP_REDIRECT */ 108 + spin_lock(&xdp_ring->xdp_tx_lock); 109 + 110 + if (ena_xdp_xmit_frame(xdp_ring, rx_ring->adapter, xdpf, 111 + XDP_XMIT_FLUSH)) 112 + xdp_return_frame(xdpf); 113 + 114 + spin_unlock(&xdp_ring->xdp_tx_lock); 115 + xdp_stat = &rx_ring->rx_stats.xdp_tx; 116 + verdict = ENA_XDP_TX; 117 + break; 118 + case XDP_REDIRECT: 119 + if (likely(!xdp_do_redirect(rx_ring->netdev, xdp, xdp_prog))) { 120 + xdp_stat = &rx_ring->rx_stats.xdp_redirect; 121 + verdict = ENA_XDP_REDIRECT; 122 + break; 123 + } 124 + trace_xdp_exception(rx_ring->netdev, xdp_prog, verdict); 125 + xdp_stat = &rx_ring->rx_stats.xdp_aborted; 126 + verdict = ENA_XDP_DROP; 127 + break; 128 + case XDP_ABORTED: 129 + trace_xdp_exception(rx_ring->netdev, xdp_prog, verdict); 130 + xdp_stat = &rx_ring->rx_stats.xdp_aborted; 131 + verdict = ENA_XDP_DROP; 132 + break; 133 + case XDP_DROP: 134 + xdp_stat = &rx_ring->rx_stats.xdp_drop; 135 + verdict = ENA_XDP_DROP; 136 + break; 137 + case XDP_PASS: 138 + xdp_stat = &rx_ring->rx_stats.xdp_pass; 139 + verdict = ENA_XDP_PASS; 140 + break; 141 + default: 142 + bpf_warn_invalid_xdp_action(rx_ring->netdev, xdp_prog, verdict); 143 + xdp_stat = &rx_ring->rx_stats.xdp_invalid; 144 + verdict = ENA_XDP_DROP; 145 + } 146 + 147 + ena_increase_stat(xdp_stat, 1, &rx_ring->syncp); 148 + 149 + return verdict; 150 + } 151 + #endif /* ENA_XDP_H */