| /linux/Documentation/translations/zh_CN/networking/ |
| H A D | napi.rst | 4 :Original: Documentation/networking/napi.rst 11 NAPI title 14 NAPI 是 Linux 网络堆栈中使用的事件处理机制。NAPI 的名称现在不再代表任何特定含义 [#]_。 16 在基本操作中,设备通过中断通知主机有新事件发生。主机随后调度 NAPI 实例来处理这些事件。 17 该设备也可以通过 NAPI 进行事件轮询,而无需先接收中断信号(:ref:`忙轮询<poll_zh_CN>`)。 19 NAPI 处理通常发生在软中断上下文中,但有一个选项,可以使用 :ref:`单独的内核线程<threaded_zh_CN>` 20 来进行 NAPI 处理。 22 总的来说,NAPI 为驱动程序抽象了事件(数据包接收和发送)处理的上下文环境和配置情况。 27 NAPI 最重要的两个元素是 struct napi_struct 和关联的 poll 方法。struct napi_struct 28 持有 NAPI 实例的状态,而方法则是与驱动程序相关的事件处理器。该方法通常会释放已传输的发送 [all …]
|
| /linux/Documentation/networking/ |
| H A D | napi.rst | 6 NAPI title 9 NAPI is the event handling mechanism used by the Linux networking stack. 10 The name NAPI no longer stands for anything in particular [#]_. 14 The host then schedules a NAPI instance to process the events. 15 The device may also be polled for events via NAPI without receiving 18 NAPI processing usually happens in the software interrupt context, 20 for NAPI processing. 22 All in all NAPI abstracts away from the drivers the context and configuration 28 The two most important elements of NAPI are the struct napi_struct 30 of the NAPI instance while the method is the driver-specific event [all …]
|
| H A D | multi-pf-netdev.rst | 90 The relation between PF, irq, napi, and queue can be observed via netlink spec:: 93 [{'id': 0, 'ifindex': 13, 'napi-id': 539, 'type': 'rx'}, 94 {'id': 1, 'ifindex': 13, 'napi-id': 540, 'type': 'rx'}, 95 {'id': 2, 'ifindex': 13, 'napi-id': 541, 'type': 'rx'}, 96 {'id': 3, 'ifindex': 13, 'napi-id': 542, 'type': 'rx'}, 97 {'id': 4, 'ifindex': 13, 'napi-id': 543, 'type': 'rx'}, 98 {'id': 0, 'ifindex': 13, 'napi-id': 539, 'type': 'tx'}, 99 {'id': 1, 'ifindex': 13, 'napi-id': 540, 'type': 'tx'}, 100 {'id': 2, 'ifindex': 13, 'napi-id': 541, 'type': 'tx'}, 101 {'id': 3, 'ifindex': 13, 'napi-id': 542, 'type': 'tx'}, [all …]
|
| /linux/tools/testing/selftests/drivers/net/ |
| H A D | napi_threaded.py | 5 Test napi threaded states. 15 napi = nl.napi_get({'id': napi_id}) 16 ksft_eq(napi['threaded'], 'enabled') 17 ksft_ne(napi.get('pid'), None) 21 napi = nl.napi_get({'id': napi_id}) 22 ksft_eq(napi['threaded'], 'disabled') 23 ksft_eq(napi.get('pid'), None) 44 Test that threaded state (in the persistent NAPI config) gets updated 45 even when NAPI with given ID is not allocated at the time. 56 for napi in napis: [all …]
|
| /linux/io_uring/ |
| H A D | napi.c | 4 #include "napi.h" 37 /* napi approximating usecs, reverse busy_loop_current_time */ in net_to_ktime() 46 /* Non-NAPI IDs can be rejected. */ in __io_napi_add_id() 89 /* Non-NAPI IDs can be rejected. */ in __io_napi_del_id() 212 /* Singular lists use a different napi loop end check function and are in io_napi_blocking_busy_loop() 232 * io_napi_init() - Init napi settings 235 * Init napi settings in the io-uring context. 249 * io_napi_free() - Deallocate napi 252 * Free the napi list and the hash table in the io-uring context. 267 struct io_uring_napi *napi) in io_napi_register_napi() argument [all …]
|
| /linux/net/core/ |
| H A D | dev.h | 210 * napi_get_defer_hard_irqs - get the NAPI's defer_hard_irqs 211 * @n: napi struct to get the defer_hard_irqs field from 213 * Return: the per-NAPI value of the defar_hard_irqs field. 221 * napi_set_defer_hard_irqs - set the defer_hard_irqs for a napi 240 struct napi_struct *napi; in netdev_set_defer_hard_irqs() local 244 list_for_each_entry(napi, &netdev->napi_list, dev_list) in netdev_set_defer_hard_irqs() 245 napi_set_defer_hard_irqs(napi, defer); in netdev_set_defer_hard_irqs() 253 * @n: napi struct to get the gro_flush_timeout from 255 * Return: the per-NAPI value of the gro_flush_timeout field. 264 * napi_set_gro_flush_timeout - set the gro_flush_timeout for a napi [all …]
|
| H A D | gro_cells.c | 10 struct napi_struct napi; member 44 napi_schedule(&cell->napi); in gro_cells_receive() 57 static int gro_cell_poll(struct napi_struct *napi, int budget) in gro_cell_poll() argument 59 struct gro_cell *cell = container_of(napi, struct gro_cell, napi); in gro_cell_poll() 69 napi_gro_receive(napi, skb); in gro_cell_poll() 74 napi_complete_done(napi, work_done); in gro_cell_poll() 92 set_bit(NAPI_STATE_NO_BUSY_POLL, &cell->napi.state); in gro_cells_init() 94 netif_napi_add(dev, &cell->napi, gro_cell_poll); in gro_cells_init() 95 napi_enable(&cell->napi); in gro_cells_init() 125 napi_disable(&cell->napi); in gro_cells_destroy() [all …]
|
| H A D | netdev-genl.c | 162 netdev_nl_napi_fill_one(struct sk_buff *rsp, struct napi_struct *napi, in netdev_nl_napi_fill_one() argument 171 if (!napi->dev->up) in netdev_nl_napi_fill_one() 178 if (nla_put_u32(rsp, NETDEV_A_NAPI_ID, napi->napi_id)) in netdev_nl_napi_fill_one() 181 if (nla_put_u32(rsp, NETDEV_A_NAPI_IFINDEX, napi->dev->ifindex)) in netdev_nl_napi_fill_one() 184 if (napi->irq >= 0 && nla_put_u32(rsp, NETDEV_A_NAPI_IRQ, napi->irq)) in netdev_nl_napi_fill_one() 188 napi_get_threaded(napi))) in netdev_nl_napi_fill_one() 191 if (napi->thread) { in netdev_nl_napi_fill_one() 192 pid = task_pid_nr(napi->thread); in netdev_nl_napi_fill_one() 197 napi_defer_hard_irqs = napi_get_defer_hard_irqs(napi); in netdev_nl_napi_fill_one() 202 irq_suspend_timeout = napi_get_irq_suspend_timeout(napi); in netdev_nl_napi_fill_one() [all …]
|
| H A D | dev.c | 136 #include <trace/events/napi.h> 469 * (e.g. NAPI context). 797 struct napi_struct *napi; in napi_by_id() local 799 hlist_for_each_entry_rcu(napi, &napi_hash[hash], napi_hash_node) in napi_by_id() 800 if (napi->napi_id == napi_id) in napi_by_id() 801 return napi; in napi_by_id() 810 struct napi_struct *napi; in netdev_napi_by_id() local 812 napi = napi_by_id(napi_id); in netdev_napi_by_id() 813 if (!napi) in netdev_napi_by_id() 816 if (WARN_ON_ONCE(!napi->dev)) in netdev_napi_by_id() [all …]
|
| /linux/include/trace/events/ |
| H A D | napi.h | 3 #define TRACE_SYSTEM napi 16 TP_PROTO(struct napi_struct *napi, int work, int budget), 18 TP_ARGS(napi, work, budget), 21 __field( struct napi_struct *, napi) 22 __string( dev_name, napi->dev ? napi->dev->name : NO_DEV) 28 __entry->napi = napi; 34 TP_printk("napi poll on napi struct %p for device %s work %d budget %d", 35 __entry->napi, __get_str(dev_name),
|
| /linux/drivers/net/ethernet/intel/igc/ |
| H A D | igc_xdp.c | 32 napi_disable(&adapter->rx_ring[i]->q_vector->napi); in igc_xdp_set_prog() 47 napi_enable(&adapter->rx_ring[i]->q_vector->napi); in igc_xdp_set_prog() 62 struct napi_struct *napi; in igc_xdp_enable_pool() local 91 /* Rx and Tx rings share the same napi context. */ in igc_xdp_enable_pool() 92 napi = &rx_ring->q_vector->napi; in igc_xdp_enable_pool() 97 napi_disable(napi); in igc_xdp_enable_pool() 104 napi_enable(napi); in igc_xdp_enable_pool() 122 struct napi_struct *napi; in igc_xdp_disable_pool() local 137 /* Rx and Tx rings share the same napi context. */ in igc_xdp_disable_pool() 138 napi = &rx_ring->q_vector->napi; in igc_xdp_disable_pool() [all …]
|
| /linux/Documentation/netlink/specs/ |
| H A D | netdev.yaml | 39 support in the driver napi callback. 89 name: napi-threaded 153 name: napi-id 154 doc: Id of NAPI using this Page Pool instance. 248 name: napi 252 doc: ifindex of the netdevice to which NAPI instance belongs. 258 doc: ID of the NAPI instance. 262 doc: The associated interrupt vector number for the napi 266 doc: PID of the napi thread, if NAPI is configured to operate in 267 threaded mode. If NAPI is not in threaded mode (i.e. uses normal [all …]
|
| /linux/drivers/infiniband/hw/hfi1/ |
| H A D | ipoib_rx.c | 22 static struct sk_buff *prepare_frag_skb(struct napi_struct *napi, int size) in prepare_frag_skb() argument 33 return napi_alloc_skb(napi, size); in prepare_frag_skb() 49 struct napi_struct *napi = &rxq->napi; in hfi1_ipoib_prepare_skb() local 55 * napi cache. Otherwise we will try to use napi frag cache. in hfi1_ipoib_prepare_skb() 58 skb = napi_alloc_skb(napi, skb_size); in hfi1_ipoib_prepare_skb() 60 skb = prepare_frag_skb(napi, skb_size); in hfi1_ipoib_prepare_skb()
|
| /linux/drivers/net/wireless/ath/wil6210/ |
| H A D | netdev.c | 91 static int wil6210_netdev_poll_rx(struct napi_struct *napi, int budget) in wil6210_netdev_poll_rx() argument 93 struct wil6210_priv *wil = container_of(napi, struct wil6210_priv, in wil6210_netdev_poll_rx() 102 napi_complete_done(napi, done); in wil6210_netdev_poll_rx() 104 wil_dbg_txrx(wil, "NAPI RX complete\n"); in wil6210_netdev_poll_rx() 107 wil_dbg_txrx(wil, "NAPI RX poll(%d) done %d\n", budget, done); in wil6210_netdev_poll_rx() 112 static int wil6210_netdev_poll_rx_edma(struct napi_struct *napi, int budget) in wil6210_netdev_poll_rx_edma() argument 114 struct wil6210_priv *wil = container_of(napi, struct wil6210_priv, in wil6210_netdev_poll_rx_edma() 123 napi_complete_done(napi, done); in wil6210_netdev_poll_rx_edma() 125 wil_dbg_txrx(wil, "NAPI RX complete\n"); in wil6210_netdev_poll_rx_edma() 128 wil_dbg_txrx(wil, "NAPI RX poll(%d) done %d\n", budget, done); in wil6210_netdev_poll_rx_edma() [all …]
|
| /linux/drivers/net/netdevsim/ |
| H A D | netdev.c | 48 idx = rq->napi.index; in nsim_start_peer_tx_queue() 415 struct net_device *dev = rq->napi.dev; in nsim_rcv() 446 napi_gro_receive(&rq->napi, skb); in nsim_rcv() 453 static int nsim_poll(struct napi_struct *napi, int budget) in nsim_poll() argument 455 struct nsim_rq *rq = container_of(napi, struct nsim_rq, napi); in nsim_poll() 460 napi_complete_done(napi, done); in nsim_poll() 465 static int nsim_create_page_pool(struct page_pool **p, struct napi_struct *napi) in nsim_create_page_pool() argument 471 .dev = &napi->dev->dev, in nsim_create_page_pool() 472 .napi = napi, in nsim_create_page_pool() 474 .netdev = napi->dev, in nsim_create_page_pool() [all …]
|
| /linux/include/linux/ |
| H A D | netpoll.h | 79 static inline void *netpoll_poll_lock(struct napi_struct *napi) in netpoll_poll_lock() argument 81 struct net_device *dev = napi->dev; in netpoll_poll_lock() 86 while (cmpxchg(&napi->poll_owner, -1, owner) != -1) in netpoll_poll_lock() 89 return napi; in netpoll_poll_lock() 96 struct napi_struct *napi = have; in netpoll_poll_unlock() local 98 if (napi) in netpoll_poll_unlock() 99 smp_store_release(&napi->poll_owner, -1); in netpoll_poll_unlock() 108 static inline void *netpoll_poll_lock(struct napi_struct *napi) in netpoll_poll_lock() argument
|
| /linux/drivers/net/ethernet/synopsys/ |
| H A D | dwc-xlgmac-net.c | 283 * enabled before using the private data napi structure. in xlgmac_isr() 290 if (napi_schedule_prep(&pdata->napi)) { in xlgmac_isr() 296 __napi_schedule_irqoff(&pdata->napi); in xlgmac_isr() 348 * channel napi structure and not the private data napi structure in xlgmac_dma_isr() 350 if (napi_schedule_prep(&channel->napi)) { in xlgmac_dma_isr() 355 __napi_schedule_irqoff(&channel->napi); in xlgmac_dma_isr() 366 struct napi_struct *napi; in xlgmac_tx_timer() local 368 napi = (pdata->per_channel_irq) ? &channel->napi : &pdata->napi; in xlgmac_tx_timer() 370 if (napi_schedule_prep(napi)) { in xlgmac_tx_timer() 379 __napi_schedule(napi); in xlgmac_tx_timer() [all …]
|
| /linux/drivers/net/ethernet/ |
| H A D | lantiq_xrx200.c | 64 struct napi_struct napi; member 151 napi_enable(&priv->chan_tx.napi); in xrx200_open() 155 napi_enable(&priv->chan_rx.napi); in xrx200_open() 178 napi_disable(&priv->chan_rx.napi); in xrx200_close() 181 napi_disable(&priv->chan_tx.napi); in xrx200_close() 283 static int xrx200_poll_rx(struct napi_struct *napi, int budget) in xrx200_poll_rx() argument 285 struct xrx200_chan *ch = container_of(napi, in xrx200_poll_rx() 286 struct xrx200_chan, napi); in xrx200_poll_rx() 306 if (napi_complete_done(&ch->napi, rx)) in xrx200_poll_rx() 313 static int xrx200_tx_housekeeping(struct napi_struct *napi, int budget) in xrx200_tx_housekeeping() argument [all …]
|
| /linux/drivers/net/ethernet/meta/fbnic/ |
| H A D | fbnic_txrx.c | 606 txq = txring_txq(nv->napi.dev, ring); in fbnic_clean_twq0() 698 netdev_err(nv->napi.dev, in fbnic_clean_tsq() 710 fbn = netdev_priv(nv->napi.dev); in fbnic_clean_tsq() 748 /* sub0 is always fed system pages, from the NAPI-level page_pool */ in fbnic_page_pool_get_head() 1021 netdev_err_once(nv->napi.dev, in fbnic_add_rx_frag() 1150 struct fbnic_net *fbn = netdev_priv(nv->napi.dev); in fbnic_run_xdp() 1170 bpf_warn_invalid_xdp_action(nv->napi.dev, xdp_prog, act); in fbnic_run_xdp() 1173 trace_xdp_exception(nv->napi.dev, xdp_prog, act); in fbnic_run_xdp() 1198 fbn = netdev_priv(nv->napi.dev); in fbnic_rx_tstamp() 1211 struct net_device *netdev = nv->napi.dev; in fbnic_populate_skb_fields() [all …]
|
| /linux/drivers/net/ethernet/aquantia/atlantic/ |
| H A D | aq_vec.c | 21 struct napi_struct napi; member 28 static int aq_vec_poll(struct napi_struct *napi, int budget) in aq_vec_poll() argument 30 struct aq_vec_s *self = container_of(napi, struct aq_vec_s, napi); in aq_vec_poll() 68 napi, in aq_vec_poll() 93 napi_complete_done(napi, work_done); in aq_vec_poll() 122 netif_napi_add(aq_nic_get_ndev(aq_nic), &self->napi, aq_vec_poll); in aq_vec_alloc() 151 self->napi.napi_id) < 0) { in aq_vec_ring_alloc() 245 napi_enable(&self->napi); in aq_vec_start() 265 napi_disable(&self->napi); in aq_vec_stop() 290 netif_napi_del(&self->napi); in aq_vec_free() [all …]
|
| /linux/drivers/net/ethernet/huawei/hinic3/ |
| H A D | hinic3_irq.c | 31 static int hinic3_poll(struct napi_struct *napi, int budget) in hinic3_poll() argument 34 container_of(napi, struct hinic3_irq_cfg, napi); in hinic3_poll() 52 if (likely(napi_complete_done(napi, work_done))) { in hinic3_poll() 65 netif_napi_add(nic_dev->netdev, &irq_cfg->napi, hinic3_poll); in qp_add_napi() 66 napi_enable(&irq_cfg->napi); in qp_add_napi() 71 napi_disable(&irq_cfg->napi); in qp_del_napi() 72 netif_napi_del(&irq_cfg->napi); in qp_del_napi() 86 napi_schedule(&irq_cfg->napi); in qp_irq() 235 NETDEV_QUEUE_TYPE_RX, &irq_cfg->napi); in hinic3_qps_irq_init() 237 NETDEV_QUEUE_TYPE_TX, &irq_cfg->napi); in hinic3_qps_irq_init()
|
| /linux/drivers/net/ethernet/mellanox/mlx4/ |
| H A D | en_cq.c | 152 netif_napi_add_tx(cq->dev, &cq->napi, mlx4_en_poll_tx_cq); in mlx4_en_activate_cq() 153 netif_napi_set_irq(&cq->napi, irq); in mlx4_en_activate_cq() 154 napi_enable(&cq->napi); in mlx4_en_activate_cq() 155 netif_queue_set_napi(cq->dev, cq_idx, NETDEV_QUEUE_TYPE_TX, &cq->napi); in mlx4_en_activate_cq() 159 netif_napi_add_config(cq->dev, &cq->napi, mlx4_en_poll_rx_cq, in mlx4_en_activate_cq() 161 netif_napi_set_irq(&cq->napi, irq); in mlx4_en_activate_cq() 162 napi_enable(&cq->napi); in mlx4_en_activate_cq() 163 netif_queue_set_napi(cq->dev, cq_idx, NETDEV_QUEUE_TYPE_RX, &cq->napi); in mlx4_en_activate_cq() 166 /* nothing regarding napi, it's shared with rx ring */ in mlx4_en_activate_cq() 207 napi_disable(&cq->napi); in mlx4_en_deactivate_cq() [all …]
|
| /linux/tools/testing/selftests/net/ |
| H A D | nl_netdev.py | 40 Test that verifies various cases of napi threaded 41 set and unset at napi and device level. 54 # set napi threaded and verify 68 # verify if napi threaded is still set 78 # unset napi threaded and verify 87 # check napi threaded is set for both napis 98 # check napi threaded is unset for both napis 106 # set napi threaded for napi0 115 # check napi threaded is unset for both napis 125 Test that verifies various cases of napi threaded [all …]
|
| /linux/drivers/net/ethernet/mellanox/mlx5/core/en/ |
| H A D | trap.c | 8 static int mlx5e_trap_napi_poll(struct napi_struct *napi, int budget) in mlx5e_trap_napi_poll() argument 10 struct mlx5e_trap *trap_ctx = container_of(napi, struct mlx5e_trap, napi); in mlx5e_trap_napi_poll() 29 if (unlikely(!napi_complete_done(napi, work_done))) in mlx5e_trap_napi_poll() 77 ccp.napi = &t->napi; in mlx5e_open_trap_rq() 152 netif_napi_add_locked(netdev, &t->napi, mlx5e_trap_napi_poll); in mlx5e_open_trap() 167 netif_napi_del_locked(&t->napi); in mlx5e_open_trap() 176 netif_napi_del_locked(&trap->napi); in mlx5e_close_trap() 182 napi_enable_locked(&trap->napi); in mlx5e_activate_trap() 184 mlx5e_trigger_napi_sched(&trap->napi); in mlx5e_activate_trap() 192 napi_disable_locked(&trap->napi); in mlx5e_deactivate_trap()
|
| /linux/drivers/net/caif/ |
| H A D | caif_virtio.c | 30 /* NAPI schedule quota */ 41 /* struct cfv_napi_contxt - NAPI context info 54 * @rx_napi_complete: Number of NAPI completions (RX) 84 * @napi: Napi context used in cfv_rx_poll() 111 struct napi_struct napi; member 250 static int cfv_rx_poll(struct napi_struct *napi, int quota) in cfv_rx_poll() argument 252 struct cfv_info *cfv = container_of(napi, struct cfv_info, napi); in cfv_rx_poll() 319 napi_complete(napi); in cfv_rx_poll() 321 napi_schedule_prep(napi)) { in cfv_rx_poll() 323 __napi_schedule(napi); in cfv_rx_poll() [all …]
|