Re: 2.6.4-mm2

From: Jens Axboe
Date: Fri Mar 19 2004 - 02:58:06 EST


On Thu, Mar 18 2004, Andrew Morton wrote:
> Jens Axboe <axboe@xxxxxxx> wrote:
> >
> > > --- 25/drivers/md/dm-table.c~a 2004-03-18 19:03:15.130004696 -0800
> > > +++ 25-akpm/drivers/md/dm-table.c 2004-03-18 19:03:41.656971984 -0800
> > > @@ -893,7 +893,7 @@ void dm_table_unplug_all(struct dm_table
> > > struct dm_dev *dd = list_entry(d, struct dm_dev, list);
> > > request_queue_t *q = bdev_get_queue(dd->bdev);
> > >
> > > - if (q->unplug_fn)
> > > + if (q->unplug_fn && queue_needs_unplug(q)))
> > > q->unplug_fn(q);
> > > }
> > > }
> > >
> > >
> > > to reduce the computational expense of dm_table_unplug_all() a bit.
> > >
> > > But we're barking up the wrong tree here. Mark, if it's OK I'll run up
> > > some kernels for you to test.
> >
> > I thought about this last night, and I have a better idea that gets the
> > same accomplished. The problem right now is indeed that we aren't
> > tracking who needs to be unplugged, like we used to. The solution is to
> > do the exact same style plugging (with block helpers) that we used to,
> > except the plug_list is maintained in the driver. So when you do
> > dm_unplug(), it doesn't _have_ to iterate the full device list, only
> > those that do need kicking.
> >
> > I'll produce a patch to fix this this morning. First coffee.
>
> Yes, it would be nice but I fear that it gets complicated.
>
> Is it not the case that two dm maps can refer to the same queue? Say, one
> map uses /dev/hda1 and another map uses /dev/hda2?
>
> If so, then when the /dev/hda queue is plugged we need to tell both the
> higher-level maps that this queue needs an unplug. So blk_plug_device()
> and the various unplug functions need to perform upcalls to an arbitrary
> number of higher-level drivers, and those drivers need to keep track of the
> currently-plugged queues without adding data structures to the
> request_queue structure.
>
> It can be done of course, but could get messy.

That would get nasty, it's much more natural to track it from the other
end. I view it as a dm (or whatever problem) that they need to track who
has pending io on their behalf, which is pretty easy to to from eg
__map_bio().

The only addition is putting the old q->plug_list back, but using it on
stacking drivers like dm. dm then maintains a per-dm plugged list that
it can use when dm_unplug() runs.

--
Jens Axboe

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/