2010/2/1 Bob Beck <b...@ualberta.ca>:
> On 31 January 2010 05:43, Anton Maksimenkov <anton...@gmail.com> wrote:
>> Second, remove redundant "temp_entry" variable from both functions.
>> One "entry" variable is enough to do the job.
> I don't think you want to do that.. uvm_map_lookup_entry can screw
> with that pointer even when it fails.

Sorry, I don't clearly understand what you mean. What is bad?
I think that "screw with that pointer even when it fails" is exactly
what uvm_map_lookup_entry must do and what we need here.

uvm_map_protect() exploit exactly same trick. And uvm_map_extract() do the same:
...
if (uvm_map_lookup_entry(srcmap, start, &entry)) {
    ...do some work with entry...
} else {
    /* "start" is not within an entry ... skip to next entry */
    if (flags & UVM_EXTRACT_CONTIG) {
        error = EINVAL;
        goto bad;    /* definite hole here ... */
    }
    entry = entry->next;
    fudge = 0;
}

AFAIS, uvm_map_lookup_entry() set the "entry" either to the
vm_map_entry which contain "start" address (success)
or to the last vm_map_entry in the map (fail).
If it fail and set "entry" to the last vm_map_entry then "entry =
entry->next" move entry to the map->header.
So loop with
 while ((entry != &map->header) && (entry->start < end)) {
will never be executed (it is right thing).

Overcomplicated using of RB_TREE in uvm_map_lookup_entry() making it
hard to understand.
I thinking about drop this RB_TREE out from uvm_map.c or completely
rewrite using of this RB_TREE.
-- 
antonvm

Reply via email to