Current-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: uvm_map_enter entry merging (was Re: vrelel...)
Dear Chuck,
On 2020-11-29, Chuck Silvers wrote:
> hi Yorick,
>
> On Sat, Nov 28, 2020 at 12:39:56AM +0200, Yorick Hardy wrote:
> > May I ask if you have an opinion on this patch? I have
> > not noticed any bad behaviour if it is omitted but, if I read
> > the code correctly, I don't think it is correct to fall through
> > for this case.
>
> this function is very hard to follow, it's very tangled.
> I stared at it for a while and I didn't see anything wrong,
> but it's hard to be sure just from reading the code.
I am sorry to have made more work for you, and thanks for looking at
it! I agree, and since I have only a superficial understanding of
how everything fits together I am not 100% sure that my reading is
correct.
> could you explain the specific case that you think is wrong now and
> that your patch fixes?
I will look at the tests as suggested below. Please read/ignore this
part as you see fit. Superficially (and perhaps that is part of the
"not reading correctly"!)
1) if we reach
http://nxr.netbsd.org/xref/src/sys/uvm/uvm_map.c#1479
then one of two things happened (with merged == 1):
a) an amap was extended
b) neither prev_entry nor prev_entry->next have an amap
2) now we reach
https://nxr.netbsd.org/xref/src/sys/uvm/uvm_map.c#1493
and since merged == 1 in (1)
https://nxr.netbsd.org/xref/src/sys/uvm/uvm_map.c#1497
UVMMAP_EVCNT_DECR(ubackmerge);
UVMMAP_EVCNT_INCR(ubimerge);
but in case 1(b) the forward merge never happened?
That was the starting point of my query. I thought perhaps that
1(b) never happens, but a printf shows that it happens often.
I am "living dangerously" and running with the patch for now,
although I am not sure yet where to look for any adverse effects.
> even better would be if you could write a set of atf tests to exercise
> all of the possible merge cases and verify that the contents of memory
> after the new mapping is created is what it should be.
> any previous and next mapping should have the same contents as before,
> and the new mapping should have either zeroes (for a new amap mapping)
> or the uobj contents at that offset (for a new uobj mapping).
I did not think I could do that, I will look into it! (Energy is low
again so, when I get to it ...)
> note that a vm_map_entry can reference both a uobj and an amap at the
> same time, so there are 4 possible cases for the each of previous and next
> entries (none, uobj, amap, uobj+amap), and two possible cases for the
> new entry (uobj, amap). then I guess there are two more factors of 2
> for whether the forward and/or backward merges succeed, so that gives
> at least 128 cases to test. I think there are some more cases hidden
> in there because there are multiple reasons why the merges might fail
> and those checks are in different places, so it would really be best
> to test all of the different possible paths through this function.
>
> I would be reluctant to change anything here without such a set of
> comprehensive tests, because even if we are sure that a change fixes
> one case, it would be very hard to be sure that it doesn't break
> some other case.
>
> -Chuck
Understood, it is quite possible that I am way out of my depth!
--
Kind regards,
Yorick Hardy
Home |
Main Index |
Thread Index |
Old Index