-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'netdev-genl-add-an-xsk-attribute-to-queues'
Joe Damato says: ==================== netdev-genl: Add an xsk attribute to queues This is an attempt to followup on something Jakub asked me about [1], adding an xsk attribute to queues and more clearly documenting which queues are linked to NAPIs... After the RFC [2], Jakub suggested creating an empty nest for queues which have a pool, so I've adjusted this version to work that way. The nest can be extended in the future to express attributes about XSK as needed. Queues which are not used for AF_XDP do not have the xsk attribute present. I've run the included test on: - my mlx5 machine (via NETIF=) - without setting NETIF And the test seems to pass in both cases. [1]: https://lore.kernel.org/netdev/20250113143109.60afa59a@kernel.org/ [2]: https://lore.kernel.org/netdev/20250129172431.65773-1-jdamato@fastly.com/ ==================== Link: https://patch.msgid.link/20250214211255.14194-1-jdamato@fastly.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
- Loading branch information
Showing
10 changed files
with
194 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
# SPDX-License-Identifier: GPL-2.0-only | ||
xdp_helper |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
#include <errno.h> | ||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <string.h> | ||
#include <unistd.h> | ||
#include <sys/mman.h> | ||
#include <sys/socket.h> | ||
#include <linux/if_xdp.h> | ||
#include <linux/if_link.h> | ||
#include <net/if.h> | ||
#include <inttypes.h> | ||
|
||
#define UMEM_SZ (1U << 16) | ||
#define NUM_DESC (UMEM_SZ / 2048) | ||
|
||
/* this is a simple helper program that creates an XDP socket and does the | ||
* minimum necessary to get bind() to succeed. | ||
* | ||
* this test program is not intended to actually process packets, but could be | ||
* extended in the future if that is actually needed. | ||
* | ||
* it is used by queues.py to ensure the xsk netlinux attribute is set | ||
* correctly. | ||
*/ | ||
int main(int argc, char **argv) | ||
{ | ||
struct xdp_umem_reg umem_reg = { 0 }; | ||
struct sockaddr_xdp sxdp = { 0 }; | ||
int num_desc = NUM_DESC; | ||
void *umem_area; | ||
int ifindex; | ||
int sock_fd; | ||
int queue; | ||
char byte; | ||
|
||
if (argc != 3) { | ||
fprintf(stderr, "Usage: %s ifindex queue_id", argv[0]); | ||
return 1; | ||
} | ||
|
||
sock_fd = socket(AF_XDP, SOCK_RAW, 0); | ||
if (sock_fd < 0) { | ||
perror("socket creation failed"); | ||
/* if the kernel doesn't support AF_XDP, let the test program | ||
* know with -1. All other error paths return 1. | ||
*/ | ||
if (errno == EAFNOSUPPORT) | ||
return -1; | ||
return 1; | ||
} | ||
|
||
ifindex = atoi(argv[1]); | ||
queue = atoi(argv[2]); | ||
|
||
umem_area = mmap(NULL, UMEM_SZ, PROT_READ | PROT_WRITE, MAP_PRIVATE | | ||
MAP_ANONYMOUS, -1, 0); | ||
if (umem_area == MAP_FAILED) { | ||
perror("mmap failed"); | ||
return 1; | ||
} | ||
|
||
umem_reg.addr = (uintptr_t)umem_area; | ||
umem_reg.len = UMEM_SZ; | ||
umem_reg.chunk_size = 2048; | ||
umem_reg.headroom = 0; | ||
|
||
setsockopt(sock_fd, SOL_XDP, XDP_UMEM_REG, &umem_reg, | ||
sizeof(umem_reg)); | ||
setsockopt(sock_fd, SOL_XDP, XDP_UMEM_FILL_RING, &num_desc, | ||
sizeof(num_desc)); | ||
setsockopt(sock_fd, SOL_XDP, XDP_UMEM_COMPLETION_RING, &num_desc, | ||
sizeof(num_desc)); | ||
setsockopt(sock_fd, SOL_XDP, XDP_RX_RING, &num_desc, sizeof(num_desc)); | ||
|
||
sxdp.sxdp_family = AF_XDP; | ||
sxdp.sxdp_ifindex = ifindex; | ||
sxdp.sxdp_queue_id = queue; | ||
sxdp.sxdp_flags = 0; | ||
|
||
if (bind(sock_fd, (struct sockaddr *)&sxdp, sizeof(sxdp)) != 0) { | ||
munmap(umem_area, UMEM_SZ); | ||
perror("bind failed"); | ||
close(sock_fd); | ||
return 1; | ||
} | ||
|
||
/* give the parent program some data when the socket is ready*/ | ||
fprintf(stdout, "%d\n", sock_fd); | ||
|
||
/* parent program will write a byte to stdin when its ready for this | ||
* helper to exit | ||
*/ | ||
read(STDIN_FILENO, &byte, 1); | ||
|
||
close(sock_fd); | ||
return 0; | ||
} |