Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unexpected EFAULT when doing sendmsg + cmsg and IOSQE_ASYNC #880

Open
majek opened this issue Jun 12, 2023 · 3 comments
Open

Unexpected EFAULT when doing sendmsg + cmsg and IOSQE_ASYNC #880

majek opened this issue Jun 12, 2023 · 3 comments

Comments

@majek
Copy link

majek commented Jun 12, 2023

Hi!

I'm playing with doing UDP networking and IOSQE_ASYNC. Here's a repro:

#include <errno.h>
#include <error.h>
#include <liburing.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

int fill_cmsg(struct msghdr *msgh, int gro_sz)
{
	struct cmsghdr *cmsg;

	int space = 0;
	/* To ensure CMSG_NXTHDR contorllen must be
	 * large and the buffer must be zeroed. */
	memset(msgh->msg_control, 0, msgh->msg_controllen);

	cmsg = CMSG_FIRSTHDR(msgh);

	{
		uint16_t gro_sz_short = gro_sz;
		cmsg->cmsg_level = SOL_UDP;
		cmsg->cmsg_type = UDP_SEGMENT;
		cmsg->cmsg_len = CMSG_LEN(sizeof(gro_sz_short));
		memcpy(CMSG_DATA(cmsg), &gro_sz_short, sizeof(gro_sz_short));
		cmsg = CMSG_NXTHDR(msgh, cmsg);
		space += CMSG_SPACE(sizeof(gro_sz_short));
	}
	msgh->msg_controllen = space;
	return 1;
}


int main(int argc, char **argv)
{
	int inflight = 32;
	int sq_async = 7;
	if (argc > 1) {
		inflight = atoi(argv[1]);
	}
	if (argc > 2) {
		sq_async = atoi(argv[2]);
	}
	printf("inflight=%d sq_async=%d\n", inflight, sq_async);

	int sd = socket(AF_INET, SOCK_DGRAM, 0);
	if (sd < 0) {
		error(-1, errno, "socket(SOCK_DGRAM)");
	}

	struct sockaddr_in listen = {.sin_family = AF_INET};

	int r = bind(sd, (struct sockaddr *)&listen, sizeof(listen));
	if (r != 0) {
		error(-1, errno, "bind()");
	}

	socklen_t sz = sizeof(listen);
	r = getsockname(sd, (struct sockaddr *)&listen, &sz);
	if (r != 0) {
		error(-1, errno, "getsockname()");
	}

	int sd2 = socket(AF_INET, SOCK_DGRAM, 0);
	if (sd2 < 0) {
		error(-1, errno, "socket(SOCK_DGRAM)");
	}

	r = connect(sd2, (struct sockaddr *)&listen, sizeof(listen));
	if (r != 0) {
		error(-1, errno, "connect()");
	}

	struct io_uring ring;
	r = io_uring_queue_init(inflight * 2, &ring, 0);
	if (r != 0) {
		error(-1, errno, "io_uring_queue_init");
	}

	unsigned values[2] = {0, sq_async};
	io_uring_register_iowq_max_workers(&ring, values);

	char ctrl[256];
	char data[65500] = "hello world\n";
	struct iovec iovec = {
		.iov_base = data,
		.iov_len = sizeof(data),
	};
	struct msghdr msghdr = {
		.msg_name = &listen,
		.msg_namelen = sizeof(listen),
		.msg_iov = &iovec,
		.msg_iovlen = 1,
		.msg_control = ctrl,
		.msg_controllen = sizeof(ctrl),
	};
	fill_cmsg(&msghdr, 1400);

	int i;
	for (i = 0; i < inflight; i++) {
		struct io_uring_sqe *sqe = io_uring_get_sqe(&ring);
		if (sqe == NULL) {
			error(-1, errno, "io_uring_get_sqe");
		}
		io_uring_prep_sendmsg(sqe, sd2, &msghdr, 0);
		sqe->flags |= IOSQE_ASYNC;
		io_uring_sqe_set_data64(sqe, i);
	}

	while (1) {
		struct io_uring_cqe *cqe = NULL;
		int r = io_uring_submit_and_wait_timeout(&ring, &cqe, 1, NULL, NULL);
		if (r < 0) {
			error(-1, errno, "io_uring_wait_cqe");
		}

		if (cqe->res <= 0) {
			error(-1, -cqe->res, "io_uring_sendmsg");
		}
		int i = (uint64_t)cqe->user_data;
		io_uring_cqe_seen(&ring, cqe);

		struct io_uring_sqe *sqe = io_uring_get_sqe(&ring);
		if (sqe == NULL) {
			error(-1, errno, "io_uring_get_sqe");
		}
		io_uring_prep_sendmsg(sqe, sd2, &msghdr, 0);
		sqe->flags |= IOSQE_ASYNC;
		io_uring_sqe_set_data64(sqe, i);
	}
}

Run:

$ gcc -Wall -Wextra efault.c -I ./liburing/src/include/ ./liburing/src/liburing.a && ./a.out 32 7
inflight=32 sq_async=7
./a.out: io_uring_sendmsg: Bad address

What we do is set 32 sendmsg SQE's that fly towards a connected socket all the time - the socket is overfilled and packets dropped, and cap the iowq_max_workers at 7.

I think we should hear EAGAIN. This seem to be confirmed with

$ sudo ~/bin/bpftrace -e 'kretfunc:udp_sendmsg / (int32)retval < 0/ { printf("%p %d %d\n", args->sk, args->len, retval); }' 
Attaching 1 probe...
0xffff8c970a06ec00 65500 -11

-11 = -EAGAIN

However, the cqe->res contains -14 which is EFAULT.

I don't expect EFAULT here. AFAICT the sendmsg arguments are valid.

The problem only occurs when:

  • there is many inflight requests
  • there are many iowq threads
  • cmsg is set.

You might need to massage the two parameters of the test program (inflight and iowq settings), depending on your machine. I suspect that the EAGAIN from udp_sendmsg happens on full send buffer, so we need to fill the buffer faster than it's drained/dropped by network subsystem.

Kernel 6.4-rc5
liburing master branch commit d39530a

@axboe
Copy link
Owner

axboe commented Jun 12, 2023

That is definitely a bug. I took a look at it, and came up with:

https://git.kernel.dk/cgit/linux/commit/?h=io_uring-6.4&id=f7e2fa2b65127e162f6509bb73debf44e6ccc10b

Can you try and pull that patch (or branch) into your 6.4-rc kernel?

Also, in terms of attribution, I like to add a Reported-by tag to the commit so it gives credit to the person that found it. For that, I'd need your real name and email. Let me know if you want that added and provide those details. Totally up to you, I've linked this issue as well.

@majek
Copy link
Author

majek commented Jun 13, 2023

Reported-by: Marek Majkowski <marek@cloudflare.com>
Tested-by: Marek Majkowski <marek@cloudflare.com>

@majek
Copy link
Author

majek commented Jun 13, 2023

I've run the patch and I can see no -EFAULT anymore. I'll attempt to get a deeper understanding if it works soon. However, one thing that is immediately visible, is that in past, before the patch the ss -au showed sending socket (transmitting) with varying Snd buffer, sometimes small, sometimes large. The issue was triggered AFAIU when the snd buffer was reached (in hindsight, maybe testing TCP would be better, however, does TCP do cmsg?).

With the patch the SND buffer of the connected socket is always zero.

Just saying. I'm not fully understanding it yet.

torvalds pushed a commit to torvalds/linux that referenced this issue Jun 16, 2023
If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
github-actions bot pushed a commit to sirdarckcat/linux-1 that referenced this issue Jun 21, 2023
commit cac9e44 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
woodsts pushed a commit to woodsts/linux-stable that referenced this issue Jun 21, 2023
commit cac9e44 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Whissi pushed a commit to Whissi/linux-stable that referenced this issue Jun 28, 2023
Commit cac9e44 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Whissi pushed a commit to Whissi/linux-stable that referenced this issue Jun 28, 2023
Commit cac9e44 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
oraclelinuxkernel pushed a commit to oracle/linux-uek that referenced this issue Jun 30, 2023
Commit cac9e44 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit 34a7e5021a437bf813e1b52fc9043b43d48e2325)
Signed-off-by: Jack Vogel <jack.vogel@oracle.com>
tarmeh2r pushed a commit to tarmeh2r/linux-flex-imx that referenced this issue Jul 10, 2023
Commit cac9e4418f4cbd548ccb065b3adcafe073f7f7d2 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
tarmeh2r pushed a commit to tarmeh2r/linux-flex-imx that referenced this issue Jul 11, 2023
Commit cac9e4418f4cbd548ccb065b3adcafe073f7f7d2 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
jpuhlman pushed a commit to MontaVista-OpenSourceTechnology/linux-mvista that referenced this issue Jul 11, 2023
Source: Kernel.org
MR: 127139
Type: Integration
Disposition: Backport from git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable linux-5.10.y
ChangeID: 5fdea4468f57db3fc304e366d03d7214ca3a209e
Description:

Commit cac9e44 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster@mvista.com>
jpuhlman pushed a commit to MontaVista-OpenSourceTechnology/linux-mvista that referenced this issue Jul 11, 2023
Source: Kernel.org
MR: 127139
Type: Integration
Disposition: Backport from git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable linux-5.10.y
ChangeID: 5fdea4468f57db3fc304e366d03d7214ca3a209e
Description:

Commit cac9e44 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster@mvista.com>
jpuhlman pushed a commit to MontaVista-OpenSourceTechnology/linux-mvista that referenced this issue Jul 11, 2023
Source: Kernel.org
MR: 127139
Type: Integration
Disposition: Backport from git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable linux-5.10.y
ChangeID: 5fdea4468f57db3fc304e366d03d7214ca3a209e
Description:

Commit cac9e44 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Armin Kuster <akuster@mvista.com>
oraclelinuxkernel pushed a commit to oracle/linux-uek that referenced this issue Aug 18, 2023
Commit cac9e44 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit 5fdea4468f57db3fc304e366d03d7214ca3a209e)

Orabug: 35495339

Signed-off-by: Prasad Singamsetty <prasad.singamsetty@oracle.com>
Reviewed-by: Alan Adamson <alan.adamson@oracle.com>
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Brian Maly <brian.maly@oracle.com>
Matombo pushed a commit to tuxedocomputers/linux that referenced this issue Sep 19, 2023
BugLink: https://bugs.launchpad.net/bugs/2032683

Commit cac9e44 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
tuxedo-bot pushed a commit to tuxedocomputers/linux that referenced this issue Oct 4, 2023
BugLink: https://bugs.launchpad.net/bugs/2033931

commit cac9e44 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
wanghao75 pushed a commit to openeuler-mirror/kernel that referenced this issue Dec 1, 2023
stable inclusion
from stable-v5.10.186
commit 5fdea4468f57db3fc304e366d03d7214ca3a209e
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I8J4KH

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=5fdea4468f57db3fc304e366d03d7214ca3a209e

--------------------------------

Commit cac9e44 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: sanglipeng <sanglipeng1@jd.com>
wanghao75 pushed a commit to openeuler-mirror/kernel that referenced this issue Dec 4, 2023
stable inclusion
from stable-v5.10.186
commit 5fdea4468f57db3fc304e366d03d7214ca3a209e
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I8L5XP

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=5fdea4468f57db3fc304e366d03d7214ca3a209e

--------------------------------

Commit cac9e44 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: sanglipeng <sanglipeng1@jd.com>
eclipse-oniro-oh-bot pushed a commit to eclipse-oniro-mirrors/kernel_linux_5.10 that referenced this issue Feb 18, 2024
stable inclusion
from stable-5.10.186
commit 5fdea4468f57db3fc304e366d03d7214ca3a209e
category: bugfix
issue: #I91QK2
CVE: NA

Signed-off-by: wanxiaoqing <wanxiaoqing@huawei.com>
---------------------------------------

Commit cac9e4418f4cbd548ccb065b3adcafe073f7f7d2 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: wanxiaoqing <wanxiaoqing@huawei.com>
SIGSEGV111 pushed a commit to SIGSEGV111/Star64_linux that referenced this issue Mar 28, 2024
Commit cac9e44 upstream.

If the application sets ->msg_control and we have to later retry this
command, or if it got queued with IOSQE_ASYNC to begin with, then we
need to retain the original msg_control value. This is due to the net
stack overwriting this field with an in-kernel pointer, to copy it
in. Hitting that path for the second time will now fail the copy from
user, as it's attempting to copy from a non-user address.

Cc: stable@vger.kernel.org # 5.10+
Link: axboe/liburing#880
Reported-and-tested-by: Marek Majkowski <marek@cloudflare.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants