Currently we don't limit O_DIRECT writes at all, we just let them queue
up as many as possible. As max priority writes should be able to get
full bandwidth, handle O_DIRECT writes just like we would high priority
buffered writes.

Signed-off-by: Jens Axboe <[email protected]>

---

diff --git a/block/blk-wbt.c b/block/blk-wbt.c
index 8e20a0677dcf..9b17161b5668 100644
--- a/block/blk-wbt.c
+++ b/block/blk-wbt.c
@@ -450,6 +450,12 @@ static bool close_io(struct rq_wb *rwb)
                time_before(now, rwb->last_comp + HZ / 10);
 }
 
+static bool is_odirect_write(unsigned long rw)
+{
+       return op_is_write(rw) &&
+               ((rw & (REQ_SYNC | REQ_IDLE)) == (REQ_SYNC | REQ_IDLE));
+}
+
 #define REQ_HIPRIO     (REQ_SYNC | REQ_META | REQ_PRIO)
 
 static inline unsigned int get_limit(struct rq_wb *rwb, unsigned long rw)
@@ -474,7 +480,8 @@ static inline unsigned int get_limit(struct rq_wb *rwb, 
unsigned long rw)
         * the idle limit, or go to normal if we haven't had competing
         * IO for a bit.
         */
-       if ((rw & REQ_HIPRIO) || wb_recent_wait(rwb) || current_is_kswapd())
+       if ((rw & REQ_HIPRIO) || wb_recent_wait(rwb) || current_is_kswapd() ||
+           is_odirect_write(rw))
                limit = rwb->rq_depth.max_depth;
        else if ((rw & REQ_BACKGROUND) || close_io(rwb)) {
                /*
@@ -578,12 +585,6 @@ static inline bool wbt_should_throttle(struct rq_wb *rwb, 
struct bio *bio)
 {
        switch (bio_op(bio)) {
        case REQ_OP_WRITE:
-               /*
-                * Don't throttle WRITE_ODIRECT
-                */
-               if ((bio->bi_opf & (REQ_SYNC | REQ_IDLE)) ==
-                   (REQ_SYNC | REQ_IDLE))
-                       return false;
                /* fallthrough */
        case REQ_OP_DISCARD:
                return true;


-- 
Jens Axboe

Reply via email to