[PATCH 0/4] Some more lock_page work..

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



So this is all just preliminary, but I'd really like to have people
think more about the page fault handling of the page lock, and I have
a small experimental series of patches for people to look at and maybe
get the discussion started.

The three first patches are really just fairly trivial cleanups. They
also likely don't really matter, because the *bulk* of all faults -
particularly the ones that really shouldn't need any page locking
games - should be all about just "filemap_map_pages()". Which is that
optimistic "let's insert pages from the page cache as efficiently as
possible" case.

That's how all the normal private pages that don't actually get
modified (so executables, but also any load that uses mmap as a
zero-copy read) should generally get populated.

That code doesn't actually do "lock_page()" itself (because it all
runs under the RCU read lock), but it does to do a trylock, and give
up if the page was locked. Which is fine as long as you don't get any
contention, but any concurrent faults of the same page in different
address spaces will then just mess with other faulters and cause it to
fall out of the fast path.

And looking at that code, I'm pretty sure it doesn't actually *need*
the page lock. It wants the page lock for two reasons:

 - the truncation worries (which may or may not be relevant - xfs
wraps the map_pages with xfs_ilock)

 - compound page worries (sub-page mapcount updates and page splitting issues)

The compound page case I'm not sure about, but it's probably fine to
just lock the page in that case - once we end up actually just mapping
a hugepage, the number of page faults should be small enough that it
probably doesn't matter.

The truncation thing could be handled like xfs does, but honestly, I
think it can equally well be handled by just doing some operations in
the right order, and double-checking that we don't race with truncate.
IOW, first increasing the page mapcount, and then re-checking that the
page still isn't locked and the mapping is still valid, and reachable
in the xarray.

Because we can still just drop out of this loop and not populate the
page table if we see anything odd going on, but if *this* code doesn't
bother getting the page lock (and we make the COW code not do it
either), then in all the normal cases you will never have that "fall
out of the common case".

IOW, I think right now the thing that makes us fall back to the actual
page lock is this code itself: by doing the 'trylock", it will make
other users of the same page not able to do the fast-case. And I think
the trylock is unnecessary.

ANYWAY. The patch I have here isn't actually that "just do the checks
in the right order" patch. No, it's a dirty nasty "a private mapping
doesn't need to be so careful" patch. Ugly, brutish and nasty. Not the
right thing at all. But I'm doing it here simply because I wanted to
test it out and get people to look at this.

This code is "tested" in the sense that it builds for me, and I'm
actually running it right now. But I haven't actually stress-tested it
or tried to see if it gets rid of some page lock heavy cases.

Comments?

                         Linus




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux