|
|
|
|
|
|
|
|
|
|
xen-devel
Re: [Xen-devel] Possible bug in gntdev.c
Hi,
Have you tried executing this example and observing if it does cause a
bug and/or an unexpected error (such as ENOMEM)?
When you map the single grant in your third step, it does not take the
first free slot in the grants array; instead it takes the slot that is
at the end of the free_list, which would be entry #3 in your example.
When this grant is unmapped, entry #3 is re-appended to the free_list.
The rationale behind this algorithm is that it is able to find a free
single slot (the assumed common case) in O(1) time, rather than
performing an O(n) search of the grants array.
Regards,
Derek Murray.
wei huang wrote:
Hi list,
I am playing with grant table device in xen-3.1
(http://xenbits.xensource.com/xen-3.1-testing.hg) these days and I am not
sure about the following code snippet for gntdev_ioctl function. These
could be a bug IMO:
gntdev.c: line 899-912
====================================================================
/* Unmap pages and add them to the free list.
*/
for (i = 0; i < op.count; ++i) {
private_data->grants[start_index+i].state =
GNTDEV_SLOT_INVALID;
private_data->grants[start_index+i].u.free_list_index =
private_data->free_list_size;
private_data->free_list[private_data->free_list_size] =
start_index + i;
++private_data->free_list_size;
}
compress_free_list(flip);
====================================================================
The reason I think this could be a bug is through this simple example.
Take the case MAX_GRANTS=4. In gntdev_open,
private_data->grants[i].u.free_list_index is initialized as (MAX_GRANTS -
i - 1), so for entry 0, 1, 2, 3, their corresponding free_list_index is:
entry # free_list_index
0 3
1 2
2 1
3 0
Now, suppose we map 4 pages one by one, and then unmap those pages one by
one. According to the above code, the free_list_index will become the
following. When you unmap and unset the 0th entry, the free_list_size at
that time is 0, ...:
entry # free_list_index
0 0
1 1
2 2
3 3
Now, let's again map 1 page and unmap it. After
IOCTL_GNTDEV_UNMAP_GRANT_REF, the indices will be (free_list_size will be
3 at the point of unmap):
entry # free_list_index
0 3
1 1
2 2
3 3
To here, the does not look correct to me. Actually if now I map 4 pages
at at one, we will think we still have 1 mapping slot not used.
Am I making the correct observation?
Thanks.
Regards,
Wei Huang
Dept. of Computer Science and Engineering
Ohio State University
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
|
|
|
|