Messages in this thread | | | From | Tao Guo <> | Date | Wed, 4 Apr 2012 15:20:16 -0700 | Subject | Re: [PATCH] umem: fix up unplugging. |
| |
Hi Andrew,
Thanks for your reply.
Yes, without this patch the umem driver just doesn't work. It is a bug introduced by commit 7eaceaccab5f40bbfda044629a6298616aeaed50. In that patch, Jens removed the whole mm_unplug_device() function, which used to be the trigger to make umem start to work.
Thanks, -Tao
On Wed, Apr 4, 2012 at 2:46 PM, Andrew Morton <akpm@linux-foundation.org> wrote: > On Fri, 30 Dec 2011 09:17:31 -0500 > > (Long delay...) > > Tao Guo <glorioustao@gmail.com> wrote: > >> We need to implement unplugging to make umem start to work, or I/O >> will never be triggered. >> > > I take it from this that umem simply doesn't work at all? > > If so, for how long has this been the case and should we just delete the > thing? > >> >> --- a/drivers/block/umem.c >> +++ b/drivers/block/umem.c >> @@ -111,7 +111,8 @@ struct cardinfo { >> int current_idx; >> sector_t current_sector; >> >> - struct request_queue *queue; >> + struct request_queue *queue; >> + struct blk_plug_cb plug_cb; >> >> struct mm_page { >> dma_addr_t page_dma; >> @@ -513,6 +514,33 @@ static void process_page(unsigned long data) >> } >> } >> >> +static void mm_unplug(struct blk_plug_cb *cb) >> +{ >> + struct cardinfo *card = container_of(cb, struct cardinfo, plug_cb); >> + >> + spin_lock_irq(&card->lock); >> + activate(card); >> + spin_unlock_irq(&card->lock); >> +} >> + >> +int mm_check_plugged(struct cardinfo *card) >> +{ >> + struct blk_plug *plug = current->plug; >> + struct cardinfo *c; >> + >> + if (!plug) >> + return 0; >> + >> + list_for_each_entry(c, &plug->cb_list, plug_cb.list) { >> + if (c == card) >> + return 1; >> + } >> + >> + /* set up unplug callback */ >> + list_add(&card->plug_cb.list, &plug->cb_list); >> + return 1; >> +} >> + >> static void mm_make_request(struct request_queue *q, struct bio *bio) >> { >> struct cardinfo *card = q->queuedata; >> @@ -523,6 +551,8 @@ static void mm_make_request(struct request_queue *q, struct bio *bio) >> *card->biotail = bio; >> bio->bi_next = NULL; >> card->biotail = &bio->bi_next; >> + if (bio->bi_rw & REQ_SYNC || !mm_check_plugged(card)) >> + activate(card); >> spin_unlock_irq(&card->lock); >> >> return; >> @@ -884,6 +914,7 @@ static int __devinit mm_pci_probe(struct pci_dev *dev, >> blk_queue_make_request(card->queue, mm_make_request); >> card->queue->queue_lock = &card->lock; >> card->queue->queuedata = card; >> + card->plug_cb.callback = mm_unplug; >> >> tasklet_init(&card->tasklet, process_page, (unsigned long)card); > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |