From nobody Tue Dec 2 01:44:29 2025 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5FF6E2BE7B6 for ; Sun, 23 Nov 2025 22:52:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763938328; cv=none; b=YuwoKctRasfVyX3dYN/dpJg1IFG8v+Sh43JH1+V1vZTQhfY947aRR49pxfpGZUiTVuXPug79hI+p6q/CVsJ2+J+H4+5hCsDTpIMMRYsNA9KAzAIAvgjuWSAVVQvS6w8M+6K9aa+ymsNOEULEFwdAl6ZDbcdGGymB4eP7YEQRE08= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763938328; c=relaxed/simple; bh=EXYOheJb4cgW5yVlz0jhAvYk6zmI9HBqPvYTaeMxyhc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WutuEjW/jx34kvs2MAxCtLFCLwr4X8kGurkPZmUgryAu7dyO+dw9wcQSNZYMB73E0y+Td6G41K+xzgckkecvIlANsziMwow2f8y3tQwLbF9c3kxZDZfQ14P4DeiyNY/4lNwwc9a/MxtSUQjuDq/ZYFPfxu6gxISpQyIFKy6YHOo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=P4NZQWfe; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="P4NZQWfe" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-47778b23f64so19064375e9.0 for ; Sun, 23 Nov 2025 14:52:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1763938325; x=1764543125; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=IjKpkoDBMFXqwI53pRDJnxFi7xwhurS0a3ahU0JbCgI=; b=P4NZQWfeyO45qY/ul+V8nOpW0TduYosMmKvc9jP8E//7n1Kuz9XEHBR4MP35H2QEL5 sQRRFXi6orkEra+c606COFw3gtGmyj+6yzk5qdWcWgLrcu7x0zgXa+NzdmCe1X5WBxd5 2TQg4+n65KIoUGwQsJv1jNvtjWulO90MfvFO+JXnPVSvGvILHUjAwEhKzhHOkaVdbdeS e04WvpRe3TwvvPvNrTEMEhZNSNtaZR2OkwX3c5bhUE0WbdPku1toldN1q+KJgEb9N77S PJlAGJjHMosHvFnc+GocB72N9HRjxpKmslvSu2l9TXToP1nIWZQ2KQCLN8jmO+0NsQx4 7bOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763938325; x=1764543125; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=IjKpkoDBMFXqwI53pRDJnxFi7xwhurS0a3ahU0JbCgI=; b=dtdxpH8/Cf+3OTwWUrg6x5pzG+8it3DiQKyzb+2tNc9I73HoCeT7yKj8VcIZd5YGyi LzNGX0dz1w8IzfU0gZDE12Fc0xRbHOa1NwRA1TvsymZPFbbpgCZigL/f5nDxBq0CLydB GV9JMv8Cp/jWc8eJWxGy0PysEMgPolu8efrgNjXzq63P/DHH0QV34Eh7GjD+1l4xgm0v 0U3/rmukRycVqt2bo1BEbspaHs54GsDUyVDtp1Nm6I0hQbut/SsXK67n31CRr7eUazhf 1lrHcOOlwxjWGith1NxIixelksAIRTamwHXv9Hw6qzdhQoRjPfCHJofDnzfH1LLFQh2v GDWw== X-Forwarded-Encrypted: i=1; AJvYcCWGixTNZXbEDY+R+yr0HwqZWIWJTFO6/HiWScBobzY+NJ66xMi58YwrDhXVqg1D9WeoDEip/UVkBjudSmQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxpR/9sbIjkaKUQppVjBHkwUjU2odNiq36SnGNoY43rf6m/2xgg SGBMM2QEWfmrk6DezWfkJwcw6AEvIDRo8jy00+plwfO6G/JzGetWVyfb X-Gm-Gg: ASbGnct8wrnODwFrFDbC4G6vMpkCwAH6iAzoZT33O7KfZW/cuUR3CYD1BUYKxJnVFCg Iwi/sxPMrOcFFwm9pPg+fOLhir8Va8+8kXaJpyacB2x8KshmidLGqjR7XuasB2U58xYzUu0Apgx 5gT6gtL+ZkhGoBKdXSXyXucOSDHt2VFGirXa58VnNdu9bsotOMPtUtHLFHakIxjOyvN6Y0g/0qv G8NcGM5PezA44NUVR7d76RL8bijRGHIhHdsQS5bOlxDDO02zDepSb86741cXaoHgheFNgbEj5ti WwqO3EZb6DMFezHiNycDVaL+ilsQDzfdmqS6aeVF1pHHBm+JOEqokL3+lDmaOVw20ol94YgyQ6t qNMun9q606rYFnnQb+82DHTPSD7kw4xpgxucwJ7RkjAY4wfym9a9Viz3O3l8Tc4sbqKMwK+MFD8 vHRuxmKbZxj96ZPw== X-Google-Smtp-Source: AGHT+IG0SGMWMdVe66Rksvn6v5FBe6opsohs/EM0p8y743GggDbgal5u09Oo75v6mEVGyS+Z85JlHQ== X-Received: by 2002:a05:600c:8b35:b0:477:832c:86ae with SMTP id 5b1f17b1804b1-477c111b94fmr113406075e9.12.1763938324588; Sun, 23 Nov 2025 14:52:04 -0800 (PST) Received: from 127.mynet ([2a01:4b00:bd21:4f00:7cc6:d3ca:494:116c]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-42cb7fb9190sm24849064f8f.33.2025.11.23.14.52.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 23 Nov 2025 14:52:03 -0800 (PST) From: Pavel Begunkov To: linux-block@vger.kernel.org, io-uring@vger.kernel.org Cc: Vishal Verma , tushar.gohad@intel.com, Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg , Alexander Viro , Christian Brauner , Andrew Morton , Sumit Semwal , =?UTF-8?q?Christian=20K=C3=B6nig?= , Pavel Begunkov , linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, linux-fsdevel@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, David Wei Subject: [RFC v2 11/11] io_uring/rsrc: implement dmabuf regbuf import Date: Sun, 23 Nov 2025 22:51:31 +0000 Message-ID: <44e4ad8c4bd72856379c368e4303090c44c9e98e.1763725388.git.asml.silence@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Allow importing dmabuf backed registered buffers. It's an opt-in feature for requests and they need to pass a flag allowing it. Furthermore, the import will fail if the request's file doesn't match the file for which the buffer for registered. This way, it's also limited to files that support the feature by implementing the corresponding file op. Enable it for read/write requests. Suggested-by: David Wei Suggested-by: Vishal Verma Signed-off-by: Pavel Begunkov --- io_uring/rsrc.c | 36 +++++++++++++++++++++++++++++------- io_uring/rsrc.h | 16 +++++++++++++++- io_uring/rw.c | 4 ++-- 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/io_uring/rsrc.c b/io_uring/rsrc.c index 7dfebf459dd0..a5d88dae536e 100644 --- a/io_uring/rsrc.c +++ b/io_uring/rsrc.c @@ -1201,9 +1201,27 @@ static int io_import_kbuf(int ddir, struct iov_iter = *iter, return 0; } =20 -static int io_import_fixed(int ddir, struct iov_iter *iter, +static int io_import_dmabuf(struct io_kiocb *req, + int ddir, struct iov_iter *iter, struct io_mapped_ubuf *imu, - u64 buf_addr, size_t len) + size_t len, size_t offset) +{ + struct io_regbuf_dma *db =3D imu->priv; + + if (!len) + return -EFAULT; + if (req->file !=3D db->target_file) + return -EBADF; + + iov_iter_dma_token(iter, ddir, db->token, offset, len); + return 0; +} + +static int io_import_fixed(struct io_kiocb *req, + int ddir, struct iov_iter *iter, + struct io_mapped_ubuf *imu, + u64 buf_addr, size_t len, + unsigned import_flags) { const struct bio_vec *bvec; size_t folio_mask; @@ -1219,8 +1237,11 @@ static int io_import_fixed(int ddir, struct iov_iter= *iter, =20 offset =3D buf_addr - imu->ubuf; =20 - if (imu->flags & IO_IMU_F_DMA) - return -EOPNOTSUPP; + if (imu->flags & IO_IMU_F_DMA) { + if (!(import_flags & IO_REGBUF_IMPORT_ALLOW_DMA)) + return -EFAULT; + return io_import_dmabuf(req, ddir, iter, imu, len, offset); + } if (imu->flags & IO_IMU_F_KBUF) return io_import_kbuf(ddir, iter, imu, len, offset); =20 @@ -1274,16 +1295,17 @@ inline struct io_rsrc_node *io_find_buf_node(struct= io_kiocb *req, return NULL; } =20 -int io_import_reg_buf(struct io_kiocb *req, struct iov_iter *iter, +int __io_import_reg_buf(struct io_kiocb *req, struct iov_iter *iter, u64 buf_addr, size_t len, int ddir, - unsigned issue_flags) + unsigned issue_flags, unsigned import_flags) { struct io_rsrc_node *node; =20 node =3D io_find_buf_node(req, issue_flags); if (!node) return -EFAULT; - return io_import_fixed(ddir, iter, node->buf, buf_addr, len); + return io_import_fixed(req, ddir, iter, node->buf, buf_addr, len, + import_flags); } =20 /* Lock two rings at once. The rings must be different! */ diff --git a/io_uring/rsrc.h b/io_uring/rsrc.h index 280d3988abf3..e0eafce976f3 100644 --- a/io_uring/rsrc.h +++ b/io_uring/rsrc.h @@ -33,6 +33,10 @@ enum { IO_IMU_F_DMA =3D 2, }; =20 +enum { + IO_REGBUF_IMPORT_ALLOW_DMA =3D 1, +}; + struct io_mapped_ubuf { u64 ubuf; unsigned int len; @@ -66,9 +70,19 @@ int io_rsrc_data_alloc(struct io_rsrc_data *data, unsign= ed nr); =20 struct io_rsrc_node *io_find_buf_node(struct io_kiocb *req, unsigned issue_flags); +int __io_import_reg_buf(struct io_kiocb *req, struct iov_iter *iter, + u64 buf_addr, size_t len, int ddir, + unsigned issue_flags, unsigned import_flags); + +static inline int io_import_reg_buf(struct io_kiocb *req, struct iov_iter *iter, u64 buf_addr, size_t len, int ddir, - unsigned issue_flags); + unsigned issue_flags) +{ + return __io_import_reg_buf(req, iter, buf_addr, len, ddir, + issue_flags, 0); +} + int io_import_reg_vec(int ddir, struct iov_iter *iter, struct io_kiocb *req, struct iou_vec *vec, unsigned nr_iovs, unsigned issue_flags); diff --git a/io_uring/rw.c b/io_uring/rw.c index a3eb4e7bf992..0d9d99695801 100644 --- a/io_uring/rw.c +++ b/io_uring/rw.c @@ -374,8 +374,8 @@ static int io_init_rw_fixed(struct io_kiocb *req, unsig= ned int issue_flags, if (io->bytes_done) return 0; =20 - ret =3D io_import_reg_buf(req, &io->iter, rw->addr, rw->len, ddir, - issue_flags); + ret =3D __io_import_reg_buf(req, &io->iter, rw->addr, rw->len, ddir, + issue_flags, IO_REGBUF_IMPORT_ALLOW_DMA); iov_iter_save_state(&io->iter, &io->iter_state); return ret; } --=20 2.52.0