lkml.org 
[lkml]   [2012]   [Apr]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
Date
SubjectRe: [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/

\
 
 \ /
  Last update: 2012-04-05 00:23    [W:0.064 / U:0.204 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site