Skip to contentSkip to conversation

liburing: add api for napi busy poll

RFC PATCH Superseded Stefan Roesch 3 participants 13 messages Nov 19, 2022 – Nov 21, 2022

Subsystems (3)

v4 of 9 Superseded Latest is v9 →

lore
Share & tools
lore
#0 lore raw

v4 cover liburing: add api for napi busy poll

This adds two new api's to set/clear the napi busy poll settings. The two new functions are called:
- io_uring_register_napi
- io_uring_unregister_napi

The patch series also contains the documentation for the two new functions and two example programs. The client program is called napi-busy-poll-client and the server program napi-busy-poll-server. The client measures the roundtrip times of requests.

There is also a kernel patch "io-uring: support napi busy poll" to enable this feature on the kernel side.

Changes:
- V4:
- Modify functions to use a structure to pass the napi busy poll settings to the kernel.
- Return previous values when returning from the above functions.
- Rename the functions and remove one function (no longer needed as the data is passed as a structure)
- V3:
- Updated liburing.map file
- Moved example programs from the test directory to the example directory. The two example programs don't fit well in the test category and need to be run from separate hosts.
- Added the io_uring_register_napi_prefer_busy_poll API.
- Added the call to io_uring_register_napi_prefer_busy_poll to the example programs
- Updated the documentation
- V2:
- Updated the liburing.map file for the two new functions. (added a 2.4 section)
- Added a description of the new feature to the changelog file
- Fixed the indentation of the longopts structure
- Used defined exit constants
- Fixed encodeUserData to support 32 bit builds

*** BLURB HERE ***

Stefan Roesch (4):
liburing: add api to set napi busy poll settings
liburing: add documentation for new napi busy polling
liburing: add example programs for napi busy poll
liburing: update changelog with new feature

 .gitignore                       |   2 +
 CHANGELOG                        |   3 +
 examples/Makefile                |   2 +
 examples/napi-busy-poll-client.c | 441 +++++++++++++++++++++++++++++++
 examples/napi-busy-poll-server.c | 385 +++++++++++++++++++++++++++
 man/io_uring_register_napi.3     |  40 +++
 man/io_uring_unregister_napi.3   |  27 ++
 src/include/liburing.h           |   3 +
 src/include/liburing/io_uring.h  |  12 +
 src/liburing.map                 |   6 +
 src/register.c                   |  12 +
 11 files changed, 933 insertions(+)
 create mode 100644 examples/napi-busy-poll-client.c
 create mode 100644 examples/napi-busy-poll-server.c
 create mode 100644 man/io_uring_register_napi.3
 create mode 100644 man/io_uring_unregister_napi.3

base-commit: 8fc22e3b3348c0a6384ec926e0b19b6707622e58

Signature · 1 line
2.30.2
#1 lore raw

RFC PATCH v4 1/4 liburing: add api to set napi busy poll settings

This adds two functions to manage the napi busy poll settings:
- io_uring_register_napi
- io_uring_unregister_napi

---
 src/include/liburing.h          |  3 +++
 src/include/liburing/io_uring.h | 12 ++++++++++++
 src/liburing.map                |  6 ++++++
 src/register.c                  | 12 ++++++++++++
 4 files changed, 33 insertions(+)
src/include/liburing.h +3 -0
index 12a703f..98ffd73 100644
@@ -235,6 +235,9 @@ int io_uring_register_sync_cancel(struct io_uring *ring,
 int io_uring_register_file_alloc_range(struct io_uring *ring,
 					unsigned off, unsigned len);
 
+int io_uring_register_napi(struct io_uring *ring, struct io_uring_napi *napi);
+int io_uring_unregister_napi(struct io_uring *ring, struct io_uring_napi *napi);
+
 int io_uring_get_events(struct io_uring *ring);
 int io_uring_submit_and_get_events(struct io_uring *ring);
 
src/include/liburing/io_uring.h +12 -0
index a3e0920..25caee3 100644
@@ -499,6 +499,10 @@ enum {
 	/* register a range of fixed file slots for automatic slot allocation */
 	IORING_REGISTER_FILE_ALLOC_RANGE	= 25,
 
+	/* set/clear busy poll settings */
+	IORING_REGISTER_NAPI			= 26,
+	IORING_UNREGISTER_NAPI			= 27,
+
 	/* this goes last */
 	IORING_REGISTER_LAST
 };
@@ -621,6 +625,14 @@ struct io_uring_buf_reg {
 	__u64	resv[3];
 };
 
+/* argument for IORING_(UN)REGISTER_NAPI */
+struct io_uring_napi {
+	__u32   busy_poll_to;
+	__u8    prefer_busy_poll;
+	__u8    pad[3];
+	__u64   resv;
+};
+
 /*
  * io_uring_restriction->opcode values
  */
src/liburing.map +6 -0
index 06c64f8..74036d3 100644
@@ -67,3 +67,9 @@ LIBURING_2.3 {
 		io_uring_get_events;
 		io_uring_submit_and_get_events;
 } LIBURING_2.2;
+
+LIBURING_2.4 {
+	global:
+		io_uring_register_napi;
+		io_uring_unregister_napi;
+} LIBURING_2.3;
src/register.c +12 -0
index e849825..9b363e0 100644
@@ -367,3 +367,15 @@ int io_uring_register_file_alloc_range(struct io_uring *ring,
 				       IORING_REGISTER_FILE_ALLOC_RANGE, &range,
 				       0);
 }
+
+int io_uring_register_napi(struct io_uring *ring, struct io_uring_napi *napi)
+{
+	return __sys_io_uring_register(ring->ring_fd,
+				IORING_REGISTER_NAPI, napi, 0);
+}
+
+int io_uring_unregister_napi(struct io_uring *ring, struct io_uring_napi *napi)
+{
+	return __sys_io_uring_register(ring->ring_fd,
+				IORING_REGISTER_NAPI, napi, 0);
+}
Signature · 1 line
2.30.2
#2 lore raw

Re: [RFC PATCH v4 1/4] liburing: add api to set napi busy poll settings

src/register.c int io_uring_register_file_alloc_range(struct io_uring *ring, · line 381

Quoted 12 lines · Stefan Roesch
src/register.c +12 -0
+
+int io_uring_register_napi(struct io_uring *ring, struct io_uring_napi *napi)
+{
+	return __sys_io_uring_register(ring->ring_fd,
+				IORING_REGISTER_NAPI, napi, 0);
+}
+
+int io_uring_unregister_napi(struct io_uring *ring, struct io_uring_napi *napi)
+{
+	return __sys_io_uring_register(ring->ring_fd,
+				IORING_REGISTER_NAPI, napi, 0);
+}

The latter should be IORING_UNREGISTER_NAPI instead of IORING_REGISTER_NAPI? Or did I miss something?

Signature · 1 line
Ammar Faizi
#3 lore raw

Re: [RFC PATCH v4 1/4] liburing: add api to set napi busy poll settings

Quoted 16 lines · Ammar Faizi

src/register.c int io_uring_register_file_alloc_range(struct io_uring *ring, · line 381

Quoted 12 lines · Stefan Roesch
src/register.c +12 -0
+
+int io_uring_register_napi(struct io_uring *ring, struct io_uring_napi *napi)
+{
+	return __sys_io_uring_register(ring->ring_fd,
+				IORING_REGISTER_NAPI, napi, 0);
+}
+
+int io_uring_unregister_napi(struct io_uring *ring, struct io_uring_napi *napi)
+{
+	return __sys_io_uring_register(ring->ring_fd,
+				IORING_REGISTER_NAPI, napi, 0);
+}

The latter should be IORING_UNREGISTER_NAPI instead of IORING_REGISTER_NAPI? Or did I miss something?

Thats correct.

#4 lore raw

RFC PATCH v4 2/4 liburing: add documentation for new napi busy polling

In reply to Stefan Roesch

This adds two man pages for the two new functions:
- io_uring_register_nap
- io_uring_unregister_napi

---
 man/io_uring_register_napi.3   | 40 ++++++++++++++++++++++++++++++++++
 man/io_uring_unregister_napi.3 | 27 +++++++++++++++++++++++
 2 files changed, 67 insertions(+)
 create mode 100644 man/io_uring_register_napi.3
 create mode 100644 man/io_uring_unregister_napi.3
man/io_uring_register_napi.3 new file +40 -0
new file mode 100644
index 0000000..2a70e3b
@@ -0,0 +1,40 @@
+.\" Copyright (C) 2022 Stefan Roesch <[email protected]>
+.\"
+.\" SPDX-License-Identifier: LGPL-2.0-or-later
+.\"
+.TH io_uring_register_napi 3 "November 16, 2022" "liburing-2.4" "liburing Manual"
+.SH NAME
+io_uring_register_napi \- register NAPI busy poll settings
+.SH SYNOPSIS
+.nf
+.B #include <liburing.h>
+.PP
+.BI "int io_uring_register_napi(struct io_uring *" ring ","
+.BI "                           struct io_uring_napi *" napi)
+.PP
+.fi
+.SH DESCRIPTION
+.PP
+The
+.BR io_uring_register_napi (3)
+function registers the NAPI settings for subsequent operations. The NAPI
+settings are specified in the structure that is passed in the
+.I napi
+parameter. The structure consists of the napi timeout
+.I busy_poll_to
+(napi busy poll timeout in us) and
+.I prefer_busy_poll.
+
+Registering a NAPI settings sets the mode when calling the function
+napi_busy_loop and corresponds to the SO_PREFER_BUSY_POLL socket
+option.
+
+NAPI busy poll can reduce the network roundtrip time.
+
+
+.SH RETURN VALUE
+On success
+.BR io_uring_register_napi_prefer_busy_poll (3)
+return 0. On failure they return
+.BR -errno .
+It also updates the napi structure with the current values.
man/io_uring_unregister_napi.3 new file +27 -0
new file mode 100644
index 0000000..193d9e5
@@ -0,0 +1,27 @@
+.\" Copyright (C) 2022 Stefan Roesch <[email protected]>
+.\"
+.\" SPDX-License-Identifier: LGPL-2.0-or-later
+.\"
+.TH io_uring_unregister_napi 3 "November 16, 2022" "liburing-2.4" "liburing Manual"
+.SH NAME
+io_uring_unregister_napi \- unregister NAPI busy poll settings
+.SH SYNOPSIS
+.nf
+.B #include <liburing.h>
+.PP
+.BI "int io_uring_unregister_napi(struct io_uring *" ring ","
+.BI "                             struct io_uring_napi *" napi)
+.PP
+.fi
+.SH DESCRIPTION
+.PP
+The
+.BR io_uring_unregister_napi (3)
+function unregisters the NAPI busy poll settings for subsequent operations.
+
+.SH RETURN VALUE
+On success
+.BR io_uring_unregister_napi_busy_poll_timeout (3)
+return 0. On failure they return
+.BR -errno .
+It also updates the napi structure with the current values.
Signature · 1 line
2.30.2
#5 lore raw

Re: [RFC PATCH v4 2/4] liburing: add documentation for new napi busy polling

Quoted 2 lines · Stefan Roesch

This adds two man pages for the two new functions:
- io_uring_register_nap

Typo:

s/io_uring_register_nap/io_uring_register_napi/

man/io_uring_register_napi.3 line 40

Quoted 6 lines

+.SH RETURN VALUE

man/io_uring_register_napi.3 new file +5 -0
+On success
+.BR io_uring_register_napi_prefer_busy_poll (3)
+return 0. On failure they return
+.BR -errno .
+It also updates the napi structure with the current values.

io_uring_register_napi_prefer_busy_poll() no longer exists in this version.

man/io_uring_unregister_napi.3 line 27

Quoted 6 lines

+.SH RETURN VALUE

man/io_uring_unregister_napi.3 new file +5 -0
+On success
+.BR io_uring_unregister_napi_busy_poll_timeout (3)
+return 0. On failure they return
+.BR -errno .
+It also updates the napi structure with the current values.

io_uring_unregister_napi_busy_poll_timeout() no longer exists in this version.

Signature · 1 line
Ammar Faizi
#6 lore raw

Re: [RFC PATCH v4 2/4] liburing: add documentation for new napi busy polling

Quoted 17 lines · Ammar Faizi
Quoted 2 lines · Stefan Roesch

This adds two man pages for the two new functions:
- io_uring_register_nap

Typo:

s/io_uring_register_nap/io_uring_register_napi/

man/io_uring_register_napi.3 line 40

Quoted 6 lines

+.SH RETURN VALUE

man/io_uring_register_napi.3 new file +5 -0
+On success
+.BR io_uring_register_napi_prefer_busy_poll (3)
+return 0. On failure they return
+.BR -errno .
+It also updates the napi structure with the current values.

io_uring_register_napi_prefer_busy_poll() no longer exists in this version.

Quoted 8 lines

man/io_uring_unregister_napi.3 line 27

Quoted 6 lines

+.SH RETURN VALUE

man/io_uring_unregister_napi.3 new file +5 -0
+On success
+.BR io_uring_unregister_napi_busy_poll_timeout (3)
+return 0. On failure they return
+.BR -errno .
+It also updates the napi structure with the current values.

io_uring_unregister_napi_busy_poll_timeout() no longer exists in this version.

Fixed in the next version.

#7 lore raw

RFC PATCH v4 3/4 liburing: add example programs for napi busy poll

In reply to Stefan Roesch

This adds two example programs to test the napi busy poll functionality. It consists of a client program and a server program. To get a napi id, the client and the server program need to be run on different hosts.

To test the napi busy poll timeout, the -t needs to be specified. A reasonable value for the busy poll timeout is 100. By specifying the busy poll timeout on the server and the client the best results are accomplished.

---
 .gitignore                       |   2 +
 examples/Makefile                |   2 +
 examples/napi-busy-poll-client.c | 441 +++++++++++++++++++++++++++++++
 examples/napi-busy-poll-server.c | 385 +++++++++++++++++++++++++++
 4 files changed, 830 insertions(+)
 create mode 100644 examples/napi-busy-poll-client.c
 create mode 100644 examples/napi-busy-poll-server.c
.gitignore +2 -0
index 6e8a2f7..89b5a41 100644
@@ -15,6 +15,8 @@
 /examples/io_uring-test
 /examples/io_uring-udp
 /examples/link-cp
+/examples/napi-busy-poll-client
+/examples/napi-busy-poll-server
 /examples/ucontext-cp
 /examples/poll-bench
 /examples/send-zerocopy
examples/Makefile +2 -0
index e561e05..59f1260 100644
@@ -15,6 +15,8 @@ example_srcs := \
 	io_uring-test.c \
 	io_uring-udp.c \
 	link-cp.c \
+	napi-busy-poll-client.c \
+	napi-busy-poll-server.c \
 	poll-bench.c \
 	send-zerocopy.c
 
examples/napi-busy-poll-client.c new file +441 -0

441 lines not on this page · raw message

examples/napi-busy-poll-server.c new file +385 -0

385 lines not on this page · raw message

Signature · 1 line
2.30.2
#8 lore raw

Re: [RFC PATCH v4 3/4] liburing: add example programs for napi busy poll

examples/napi-busy-poll-client.c line 201

Quoted 11 lines · Stefan Roesch
examples/napi-busy-poll-client.c new file +11 -0
+void recordRTT(struct ctx *ctx)
+{
+    struct timespec startTs = ctx->ts;
+
+    // Send next ping.
+    sendPing(ctx);
+
+    // Store round-trip time.
+    ctx->rtt[ctx->rtt_index] = diffTimespec(&ctx->ts, &startTs);
+    ctx->rtt_index++;
+}

Use tabs for indentation, not spaces.

Signature · 1 line
Ammar Faizi
#9 lore raw

Re: [RFC PATCH v4 3/4] liburing: add example programs for napi busy poll

Quoted 14 lines · Ammar Faizi

examples/napi-busy-poll-client.c line 201

Quoted 11 lines · Stefan Roesch
examples/napi-busy-poll-client.c new file +11 -0
+void recordRTT(struct ctx *ctx)
+{
+    struct timespec startTs = ctx->ts;
+
+    // Send next ping.
+    sendPing(ctx);
+
+    // Store round-trip time.
+    ctx->rtt[ctx->rtt_index] = diffTimespec(&ctx->ts, &startTs);
+    ctx->rtt_index++;
+}

Use tabs for indentation, not spaces.

Fixed in next version.

#10 lore raw

RFC PATCH v4 4/4 liburing: update changelog with new feature

In reply to Stefan Roesch

Add a new entry to the changelog file for the napi busy poll feature.

---
 CHANGELOG | 3 +++
 1 file changed, 3 insertions(+)
CHANGELOG +3 -0
index 09511af..1db0269 100644
@@ -1,3 +1,6 @@
+liburing-2.4 release
+- Support for napi busy polling
+
 liburing-2.3 release
 
 - Support non-libc build for aarch64.
Signature · 1 line
2.30.2
#11 lore raw
In reply to Stefan Roesch
Quoted 5 lines · Stefan Roesch

This adds two new api's to set/clear the napi busy poll settings. The two new functions are called:
- io_uring_register_napi
- io_uring_unregister_napi

Quoted 7 lines

The patch series also contains the documentation for the two new functions and two example programs. The client program is called napi-busy-poll-client and the server program napi-busy-poll-server. The client measures the roundtrip times of requests.

There is also a kernel patch "io-uring: support napi busy poll" to enable this feature on the kernel side.

BTW Stefan, I got:

"[RFC PATCH v4 0/4] liburing: add api for napi busy poll"

patchset twice. Both are identical. But I don't get a v4 kernel patchset that adds this feature.

Maybe you were going to send the kernel and liburing patchset, but you accidentally sent the liburing patchset twice?

Signature · 1 line
Ammar Faizi
maintainer
#12 lore raw
In reply to Stefan Roesch
Quoted 5 lines · Stefan Roesch

This adds two new api's to set/clear the napi busy poll settings. The two new functions are called:
- io_uring_register_napi
- io_uring_unregister_napi

Quoted 7 lines

The patch series also contains the documentation for the two new functions and two example programs. The client program is called napi-busy-poll-client and the server program napi-busy-poll-server. The client measures the roundtrip times of requests.

There is also a kernel patch "io-uring: support napi busy poll" to enable this feature on the kernel side.

Did you post the kernel side, because I don't see it? That's the most important one to get sorted first.

Signature · 1 line
Jens Axboe