From nobody Tue Dec 16 18:12:06 2025 Received: from mail-ua1-f98.google.com (mail-ua1-f98.google.com [209.85.222.98]) (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 5379A1D86CE for ; Fri, 28 Mar 2025 15:47:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.98 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743176838; cv=none; b=ilHzQ8eNgxwe4pG5DvInDArcuiZ0bHeQruOKCDDTBYsC0S9m0uUSG6BY6ThF18hxSPknlt89wKf9t0tL9mtNlVIrbBzpcHXjjV7xH4ZF1WfKYHqZhjK6sBYSlfUnqC4m/+WxWoXX7iWrgO5NmVlcUFDXQSnY98gOuPidezGxxTk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743176838; c=relaxed/simple; bh=gvF1oARvUAWHdyUpUJyX1ddyxJvSalxLbCGGNhclpFM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TQ+a29dzrCyKuvw5geMJFus4E8LQ5PxM/KD5ZXo8jj9R7zMU/vfbLwgrcIPgoS1SKr1ZUbfkfCEHwBVpkqCuZXZBu+53Db02vTP3C/xERiy8dJXo/MibwAdV+iTO3Jbs+yFJUhFrtCK6DrKIstXWrZk0yvax9YL8IISF5qHtaMQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=FXjXF0pL; arc=none smtp.client-ip=209.85.222.98 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="FXjXF0pL" Received: by mail-ua1-f98.google.com with SMTP id a1e0cc1a2514c-86ca7d2bda0so129996241.2 for ; Fri, 28 Mar 2025 08:47:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1743176835; x=1743781635; 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=Gt+Qb9IbUDqMOWgjJF/41cbBN6cQ8nnHS3i+KThbO6c=; b=FXjXF0pL9uLJ2K1A3tdiyKaP62Rskbw2nR0Khgu62Q064lGzsFt32TldAV6F7Nfp2e inZlhV5zWm5w2OKZpR/oBCegeDqbW/SX/8fARnWY5LjO3vBzq1elb1Ffu3POjBcyuMV5 gn+7ZC89iZc/GnKEhjryb1oaOKNYlQ221RNySnscKRnFg+J3H9yDsNHbu5hvLeqBBX/b gaC0uQ2pMzS99uxPWbBu6utflI80ieI/MiuVaxo7Mu9KRe5BSa5jLGgIIHtDkKHQXwgI cr8Lq0BCWy+H+sKrOlcYRxD846o9EVauCAbmqvPO4W9KOefWFClyQgBkgpNSXn9s2skO Ckiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743176835; x=1743781635; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Gt+Qb9IbUDqMOWgjJF/41cbBN6cQ8nnHS3i+KThbO6c=; b=KIZDj2BAv7LCJ4YObVcJm6ydJ+4iigDDrI/HSUQmTJb1mJqB93qUC69XUAzNMvOOQz KDs4/PB7ollINEmG7vMGontdqHgr9O/Sh6qzQz3IGW6GOqeHUM0us9/kaRbwYO06Ei45 6/qIriqhKxlC3sc+8/IjV6IVpDr+obFVmumXkk+dq1t6RH/e7Ve3hf9XLVh1QsYFo+3X 8cmbo5tk8siy2JdSGiNzjed36+6BHeNrgc0VIdd1FaCDNW64XJ3WV9Sf0PB4kD2oIjYO AfNbmZE9zkG5SQaPUkgr2at2Hf2sACFvQ9SkJVnqXO6IGqd8am8OGR+iEgewM3CM6ADv 8mig== X-Forwarded-Encrypted: i=1; AJvYcCXK3KR/1cbD/z0eU7Jr6LSXR8RGfPELwENKHmMK7KTaZhDr/mB2ezHTDoPzjkW1mTBYas9ovOBpdzzHJBk=@vger.kernel.org X-Gm-Message-State: AOJu0Yx3R0WIqBKCGYWx5TxxBKbMUgNQJ5CXvV8Lo39je9Nppf6v4G25 JgI5llQ6qV9Oy+6u+rz2Jz6A3A+YTQswWCKUIggdC+xYZCzfm1yc+TNOoBGIHpV00XsNAqwKOga CWHTLoLw8zFQWxULAogKy3KInjfhYUE2DmMPGI+CHXV+gLHhB X-Gm-Gg: ASbGncv/y23VS8FdXKwhd4HLnHs4J/KeK++Yv2JHqS3zYIrCDWXB9WEHvp2iOG5qPJy +0lmdVMX06pCmtMJA1iysrUlw6zclKVX9kDMf7hYF7+rU+oQW1MbvlpfkR3x5i/Lnhq+DrUNNd2 kaOM0l7PRr1e0W3LmxfJKYgCMLVgoaeMCtU+DqGFncfAby2H90u4ZD9aC8LJ3VfGYX8bUgh5Why P5d98tftY+P4z7DvradUcvn9ExZ+DKggbrmF5Q8tqhTdzWSSL5bkKT7vrb8Ry5g4blpzz2ybVkm V0BtY9uBkuMPY0d4hQeTV0mXg9GTNg34dg== X-Google-Smtp-Source: AGHT+IEIEYPcBdsJZpKh2cvQEk66b3OVfAq5JkqYNBmXLDDWmMZLlGArepCBDdYK+K0T2LFBmFbzQDs9f1sI X-Received: by 2002:a05:6122:348a:b0:516:20fe:d5d8 with SMTP id 71dfb90a1353d-52602d93fb3mr1803006e0c.2.1743176834950; Fri, 28 Mar 2025 08:47:14 -0700 (PDT) Received: from c7-smtp-2023.dev.purestorage.com ([2620:125:9017:12:36:3:5:0]) by smtp-relay.gmail.com with ESMTPS id 71dfb90a1353d-5260e9baa77sm190070e0c.9.2025.03.28.08.47.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Mar 2025 08:47:14 -0700 (PDT) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.7.70.37]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 7169334018F; Fri, 28 Mar 2025 09:47:13 -0600 (MDT) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 6F39CE40A9F; Fri, 28 Mar 2025 09:47:13 -0600 (MDT) From: Caleb Sander Mateos To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg , Pavel Begunkov Cc: Chaitanya Kulkarni , linux-nvme@lists.infradead.org, io-uring@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Sander Mateos Subject: [PATCH v4 1/3] nvme/ioctl: don't warn on vectorized uring_cmd with fixed buffer Date: Fri, 28 Mar 2025 09:46:45 -0600 Message-ID: <20250328154647.2590171-2-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20250328154647.2590171-1-csander@purestorage.com> References: <20250328154647.2590171-1-csander@purestorage.com> 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" The vectorized io_uring NVMe passthru opcodes don't yet support fixed buffers. But since userspace can trigger this condition based on the io_uring SQE parameters, it shouldn't cause a kernel warning. Signed-off-by: Caleb Sander Mateos Reviewed-by: Jens Axboe Reviewed-by: Chaitanya Kulkarni Reviewed-by: Christoph Hellwig Fixes: 23fd22e55b76 ("nvme: wire up fixed buffer support for nvme passthrou= gh") --- drivers/nvme/host/ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/nvme/host/ioctl.c b/drivers/nvme/host/ioctl.c index a35ff018da74..0634e24eac97 100644 --- a/drivers/nvme/host/ioctl.c +++ b/drivers/nvme/host/ioctl.c @@ -140,11 +140,11 @@ static int nvme_map_user_request(struct request *req,= u64 ubuffer, =20 if (ioucmd && (ioucmd->flags & IORING_URING_CMD_FIXED)) { struct iov_iter iter; =20 /* fixedbufs is only for non-vectored io */ - if (WARN_ON_ONCE(flags & NVME_IOCTL_VEC)) { + if (flags & NVME_IOCTL_VEC) { ret =3D -EINVAL; goto out; } ret =3D io_uring_cmd_import_fixed(ubuffer, bufflen, rq_data_dir(req), &iter, ioucmd, --=20 2.45.2 From nobody Tue Dec 16 18:12:06 2025 Received: from mail-pl1-f228.google.com (mail-pl1-f228.google.com [209.85.214.228]) (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 D05241C4A13 for ; Fri, 28 Mar 2025 15:47:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.228 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743176839; cv=none; b=ZaAW1OgGp2wGhh+feM7L0JIigYim5GZuzYYrp0EKwKvITxko58qylip6yAtfI3TtqXWapC99ZHgm21Y5LrV33WXFguGPZSZFXQSpdhL5QQ8FvJrICXbhWV8RQbqBDwfVNrb2VIzvFlGkZAS99eDcnoFg95Sszh2KpdR85BCyNXM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743176839; c=relaxed/simple; bh=fUXrNvezfQcUlckLuYQ/mreZHTic4EIPjfaDUroijsU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hFf8YrnmAHJibKd2gQE3FCbaN6VQ1pNGOQq3C6ZASgMK84YoX2AzljkvKilAQhhQQWbdjYANwXUsDyGyDhDOfDTF/QGJcTCeFRhUbBLwO+CXgTymKObOLq7MIpCnS58EhVRgyEHxapwZe6Eb2kFINQJ7SC0uPkHRxIPj54igHrI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=ayti3Y4A; arc=none smtp.client-ip=209.85.214.228 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="ayti3Y4A" Received: by mail-pl1-f228.google.com with SMTP id d9443c01a7336-223f7b10cbbso6108245ad.3 for ; Fri, 28 Mar 2025 08:47:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1743176837; x=1743781637; 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=0mVM8AOP/uQwd1MDpgpJ58oiDfod93l3Y9l0W6NadbQ=; b=ayti3Y4AZ/Tmx5mEhS53XGb9xnP5Bj3IV/ePBkbyXJFa70JE2iOUO0bagfcfuU6xr4 cKnbi2UlHNIoGvBTNnmWgEJjIJtuAokU7vECYf1wk/cnDgHcTu/yuffbYLrLhsmKiOvL yRN2XahA6kxEWA3OmexT05Lu4f4VmwvYwBhhpSsH3mYWRAUlhXpaBLuNyCpZxpxPb8oe +Nlux3f3shJwBaKHryYHLkP3CHY3PPpH/P9rwUIE991DuQjs3mWClnOZTns8o2mRgkYk KLXNY/MT2w1ar/Th0puIGWhFuwDphafG/asCQriz0zbkTIFXnF2a+li6mdx107AhzGof 4+hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743176837; x=1743781637; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0mVM8AOP/uQwd1MDpgpJ58oiDfod93l3Y9l0W6NadbQ=; b=qqUIVCX57cu3XRJdPmmEF0c5vwueLB1TGYyorY5erle6qHTXcb8ekN/Xw8MV00tIZq RWprA2gdlWZPW28owPMFVLcWKJfcrS0iVOfte/4HBrOsTYiA8d3YO912fFd/I9b0MozH Zw68K5jIY2VB6OA1sEl3cOrCmotyzbKOwonVpndKQyAqoNsK7CzoC+t/UsFq0+gioe16 ir/Js6RHsw4l1H6OVk7dcAlbkHJnW4kQCwVx3/r6l6Nh0guqz+XoTCpx0cfBY9nqVWMn 4Bp6l2wx1ftmepnhCpQvmdXubDVhcqTTy5rXZdQXfuN469GErq6bljPQdU4xRRbGRfiH FvIg== X-Forwarded-Encrypted: i=1; AJvYcCUssSbAp4qDzguMUnHD8IhQa1p3ZNI+IbYL5PAL7Kbq1d/77gq2kVYoWbAb62GSIUYDdQDt6JEHC4wmARo=@vger.kernel.org X-Gm-Message-State: AOJu0YwXlUoYMX9iTgrLB7dDjg10xHWZIE5A+GvzCgnBTVPyLBuE3aTu 6YO59MlbSLPPHXH8cCCCETEcEDtGZbCA/rpN0Xo/DMqobEWwz0gvNx6Y5mC0R1tZGKLliJ2Clw6 LnZwbBaGKehPvhyGDS1qYG1B91PVVTZOPwPVAaBja3bt1XpmP X-Gm-Gg: ASbGncv09YgBNP4ElNYX7TEK7IceDVtT1+r3Krkaks7PCxyAu3IvmpAyqKInvu++Mms 2K0++tr33GzCFer/dNkjhOVOCTT5v8MrvZf8DovOVCt7bpRYtgDbfb/OlGfoXfALEWoGIUz6Jo6 9erZ86V75mDs/mt8Z+cZ8KhnC0xs98zxYRZCL++Twww4sfN4sYGevsJ7YKVglsXFOQ6mJu2cWIk pBFQdOLFA225E9VCa+l7E8Ih+Hv2vgQHyc2YCKZiqiySpZgtP+XEvQIHcXDoeoO8m9Snba99C/X CqydvcAsp+OJvWcW/azujtOLZ1LNQC9tmA== X-Google-Smtp-Source: AGHT+IHcHduh5E0s2skNSV47XrUM4N9lgZTh46ndYiV2vIM8885gcd/Exi/meEMDt1hOO7Sm4si1VNwfTQYp X-Received: by 2002:a17:903:985:b0:223:28a8:610b with SMTP id d9443c01a7336-229200f26damr22792405ad.14.1743176836796; Fri, 28 Mar 2025 08:47:16 -0700 (PDT) Received: from c7-smtp-2023.dev.purestorage.com ([2620:125:9017:12:36:3:5:0]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2291f1db993sm2730225ad.126.2025.03.28.08.47.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Mar 2025 08:47:16 -0700 (PDT) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.7.70.37]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 31D4F34018F; Fri, 28 Mar 2025 09:47:16 -0600 (MDT) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 2FA11E40A9F; Fri, 28 Mar 2025 09:47:16 -0600 (MDT) From: Caleb Sander Mateos To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg , Pavel Begunkov Cc: Chaitanya Kulkarni , linux-nvme@lists.infradead.org, io-uring@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Sander Mateos Subject: [PATCH v4 2/3] nvme/ioctl: move blk_mq_free_request() out of nvme_map_user_request() Date: Fri, 28 Mar 2025 09:46:46 -0600 Message-ID: <20250328154647.2590171-3-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20250328154647.2590171-1-csander@purestorage.com> References: <20250328154647.2590171-1-csander@purestorage.com> 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" The callers of nvme_map_user_request() (nvme_submit_user_cmd() and nvme_uring_cmd_io()) allocate the request, so have them free it if nvme_map_user_request() fails. Signed-off-by: Caleb Sander Mateos Reviewed-by: Jens Axboe Reviewed-by: Chaitanya Kulkarni --- drivers/nvme/host/ioctl.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/drivers/nvme/host/ioctl.c b/drivers/nvme/host/ioctl.c index 0634e24eac97..42dfd29ed39e 100644 --- a/drivers/nvme/host/ioctl.c +++ b/drivers/nvme/host/ioctl.c @@ -127,41 +127,39 @@ static int nvme_map_user_request(struct request *req,= u64 ubuffer, int ret; =20 if (!nvme_ctrl_sgl_supported(ctrl)) dev_warn_once(ctrl->device, "using unchecked data buffer\n"); if (has_metadata) { - if (!supports_metadata) { - ret =3D -EINVAL; - goto out; - } + if (!supports_metadata) + return -EINVAL; + if (!nvme_ctrl_meta_sgl_supported(ctrl)) dev_warn_once(ctrl->device, "using unchecked metadata buffer\n"); } =20 if (ioucmd && (ioucmd->flags & IORING_URING_CMD_FIXED)) { struct iov_iter iter; =20 /* fixedbufs is only for non-vectored io */ - if (flags & NVME_IOCTL_VEC) { - ret =3D -EINVAL; - goto out; - } + if (flags & NVME_IOCTL_VEC) + return -EINVAL; + ret =3D io_uring_cmd_import_fixed(ubuffer, bufflen, rq_data_dir(req), &iter, ioucmd, iou_issue_flags); if (ret < 0) - goto out; + return ret; ret =3D blk_rq_map_user_iov(q, req, NULL, &iter, GFP_KERNEL); } else { ret =3D blk_rq_map_user_io(req, NULL, nvme_to_user_ptr(ubuffer), bufflen, GFP_KERNEL, flags & NVME_IOCTL_VEC, 0, 0, rq_data_dir(req)); } =20 if (ret) - goto out; + return ret; =20 bio =3D req->bio; if (bdev) bio_set_dev(bio, bdev); =20 @@ -174,12 +172,10 @@ static int nvme_map_user_request(struct request *req,= u64 ubuffer, return ret; =20 out_unmap: if (bio) blk_rq_unmap_user(bio); -out: - blk_mq_free_request(req); return ret; } =20 static int nvme_submit_user_cmd(struct request_queue *q, struct nvme_command *cmd, u64 ubuffer, unsigned bufflen, @@ -200,11 +196,11 @@ static int nvme_submit_user_cmd(struct request_queue = *q, req->timeout =3D timeout; if (ubuffer && bufflen) { ret =3D nvme_map_user_request(req, ubuffer, bufflen, meta_buffer, meta_len, NULL, flags, 0); if (ret) - return ret; + goto out_free_req; } =20 bio =3D req->bio; ctrl =3D nvme_req(req)->ctrl; =20 @@ -216,11 +212,14 @@ static int nvme_submit_user_cmd(struct request_queue = *q, blk_rq_unmap_user(bio); blk_mq_free_request(req); =20 if (effects) nvme_passthru_end(ctrl, ns, effects, cmd, ret); + return ret; =20 +out_free_req: + blk_mq_free_request(req); return ret; } =20 static int nvme_submit_io(struct nvme_ns *ns, struct nvme_user_io __user *= uio) { @@ -520,20 +519,24 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, = struct nvme_ns *ns, if (d.data_len) { ret =3D nvme_map_user_request(req, d.addr, d.data_len, nvme_to_user_ptr(d.metadata), d.metadata_len, ioucmd, vec, issue_flags); if (ret) - return ret; + goto out_free_req; } =20 /* to free bio on completion, as req->bio will be null at that time */ pdu->bio =3D req->bio; pdu->req =3D req; req->end_io_data =3D ioucmd; req->end_io =3D nvme_uring_cmd_end_io; blk_execute_rq_nowait(req, false); return -EIOCBQUEUED; + +out_free_req: + blk_mq_free_request(req); + return ret; } =20 static bool is_ctrl_ioctl(unsigned int cmd) { if (cmd =3D=3D NVME_IOCTL_ADMIN_CMD || cmd =3D=3D NVME_IOCTL_ADMIN64_CMD) --=20 2.45.2 From nobody Tue Dec 16 18:12:06 2025 Received: from mail-io1-f98.google.com (mail-io1-f98.google.com [209.85.166.98]) (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 B889C1C84C8 for ; Fri, 28 Mar 2025 15:47:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.98 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743176871; cv=none; b=FGm2m8AV2mphuLDVaIE13M5sAonTUYDBTIQHhjJo41U2HKT9etrFknydqHWHM6pWYQi5Rf+7KrufxOC0ldLrV2CDof+f07BUCoWFircaBLMbJyayMI3u5UWsqOtMS9snM7KVnjQ7uYvdcpchN56MvfmIEURjGf4YHWzty5s3FjQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743176871; c=relaxed/simple; bh=yYtWoyv8WbfgloYoO/rNNRvz+4dqKS+a7SoTZFAZSuE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AI+M7UgFN7EfnBpb36K9TdANp9rngLO5teAVd0vNbFedDXxa2OyUk2Ky3H1fensGKWpOSx+yQjnJWNNS1HiCbs97g2oeabncLhiDWmbAV8GDoPwUAbGbYB9PpCHZvobg4wBJGJVJfOTTicDx2VGKdL7zE+CFbNVhi0xAlBgQQFU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=YbDvoBPv; arc=none smtp.client-ip=209.85.166.98 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="YbDvoBPv" Received: by mail-io1-f98.google.com with SMTP id ca18e2360f4ac-85da20b2640so9459039f.1 for ; Fri, 28 Mar 2025 08:47:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1743176869; x=1743781669; 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=rvZNgJEOLv7vlUnMHFowwsJc7mv9fgxFUo+rGJDtCw4=; b=YbDvoBPvwxVGErSHBFK5ec+eZhMjiXZ78OEA0dZxg8V0BG2b0aO33aQtZKPoFtdd0X BDDzwLHFwNTXf81d8YoWWc3ket/6YjAtBbcdENnszTXsgkxXyIUUN3Q6zoikOERZa1q8 OD2ljfPZVYKQbMk62u4qR+D7HC4BGEAzkLE0X0o/Tzdf/61/2FoQCoAsihByF7hfzGxb l9nd8QyRMs93rySULY2c75GXJ/Da15HrFuRqev84Cq14Dn018fXQCDlWLyDbuyVFiZnf cpDm3S8reN8qXAl0f1HLoFp0KcprJ5OcsjPqdpJvPKLcrN8qv4P4wuuXe5DO4eG5ry9L fzuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743176869; x=1743781669; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rvZNgJEOLv7vlUnMHFowwsJc7mv9fgxFUo+rGJDtCw4=; b=myYU9T1Us37Qv+67/XYwtkfDBl6n7DNHQt8+Ybz/EA9pMQ0Ando60HHklInYWakHZj mhdLkYmhIwZ6LJx/yCrP2JN88l7CyFKJ6kIi13topavX3qTyasXxve66FrE312hjjXm4 Kn2kOv45i9IKu3dG0OtarSTLpczJwjMTI1MRyb/r+TDcTvWg7AHSHh13F2kX1M+Zq/Gs wLi3fUIhodAIuuT75TD7bsyXkNVtwXtSP1KCY95uVHEcbBkkxszqY+leoN8pGDkyDX+J vPbzIg5IMiYOcruP2kqVlsGRDSUNHigksU5YuJ34ag2shf3n74hfWjiSYPEL/x55v0LY h6Dw== X-Forwarded-Encrypted: i=1; AJvYcCUovSULTTNDhpdZm6aMfLWq+AcJBcXBeazh/yrb9uUr8ZwB3pKf6Wn+jhDwWzXTcM5mLQ2K88GIa1fViUk=@vger.kernel.org X-Gm-Message-State: AOJu0YwUclCSCf3qfVImc+bUC5h34kzXzxU/fSfqNAOvnkhPGLPUxBiA EAcuB2zwAGxhonck26CMfOMYVHvZ0clKHRQezKn1dcue6Yl6Q/OLY4f9lOraS1QBaxH4LpmZEw1 /w0SnHUI9Hq/wmcOnCcKOfPVTiSDT8Q8h X-Gm-Gg: ASbGncuhbvuZl9NuMqX1lsLLAhlL4wffKm6U0gwJ4B9cuwEaLkIeRMHjTaIYJnwmiIL //yELUQ4+NzvWO7ozDbQLI5mUZOjYxiCPx0gxe3QJ0hH6M4guDBvn2VLeqCS2ILPjH/6eoGckzO h8ZDR0x5ZAMA/4aXJMTwptXiAxorEtvDTqaGAO9Klkst2gehGvvcwg1qs3uVA7WQpB3F4NUCuVz t9O+4Ib7Godq0Q3lz0ShNE68mntBA6rCJW/3iibwJRGIeEON6X48YsUnkDF6fbGFBQ8U3fjkV+2 lV8K8SYn+rw/VLT+/vq/fS7CFXnOf+oSo4ewTNwEeuTe6iZj X-Google-Smtp-Source: AGHT+IHZyp/hTQTgBPdjdI/PAGSVR+TwdInUQ4bs/fMWlLnjp1ni0mf8CfgyGlPr5zMbfOYKigzJ9+sGNsfR X-Received: by 2002:a05:6602:1691:b0:855:d60d:1104 with SMTP id ca18e2360f4ac-85e83cee041mr242544339f.2.1743176868650; Fri, 28 Mar 2025 08:47:48 -0700 (PDT) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id ca18e2360f4ac-85e900121a8sm23348939f.11.2025.03.28.08.47.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Mar 2025 08:47:48 -0700 (PDT) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.7.70.37]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 9515D34018F; Fri, 28 Mar 2025 09:47:47 -0600 (MDT) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 912C3E40A9F; Fri, 28 Mar 2025 09:47:17 -0600 (MDT) From: Caleb Sander Mateos To: Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg , Pavel Begunkov Cc: Chaitanya Kulkarni , linux-nvme@lists.infradead.org, io-uring@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Sander Mateos Subject: [PATCH v4 3/3] nvme/ioctl: move fixed buffer lookup to nvme_uring_cmd_io() Date: Fri, 28 Mar 2025 09:46:47 -0600 Message-ID: <20250328154647.2590171-4-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20250328154647.2590171-1-csander@purestorage.com> References: <20250328154647.2590171-1-csander@purestorage.com> 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" nvme_map_user_request() is called from both nvme_submit_user_cmd() and nvme_uring_cmd_io(). But the ioucmd branch is only applicable to nvme_uring_cmd_io(). Move it to nvme_uring_cmd_io() and just pass the resulting iov_iter to nvme_map_user_request(). For NVMe passthru operations with fixed buffers, the fixed buffer lookup happens in io_uring_cmd_import_fixed(). But nvme_uring_cmd_io() can return -EAGAIN first from nvme_alloc_user_request() if all tags in the tag set are in use. This ordering difference is observable when using UBLK_U_IO_{,UN}REGISTER_IO_BUF SQEs to modify the fixed buffer table. If the NVMe passthru operation is followed by UBLK_U_IO_UNREGISTER_IO_BUF to unregister the fixed buffer and the NVMe passthru goes async, the fixed buffer lookup will fail because it happens after the unregister. Userspace should not depend on the order in which io_uring issues SQEs submitted in parallel, but it may try submitting the SQEs together and fall back on a slow path if the fixed buffer lookup fails. To make the fast path more likely, do the import before nvme_alloc_user_request(). Signed-off-by: Caleb Sander Mateos Reviewed-by: Jens Axboe Reviewed-by: Chaitanya Kulkarni --- drivers/nvme/host/ioctl.c | 45 +++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/drivers/nvme/host/ioctl.c b/drivers/nvme/host/ioctl.c index 42dfd29ed39e..400c3df0e58f 100644 --- a/drivers/nvme/host/ioctl.c +++ b/drivers/nvme/host/ioctl.c @@ -112,12 +112,11 @@ static struct request *nvme_alloc_user_request(struct= request_queue *q, return req; } =20 static int nvme_map_user_request(struct request *req, u64 ubuffer, unsigned bufflen, void __user *meta_buffer, unsigned meta_len, - struct io_uring_cmd *ioucmd, unsigned int flags, - unsigned int iou_issue_flags) + struct iov_iter *iter, unsigned int flags) { struct request_queue *q =3D req->q; struct nvme_ns *ns =3D q->queuedata; struct block_device *bdev =3D ns ? ns->disk->part0 : NULL; bool supports_metadata =3D bdev && blk_get_integrity(bdev->bd_disk); @@ -135,28 +134,16 @@ static int nvme_map_user_request(struct request *req,= u64 ubuffer, if (!nvme_ctrl_meta_sgl_supported(ctrl)) dev_warn_once(ctrl->device, "using unchecked metadata buffer\n"); } =20 - if (ioucmd && (ioucmd->flags & IORING_URING_CMD_FIXED)) { - struct iov_iter iter; - - /* fixedbufs is only for non-vectored io */ - if (flags & NVME_IOCTL_VEC) - return -EINVAL; - - ret =3D io_uring_cmd_import_fixed(ubuffer, bufflen, - rq_data_dir(req), &iter, ioucmd, - iou_issue_flags); - if (ret < 0) - return ret; - ret =3D blk_rq_map_user_iov(q, req, NULL, &iter, GFP_KERNEL); - } else { + if (iter) + ret =3D blk_rq_map_user_iov(q, req, NULL, iter, GFP_KERNEL); + else ret =3D blk_rq_map_user_io(req, NULL, nvme_to_user_ptr(ubuffer), bufflen, GFP_KERNEL, flags & NVME_IOCTL_VEC, 0, 0, rq_data_dir(req)); - } =20 if (ret) return ret; =20 bio =3D req->bio; @@ -194,11 +181,11 @@ static int nvme_submit_user_cmd(struct request_queue = *q, return PTR_ERR(req); =20 req->timeout =3D timeout; if (ubuffer && bufflen) { ret =3D nvme_map_user_request(req, ubuffer, bufflen, meta_buffer, - meta_len, NULL, flags, 0); + meta_len, NULL, flags); if (ret) goto out_free_req; } =20 bio =3D req->bio; @@ -467,10 +454,12 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, = struct nvme_ns *ns, struct nvme_uring_cmd_pdu *pdu =3D nvme_uring_cmd_pdu(ioucmd); const struct nvme_uring_cmd *cmd =3D io_uring_sqe_cmd(ioucmd->sqe); struct request_queue *q =3D ns ? ns->queue : ctrl->admin_q; struct nvme_uring_data d; struct nvme_command c; + struct iov_iter iter; + struct iov_iter *map_iter =3D NULL; struct request *req; blk_opf_t rq_flags =3D REQ_ALLOC_CACHE; blk_mq_req_flags_t blk_flags =3D 0; int ret; =20 @@ -502,10 +491,24 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, = struct nvme_ns *ns, d.addr =3D READ_ONCE(cmd->addr); d.data_len =3D READ_ONCE(cmd->data_len); d.metadata_len =3D READ_ONCE(cmd->metadata_len); d.timeout_ms =3D READ_ONCE(cmd->timeout_ms); =20 + if (d.data_len && (ioucmd->flags & IORING_URING_CMD_FIXED)) { + /* fixedbufs is only for non-vectored io */ + if (vec) + return -EINVAL; + + ret =3D io_uring_cmd_import_fixed(d.addr, d.data_len, + nvme_is_write(&c) ? WRITE : READ, &iter, ioucmd, + issue_flags); + if (ret < 0) + return ret; + + map_iter =3D &iter; + } + if (issue_flags & IO_URING_F_NONBLOCK) { rq_flags |=3D REQ_NOWAIT; blk_flags =3D BLK_MQ_REQ_NOWAIT; } if (issue_flags & IO_URING_F_IOPOLL) @@ -515,13 +518,13 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, = struct nvme_ns *ns, if (IS_ERR(req)) return PTR_ERR(req); req->timeout =3D d.timeout_ms ? msecs_to_jiffies(d.timeout_ms) : 0; =20 if (d.data_len) { - ret =3D nvme_map_user_request(req, d.addr, - d.data_len, nvme_to_user_ptr(d.metadata), - d.metadata_len, ioucmd, vec, issue_flags); + ret =3D nvme_map_user_request(req, d.addr, d.data_len, + nvme_to_user_ptr(d.metadata), d.metadata_len, + map_iter, vec); if (ret) goto out_free_req; } =20 /* to free bio on completion, as req->bio will be null at that time */ --=20 2.45.2