lost wakeup problem.

Prasad Joshi <[email protected]>
Newsgroups gmane.linux.newbie
Message-ID <[email protected]>
Hi All,

I am implementing a block device. I put every new request in the
bio_list and then I have a thread which keeps on retrieving and
servicing the request.

Here is my make_request function.

int iftl_make_request(struct request_queue *q, struct bio *bio)
{
    struct iftl_device *dev = q->queuedata;
    int rw = bio_rw(bio);

    if (rw == READA)
        rw = READ;

    BUG_ON(!dev || (rw != READ && rw != WRITE));

    spin_lock_irq(&dev->lock);
    bio_list_add(&dev->ftl_bio_list, bio);
    wake_up(&dev->event);
    spin_unlock_irq(&dev->lock);
    return 0;
}

This is my thread servicing the bio requests

int iftl_thread(void *data)
{
    struct iftl_device *dev = (struct iftl_device *) data;
    struct bio *bio;

    set_user_nice(current, -20);
    while (!kthread_should_stop() || !bio_list_empty(&dev->ftl_bio_list)) {
        wait_event_interruptible(dev->event,
                !bio_list_empty(&dev->ftl_bio_list) || kthread_should_stop());

        spin_lock_irq(&dev->lock);
        if (bio_list_empty(&dev->ftl_bio_list)) {
            spin_unlock_irq(&dev->lock);
            continue;
        }
        bio = bio_list_pop(&dev->ftl_bio_list);
        spin_unlock_irq(&dev->lock);
        BUG_ON(!bio);
        iftl_handle_bio(dev, bio);
    }
    return 0;
}

Every time I run IOs on my device I get following oops

mkfs.ext3     D 0000000000000000     0  7962   7960 0x00000000
ffffffff81492020 0000000000000086 ffffc9001447b028 0000000000000008
0000000000000092 0000000000011e40 000000000000c788 ffff88021ea25780
ffff88021ea25a08 00000000000000ff ffff8800588d1f00 ffff88021ea25a08
Call Trace:
[<ffffffff81108070>] ? sync_buffer+0x0/0x50
[<ffffffff8130d884>] ? io_schedule+0x34/0x50
[<ffffffff811080ad>] ? sync_buffer+0x3d/0x50
[<ffffffff8130dfb0>] ? __wait_on_bit+0x50/0x80
[<ffffffff81108070>] ? sync_buffer+0x0/0x50
[<ffffffff8130e059>] ? out_of_line_wait_on_bit+0x79/0xa0
[<ffffffff81057e70>] ? wake_bit_function+0x0/0x30
[<ffffffff81108faf>] ? __block_prepare_write+0x37f/0x560
[<ffffffff8110c8d0>] ? blkdev_get_block+0x0/0x70
[<ffffffff81109315>] ? block_write_begin+0x55/0xe0
[<ffffffff8110d8d2>] ? blkdev_write_begin+0x22/0x30
[<ffffffff8110c8d0>] ? blkdev_get_block+0x0/0x70
[<ffffffff810ade38>] ? generic_file_buffered_write+0x128/0x320
[<ffffffff8102f633>] ? __wake_up+0x43/0x70
[<ffffffff810ae4d8>] ? __generic_file_aio_write_nolock+0x278/0x480
[<ffffffff8102f633>] ? __wake_up+0x43/0x70
[<ffffffff810aee8f>] ? generic_file_aio_write_nolock+0x2f/0xa0
[<ffffffff810e1093>] ? do_sync_write+0xe3/0x130
[<ffffffff81057e40>] ? autoremove_wake_function+0x0/0x30
[<ffffffff810e1d2b>] ? vfs_write+0xcb/0x1a0
[<ffffffff810e1f03>] ? sys_write+0x53/0xa0
[<ffffffff8100be42>] ? system_call_fastpath+0x16/0x1b

I also found that there is mismatch between, the number of
make_request calls and number of times thread serves request. Is this
problem because of lost wake_ups.

Appreciate your help.

Thanks and Regards,
Prasad
--
To unsubscribe from this list: send the line "unsubscribe linux-newbie" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.linux-learn.org/faqs
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.