blk: mark discard request sync
RFC 1/1 blk: mark discard request sync
Subject: blk: mark discard request sync
discard is called in jbd for example. If discard is slowed down, all file operations could be impacted (eg, journal is full). And we always wait for discard to finish. So looks we should mark discard as sync.
--- block/blk-lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
block/blk-lib.c +1 -1
@@ -42,7 +42,7 @@ int blkdev_issue_discard(struct block_de {DECLARE_COMPLETION_ONSTACK (wait);struct request_queue *q =bdev_get_queue (bdev); -int type =REQ_WRITE |REQ_DISCARD ; +int type =REQ_WRITE |REQ_DISCARD |REQ_SYNC ;unsigned int max_discard_sectors;struct bio_batch bb;struct bio *bio;
Quoted 8 lines · Shaohua Li
Subject: blk: mark discard request sync
discard is called in jbd for example. If discard is slowed down, all file operations could be impacted (eg, journal is full). And we always wait for discard to finish. So looks we should mark discard as sync.
Signed-off-by Shaohua Li <[email protected]>
This one is tricky and I am not sure what's the right thing to do.
Generally the philosophy seems to be that request is sync is somebody is waiting on it. To me even on async writes somebody is waiting (either file system or a writer which has been throttled). So if we don't do async writes in reasonable amount of time, we start getting "task blocked for more than 120 seconds" message.
Do you have some test cases to show how bad the problem is if we don't issue discard as SYNC request.
Thanks
Vivek
2012/3/21 Vivek Goyal <[email protected]>:
Quoted 10 lines · Shaohua Li
Quoted 8 lines
Subject: blk: mark discard request sync
discard is called in jbd for example. If discard is slowed down, all file operations could be impacted (eg, journal is full). And we always wait for discard to finish. So looks we should mark discard as sync.
Signed-off-by Shaohua Li <[email protected]>
Quoted 7 lines
This one is tricky and I am not sure what's the right thing to do.
Generally the philosophy seems to be that request is sync is somebody is waiting on it. To me even on async writes somebody is waiting (either file system or a writer which has been throttled). So if we don't do async writes in reasonable amount of time, we start getting "task blocked for more than 120 seconds" message.
Not just waiting. If jbd is slow and full, things will get crazy.
Quoted 2 lines
Do you have some test cases to show how bad the problem is if we don't issue discard as SYNC request.
I came this idea when debugging Holger's discard slow problem, though his problem isn't related to the issue because he is using noop. I realized this could be a problem if ioscheduler is cfq. I tested a workload which deletes a lot of small files. With a fusionio card (changing ioscheduler to cfq), marking
discard sync gives slightly better performance. For ssd with slow discard, this might be more significant (I didn't try, no such ssd).
But any way, I haven't too strong reason we should do this, this's why it's RFC.
Thanks,
Shaohua