From: John Garry <john.g.garry@oracle.com>
To: Keith Busch <kbusch@kernel.org>
Cc: axboe@kernel.dk, hch@lst.de, sagi@grimberg.me,
jejb@linux.ibm.com, martin.petersen@oracle.com,
djwong@kernel.org, viro@zeniv.linux.org.uk, brauner@kernel.org,
dchinner@redhat.com, jack@suse.cz, linux-block@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org,
linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org,
tytso@mit.edu, jbongio@google.com, linux-scsi@vger.kernel.org,
ming.lei@redhat.com, ojaswin@linux.ibm.com, bvanassche@acm.org,
Alan Adamson <alan.adamson@oracle.com>
Subject: Re: [PATCH v3 15/15] nvme: Ensure atomic writes will be executed atomically
Date: Thu, 25 Jan 2024 11:28:22 +0000 [thread overview]
Message-ID: <dbb3ad13-7524-4861-8006-b2ea426fbacd@oracle.com> (raw)
In-Reply-To: <ZbGwv4uFdJyfKtk5@kbusch-mbp.dhcp.thefacebook.com>
On 25/01/2024 00:52, Keith Busch wrote:
> On Wed, Jan 24, 2024 at 11:38:41AM +0000, John Garry wrote:
>> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
>> index 5045c84f2516..6a34a5d92088 100644
>> --- a/drivers/nvme/host/core.c
>> +++ b/drivers/nvme/host/core.c
>> @@ -911,6 +911,32 @@ static inline blk_status_t nvme_setup_rw(struct nvme_ns *ns,
>> if (req->cmd_flags & REQ_RAHEAD)
>> dsmgmt |= NVME_RW_DSM_FREQ_PREFETCH;
>>
>> + /*
>> + * Ensure that nothing has been sent which cannot be executed
>> + * atomically.
>> + */
>> + if (req->cmd_flags & REQ_ATOMIC) {
>> + struct nvme_ns_head *head = ns->head;
>> + u32 boundary_bytes = head->atomic_boundary;
>> +
>> + if (blk_rq_bytes(req) > ns->head->atomic_max)
>> + return BLK_STS_IOERR;
>> +
>> + if (boundary_bytes) {
>> + u32 mask = boundary_bytes - 1, imask = ~mask;
>> + u32 start = blk_rq_pos(req) << SECTOR_SHIFT;
>> + u32 end = start + blk_rq_bytes(req);
>> +
>> + if (blk_rq_bytes(req) > boundary_bytes)
>> + return BLK_STS_IOERR;
>> +
>> + if (((start & imask) != (end & imask)) &&
>> + (end & mask)) {
>> + return BLK_STS_IOERR;
>> + }
>> + }
>> + }
> Aren't these new fields, atomic_max and atomic_boundary, duplicates of
> the equivalent queue limits? Let's just use the queue limits instead.
I was making a copy of these limits in the driver out of an abundance of
caution. I suppose the atomic_max and atomic_boundary values won't be
modified in the block layer, so I could use them instead.
>
> And couldn't we generically validate the constraints are not violated in
> submit_bio_noacct() instead of doing that in the low level driver? The
> driver assumes all other requests are already sanity checked, so I don't
> think we should change the responsibility for that just for this flag.
As a safety mechanism, we want to ensure the complete stack is not
giving us out-of-limits atomic writes.
We have limits checks in XFS iomap and fops.c, but we would also want to
ensure that the the block layer is not doing anything it shouldn't be
doing after submit_bio_noacct(), like merging atomic write BIOs which
straddle a boundary or exceed atomic_max (if there were any merging).
The SCSI standard already has provision for error'ing an atomic write
command which exceeds the target atomic write capabilities, while NVMe
doesn't.
BTW, Christoph did mention that he would like to see this:
https://lore.kernel.org/linux-nvme/20231109153603.GA2188@lst.de/
Thanks,
John
next prev parent reply other threads:[~2024-01-25 11:30 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-24 11:38 [PATCH v3 00/15] block atomic writes John Garry
2024-01-24 11:38 ` [PATCH v3 01/15] block: Add atomic write operations to request_queue limits John Garry
2024-02-13 6:22 ` Christoph Hellwig
2024-01-24 11:38 ` [PATCH v3 02/15] block: Limit atomic writes according to bio and queue limits John Garry
2024-02-13 4:33 ` Ritesh Harjani
2024-02-13 8:05 ` John Garry
2024-01-24 11:38 ` [PATCH v3 03/15] fs/bdev: Add atomic write support info to statx John Garry
2024-01-24 11:38 ` [PATCH v3 04/15] fs: Add RWF_ATOMIC and IOCB_ATOMIC flags for atomic write support John Garry
2024-01-24 11:38 ` [PATCH v3 05/15] block: Add REQ_ATOMIC flag John Garry
2024-02-13 6:24 ` Christoph Hellwig
2024-01-24 11:38 ` [PATCH v3 06/15] block: Pass blk_queue_get_max_sectors() a request pointer John Garry
2024-02-13 6:23 ` Christoph Hellwig
2024-02-13 8:15 ` John Garry
2024-01-24 11:38 ` [PATCH v3 07/15] block: Limit atomic write IO size according to atomic_write_max_sectors John Garry
2024-02-13 6:26 ` Christoph Hellwig
2024-02-13 8:15 ` John Garry
2024-02-14 7:26 ` Christoph Hellwig
2024-02-14 9:24 ` John Garry
2024-01-24 11:38 ` [PATCH v3 08/15] block: Error an attempt to split an atomic write bio John Garry
2024-01-24 11:38 ` [PATCH v3 09/15] block: Add checks to merging of atomic writes John Garry
2024-02-12 10:54 ` Nilay Shroff
2024-02-12 11:20 ` [PATCH " John Garry
2024-02-12 12:01 ` Nilay Shroff
2024-02-12 12:09 ` John Garry
2024-02-13 6:52 ` Nilay Shroff
2024-01-24 11:38 ` [PATCH v3 10/15] block: Add fops atomic write support John Garry
2024-02-13 9:36 ` Nilay Shroff
2024-02-13 9:58 ` [PATCH " John Garry
2024-02-13 11:08 ` Nilay Shroff
2024-02-13 11:52 ` John Garry
2024-02-14 9:38 ` Nilay Shroff
2024-02-14 11:29 ` John Garry
2024-02-14 11:47 ` Nilay Shroff
2024-01-24 11:38 ` [PATCH v3 11/15] scsi: sd: Support reading atomic write properties from block limits VPD John Garry
2024-02-13 6:31 ` Christoph Hellwig
2024-02-13 8:16 ` John Garry
2024-01-24 11:38 ` [PATCH v3 12/15] scsi: sd: Add WRITE_ATOMIC_16 support John Garry
2024-01-24 11:38 ` [PATCH v3 13/15] scsi: scsi_debug: Atomic write support John Garry
2024-01-24 11:38 ` [PATCH v3 14/15] nvme: Support atomic writes John Garry
2024-02-13 6:42 ` Christoph Hellwig
2024-02-13 14:21 ` John Garry
2024-02-14 8:00 ` Christoph Hellwig
2024-02-14 9:21 ` John Garry
2024-02-14 12:27 ` Nilay Shroff
2024-02-14 13:02 ` John Garry
2024-02-14 16:45 ` Nilay Shroff
2024-01-24 11:38 ` [PATCH v3 15/15] nvme: Ensure atomic writes will be executed atomically John Garry
2024-01-25 0:52 ` Keith Busch
2024-01-25 11:28 ` John Garry [this message]
2024-01-29 6:20 ` Christoph Hellwig
2024-01-29 9:36 ` John Garry
2024-01-29 14:39 ` Christoph Hellwig
2024-01-26 3:50 ` Chaitanya Kulkarni
2024-02-13 6:42 ` Christoph Hellwig
2024-02-13 14:07 ` John Garry
2024-01-29 6:18 ` [PATCH v3 00/15] block atomic writes Christoph Hellwig
2024-01-29 9:17 ` John Garry
2024-02-06 18:44 ` John Garry
2024-02-10 12:12 ` David Laight
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=dbb3ad13-7524-4861-8006-b2ea426fbacd@oracle.com \
--to=john.g.garry@oracle.com \
--cc=alan.adamson@oracle.com \
--cc=axboe@kernel.dk \
--cc=brauner@kernel.org \
--cc=bvanassche@acm.org \
--cc=dchinner@redhat.com \
--cc=djwong@kernel.org \
--cc=hch@lst.de \
--cc=jack@suse.cz \
--cc=jbongio@google.com \
--cc=jejb@linux.ibm.com \
--cc=kbusch@kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=linux-scsi@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=ming.lei@redhat.com \
--cc=ojaswin@linux.ibm.com \
--cc=sagi@grimberg.me \
--cc=tytso@mit.edu \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).