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

Configure Feed

Select the types of activity you want to include in your feed.

at v6.15-rc5 238 lines 6.8 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* AF_XDP internal functions 3 * Copyright(c) 2018 Intel Corporation. 4 */ 5 6#ifndef _LINUX_XDP_SOCK_H 7#define _LINUX_XDP_SOCK_H 8 9#include <linux/bpf.h> 10#include <linux/workqueue.h> 11#include <linux/if_xdp.h> 12#include <linux/mutex.h> 13#include <linux/spinlock.h> 14#include <linux/mm.h> 15#include <net/sock.h> 16 17#define XDP_UMEM_SG_FLAG (1 << 1) 18 19struct net_device; 20struct xsk_queue; 21struct xdp_buff; 22 23struct xdp_umem { 24 void *addrs; 25 u64 size; 26 u32 headroom; 27 u32 chunk_size; 28 u32 chunks; 29 u32 npgs; 30 struct user_struct *user; 31 refcount_t users; 32 u8 flags; 33 u8 tx_metadata_len; 34 bool zc; 35 struct page **pgs; 36 int id; 37 struct list_head xsk_dma_list; 38 struct work_struct work; 39}; 40 41struct xsk_map { 42 struct bpf_map map; 43 spinlock_t lock; /* Synchronize map updates */ 44 atomic_t count; 45 struct xdp_sock __rcu *xsk_map[]; 46}; 47 48struct xdp_sock { 49 /* struct sock must be the first member of struct xdp_sock */ 50 struct sock sk; 51 struct xsk_queue *rx ____cacheline_aligned_in_smp; 52 struct net_device *dev; 53 struct xdp_umem *umem; 54 struct list_head flush_node; 55 struct xsk_buff_pool *pool; 56 u16 queue_id; 57 bool zc; 58 bool sg; 59 enum { 60 XSK_READY = 0, 61 XSK_BOUND, 62 XSK_UNBOUND, 63 } state; 64 65 struct xsk_queue *tx ____cacheline_aligned_in_smp; 66 struct list_head tx_list; 67 /* record the number of tx descriptors sent by this xsk and 68 * when it exceeds MAX_PER_SOCKET_BUDGET, an opportunity needs 69 * to be given to other xsks for sending tx descriptors, thereby 70 * preventing other XSKs from being starved. 71 */ 72 u32 tx_budget_spent; 73 74 /* Statistics */ 75 u64 rx_dropped; 76 u64 rx_queue_full; 77 78 /* When __xsk_generic_xmit() must return before it sees the EOP descriptor for the current 79 * packet, the partially built skb is saved here so that packet building can resume in next 80 * call of __xsk_generic_xmit(). 81 */ 82 struct sk_buff *skb; 83 84 struct list_head map_list; 85 /* Protects map_list */ 86 spinlock_t map_list_lock; 87 /* Protects multiple processes in the control path */ 88 struct mutex mutex; 89 struct xsk_queue *fq_tmp; /* Only as tmp storage before bind */ 90 struct xsk_queue *cq_tmp; /* Only as tmp storage before bind */ 91}; 92 93/* 94 * AF_XDP TX metadata hooks for network devices. 95 * The following hooks can be defined; unless noted otherwise, they are 96 * optional and can be filled with a null pointer. 97 * 98 * void (*tmo_request_timestamp)(void *priv) 99 * Called when AF_XDP frame requested egress timestamp. 100 * 101 * u64 (*tmo_fill_timestamp)(void *priv) 102 * Called when AF_XDP frame, that had requested egress timestamp, 103 * received a completion. The hook needs to return the actual HW timestamp. 104 * 105 * void (*tmo_request_checksum)(u16 csum_start, u16 csum_offset, void *priv) 106 * Called when AF_XDP frame requested HW checksum offload. csum_start 107 * indicates position where checksumming should start. 108 * csum_offset indicates position where checksum should be stored. 109 * 110 * void (*tmo_request_launch_time)(u64 launch_time, void *priv) 111 * Called when AF_XDP frame requested launch time HW offload support. 112 * launch_time indicates the PTP time at which the device can schedule the 113 * packet for transmission. 114 */ 115struct xsk_tx_metadata_ops { 116 void (*tmo_request_timestamp)(void *priv); 117 u64 (*tmo_fill_timestamp)(void *priv); 118 void (*tmo_request_checksum)(u16 csum_start, u16 csum_offset, void *priv); 119 void (*tmo_request_launch_time)(u64 launch_time, void *priv); 120}; 121 122#ifdef CONFIG_XDP_SOCKETS 123 124int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp); 125int __xsk_map_redirect(struct xdp_sock *xs, struct xdp_buff *xdp); 126void __xsk_map_flush(struct list_head *flush_list); 127 128/** 129 * xsk_tx_metadata_to_compl - Save enough relevant metadata information 130 * to perform tx completion in the future. 131 * @meta: pointer to AF_XDP metadata area 132 * @compl: pointer to output struct xsk_tx_metadata_to_compl 133 * 134 * This function should be called by the networking device when 135 * it prepares AF_XDP egress packet. The value of @compl should be stored 136 * and passed to xsk_tx_metadata_complete upon TX completion. 137 */ 138static inline void xsk_tx_metadata_to_compl(struct xsk_tx_metadata *meta, 139 struct xsk_tx_metadata_compl *compl) 140{ 141 if (!meta) 142 return; 143 144 if (meta->flags & XDP_TXMD_FLAGS_TIMESTAMP) 145 compl->tx_timestamp = &meta->completion.tx_timestamp; 146 else 147 compl->tx_timestamp = NULL; 148} 149 150/** 151 * xsk_tx_metadata_request - Evaluate AF_XDP TX metadata at submission 152 * and call appropriate xsk_tx_metadata_ops operation. 153 * @meta: pointer to AF_XDP metadata area 154 * @ops: pointer to struct xsk_tx_metadata_ops 155 * @priv: pointer to driver-private aread 156 * 157 * This function should be called by the networking device when 158 * it prepares AF_XDP egress packet. 159 */ 160static inline void xsk_tx_metadata_request(const struct xsk_tx_metadata *meta, 161 const struct xsk_tx_metadata_ops *ops, 162 void *priv) 163{ 164 if (!meta) 165 return; 166 167 if (ops->tmo_request_launch_time) 168 if (meta->flags & XDP_TXMD_FLAGS_LAUNCH_TIME) 169 ops->tmo_request_launch_time(meta->request.launch_time, 170 priv); 171 172 if (ops->tmo_request_timestamp) 173 if (meta->flags & XDP_TXMD_FLAGS_TIMESTAMP) 174 ops->tmo_request_timestamp(priv); 175 176 if (ops->tmo_request_checksum) 177 if (meta->flags & XDP_TXMD_FLAGS_CHECKSUM) 178 ops->tmo_request_checksum(meta->request.csum_start, 179 meta->request.csum_offset, priv); 180} 181 182/** 183 * xsk_tx_metadata_complete - Evaluate AF_XDP TX metadata at completion 184 * and call appropriate xsk_tx_metadata_ops operation. 185 * @compl: pointer to completion metadata produced from xsk_tx_metadata_to_compl 186 * @ops: pointer to struct xsk_tx_metadata_ops 187 * @priv: pointer to driver-private aread 188 * 189 * This function should be called by the networking device upon 190 * AF_XDP egress completion. 191 */ 192static inline void xsk_tx_metadata_complete(struct xsk_tx_metadata_compl *compl, 193 const struct xsk_tx_metadata_ops *ops, 194 void *priv) 195{ 196 if (!compl) 197 return; 198 if (!compl->tx_timestamp) 199 return; 200 201 *compl->tx_timestamp = ops->tmo_fill_timestamp(priv); 202} 203 204#else 205 206static inline int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp) 207{ 208 return -ENOTSUPP; 209} 210 211static inline int __xsk_map_redirect(struct xdp_sock *xs, struct xdp_buff *xdp) 212{ 213 return -EOPNOTSUPP; 214} 215 216static inline void __xsk_map_flush(struct list_head *flush_list) 217{ 218} 219 220static inline void xsk_tx_metadata_to_compl(struct xsk_tx_metadata *meta, 221 struct xsk_tx_metadata_compl *compl) 222{ 223} 224 225static inline void xsk_tx_metadata_request(struct xsk_tx_metadata *meta, 226 const struct xsk_tx_metadata_ops *ops, 227 void *priv) 228{ 229} 230 231static inline void xsk_tx_metadata_complete(struct xsk_tx_metadata_compl *compl, 232 const struct xsk_tx_metadata_ops *ops, 233 void *priv) 234{ 235} 236 237#endif /* CONFIG_XDP_SOCKETS */ 238#endif /* _LINUX_XDP_SOCK_H */