On Monday February 7, [EMAIL PROTECTED] wrote:
> NeilBrown <[EMAIL PROTECTED]> wrote:
> >
> > +   retry:
> >             sh = get_active_stripe(conf, new_sector, pd_idx, 
> > (bi->bi_rw&RWA_MASK));
> >             if (sh) {
> >  -
> >  -                  while (!add_stripe_bio(sh, bi, dd_idx, 
> > (bi->bi_rw&RW_MASK))) {
> >  -                          /* add failed due to overlap.  Flush everything
> >  +                  if (!add_stripe_bio(sh, bi, dd_idx, 
> > (bi->bi_rw&RW_MASK))) {
> >  +                          /* Add failed due to overlap.  Flush everything
> >                              * and wait a while
> >  -                           * FIXME - overlapping requests should be 
> > handled better
> >                              */
> >                             raid5_unplug_device(mddev->queue);
> >  -                          set_current_state(TASK_UNINTERRUPTIBLE);
> >  -                          schedule_timeout(1);
> >  +                          release_stripe(sh);
> >  +                          schedule();
> >  +                          goto retry;
> 
> Worrisome.  If the calling process has SCHED_RR or SCHED_FIFO policy, this
> could cause a lockup, perhaps.

Is that just that I should have the "prepare_to_wait" after the retry:
label rather than before, or is there something more subtle.

> 
> Some sort of real synchronisation scheme would be nicer.  Or at the least,
> what was wrong with the schedule_timeout(1)?

schedule_timeout shouldn't be necessary as whenever the conflicting
bio gets dealt with, a wakeup will happen on the conf->wait_for_overlap 
wait_queue.

(schedule_timeout(1) by itself slowed things down too much. The
proactive waking was needed, and with it in place, the timeout becomes
irrelevant).

NeilBrown


--
md: prepare_to_wait needs to be in the loop which waits for overlapping 
requests to complete

Signed-off-by: Neil Brown <[EMAIL PROTECTED]>

### Diffstat output
 ./drivers/md/raid5.c |    2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)

diff ./drivers/md/raid5.c~current~ ./drivers/md/raid5.c
--- ./drivers/md/raid5.c~current~       2005-02-07 13:34:23.000000000 +1100
+++ ./drivers/md/raid5.c        2005-02-08 13:34:38.000000000 +1100
@@ -1433,9 +1433,9 @@ static int make_request (request_queue_t
                        (unsigned long long)new_sector, 
                        (unsigned long long)logical_sector);
 
+       retry:
                prepare_to_wait(&conf->wait_for_overlap, &w, 
TASK_UNINTERRUPTIBLE);
 
-       retry:
                sh = get_active_stripe(conf, new_sector, pd_idx, 
(bi->bi_rw&RWA_MASK));
                if (sh) {
                        if (!add_stripe_bio(sh, bi, dd_idx, 
(bi->bi_rw&RW_MASK))) {

-
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to