From: Jens Axboe <axboe@kernel.dk>
To: linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org
Cc: adilger@dilger.ca, hch@infradead.org, martin.petersen@oracle.com,
linux-nvme@lists.infradead.org, Jens Axboe <axboe@kernel.dk>
Subject: [PATCH 2/9] block: add support for write hints in a bio
Date: Tue, 20 Jun 2017 18:21:59 -0600 [thread overview]
Message-ID: <1498004526-4543-3-git-send-email-axboe@kernel.dk> (raw)
In-Reply-To: <1498004526-4543-1-git-send-email-axboe@kernel.dk>
No functional changes in this patch, we just set aside 3 bits
in the bio/request flags, which can be used to hold a WRITE_LIFE_*
life time hint.
Ensure that we don't merge requests that have different life time
hints assigned to them.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
---
block/blk-merge.c | 16 ++++++++++++++++
include/linux/blk_types.h | 31 +++++++++++++++++++++++++++++++
2 files changed, 47 insertions(+)
diff --git a/block/blk-merge.c b/block/blk-merge.c
index cea544ec5d96..17cd0c3f872d 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -670,6 +670,14 @@ static struct request *attempt_merge(struct request_queue *q,
return NULL;
/*
+ * Don't allow merge of different streams, or for a stream with
+ * non-stream IO.
+ */
+ if ((req->cmd_flags & REQ_WRITE_LIFE_MASK) !=
+ (next->cmd_flags & REQ_WRITE_LIFE_MASK))
+ return NULL;
+
+ /*
* If we are allowed to merge, then append bio list
* from next to rq and release next. merge_requests_fn
* will have updated segment counts, update sector
@@ -788,6 +796,14 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
!blk_write_same_mergeable(rq->bio, bio))
return false;
+ /*
+ * Don't allow merge of different streams, or for a stream with
+ * non-stream IO.
+ */
+ if ((rq->cmd_flags & REQ_WRITE_LIFE_MASK) !=
+ (bio->bi_opf & REQ_WRITE_LIFE_MASK))
+ return false;
+
return true;
}
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
index e210da6d14b8..4ce71298e45b 100644
--- a/include/linux/blk_types.h
+++ b/include/linux/blk_types.h
@@ -7,6 +7,7 @@
#include <linux/types.h>
#include <linux/bvec.h>
+#include <linux/fs.h>
struct bio_set;
struct bio;
@@ -223,6 +224,10 @@ enum req_flag_bits {
__REQ_RAHEAD, /* read ahead, can fail anytime */
__REQ_BACKGROUND, /* background IO */
+ __REQ_WRITE_HINT_SHIFT, /* 3 bits for life time hint */
+ __REQ_WRITE_HINT_PAD1,
+ __REQ_WRITE_HINT_PAD2,
+
/* command specific flags for REQ_OP_WRITE_ZEROES: */
__REQ_NOUNMAP, /* do not free blocks when zeroing */
@@ -244,6 +249,13 @@ enum req_flag_bits {
#define REQ_RAHEAD (1ULL << __REQ_RAHEAD)
#define REQ_BACKGROUND (1ULL << __REQ_BACKGROUND)
+#define REQ_WRITE_SHORT (WRITE_LIFE_SHORT << __REQ_WRITE_HINT_SHIFT)
+#define REQ_WRITE_MEDIUM (WRITE_LIFE_MEDIUM << __REQ_WRITE_HINT_SHIFT)
+#define REQ_WRITE_LONG (WRITE_LIFE_LONG << __REQ_WRITE_HINT_SHIFT)
+#define REQ_WRITE_EXTREME (WRITE_LIFE_EXTREME << __REQ_WRITE_HINT_SHIFT)
+
+#define REQ_WRITE_LIFE_MASK (0x7 << __REQ_WRITE_HINT_SHIFT)
+
#define REQ_NOUNMAP (1ULL << __REQ_NOUNMAP)
#define REQ_NOWAIT (1ULL << __REQ_NOWAIT)
@@ -335,4 +347,23 @@ struct blk_rq_stat {
u64 batch;
};
+static inline unsigned int write_hint_to_opf(enum rw_hint hint)
+{
+ return hint << __REQ_WRITE_HINT_SHIFT;
+}
+
+/*
+ * Don't let drivers see WRITE_LIFE_NOT_SET, return NONE for that
+ */
+static inline enum rw_hint opf_to_write_hint(unsigned int opf)
+{
+ enum rw_hint ret;
+
+ ret = (opf & REQ_WRITE_LIFE_MASK) >> __REQ_WRITE_HINT_SHIFT;
+ if (ret == WRITE_LIFE_NOT_SET)
+ ret = WRITE_LIFE_NONE;
+
+ return ret;
+}
+
#endif /* __LINUX_BLK_TYPES_H */
--
2.7.4
WARNING: multiple messages have this Message-ID (diff)
From: axboe@kernel.dk (Jens Axboe)
Subject: [PATCH 2/9] block: add support for write hints in a bio
Date: Tue, 20 Jun 2017 18:21:59 -0600 [thread overview]
Message-ID: <1498004526-4543-3-git-send-email-axboe@kernel.dk> (raw)
In-Reply-To: <1498004526-4543-1-git-send-email-axboe@kernel.dk>
No functional changes in this patch, we just set aside 3 bits
in the bio/request flags, which can be used to hold a WRITE_LIFE_*
life time hint.
Ensure that we don't merge requests that have different life time
hints assigned to them.
Signed-off-by: Jens Axboe <axboe at kernel.dk>
---
block/blk-merge.c | 16 ++++++++++++++++
include/linux/blk_types.h | 31 +++++++++++++++++++++++++++++++
2 files changed, 47 insertions(+)
diff --git a/block/blk-merge.c b/block/blk-merge.c
index cea544ec5d96..17cd0c3f872d 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -670,6 +670,14 @@ static struct request *attempt_merge(struct request_queue *q,
return NULL;
/*
+ * Don't allow merge of different streams, or for a stream with
+ * non-stream IO.
+ */
+ if ((req->cmd_flags & REQ_WRITE_LIFE_MASK) !=
+ (next->cmd_flags & REQ_WRITE_LIFE_MASK))
+ return NULL;
+
+ /*
* If we are allowed to merge, then append bio list
* from next to rq and release next. merge_requests_fn
* will have updated segment counts, update sector
@@ -788,6 +796,14 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
!blk_write_same_mergeable(rq->bio, bio))
return false;
+ /*
+ * Don't allow merge of different streams, or for a stream with
+ * non-stream IO.
+ */
+ if ((rq->cmd_flags & REQ_WRITE_LIFE_MASK) !=
+ (bio->bi_opf & REQ_WRITE_LIFE_MASK))
+ return false;
+
return true;
}
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
index e210da6d14b8..4ce71298e45b 100644
--- a/include/linux/blk_types.h
+++ b/include/linux/blk_types.h
@@ -7,6 +7,7 @@
#include <linux/types.h>
#include <linux/bvec.h>
+#include <linux/fs.h>
struct bio_set;
struct bio;
@@ -223,6 +224,10 @@ enum req_flag_bits {
__REQ_RAHEAD, /* read ahead, can fail anytime */
__REQ_BACKGROUND, /* background IO */
+ __REQ_WRITE_HINT_SHIFT, /* 3 bits for life time hint */
+ __REQ_WRITE_HINT_PAD1,
+ __REQ_WRITE_HINT_PAD2,
+
/* command specific flags for REQ_OP_WRITE_ZEROES: */
__REQ_NOUNMAP, /* do not free blocks when zeroing */
@@ -244,6 +249,13 @@ enum req_flag_bits {
#define REQ_RAHEAD (1ULL << __REQ_RAHEAD)
#define REQ_BACKGROUND (1ULL << __REQ_BACKGROUND)
+#define REQ_WRITE_SHORT (WRITE_LIFE_SHORT << __REQ_WRITE_HINT_SHIFT)
+#define REQ_WRITE_MEDIUM (WRITE_LIFE_MEDIUM << __REQ_WRITE_HINT_SHIFT)
+#define REQ_WRITE_LONG (WRITE_LIFE_LONG << __REQ_WRITE_HINT_SHIFT)
+#define REQ_WRITE_EXTREME (WRITE_LIFE_EXTREME << __REQ_WRITE_HINT_SHIFT)
+
+#define REQ_WRITE_LIFE_MASK (0x7 << __REQ_WRITE_HINT_SHIFT)
+
#define REQ_NOUNMAP (1ULL << __REQ_NOUNMAP)
#define REQ_NOWAIT (1ULL << __REQ_NOWAIT)
@@ -335,4 +347,23 @@ struct blk_rq_stat {
u64 batch;
};
+static inline unsigned int write_hint_to_opf(enum rw_hint hint)
+{
+ return hint << __REQ_WRITE_HINT_SHIFT;
+}
+
+/*
+ * Don't let drivers see WRITE_LIFE_NOT_SET, return NONE for that
+ */
+static inline enum rw_hint opf_to_write_hint(unsigned int opf)
+{
+ enum rw_hint ret;
+
+ ret = (opf & REQ_WRITE_LIFE_MASK) >> __REQ_WRITE_HINT_SHIFT;
+ if (ret == WRITE_LIFE_NOT_SET)
+ ret = WRITE_LIFE_NONE;
+
+ return ret;
+}
+
#endif /* __LINUX_BLK_TYPES_H */
--
2.7.4
next prev parent reply other threads:[~2017-06-21 0:21 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-21 0:21 [PATCHSET v9] Add support for write life time hints Jens Axboe
2017-06-21 0:21 ` Jens Axboe
2017-06-21 0:21 ` [PATCH 1/9] fs: add fcntl() interface for setting/getting " Jens Axboe
2017-06-21 0:21 ` Jens Axboe
[not found] ` <1498004526-4543-2-git-send-email-axboe-tSWWG44O7X1aa/9Udqfwiw@public.gmane.org>
2017-06-26 9:51 ` Christoph Hellwig
2017-06-26 9:51 ` Christoph Hellwig
2017-06-26 9:51 ` Christoph Hellwig
[not found] ` <20170626095148.GB14057-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2017-06-26 13:55 ` Jens Axboe
2017-06-26 13:55 ` Jens Axboe
2017-06-26 13:55 ` Jens Axboe
[not found] ` <91b3fd3b-18f5-cf8c-a1d7-c0637283ce14-tSWWG44O7X1aa/9Udqfwiw@public.gmane.org>
2017-06-26 16:09 ` Darrick J. Wong
2017-06-26 16:09 ` Darrick J. Wong
2017-06-26 16:09 ` Darrick J. Wong
[not found] ` <20170626160946.GI3787-PTl6brltDGh4DFYR7WNSRA@public.gmane.org>
2017-06-26 16:29 ` Jens Axboe
2017-06-26 16:29 ` Jens Axboe
2017-06-26 16:29 ` Jens Axboe
2017-06-21 0:21 ` Jens Axboe [this message]
2017-06-21 0:21 ` [PATCH 2/9] block: add support for write hints in a bio Jens Axboe
2017-06-26 9:52 ` Christoph Hellwig
2017-06-26 9:52 ` Christoph Hellwig
2017-06-21 0:22 ` [PATCH 3/9] blk-mq: expose stream write hints through debugfs Jens Axboe
2017-06-21 0:22 ` Jens Axboe
2017-06-26 9:52 ` Christoph Hellwig
2017-06-26 9:52 ` Christoph Hellwig
2017-06-21 0:22 ` [PATCH 4/9] fs: add O_DIRECT support for sending down write life time hints Jens Axboe
2017-06-21 0:22 ` Jens Axboe
2017-06-26 9:55 ` Christoph Hellwig
2017-06-26 9:55 ` Christoph Hellwig
2017-06-26 14:12 ` Jens Axboe
2017-06-26 14:12 ` Jens Axboe
2017-06-21 0:22 ` [PATCH 5/9] fs: add support for buffered writeback to pass down write hints Jens Axboe
2017-06-21 0:22 ` Jens Axboe
2017-06-21 0:22 ` [PATCH 6/9] ext4: add support for passing in write hints for buffered writes Jens Axboe
2017-06-21 0:22 ` Jens Axboe
2017-06-21 0:22 ` [PATCH 7/9] xfs: " Jens Axboe
2017-06-21 0:22 ` Jens Axboe
2017-06-21 1:35 ` Darrick J. Wong
2017-06-21 1:35 ` Darrick J. Wong
2017-06-21 1:46 ` Jens Axboe
2017-06-21 1:46 ` Jens Axboe
2017-06-26 9:56 ` Christoph Hellwig
2017-06-26 9:56 ` Christoph Hellwig
2017-06-26 14:16 ` Jens Axboe
2017-06-26 14:16 ` Jens Axboe
2017-06-21 0:22 ` [PATCH 8/9] btrfs: " Jens Axboe
2017-06-21 0:22 ` Jens Axboe
2017-06-21 0:22 ` [PATCH 9/9] nvme: add support for streams and directives Jens Axboe
2017-06-21 0:22 ` Jens Axboe
2017-06-26 9:59 ` Christoph Hellwig
2017-06-26 9:59 ` Christoph Hellwig
2017-06-26 13:56 ` Jens Axboe
2017-06-26 13:56 ` Jens Axboe
2017-06-26 19:36 ` Andreas Dilger
2017-06-26 19:36 ` Andreas Dilger
2017-06-26 19:39 ` Jens Axboe
2017-06-26 19:39 ` Jens Axboe
2017-06-27 14:11 ` Christoph Hellwig
2017-06-27 14:11 ` Christoph Hellwig
2017-06-27 14:16 ` Jens Axboe
2017-06-27 14:16 ` Jens Axboe
2017-06-27 14:44 ` Christoph Hellwig
2017-06-27 14:44 ` Christoph Hellwig
2017-06-27 14:46 ` Jens Axboe
2017-06-27 14:46 ` Jens Axboe
2017-06-27 14:56 ` Jens Axboe
2017-06-27 14:56 ` Jens Axboe
2017-06-26 17:52 ` Martin K. Petersen
2017-06-26 17:52 ` Martin K. Petersen
2017-06-26 18:00 ` Jens Axboe
2017-06-26 18:00 ` Jens Axboe
2017-06-21 1:30 ` [PATCHSET v9] Add support for write life time hints Martin K. Petersen
2017-06-21 1:30 ` Martin K. Petersen
2017-06-21 1:45 ` Jens Axboe
2017-06-21 1:45 ` Jens Axboe
-- strict thread matches above, loose matches on Subject: below --
2017-06-26 15:37 [PATCHSET v10] " Jens Axboe
2017-06-26 15:37 ` [PATCH 2/9] block: add support for write hints in a bio Jens Axboe
2017-06-19 17:04 [PATCHSET v8] Add support for write life time hints Jens Axboe
2017-06-19 17:04 ` [PATCH 2/9] block: add support for write hints in a bio Jens Axboe
2017-06-19 17:04 ` Jens Axboe
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=1498004526-4543-3-git-send-email-axboe@kernel.dk \
--to=axboe@kernel.dk \
--cc=adilger@dilger.ca \
--cc=hch@infradead.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=martin.petersen@oracle.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.