Skip to contentSkip to conversation

blk: mark discard request sync

RFC In review Shaohua Li 2 participants 3 messages Mar 16, 2012 – Mar 21, 2012 Block layer

lore
Share & tools
lore

Shaohua Li

author
#0 lore raw

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
Index: linux/block/blk-lib.c
===================================================================
@@ -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;
#1 lore raw
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.

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

author
#2 lore raw

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.

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