|
|
|
|
|
|
|
|
|
|
xen-devel
Re: [Xen-devel] Kernel Panic in xen-blkfront.c:blkif_queue_request under
----- "Jens Axboe" <jens.axboe@xxxxxxxxxx> wrote:
Here is what I'm thinking is happening rewritten for clarity:
#define BLKIF_MAX_SEGMENTS_PER_REQUEST 11
int array[BLKIF_MAX_SEGMENTS_PER_REQUEST];
void write_segments( int number_of_segments )
int nr_segments = 0;
for( int x = 0; x < number_of_segments; x++ )
{
BUG_ON( nr_segments == BLKIF_MAX_SEGMENTS_PER_REQUEST );
array[nr_segments] = get_segment_value(nr_segments);
nr_segments ++ ;
}
}
The BUG_ON is firing because the index into the number of segments is equal to
BLKIF_MAX_SEGMENTS_PER_REQUEST which would require an array size of
BLKIF_MAX_SEGMENTS_PER_REQUEST + 1 (more than has actually been allocated).
The kernel is being told that it should happily map up to
BLKIF_MAX_SEGMENTS_PER_REQUEST segments which will fit in our array as
allocated. The BUG_ON is correctly firing because in the iteration over the
number of segments our index has been incremented to a value that now points
outside the boundary of our array.
-- Greg
>
> > It sounds to me like the kernel itself may not be obeying the
> > requested segment limits here?
>
> It's quite simple - if you tell the kernel that your segment limit is
> 8,
> then it will happily map up to 8 segments for you. So the mixture of
> setting a limit to foo and check calling BUG() if that limit is
> reached
> is crap, of obvious reasons. If you ask for 8 segments but can only
> hold
> 7, well...
> --
> Jens Axboe
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
|
|
|
|