The patch titled pktcdvd: bio write congestion using blk_congestion_wait() has been added to the -mm tree. Its filename is pktcdvd-bio-write-congestion-using-blk_congestion_wait.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: pktcdvd: bio write congestion using blk_congestion_wait() From: "Thomas Maier" <balagi@xxxxxxxxxxx> This adds a bio write queue congestion control to the pktcdvd driver with fixed on/off marks. It prevents that the driver consumes a unlimited amount of write requests. Signed-off-by: Thomas Maier <balagi@xxxxxxxxxxx> Cc: Peter Osterlund <petero2@xxxxxxxxx> Cc: Jens Axboe <jens.axboe@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- drivers/block/pktcdvd.c | 32 ++++++++++++++++++++++++++++++++ include/linux/pktcdvd.h | 9 +++++++++ 2 files changed, 41 insertions(+) diff -puN drivers/block/pktcdvd.c~pktcdvd-bio-write-congestion-using-blk_congestion_wait drivers/block/pktcdvd.c --- a/drivers/block/pktcdvd.c~pktcdvd-bio-write-congestion-using-blk_congestion_wait +++ a/drivers/block/pktcdvd.c @@ -83,6 +83,8 @@ static struct pktcdvd_device *pkt_devs[MAX_WRITERS]; static struct proc_dir_entry *pkt_proc; static int pktdev_major; +static int write_congestion_on = PKT_WRITE_CONGESTION_ON; +static int write_congestion_off = PKT_WRITE_CONGESTION_OFF; static struct mutex ctl_mutex; /* Serialize open/close/setup/teardown */ static mempool_t *psd_pool; @@ -893,6 +895,7 @@ static int pkt_handle_queue(struct pktcd sector_t zone = 0; /* Suppress gcc warning */ struct pkt_rb_node *node, *first_node; struct rb_node *n; + int wakeup; VPRINTK("handle_queue\n"); @@ -965,7 +968,13 @@ try_next_bio: pkt->write_size += bio->bi_size / CD_FRAMESIZE; spin_unlock(&pkt->lock); } + /* check write congestion marks, and if bio_queue_size is + below, wake up any waiters */ + wakeup = (pd->write_congestion_on > 0 + && pd->bio_queue_size <= pd->write_congestion_off); spin_unlock(&pd->lock); + if (wakeup) + blk_clear_queue_congested(pd->disk->queue, WRITE); pkt->sleep_time = max(PACKET_WAIT_TIME, 1); pkt_set_state(pkt, PACKET_WAITING_STATE); @@ -2178,6 +2187,23 @@ static int pkt_make_request(request_queu } spin_unlock(&pd->cdrw.active_list_lock); + /* + * Test if there is enough room left in the bio work queue + * (queue size >= congestion on mark). + * If not, wait till the work queue size is below the congestion off mark. + */ + spin_lock(&pd->lock); + if (pd->write_congestion_on > 0 + && pd->bio_queue_size >= pd->write_congestion_on) { + blk_set_queue_congested(q, WRITE); + do { + spin_unlock(&pd->lock); + blk_congestion_wait(WRITE, HZ); + spin_lock(&pd->lock); + } while(pd->bio_queue_size > pd->write_congestion_off); + } + spin_unlock(&pd->lock); + /* * No matching packet found. Store the bio in the work queue. */ @@ -2297,6 +2323,9 @@ static int pkt_seq_show(struct seq_file seq_printf(m, "\tstate:\t\t\ti:%d ow:%d rw:%d ww:%d rec:%d fin:%d\n", states[0], states[1], states[2], states[3], states[4], states[5]); + seq_printf(m, "\twrite congestion marks:\toff=%d on=%d\n", + pd->write_congestion_off, + pd->write_congestion_on); return 0; } @@ -2461,6 +2490,9 @@ static int pkt_setup_dev(struct pkt_ctrl if (!pd->rb_pool) goto out_mem; + pd->write_congestion_on = write_congestion_on; + pd->write_congestion_off = write_congestion_off; + disk = alloc_disk(1); if (!disk) goto out_mem; diff -puN include/linux/pktcdvd.h~pktcdvd-bio-write-congestion-using-blk_congestion_wait include/linux/pktcdvd.h --- a/include/linux/pktcdvd.h~pktcdvd-bio-write-congestion-using-blk_congestion_wait +++ a/include/linux/pktcdvd.h @@ -112,6 +112,12 @@ struct pkt_ctrl_command { #include <linux/completion.h> #include <linux/cdrom.h> + +/* default bio write queue congestion marks */ +#define PKT_WRITE_CONGESTION_ON 10000 +#define PKT_WRITE_CONGESTION_OFF 9000 + + struct packet_settings { __u32 size; /* packet size in (512 byte) sectors */ @@ -271,6 +277,9 @@ struct pktcdvd_device struct packet_iosched iosched; struct gendisk *disk; + + int write_congestion_off; + int write_congestion_on; }; #endif /* __KERNEL__ */ _ Patches currently in -mm which might be from balagi@xxxxxxxxxxx are export-clear_queue_congested-and-set_queue_congested.patch pktcdvd-reusability-of-procfs-functions.patch pktcdvd-make-procfs-interface-optional.patch pktcdvd-bio-write-congestion-using-blk_congestion_wait.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html