[Tux3] Tux3 kernel port - stupid semaphore tricks

Maciej Żenczykowski zenczykowski at gmail.com
Fri Sep 19 12:22:49 PDT 2008


Care to explain, which of these is better, why and when?

On Fri, Sep 19, 2008 at 07:10, Daniel Phillips <phillips at phunq.net> wrote:
> Here is a slightly different style of handling a bio completion that
> uses a semaphore instead of a wait queue:
>
> static void read_endio(struct bio *bio, int err)
> {
>        struct semaphore *sem = bio->bi_private;
>        bio_put(bio);
>        up(sem);
> }
>
> static int junkfs_fill_super(struct super_block *sb, void *data, int silent)
> {
>        __DECLARE_SEMAPHORE_GENERIC(sem, 0);
>        struct bio *bio;
>        int i;
>        u8 *buf;
>
>
>        if (IS_ERR(bio = bio_alloc(GFP_KERNEL, 1)))
>                return PTR_ERR(bio);
>
>        if (!(buf = kmalloc(SB_SIZE, GFP_KERNEL))) {
>                bio_put(bio);
>                return -ENOMEM;
>        };
>        bio->bi_io_vec[bio->bi_vcnt] = (struct bio_vec){
>                .bv_page = virt_to_page(buf),
>                .bv_offset = offset_in_page(buf),
>                .bv_len = SB_SIZE };
>        bio->bi_bdev = sb->s_bdev;
>        bio->bi_sector = 0;
>        bio->bi_size = SB_SIZE;
>        bio->bi_vcnt = 1;
>        bio->bi_end_io = read_endio;
>        bio->bi_private = &sem;
>        submit_bio(READ, bio);
>        down(&sem);
>        printk("super = ");
>        for(i = 0; i < 16; i++)
>                printk(" %02X", buf[i]);
>        printk("\n");
>        kfree(buf);
>        return 0;
> }
>
> Note that I simply ignore the error from the bio here, which is not
> right.  We actually do need to put a pointer to something more than
> just the semaphore in the bio private field.  I just thought I would
> write it as above for fun.  Well the fun is done, and the error var
> goes back in before anything like this goes to production.
>
> Note how we lost the state flag that is needed for non-racy waiting
> on a wait queue (wait_event).  The semaphore count takes the place
> of the state flag, and the semaphore has its own wait list, plus fancy
> code in "down" to wait on the semaphore state.  (Not at all like the
> wait queue code, it's worth taking a look at.)
>
> For a one-off task like this, any efficiency difference between the
> wait_event style and the semaphore technqiue does not matter at all.
> The semaphore style is shorter, with one less state variable to get
> wrong.
>
> Regards,
>
> Daniel
>
> _______________________________________________
> Tux3 mailing list
> Tux3 at tux3.org
> http://tux3.org/cgi-bin/mailman/listinfo/tux3
>

_______________________________________________
Tux3 mailing list
Tux3 at tux3.org
http://tux3.org/cgi-bin/mailman/listinfo/tux3



More information about the Tux3 mailing list