Re: 2.3.47: elevator nr_segments x should be x+1

From: Andrea Arcangeli (andrea@suse.de)
Date: Sat Mar 04 2000 - 14:11:02 EST

  • Next message: Matthew Kirkwood: "Re: FIle IO Scatter/Gather."

    On Tue, 22 Feb 2000, Andrea Arcangeli wrote:

    >On 21 Feb 2000, David Wragg wrote:
    >
    >>The bad news is this:
    >>
    >>03:08: elevator nr_segments 197 should be 198
    >>03:08: elevator nr_segments 239 should be 240
    >
    >Don't worry about this. It's can't harm per se. Anyway it's interesting to
    >discover why this is happening. Can you reproduce?

    This patch against 2.3.49 will fix the above warning:

    --- elevator/drivers/block/DAC960.c.~1~ Fri Mar 3 02:19:23 2000
    +++ elevator/drivers/block/DAC960.c Sat Mar 4 19:53:03 2000
    @@ -1051,20 +1051,23 @@
             int max_segments;
             DAC960_Controller_T * Controller = q->queuedata;
             int total_segments = req->nr_segments + next->nr_segments;
    + int same_segment;
     
             max_segments = Controller->MaxSegmentsPerRequest[MINOR(req->rq_dev)];
             if (__max_segments < max_segments)
                     max_segments = __max_segments;
     
    + same_segment = 0;
             if (req->bhtail->b_data + req->bhtail->b_size == next->bh->b_data)
             {
                     total_segments--;
    - q->nr_segments--;
    + same_segment = 1;
             }
         
             if (total_segments > max_segments)
                     return 0;
     
    + q->nr_segments -= same_segment;
             req->nr_segments = total_segments;
             return 1;
     }
    --- elevator/drivers/block/ll_rw_blk.c.~1~ Sun Feb 27 06:19:42 2000
    +++ elevator/drivers/block/ll_rw_blk.c Sat Mar 4 19:53:58 2000
    @@ -212,15 +212,18 @@
                                     struct request *next, int max_segments)
     {
             int total_segments = req->nr_segments + next->nr_segments;
    + int same_segment;
     
    + same_segment = 0;
             if (req->bhtail->b_data + req->bhtail->b_size == next->bh->b_data) {
                     total_segments--;
    - q->nr_segments--;
    + same_segment = 1;
             }
         
             if (total_segments > max_segments)
                     return 0;
     
    + q->nr_segments -= same_segment;
             req->nr_segments = total_segments;
             return 1;
     }

    You can test it while I fix the other minor glitches.

    Andrea

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



    This archive was generated by hypermail 2b29 : Sat Mar 04 2000 - 14:45:01 EST