1 // SPDX-License-Identifier: GPL-2.0-only 2 /* net/core/xdp.c 3 * 4 * Copyright (c) 2017 Jesper Dangaard Brouer, Red Hat Inc. 5 */ 6 #include <linux/bpf.h> 7 #include <linux/btf_ids.h> 8 #include <linux/filter.h> 9 #include <linux/types.h> 10 #include <linux/mm.h> 11 #include <linux/netdevice.h> 12 #include <linux/slab.h> 13 #include <linux/idr.h> 14 #include <linux/rhashtable.h> 15 #include <linux/bug.h> 16 #include <net/page_pool.h> 17 18 #include <net/xdp.h> 19 #include <net/xdp_priv.h> /* struct xdp_mem_allocator */ 20 #include <trace/events/xdp.h> 21 #include <net/xdp_sock_drv.h> 22 23 #define REG_STATE_NEW 0x0 24 #define REG_STATE_REGISTERED 0x1 25 #define REG_STATE_UNREGISTERED 0x2 26 #define REG_STATE_UNUSED 0x3 27 28 static DEFINE_IDA(mem_id_pool); 29 static DEFINE_MUTEX(mem_id_lock); 30 #define MEM_ID_MAX 0xFFFE 31 #define MEM_ID_MIN 1 32 static int mem_id_next = MEM_ID_MIN; 33 34 static bool mem_id_init; /* false */ 35 static struct rhashtable *mem_id_ht; 36 37 static u32 xdp_mem_id_hashfn(const void *data, u32 len, u32 seed) 38 { 39 const u32 *k = data; 40 const u32 key = *k; 41 42 BUILD_BUG_ON(sizeof_field(struct xdp_mem_allocator, mem.id) 43 != sizeof(u32)); 44 45 /* Use cyclic increasing ID as direct hash key */ 46 return key; 47 } 48 49 static int xdp_mem_id_cmp(struct rhashtable_compare_arg *arg, 50 const void *ptr) 51 { 52 const struct xdp_mem_allocator *xa = ptr; 53 u32 mem_id = *(u32 *)arg->key; 54 55 return xa->mem.id != mem_id; 56 } 57 58 static const struct rhashtable_params mem_id_rht_params = { 59 .nelem_hint = 64, 60 .head_offset = offsetof(struct xdp_mem_allocator, node), 61 .key_offset = offsetof(struct xdp_mem_allocator, mem.id), 62 .key_len = sizeof_field(struct xdp_mem_allocator, mem.id), 63 .max_size = MEM_ID_MAX, 64 .min_size = 8, 65 .automatic_shrinking = true, 66 .hashfn = xdp_mem_id_hashfn, 67 .obj_cmpfn = xdp_mem_id_cmp, 68 }; 69 70 static void __xdp_mem_allocator_rcu_free(struct rcu_head *rcu) 71 { 72 struct xdp_mem_allocator *xa; 73 74 xa = container_of(rcu, struct xdp_mem_allocator, rcu); 75 76 /* Allow this ID to be reused */ 77 ida_simple_remove(&mem_id_pool, xa->mem.id); 78 79 kfree(xa); 80 } 81 82 static void mem_xa_remove(struct xdp_mem_allocator *xa) 83 { 84 trace_mem_disconnect(xa); 85 86 if (!rhashtable_remove_fast(mem_id_ht, &xa->node, mem_id_rht_params)) 87 call_rcu(&xa->rcu, __xdp_mem_allocator_rcu_free); 88 } 89 90 static void mem_allocator_disconnect(void *allocator) 91 { 92 struct xdp_mem_allocator *xa; 93 struct rhashtable_iter iter; 94 95 mutex_lock(&mem_id_lock); 96 97 rhashtable_walk_enter(mem_id_ht, &iter); 98 do { 99 rhashtable_walk_start(&iter); 100 101 while ((xa = rhashtable_walk_next(&iter)) && !IS_ERR(xa)) { 102 if (xa->allocator == allocator) 103 mem_xa_remove(xa); 104 } 105 106 rhashtable_walk_stop(&iter); 107 108 } while (xa == ERR_PTR(-EAGAIN)); 109 rhashtable_walk_exit(&iter); 110 111 mutex_unlock(&mem_id_lock); 112 } 113 114 void xdp_unreg_mem_model(struct xdp_mem_info *mem) 115 { 116 struct xdp_mem_allocator *xa; 117 int type = mem->type; 118 int id = mem->id; 119 120 /* Reset mem info to defaults */ 121 mem->id = 0; 122 mem->type = 0; 123 124 if (id == 0) 125 return; 126 127 if (type == MEM_TYPE_PAGE_POOL) { 128 rcu_read_lock(); 129 xa = rhashtable_lookup(mem_id_ht, &id, mem_id_rht_params); 130 page_pool_destroy(xa->page_pool); 131 rcu_read_unlock(); 132 } 133 } 134 EXPORT_SYMBOL_GPL(xdp_unreg_mem_model); 135 136 void xdp_rxq_info_unreg_mem_model(struct xdp_rxq_info *xdp_rxq) 137 { 138 if (xdp_rxq->reg_state != REG_STATE_REGISTERED) { 139 WARN(1, "Missing register, driver bug"); 140 return; 141 } 142 143 xdp_unreg_mem_model(&xdp_rxq->mem); 144 } 145 EXPORT_SYMBOL_GPL(xdp_rxq_info_unreg_mem_model); 146 147 void xdp_rxq_info_unreg(struct xdp_rxq_info *xdp_rxq) 148 { 149 /* Simplify driver cleanup code paths, allow unreg "unused" */ 150 if (xdp_rxq->reg_state == REG_STATE_UNUSED) 151 return; 152 153 xdp_rxq_info_unreg_mem_model(xdp_rxq); 154 155 xdp_rxq->reg_state = REG_STATE_UNREGISTERED; 156 xdp_rxq->dev = NULL; 157 } 158 EXPORT_SYMBOL_GPL(xdp_rxq_info_unreg); 159 160 static void xdp_rxq_info_init(struct xdp_rxq_info *xdp_rxq) 161 { 162 memset(xdp_rxq, 0, sizeof(*xdp_rxq)); 163 } 164 165 /* Returns 0 on success, negative on failure */ 166 int __xdp_rxq_info_reg(struct xdp_rxq_info *xdp_rxq, 167 struct net_device *dev, u32 queue_index, 168 unsigned int napi_id, u32 frag_size) 169 { 170 if (!dev) { 171 WARN(1, "Missing net_device from driver"); 172 return -ENODEV; 173 } 174 175 if (xdp_rxq->reg_state == REG_STATE_UNUSED) { 176 WARN(1, "Driver promised not to register this"); 177 return -EINVAL; 178 } 179 180 if (xdp_rxq->reg_state == REG_STATE_REGISTERED) { 181 WARN(1, "Missing unregister, handled but fix driver"); 182 xdp_rxq_info_unreg(xdp_rxq); 183 } 184 185 /* State either UNREGISTERED or NEW */ 186 xdp_rxq_info_init(xdp_rxq); 187 xdp_rxq->dev = dev; 188 xdp_rxq->queue_index = queue_index; 189 xdp_rxq->napi_id = napi_id; 190 xdp_rxq->frag_size = frag_size; 191 192 xdp_rxq->reg_state = REG_STATE_REGISTERED; 193 return 0; 194 } 195 EXPORT_SYMBOL_GPL(__xdp_rxq_info_reg); 196 197 void xdp_rxq_info_unused(struct xdp_rxq_info *xdp_rxq) 198 { 199 xdp_rxq->reg_state = REG_STATE_UNUSED; 200 } 201 EXPORT_SYMBOL_GPL(xdp_rxq_info_unused); 202 203 bool xdp_rxq_info_is_reg(struct xdp_rxq_info *xdp_rxq) 204 { 205 return (xdp_rxq->reg_state == REG_STATE_REGISTERED); 206 } 207 EXPORT_SYMBOL_GPL(xdp_rxq_info_is_reg); 208 209 static int __mem_id_init_hash_table(void) 210 { 211 struct rhashtable *rht; 212 int ret; 213 214 if (unlikely(mem_id_init)) 215 return 0; 216 217 rht = kzalloc(sizeof(*rht), GFP_KERNEL); 218 if (!rht) 219 return -ENOMEM; 220 221 ret = rhashtable_init(rht, &mem_id_rht_params); 222 if (ret < 0) { 223 kfree(rht); 224 return ret; 225 } 226 mem_id_ht = rht; 227 smp_mb(); /* mutex lock should provide enough pairing */ 228 mem_id_init = true; 229 230 return 0; 231 } 232 233 /* Allocate a cyclic ID that maps to allocator pointer. 234 * See: https://www.kernel.org/doc/html/latest/core-api/idr.html 235 * 236 * Caller must lock mem_id_lock. 237 */ 238 static int __mem_id_cyclic_get(gfp_t gfp) 239 { 240 int retries = 1; 241 int id; 242 243 again: 244 id = ida_simple_get(&mem_id_pool, mem_id_next, MEM_ID_MAX, gfp); 245 if (id < 0) { 246 if (id == -ENOSPC) { 247 /* Cyclic allocator, reset next id */ 248 if (retries--) { 249 mem_id_next = MEM_ID_MIN; 250 goto again; 251 } 252 } 253 return id; /* errno */ 254 } 255 mem_id_next = id + 1; 256 257 return id; 258 } 259 260 static bool __is_supported_mem_type(enum xdp_mem_type type) 261 { 262 if (type == MEM_TYPE_PAGE_POOL) 263 return is_page_pool_compiled_in(); 264 265 if (type >= MEM_TYPE_MAX) 266 return false; 267 268 return true; 269 } 270 271 static struct xdp_mem_allocator *__xdp_reg_mem_model(struct xdp_mem_info *mem, 272 enum xdp_mem_type type, 273 void *allocator) 274 { 275 struct xdp_mem_allocator *xdp_alloc; 276 gfp_t gfp = GFP_KERNEL; 277 int id, errno, ret; 278 void *ptr; 279 280 if (!__is_supported_mem_type(type)) 281 return ERR_PTR(-EOPNOTSUPP); 282 283 mem->type = type; 284 285 if (!allocator) { 286 if (type == MEM_TYPE_PAGE_POOL) 287 return ERR_PTR(-EINVAL); /* Setup time check page_pool req */ 288 return NULL; 289 } 290 291 /* Delay init of rhashtable to save memory if feature isn't used */ 292 if (!mem_id_init) { 293 mutex_lock(&mem_id_lock); 294 ret = __mem_id_init_hash_table(); 295 mutex_unlock(&mem_id_lock); 296 if (ret < 0) { 297 WARN_ON(1); 298 return ERR_PTR(ret); 299 } 300 } 301 302 xdp_alloc = kzalloc(sizeof(*xdp_alloc), gfp); 303 if (!xdp_alloc) 304 return ERR_PTR(-ENOMEM); 305 306 mutex_lock(&mem_id_lock); 307 id = __mem_id_cyclic_get(gfp); 308 if (id < 0) { 309 errno = id; 310 goto err; 311 } 312 mem->id = id; 313 xdp_alloc->mem = *mem; 314 xdp_alloc->allocator = allocator; 315 316 /* Insert allocator into ID lookup table */ 317 ptr = rhashtable_insert_slow(mem_id_ht, &id, &xdp_alloc->node); 318 if (IS_ERR(ptr)) { 319 ida_simple_remove(&mem_id_pool, mem->id); 320 mem->id = 0; 321 errno = PTR_ERR(ptr); 322 goto err; 323 } 324 325 if (type == MEM_TYPE_PAGE_POOL) 326 page_pool_use_xdp_mem(allocator, mem_allocator_disconnect, mem); 327 328 mutex_unlock(&mem_id_lock); 329 330 return xdp_alloc; 331 err: 332 mutex_unlock(&mem_id_lock); 333 kfree(xdp_alloc); 334 return ERR_PTR(errno); 335 } 336 337 int xdp_reg_mem_model(struct xdp_mem_info *mem, 338 enum xdp_mem_type type, void *allocator) 339 { 340 struct xdp_mem_allocator *xdp_alloc; 341 342 xdp_alloc = __xdp_reg_mem_model(mem, type, allocator); 343 if (IS_ERR(xdp_alloc)) 344 return PTR_ERR(xdp_alloc); 345 return 0; 346 } 347 EXPORT_SYMBOL_GPL(xdp_reg_mem_model); 348 349 int xdp_rxq_info_reg_mem_model(struct xdp_rxq_info *xdp_rxq, 350 enum xdp_mem_type type, void *allocator) 351 { 352 struct xdp_mem_allocator *xdp_alloc; 353 354 if (xdp_rxq->reg_state != REG_STATE_REGISTERED) { 355 WARN(1, "Missing register, driver bug"); 356 return -EFAULT; 357 } 358 359 xdp_alloc = __xdp_reg_mem_model(&xdp_rxq->mem, type, allocator); 360 if (IS_ERR(xdp_alloc)) 361 return PTR_ERR(xdp_alloc); 362 363 if (trace_mem_connect_enabled() && xdp_alloc) 364 trace_mem_connect(xdp_alloc, xdp_rxq); 365 return 0; 366 } 367 368 EXPORT_SYMBOL_GPL(xdp_rxq_info_reg_mem_model); 369 370 /* XDP RX runs under NAPI protection, and in different delivery error 371 * scenarios (e.g. queue full), it is possible to return the xdp_frame 372 * while still leveraging this protection. The @napi_direct boolean 373 * is used for those calls sites. Thus, allowing for faster recycling 374 * of xdp_frames/pages in those cases. 375 */ 376 void __xdp_return(void *data, struct xdp_mem_info *mem, bool napi_direct, 377 struct xdp_buff *xdp) 378 { 379 struct page *page; 380 381 switch (mem->type) { 382 case MEM_TYPE_PAGE_POOL: 383 page = virt_to_head_page(data); 384 if (napi_direct && xdp_return_frame_no_direct()) 385 napi_direct = false; 386 /* No need to check ((page->pp_magic & ~0x3UL) == PP_SIGNATURE) 387 * as mem->type knows this a page_pool page 388 */ 389 page_pool_put_full_page(page->pp, page, napi_direct); 390 break; 391 case MEM_TYPE_PAGE_SHARED: 392 page_frag_free(data); 393 break; 394 case MEM_TYPE_PAGE_ORDER0: 395 page = virt_to_page(data); /* Assumes order0 page*/ 396 put_page(page); 397 break; 398 case MEM_TYPE_XSK_BUFF_POOL: 399 /* NB! Only valid from an xdp_buff! */ 400 xsk_buff_free(xdp); 401 break; 402 default: 403 /* Not possible, checked in xdp_rxq_info_reg_mem_model() */ 404 WARN(1, "Incorrect XDP memory type (%d) usage", mem->type); 405 break; 406 } 407 } 408 409 void xdp_return_frame(struct xdp_frame *xdpf) 410 { 411 struct skb_shared_info *sinfo; 412 int i; 413 414 if (likely(!xdp_frame_has_frags(xdpf))) 415 goto out; 416 417 sinfo = xdp_get_shared_info_from_frame(xdpf); 418 for (i = 0; i < sinfo->nr_frags; i++) { 419 struct page *page = skb_frag_page(&sinfo->frags[i]); 420 421 __xdp_return(page_address(page), &xdpf->mem, false, NULL); 422 } 423 out: 424 __xdp_return(xdpf->data, &xdpf->mem, false, NULL); 425 } 426 EXPORT_SYMBOL_GPL(xdp_return_frame); 427 428 void xdp_return_frame_rx_napi(struct xdp_frame *xdpf) 429 { 430 struct skb_shared_info *sinfo; 431 int i; 432 433 if (likely(!xdp_frame_has_frags(xdpf))) 434 goto out; 435 436 sinfo = xdp_get_shared_info_from_frame(xdpf); 437 for (i = 0; i < sinfo->nr_frags; i++) { 438 struct page *page = skb_frag_page(&sinfo->frags[i]); 439 440 __xdp_return(page_address(page), &xdpf->mem, true, NULL); 441 } 442 out: 443 __xdp_return(xdpf->data, &xdpf->mem, true, NULL); 444 } 445 EXPORT_SYMBOL_GPL(xdp_return_frame_rx_napi); 446 447 /* XDP bulk APIs introduce a defer/flush mechanism to return 448 * pages belonging to the same xdp_mem_allocator object 449 * (identified via the mem.id field) in bulk to optimize 450 * I-cache and D-cache. 451 * The bulk queue size is set to 16 to be aligned to how 452 * XDP_REDIRECT bulking works. The bulk is flushed when 453 * it is full or when mem.id changes. 454 * xdp_frame_bulk is usually stored/allocated on the function 455 * call-stack to avoid locking penalties. 456 */ 457 void xdp_flush_frame_bulk(struct xdp_frame_bulk *bq) 458 { 459 struct xdp_mem_allocator *xa = bq->xa; 460 461 if (unlikely(!xa || !bq->count)) 462 return; 463 464 page_pool_put_page_bulk(xa->page_pool, bq->q, bq->count); 465 /* bq->xa is not cleared to save lookup, if mem.id same in next bulk */ 466 bq->count = 0; 467 } 468 EXPORT_SYMBOL_GPL(xdp_flush_frame_bulk); 469 470 /* Must be called with rcu_read_lock held */ 471 void xdp_return_frame_bulk(struct xdp_frame *xdpf, 472 struct xdp_frame_bulk *bq) 473 { 474 struct xdp_mem_info *mem = &xdpf->mem; 475 struct xdp_mem_allocator *xa; 476 477 if (mem->type != MEM_TYPE_PAGE_POOL) { 478 xdp_return_frame(xdpf); 479 return; 480 } 481 482 xa = bq->xa; 483 if (unlikely(!xa)) { 484 xa = rhashtable_lookup(mem_id_ht, &mem->id, mem_id_rht_params); 485 bq->count = 0; 486 bq->xa = xa; 487 } 488 489 if (bq->count == XDP_BULK_QUEUE_SIZE) 490 xdp_flush_frame_bulk(bq); 491 492 if (unlikely(mem->id != xa->mem.id)) { 493 xdp_flush_frame_bulk(bq); 494 bq->xa = rhashtable_lookup(mem_id_ht, &mem->id, mem_id_rht_params); 495 } 496 497 if (unlikely(xdp_frame_has_frags(xdpf))) { 498 struct skb_shared_info *sinfo; 499 int i; 500 501 sinfo = xdp_get_shared_info_from_frame(xdpf); 502 for (i = 0; i < sinfo->nr_frags; i++) { 503 skb_frag_t *frag = &sinfo->frags[i]; 504 505 bq->q[bq->count++] = skb_frag_address(frag); 506 if (bq->count == XDP_BULK_QUEUE_SIZE) 507 xdp_flush_frame_bulk(bq); 508 } 509 } 510 bq->q[bq->count++] = xdpf->data; 511 } 512 EXPORT_SYMBOL_GPL(xdp_return_frame_bulk); 513 514 void xdp_return_buff(struct xdp_buff *xdp) 515 { 516 struct skb_shared_info *sinfo; 517 int i; 518 519 if (likely(!xdp_buff_has_frags(xdp))) 520 goto out; 521 522 sinfo = xdp_get_shared_info_from_buff(xdp); 523 for (i = 0; i < sinfo->nr_frags; i++) { 524 struct page *page = skb_frag_page(&sinfo->frags[i]); 525 526 __xdp_return(page_address(page), &xdp->rxq->mem, true, xdp); 527 } 528 out: 529 __xdp_return(xdp->data, &xdp->rxq->mem, true, xdp); 530 } 531 EXPORT_SYMBOL_GPL(xdp_return_buff); 532 533 /* Only called for MEM_TYPE_PAGE_POOL see xdp.h */ 534 void __xdp_release_frame(void *data, struct xdp_mem_info *mem) 535 { 536 struct xdp_mem_allocator *xa; 537 struct page *page; 538 539 rcu_read_lock(); 540 xa = rhashtable_lookup(mem_id_ht, &mem->id, mem_id_rht_params); 541 page = virt_to_head_page(data); 542 if (xa) 543 page_pool_release_page(xa->page_pool, page); 544 rcu_read_unlock(); 545 } 546 EXPORT_SYMBOL_GPL(__xdp_release_frame); 547 548 void xdp_attachment_setup(struct xdp_attachment_info *info, 549 struct netdev_bpf *bpf) 550 { 551 if (info->prog) 552 bpf_prog_put(info->prog); 553 info->prog = bpf->prog; 554 info->flags = bpf->flags; 555 } 556 EXPORT_SYMBOL_GPL(xdp_attachment_setup); 557 558 struct xdp_frame *xdp_convert_zc_to_xdp_frame(struct xdp_buff *xdp) 559 { 560 unsigned int metasize, totsize; 561 void *addr, *data_to_copy; 562 struct xdp_frame *xdpf; 563 struct page *page; 564 565 /* Clone into a MEM_TYPE_PAGE_ORDER0 xdp_frame. */ 566 metasize = xdp_data_meta_unsupported(xdp) ? 0 : 567 xdp->data - xdp->data_meta; 568 totsize = xdp->data_end - xdp->data + metasize; 569 570 if (sizeof(*xdpf) + totsize > PAGE_SIZE) 571 return NULL; 572 573 page = dev_alloc_page(); 574 if (!page) 575 return NULL; 576 577 addr = page_to_virt(page); 578 xdpf = addr; 579 memset(xdpf, 0, sizeof(*xdpf)); 580 581 addr += sizeof(*xdpf); 582 data_to_copy = metasize ? xdp->data_meta : xdp->data; 583 memcpy(addr, data_to_copy, totsize); 584 585 xdpf->data = addr + metasize; 586 xdpf->len = totsize - metasize; 587 xdpf->headroom = 0; 588 xdpf->metasize = metasize; 589 xdpf->frame_sz = PAGE_SIZE; 590 xdpf->mem.type = MEM_TYPE_PAGE_ORDER0; 591 592 xsk_buff_free(xdp); 593 return xdpf; 594 } 595 EXPORT_SYMBOL_GPL(xdp_convert_zc_to_xdp_frame); 596 597 /* Used by XDP_WARN macro, to avoid inlining WARN() in fast-path */ 598 void xdp_warn(const char *msg, const char *func, const int line) 599 { 600 WARN(1, "XDP_WARN: %s(line:%d): %s\n", func, line, msg); 601 }; 602 EXPORT_SYMBOL_GPL(xdp_warn); 603 604 int xdp_alloc_skb_bulk(void **skbs, int n_skb, gfp_t gfp) 605 { 606 n_skb = kmem_cache_alloc_bulk(skbuff_head_cache, gfp, 607 n_skb, skbs); 608 if (unlikely(!n_skb)) 609 return -ENOMEM; 610 611 return 0; 612 } 613 EXPORT_SYMBOL_GPL(xdp_alloc_skb_bulk); 614 615 struct sk_buff *__xdp_build_skb_from_frame(struct xdp_frame *xdpf, 616 struct sk_buff *skb, 617 struct net_device *dev) 618 { 619 struct skb_shared_info *sinfo = xdp_get_shared_info_from_frame(xdpf); 620 unsigned int headroom, frame_size; 621 void *hard_start; 622 u8 nr_frags; 623 624 /* xdp frags frame */ 625 if (unlikely(xdp_frame_has_frags(xdpf))) 626 nr_frags = sinfo->nr_frags; 627 628 /* Part of headroom was reserved to xdpf */ 629 headroom = sizeof(*xdpf) + xdpf->headroom; 630 631 /* Memory size backing xdp_frame data already have reserved 632 * room for build_skb to place skb_shared_info in tailroom. 633 */ 634 frame_size = xdpf->frame_sz; 635 636 hard_start = xdpf->data - headroom; 637 skb = build_skb_around(skb, hard_start, frame_size); 638 if (unlikely(!skb)) 639 return NULL; 640 641 skb_reserve(skb, headroom); 642 __skb_put(skb, xdpf->len); 643 if (xdpf->metasize) 644 skb_metadata_set(skb, xdpf->metasize); 645 646 if (unlikely(xdp_frame_has_frags(xdpf))) 647 xdp_update_skb_shared_info(skb, nr_frags, 648 sinfo->xdp_frags_size, 649 nr_frags * xdpf->frame_sz, 650 xdp_frame_is_frag_pfmemalloc(xdpf)); 651 652 /* Essential SKB info: protocol and skb->dev */ 653 skb->protocol = eth_type_trans(skb, dev); 654 655 /* Optional SKB info, currently missing: 656 * - HW checksum info (skb->ip_summed) 657 * - HW RX hash (skb_set_hash) 658 * - RX ring dev queue index (skb_record_rx_queue) 659 */ 660 661 /* Until page_pool get SKB return path, release DMA here */ 662 xdp_release_frame(xdpf); 663 664 /* Allow SKB to reuse area used by xdp_frame */ 665 xdp_scrub_frame(xdpf); 666 667 return skb; 668 } 669 EXPORT_SYMBOL_GPL(__xdp_build_skb_from_frame); 670 671 struct sk_buff *xdp_build_skb_from_frame(struct xdp_frame *xdpf, 672 struct net_device *dev) 673 { 674 struct sk_buff *skb; 675 676 skb = kmem_cache_alloc(skbuff_head_cache, GFP_ATOMIC); 677 if (unlikely(!skb)) 678 return NULL; 679 680 memset(skb, 0, offsetof(struct sk_buff, tail)); 681 682 return __xdp_build_skb_from_frame(xdpf, skb, dev); 683 } 684 EXPORT_SYMBOL_GPL(xdp_build_skb_from_frame); 685 686 struct xdp_frame *xdpf_clone(struct xdp_frame *xdpf) 687 { 688 unsigned int headroom, totalsize; 689 struct xdp_frame *nxdpf; 690 struct page *page; 691 void *addr; 692 693 headroom = xdpf->headroom + sizeof(*xdpf); 694 totalsize = headroom + xdpf->len; 695 696 if (unlikely(totalsize > PAGE_SIZE)) 697 return NULL; 698 page = dev_alloc_page(); 699 if (!page) 700 return NULL; 701 addr = page_to_virt(page); 702 703 memcpy(addr, xdpf, totalsize); 704 705 nxdpf = addr; 706 nxdpf->data = addr + headroom; 707 nxdpf->frame_sz = PAGE_SIZE; 708 nxdpf->mem.type = MEM_TYPE_PAGE_ORDER0; 709 nxdpf->mem.id = 0; 710 711 return nxdpf; 712 } 713 714 __diag_push(); 715 __diag_ignore_all("-Wmissing-prototypes", 716 "Global functions as their definitions will be in vmlinux BTF"); 717 718 /** 719 * bpf_xdp_metadata_rx_timestamp - Read XDP frame RX timestamp. 720 * @ctx: XDP context pointer. 721 * @timestamp: Return value pointer. 722 * 723 * Returns 0 on success or ``-errno`` on error. 724 */ 725 int bpf_xdp_metadata_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp) 726 { 727 return -EOPNOTSUPP; 728 } 729 730 /** 731 * bpf_xdp_metadata_rx_hash - Read XDP frame RX hash. 732 * @ctx: XDP context pointer. 733 * @hash: Return value pointer. 734 * 735 * Returns 0 on success or ``-errno`` on error. 736 */ 737 int bpf_xdp_metadata_rx_hash(const struct xdp_md *ctx, u32 *hash) 738 { 739 return -EOPNOTSUPP; 740 } 741 742 __diag_pop(); 743 744 BTF_SET8_START(xdp_metadata_kfunc_ids) 745 #define XDP_METADATA_KFUNC(_, name) BTF_ID_FLAGS(func, name, 0) 746 XDP_METADATA_KFUNC_xxx 747 #undef XDP_METADATA_KFUNC 748 BTF_SET8_END(xdp_metadata_kfunc_ids) 749 750 static const struct btf_kfunc_id_set xdp_metadata_kfunc_set = { 751 .owner = THIS_MODULE, 752 .set = &xdp_metadata_kfunc_ids, 753 }; 754 755 BTF_ID_LIST(xdp_metadata_kfunc_ids_unsorted) 756 #define XDP_METADATA_KFUNC(name, str) BTF_ID(func, str) 757 XDP_METADATA_KFUNC_xxx 758 #undef XDP_METADATA_KFUNC 759 760 u32 bpf_xdp_metadata_kfunc_id(int id) 761 { 762 /* xdp_metadata_kfunc_ids is sorted and can't be used */ 763 return xdp_metadata_kfunc_ids_unsorted[id]; 764 } 765 766 bool bpf_dev_bound_kfunc_id(u32 btf_id) 767 { 768 return btf_id_set8_contains(&xdp_metadata_kfunc_ids, btf_id); 769 } 770 771 static int __init xdp_metadata_init(void) 772 { 773 return register_btf_kfunc_id_set(BPF_PROG_TYPE_XDP, &xdp_metadata_kfunc_set); 774 } 775 late_initcall(xdp_metadata_init); 776