at master 3.3 kB view raw
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* Copyright (C) 2024-2025 Intel Corporation */ 3 4#ifndef __LIBETH_TYPES_H 5#define __LIBETH_TYPES_H 6 7#include <linux/workqueue.h> 8 9/* Stats */ 10 11/** 12 * struct libeth_rq_napi_stats - "hot" counters to update in Rx polling loop 13 * @packets: received frames counter 14 * @bytes: sum of bytes of received frames above 15 * @fragments: sum of fragments of received S/G frames 16 * @hsplit: number of frames the device performed the header split for 17 * @raw: alias to access all the fields as an array 18 */ 19struct libeth_rq_napi_stats { 20 union { 21 struct { 22 u32 packets; 23 u32 bytes; 24 u32 fragments; 25 u32 hsplit; 26 }; 27 DECLARE_FLEX_ARRAY(u32, raw); 28 }; 29}; 30 31/** 32 * struct libeth_sq_napi_stats - "hot" counters to update in Tx completion loop 33 * @packets: completed frames counter 34 * @bytes: sum of bytes of completed frames above 35 * @raw: alias to access all the fields as an array 36 */ 37struct libeth_sq_napi_stats { 38 union { 39 struct { 40 u32 packets; 41 u32 bytes; 42 }; 43 DECLARE_FLEX_ARRAY(u32, raw); 44 }; 45}; 46 47/** 48 * struct libeth_xdpsq_napi_stats - "hot" counters to update in XDP Tx 49 * completion loop 50 * @packets: completed frames counter 51 * @bytes: sum of bytes of completed frames above 52 * @fragments: sum of fragments of completed S/G frames 53 * @raw: alias to access all the fields as an array 54 */ 55struct libeth_xdpsq_napi_stats { 56 union { 57 struct { 58 u32 packets; 59 u32 bytes; 60 u32 fragments; 61 }; 62 DECLARE_FLEX_ARRAY(u32, raw); 63 }; 64}; 65 66/* XDP */ 67 68/* 69 * The following structures should be embedded into driver's queue structure 70 * and passed to the libeth_xdp helpers, never used directly. 71 */ 72 73/* XDPSQ sharing */ 74 75/** 76 * struct libeth_xdpsq_lock - locking primitive for sharing XDPSQs 77 * @lock: spinlock for locking the queue 78 * @share: whether this particular queue is shared 79 */ 80struct libeth_xdpsq_lock { 81 spinlock_t lock; 82 bool share; 83}; 84 85/* XDPSQ clean-up timers */ 86 87/** 88 * struct libeth_xdpsq_timer - timer for cleaning up XDPSQs w/o interrupts 89 * @xdpsq: queue this timer belongs to 90 * @lock: lock for the queue 91 * @dwork: work performing cleanups 92 * 93 * XDPSQs not using interrupts but lazy cleaning, i.e. only when there's no 94 * space for sending the current queued frame/bulk, must fire up timers to 95 * make sure there are no stale buffers to free. 96 */ 97struct libeth_xdpsq_timer { 98 void *xdpsq; 99 struct libeth_xdpsq_lock *lock; 100 101 struct delayed_work dwork; 102}; 103 104/* Rx polling path */ 105 106/** 107 * struct libeth_xdp_buff_stash - struct for stashing &xdp_buff onto a queue 108 * @data: pointer to the start of the frame, xdp_buff.data 109 * @headroom: frame headroom, xdp_buff.data - xdp_buff.data_hard_start 110 * @len: frame linear space length, xdp_buff.data_end - xdp_buff.data 111 * @frame_sz: truesize occupied by the frame, xdp_buff.frame_sz 112 * @flags: xdp_buff.flags 113 * 114 * &xdp_buff is 56 bytes long on x64, &libeth_xdp_buff is 64 bytes. This 115 * structure carries only necessary fields to save/restore a partially built 116 * frame on the queue structure to finish it during the next NAPI poll. 117 */ 118struct libeth_xdp_buff_stash { 119 void *data; 120 u16 headroom; 121 u16 len; 122 123 u32 frame_sz:24; 124 u32 flags:8; 125} __aligned_largest; 126 127#endif /* __LIBETH_TYPES_H */