]> git.hungrycats.org Git - linux/log
linux
21 years agoLinux 2.6.7-rc1 v2.6.7-rc1
Linus Torvalds [Sat, 22 May 2004 15:46:07 +0000 (08:46 -0700)]
Linux 2.6.7-rc1

21 years ago[PATCH] bogus sigaltstack calls by rt_sigreturn
Roland McGrath [Sat, 22 May 2004 15:26:09 +0000 (08:26 -0700)]
[PATCH] bogus sigaltstack calls by rt_sigreturn

There is a longstanding bug in the rt_sigreturn system call.
This exists in both 2.4 and 2.6, and for almost every platform.

I am referring to this code in sys_rt_sigreturn (arch/i386/kernel/signal.c):

if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
goto badframe;
/* It is more difficult to avoid calling this function than to
   call it and ignore errors.  */
/*
 * THIS CANNOT WORK! "&st" is a kernel address, and "do_sigaltstack()"
 * takes a user address (and verifies that it is a user address). End
 * result: it does exactly _nothing_.
 */
do_sigaltstack(&st, NULL, regs->esp);

As the comment says, this is bogus.  On vanilla i386 kernels, this is just
harmlessly stupid--do_sigaltstack always does nothing and returns -EFAULT.

However this code actually bites users on kernels using Ingo Molnar's 4G/4G
address space layout changes.  There some kernel stack address might very
well be a lovely and readable user address as well.  When that happens, we
make a sigaltstack call with some random buffer, and then the fun begins.

To my knowledge, this has produced trouble in the real world only for 4G
i386 kernels (RHEL and Fedora "hugemem" kernels) on machines that actually
have several GB of physical memory (and in programs that are actually using
sigaltstack and handling a lot of signals).  However, the same clearly
broken code has been blindly copied to most other architecture ports, and
off hand I don't know the address space details of any other well enough to
know if real kernel stack addresses and real user addresses are in fact
disjoint as they are on i386 when not using the nonstandard 4GB address
space layout.

The obvious intent of the call being there in the first place is to permit
a signal handler to diddle its ucontext_t.uc_stack before returning, and
have this effect a sigaltstack call on the signal handler return.  This is
not only an optimization vs doing the extra system call, but makes it
possible to make a sigaltstack change when that handler itself was running
on the signal stack.  AFAICT this has never actually worked before, so
certainly noone depends on it.  But the code certainly suggests that
someone intended at one time for that to be the behavior.  Thus I am
inclined to fix it so it works in that way, though it has not done so before.
It would also be reasonable enough to simply rip out the bogus call and not
have this functionality.

From the current state of code in both 2.4 and 2.6, there is no fathoming
how this broken code came about.  It's actually much simpler to just make
it work!  I can only presume that at some point in the past the sigaltstack
implementation functions were different such that this made sense.  Of the
few ports I've looked at briefly, only the ppc/pc64 porters (go paulus!)
actually tried to understand what the i386 code was doing and implemented
it correctly rather than just carefully transliterating the bug.

The patch below fixes only the i386 and x86_64 versions.  The x86_64
patches I have not actually tested.  I think each and every arch (except
ppc and ppc64) need to make the corresponding fixes as well.  Note that
there is a function to fix for each native arch, and then one for each
emulation flavor.  The details differ minutely for getting the calls right
in each emulation flavor, but I think that most or all of the arch's with
biarch/emulation support have similar enough code that each emulation
flavor's fix will look very much like the arch/x86_64/ia32/ia32_signal.c
patch here.

21 years ago[PATCH] partial prefetch for vma_prio_tree_next
Andrew Morton [Sat, 22 May 2004 15:10:33 +0000 (08:10 -0700)]
[PATCH] partial prefetch for vma_prio_tree_next

From: Rajesh Venkatasubramanian <vrajesh@umich.edu>

This patch adds prefetches for walking a vm_set.list.  Adding prefetches
for prio tree traversals is tricky and may lead to cache trashing.  So this
patch just adds prefetches only when walking a vm_set.list.

I haven't done any benchmarks to show that this patch improves performance.
 However, this patch should help to improve performance when vm_set.lists
are long, e.g., libc.  Since we only prefetch vmas that are guaranteed to
be used in the near future, this patch should not result in cache trashing,
theoretically.

I didn't add any NULL checks before prefetching because prefetch.h clearly
says prefetch(0) is okay.

21 years ago[PATCH] rmap 40 better anon_vma sharing
Andrew Morton [Sat, 22 May 2004 15:10:23 +0000 (08:10 -0700)]
[PATCH] rmap 40 better anon_vma sharing

From: Hugh Dickins <hugh@veritas.com>

anon_vma rmap will always necessarily be more restrictive about vma merging
than before: according to the history of the vmas in an mm, they are liable to
be allocated different anon_vma heads, and from that point on be unmergeable.

Most of the time this doesn't matter at all; but in two cases it may matter.
One case is that mremap refuses (-EFAULT) to span more than a single vma: so
it is conceivable that some app has relied on vma merging prior to mremap in
the past, and will now fail with anon_vma.  Conceivable but unlikely, let's
cross that bridge if we come to it: and the right answer would be to extend
mremap, which should not be exporting the kernel's implementation detail of
vma to user interface.

The other case that matters is when a reasonable repetitive sequence of
syscalls and faults ends up with a large number of separate unmergeable vmas,
instead of the single merged vma it could have.

Andrea's mprotect-vma-merging patch fixed some such instances, but left other
plausible cases unmerged.  There is no perfect solution, and the harder you
try to allow vmas to be merged, the less efficient anon_vma becomes, in the
extreme there being one to span the whole address space, from which hangs
every private vma; but anonmm rmap is clearly superior to that extreme.

Andrea's principle was that neighbouring vmas which could be mprotected into
mergeable vmas should be allowed to share anon_vma: good insight.  His
implementation was to arrange this sharing when trying vma merge, but that
seems to be too early.  This patch sticks to the principle, but implements it
in anon_vma_prepare, when handling the first write fault on a private vma:
with better results.  The drawback is that this first write fault needs an
extra find_vma_prev (whereas prev was already to hand when implementing
anon_vma sharing at try-to-merge time).

21 years ago[PATCH] rmap 39 add anon_vma rmap
Andrew Morton [Sat, 22 May 2004 15:10:11 +0000 (08:10 -0700)]
[PATCH] rmap 39 add anon_vma rmap

From: Hugh Dickins <hugh@veritas.com>

Andrea Arcangeli's anon_vma object-based reverse mapping scheme for anonymous
pages.  Instead of tracking anonymous pages by pte_chains or by mm, this
tracks them by vma.  But because vmas are frequently split and merged
(particularly by mprotect), a page cannot point directly to its vma(s), but
instead to an anon_vma list of those vmas likely to contain the page - a list
on which vmas can easily be linked and unlinked as they come and go.  The vmas
on one list are all related, either by forking or by splitting.

This has three particular advantages over anonmm: that it can cope
effortlessly with mremap moves; and no longer needs page_table_lock to protect
an mm's vma tree, since try_to_unmap finds vmas via page -> anon_vma -> vma
instead of using find_vma; and should use less cpu for swapout since it can
locate its anonymous vmas more quickly.

It does have disadvantages too: a lot more change in mmap.c to deal with
anon_vmas, though small straightforward additions now that the vma merging has
been refactored there; more lowmem needed for each anon_vma and vma structure;
an additional restriction on the merging of vmas (cannot be merged if already
assigned different anon_vmas, since then their pages will be pointing to
different heads).

(There would be no need to enlarge the vma structure if anonymous pages
belonged only to anonymous vmas; but private file mappings accumulate
anonymous pages by copy-on-write, so need to be listed in both anon_vma and
prio_tree at the same time.  A different implementation could avoid that by
using anon_vmas only for purely anonymous vmas, and use the existing prio_tree
to locate cow pages - but that would involve a long search for each single
private copy, probably not a good idea.)

Where before the vm_pgoff of a purely anonymous (not file-backed) vma was
meaningless, now it represents the virtual start address at which that vma is
mapped - which the standard file pgoff manipulations treat linearly as vmas
are split and merged.  But if mremap moves the vma, then it generally carries
its original vm_pgoff to the new location, so pages shared with the old
location can still be found.  Magic.

Hugh has massaged it somewhat: building on the earlier rmap patches, this
patch is a fifth of the size of Andrea's original anon_vma patch.  Please note
that this posting will be his first sight of this patch, which he may or may
not approve.

21 years ago[PATCH] rmap 38 remove anonmm rmap
Andrew Morton [Sat, 22 May 2004 15:10:00 +0000 (08:10 -0700)]
[PATCH] rmap 38 remove anonmm rmap

From: Hugh Dickins <hugh@veritas.com>

Before moving on to anon_vma rmap, remove now what's peculiar to anonmm rmap:
the anonmm handling and the mremap move cows.  Temporarily reduce
page_referenced_anon and try_to_unmap_anon to stubs, so a kernel built with
this patch will not swap anonymous at all.

21 years ago[PATCH] rmap 37 page_add_anon_rmap vma
Andrew Morton [Sat, 22 May 2004 15:09:49 +0000 (08:09 -0700)]
[PATCH] rmap 37 page_add_anon_rmap vma

From: Hugh Dickins <hugh@veritas.com>

Silly final patch for anonmm rmap: change page_add_anon_rmap's mm arg to vma
arg like anon_vma rmap, to smooth the transition between them.

21 years ago[PATCH] rmap 36 mprotect use vma_merge
Andrew Morton [Sat, 22 May 2004 15:09:38 +0000 (08:09 -0700)]
[PATCH] rmap 36 mprotect use vma_merge

From: Hugh Dickins <hugh@veritas.com>

Earlier on, in 2.6.6, we took the vma merging code out of mremap.c and let it
rely on vma_merge instead (via copy_vma).  Now take the vma merging code out
of mprotect.c and let it rely on vma_merge too: so vma_merge becomes the sole
vma merging engine.  The fruit of this consolidation is that mprotect now
merges file-backed vmas naturally.  Make this change now because anon_vma will
complicate the vma merging rules, let's keep them all in one place.

vma_merge remains where the decisions are made, whether to merge with prev
and/or next; but now [addr,end) may be the latter part of prev, or first part
or whole of next, whereas before it was always a new area.

vma_adjust carries out vma_merge's decision, but when sliding the boundary
between vma and next, must temporarily remove next from the prio_tree too.
And it turned out (by oops) to have a surer idea of whether next needs to be
removed than vma_merge, so the fput and freeing moves into vma_adjust.

Too much decipherment of what's going on at the start of vma_adjust?  Yes, and
there's a delicate assumption that you may use vma_adjust in sliding a
boundary, or splitting in two, or growing a vma (mremap uses it in that way),
but not for simply shrinking a vma.  Which is so, and must be so (how could
pages mapped in the part to go, be zapped without first splitting?), but would
feel better with some protection.

__vma_unlink can then be moved from mm.h to mmap.c, and mm.h's more misleading
than helpful can_vma_merge is deleted.

21 years ago[PATCH] rmap 35 mmap.c cleanups
Andrew Morton [Sat, 22 May 2004 15:09:27 +0000 (08:09 -0700)]
[PATCH] rmap 35 mmap.c cleanups

From: Hugh Dickins <hugh@veritas.com>

Before some real vma_merge work in mmap.c in the next patch, a patch of
miscellaneous cleanups to cut down the noise:

- remove rb_parent arg from vma_merge: mm->mmap can do that case
- scatter pgoff_t around to ingratiate myself with the boss
- reorder is_mergeable_vma tests, vm_ops->close is least likely
- can_vma_merge_before take combined pgoff+pglen arg (from Andrea)
- rearrange do_mmap_pgoff's ever-confusing anonymous flags switch
- comment do_mmap_pgoff's mysterious (vm_flags & VM_SHARED) test
- fix ISO C90 warning on browse_rb if building with DEBUG_MM_RB
- stop that long MNT_NOEXEC line wrapping

Yes, buried in amidst these is indeed one pgoff replaced by "next->vm_pgoff -
pglen" (reverting a mod of mine which took pgoff supplied by user too
seriously in the anon case), and another pgoff replaced by 0 (reverting
anon_vma mod which crept in with NUMA API): neither of them really matters,
except perhaps in /proc/pid/maps.

21 years ago[PATCH] rmap 34 vm_flags page_table_lock
Andrew Morton [Sat, 22 May 2004 15:09:16 +0000 (08:09 -0700)]
[PATCH] rmap 34 vm_flags page_table_lock

From: Hugh Dickins <hugh@veritas.com>

First of a batch of seven rmap patches, based on 2.6.6-mm3.  Probably the
final batch: remaining issues outstanding can have isolated patches.  The
first half of the batch is good for anonmm or anon_vma, the second half of the
batch replaces my anonmm rmap by Andrea's anon_vma rmap.

Judge for yourselves which you prefer.  I do think I was wrong to call
anon_vma more complex than anonmm (its lists are easier to understand than my
refcounting), and I'm happy with its vma merging after the last patch.  It
just comes down to whether we can spare the extra 24 bytes (maximum, on
32-bit) per vma for its advantages in swapout and mremap.

rmap 34 vm_flags page_table_lock

Why do we guard vm_flags mods with page_table_lock when it's already
down_write guarded by mmap_sem?  There's probably a historical reason, but no
sign of any need for it now.  Andrea added a comment and removed the instance
from mprotect.c, Hugh plagiarized his comment and removed the instances from
madvise.c and mlock.c.  Huge leap in scalability...  not expected; but this
should stop people asking why those spinlocks.

21 years ago[PATCH] rmap 33 install_arg_page vma
Andrew Morton [Sat, 22 May 2004 15:09:05 +0000 (08:09 -0700)]
[PATCH] rmap 33 install_arg_page vma

From: Hugh Dickins <hugh@veritas.com>

anon_vma will need to pass vma to put_dirty_page, so change it and its
various callers (setup_arg_pages and its 32-on-64-bit arch variants); and
please, let's rename it to install_arg_page.

Earlier attempt to do this (rmap 26 __setup_arg_pages) tried to clean up
those callers instead, but failed to boot: so now apply rmap 27's memset
initialization of vmas to these callers too; which relieves them from
needing the recently included linux/mempolicy.h.

While there, moved install_arg_page's flush_dcache_page up before
page_table_lock - doesn't in fact matter at all, just saves one worry when
researching flush_dcache_page locking constraints.

21 years ago[PATCH] rmap 32 zap_pmd_range wrap
Andrew Morton [Sat, 22 May 2004 15:08:54 +0000 (08:08 -0700)]
[PATCH] rmap 32 zap_pmd_range wrap

From: Hugh Dickins <hugh@veritas.com>

From: Andrea Arcangeli <andrea@suse.de>

zap_pmd_range, alone of all those page_range loops, lacks the check for
whether address wrapped.  Hugh is in doubt as to whether this makes any
difference to any config on any arch, but eager to fix the odd one out.

21 years ago[PATCH] rmap 31 unlikely bad memory
Andrew Morton [Sat, 22 May 2004 15:08:43 +0000 (08:08 -0700)]
[PATCH] rmap 31 unlikely bad memory

From: Hugh Dickins <hugh@veritas.com>

From: Andrea Arcangeli <andrea@suse.de>

Sprinkle unlikelys throughout mm/memory.c, wherever we see a pgd_bad or a
pmd_bad; likely or unlikely on pte_same or !pte_same.  Put the jump in the
error return from do_no_page, not in the fast path.

21 years ago[PATCH] rmap 30 fix bad mapcount
Andrew Morton [Sat, 22 May 2004 15:08:33 +0000 (08:08 -0700)]
[PATCH] rmap 30 fix bad mapcount

From: Hugh Dickins <hugh@veritas.com>

From: Andrea Arcangeli <andrea@suse.de>

page_alloc.c's bad_page routine should reset a bad mapcount; and it's more
revealing to show the bad mapcount than just the boolean mapped.

21 years ago[PATCH] rmap 29 VM_RESERVED safety
Andrew Morton [Sat, 22 May 2004 15:08:22 +0000 (08:08 -0700)]
[PATCH] rmap 29 VM_RESERVED safety

From: Hugh Dickins <hugh@veritas.com>

From: Andrea Arcangeli <andrea@suse.de>

Set VM_RESERVED in videobuf_mmap_mapper, to warn do_no_page and swapout not to
worry about its pages.  Set VM_RESERVED in ia64_elf32_init, it too provides an
unusual nopage which might surprise higher level checks.  Future safety: they
don't actually pose a problem in this current tree.

21 years ago[PATCH] rmap 28 remove_vm_struct
Andrew Morton [Sat, 22 May 2004 15:08:11 +0000 (08:08 -0700)]
[PATCH] rmap 28 remove_vm_struct

From: Hugh Dickins <hugh@veritas.com>

The callers of remove_shared_vm_struct then proceed to do several more
identical things: gather them together in remove_vm_struct.

21 years ago[PATCH] rmap 27 memset 0 vma
Andrew Morton [Sat, 22 May 2004 15:08:00 +0000 (08:08 -0700)]
[PATCH] rmap 27 memset 0 vma

From: Hugh Dickins <hugh@veritas.com>

We're NULLifying more and more fields when initializing a vma
(mpol_set_vma_default does that too, if configured to do anything).  Now use
memset to avoid specifying fields, and save a little code too.

(Yes, I realize anon_vma will want to set vm_pgoff non-0, but I think that
will be better handled at the core, since anon vm_pgoff is negotiable up until
an anon_vma is actually assigned.)

21 years ago[PATCH] rmap 24 no rmap fastcalls
Andrew Morton [Sat, 22 May 2004 15:07:49 +0000 (08:07 -0700)]
[PATCH] rmap 24 no rmap fastcalls

From: Hugh Dickins <hugh@veritas.com>

I like CONFIG_REGPARM, even when it's forced on: because it's easy to force
off for debugging - easier than editing out scattered fastcalls.  Plus I've
never understood why we make function foo a fastcall, but function bar not.
Remove fastcall directives from rmap.  And fix comment about mremap_moved
race: it only applies to anon pages.

21 years ago[PATCH] rmap 23 empty flush_dcache_mmap_lock
Andrew Morton [Sat, 22 May 2004 15:07:38 +0000 (08:07 -0700)]
[PATCH] rmap 23 empty flush_dcache_mmap_lock

From: Hugh Dickins <hugh@veritas.com>

Most architectures (like i386) do nothing in flush_dcache_page, or don't scan
i_mmap in flush_dcache_page, so don't need flush_dcache_mmap_lock to do
anything: define it and flush_dcache_mmap_unlock away.  Noticed arm26, cris,
h8300 still defining flush_page_to_ram: delete it again.

21 years ago[PATCH] rmap 22 flush_dcache_mmap_lock
Andrew Morton [Sat, 22 May 2004 15:07:26 +0000 (08:07 -0700)]
[PATCH] rmap 22 flush_dcache_mmap_lock

From: Hugh Dickins <hugh@veritas.com>

arm and parisc __flush_dcache_page have been scanning the i_mmap(_shared) list
without locking or disabling preemption.  That may be even more unsafe now
it's a prio tree instead of a list.

It looks like we cannot use i_shared_lock for this protection: most uses of
flush_dcache_page are okay, and only one would need lock ordering fixed
(get_user_pages holds page_table_lock across flush_dcache_page); but there's a
few (e.g.  in net and ntfs) which look as if they're using it in I/O
completion - and it would be restrictive to disallow it there.

So, on arm and parisc only, define flush_dcache_mmap_lock(mapping) as
spin_lock_irq(&(mapping)->tree_lock); on i386 (and other arches left to the
next patch) define it away to nothing; and use where needed.

While updating locking hierarchy in filemap.c, remove two layers of the fossil
record from add_to_page_cache comment: no longer used for swap.

I believe all the #includes will work out, but have only built i386.  I can
see several things about this patch which might cause revulsion: the name
flush_dcache_mmap_lock?  the reuse of the page radix_tree's tree_lock for this
different purpose?  spin_lock_irqsave instead?  can't we somehow get
i_shared_lock to handle the problem?

21 years ago[PATCH] rmap 21 try_to_unmap_one mapcount
Andrew Morton [Sat, 22 May 2004 15:07:15 +0000 (08:07 -0700)]
[PATCH] rmap 21 try_to_unmap_one mapcount

From: Hugh Dickins <hugh@veritas.com>

Why should try_to_unmap_anon and try_to_unmap_file take a copy of
page->mapcount and pass it down for try_to_unmap_one to decrement?  why not
just check page->mapcount itself?  asks akpm.  Perhaps there used to be a good
reason, but not any more: remove the mapcount arg.

21 years ago[PATCH] rmap 20 i_mmap_shared into i_mmap
Andrew Morton [Sat, 22 May 2004 15:07:04 +0000 (08:07 -0700)]
[PATCH] rmap 20 i_mmap_shared into i_mmap

From: Hugh Dickins <hugh@veritas.com>

Why should struct address_space have separate i_mmap and i_mmap_shared
prio_trees (separating !VM_SHARED and VM_SHARED vmas)?  No good reason, the
same processing is usually needed on both.  Merge i_mmap_shared into i_mmap,
but keep i_mmap_writable count of VM_SHARED vmas (those capable of dirtying
the underlying file) for the mapping_writably_mapped test.

The VM_MAYSHARE test in the arm and parisc loops is not necessarily what they
will want to use in the end: it's provided as a harmless example of what might
be appropriate, but maintainers are likely to revise it later (that parisc
loop is currently being changed in the parisc tree anyway).

On the way, remove the now out-of-date comments on vm_area_struct size.

21 years ago[PATCH] rmap.c comment/style fixups
Andrew Morton [Sat, 22 May 2004 15:06:53 +0000 (08:06 -0700)]
[PATCH] rmap.c comment/style fixups

From: Christoph Hellwig <hch@lst.de>

21 years ago[PATCH] vm_area_struct size comment
Andrew Morton [Sat, 22 May 2004 15:06:42 +0000 (08:06 -0700)]
[PATCH] vm_area_struct size comment

From: Hugh Dickins <hugh@veritas.com>

Missed comment on the size of vm_area_struct: it is no longer 64 bytes on
ia32.

21 years ago[PATCH] rmap 19: arch prio_tree
Andrew Morton [Sat, 22 May 2004 15:06:32 +0000 (08:06 -0700)]
[PATCH] rmap 19: arch prio_tree

From: Hugh Dickins <hugh@veritas.com>

The previous patches of this prio_tree batch have been to generic only.  Now
the arm and parisc __flush_dcache_page are converted to using
vma_prio_tree_next, and benefit from its selection of relevant vmas.  They're
still accessing the tree without i_shared_lock or any other, that's not
forgotten but still under investigation.  Include pagemap.h for the definition
of PAGE_CACHE_SHIFT.  s390 and x86_64 no longer initialize vma's shared field
(whose type has changed), done later.

21 years ago[PATCH] unmap_mapping_range: add comment
Andrew Morton [Sat, 22 May 2004 15:06:21 +0000 (08:06 -0700)]
[PATCH] unmap_mapping_range: add comment

21 years ago[PATCH] rmap 18: i_mmap_nonlinear
Andrew Morton [Sat, 22 May 2004 15:06:10 +0000 (08:06 -0700)]
[PATCH] rmap 18: i_mmap_nonlinear

From: Hugh Dickins <hugh@veritas.com>

The prio_tree is of no use to nonlinear vmas: currently we're having to search
the tree in the most inefficient way to find all its nonlinears.  At the very
least we need an indication of the unlikely case when there are some
nonlinears; but really, we'd do best to take them out of the prio_tree
altogether, into a list of their own - i_mmap_nonlinear.

21 years ago[PATCH] rmap 17: real prio_tree
Andrew Morton [Sat, 22 May 2004 15:05:59 +0000 (08:05 -0700)]
[PATCH] rmap 17: real prio_tree

From: Hugh Dickins <hugh@veritas.com>

Rajesh Venkatasubramanian's implementation of a radix priority search tree of
vmas, to handle object-based reverse mapping corner cases well.

Amongst the objections to object-based rmap were test cases by akpm and by
mingo, in which large numbers of vmas mapping disjoint or overlapping parts of
a file showed strikingly poor performance of the i_mmap lists.  Perhaps those
tests are irrelevant in the real world?  We cannot be too sure: the prio_tree
is well-suited to solving precisely that problem, so unless it turns out to
bring too much overhead, let's include it.

Why is this prio_tree.c placed in mm rather than lib?  See GET_INDEX: this
implementation is geared throughout to use with vmas, though the first half of
the file appears more general than the second half.

Each node of the prio_tree is itself (contained within) a vma: might save
memory by allocating distinct nodes from which to hang vmas, but wouldn't save
much, and would complicate the usage with preallocations.  Off each node of
the prio_tree itself hangs a list of like vmas, if any.

The connection from node to list is a little awkward, but probably the best
compromise: it would be more straightforward to list likes directly from the
tree node, but that would use more memory per vma, for the list_head and to
identify that head.  Instead, node's shared.vm_set.head points to next vma
(whose shared.vm_set.head points back to node vma), and that next contains the
list_head from which the rest hang - reusing fields already used in the
prio_tree node itself.

Currently lacks prefetch: Rajesh hopes to add some soon.

21 years ago[PATCH] rmap 16: pretend prio_tree
Andrew Morton [Sat, 22 May 2004 15:05:47 +0000 (08:05 -0700)]
[PATCH] rmap 16: pretend prio_tree

From: Hugh Dickins <hugh@veritas.com>

Pave the way for prio_tree by switching over to its interfaces, but actually
still implement them with the same old lists as before.

Most of the vma_prio_tree interfaces are straightforward.  The interesting one
is vma_prio_tree_next, used to search the tree for all vmas which overlap the
given range: unlike the list_for_each_entry it replaces, it does not find
every vma, just those that match.

But this does leave handling of nonlinear vmas in a very unsatisfactory state:
for now we have to search again over the maximum range to find all the
nonlinear vmas which might contain a page, which of course takes away the
point of the tree.  Fixed in later patch of this batch.

There is no need to initialize vma linkage all over, just do it before
inserting the vma in list or tree.  /proc/pid/statm had an odd test for its
shared count: simplified to an equivalent test on vm_file.

21 years ago[PATCH] rmap 15: vma_adjust
Andrew Morton [Sat, 22 May 2004 15:05:35 +0000 (08:05 -0700)]
[PATCH] rmap 15: vma_adjust

From: Hugh Dickins <hugh@veritas.com>

If file-based vmas are to be kept in a tree, according to the file offsets
they map, then adjusting the vma's start pgoff or its end involves
repositioning in the tree, while holding i_shared_lock (and page_table_lock).
We used to avoid that if possible, e.g.  when just moving end; but if we're
heading that way, let's now tidy up vma_merge and split_vma, and do all the
locking and adjustment in a new helper vma_adjust.  And please, let's call the
next vma in vma_merge "next" rather than "prev".

Since these patches are diffed over 2.6.6-rc2-mm2, they include the NUMA
mpolicy mods which you'll have to remove to go earlier in the series, sorry
for that nuisance.  I have intentionally changed the one vma_mpol_equal to
mpol_equal, to make the merge cases more alike.

21 years ago[PATCH] numa api: fix end of memory handling in mbind
Andrew Morton [Sat, 22 May 2004 15:05:24 +0000 (08:05 -0700)]
[PATCH] numa api: fix end of memory handling in mbind

From: Andi Kleen <ak@suse.de>

This fixes a user triggerable crash in mbind() in NUMA API.  It would oops
when running into the end of memory.  Actually not really oops, because a
oops with the mm sem hold for writing always deadlocks.

21 years ago[PATCH] numa api: Add policy support to anonymous memory
Andrew Morton [Sat, 22 May 2004 15:05:14 +0000 (08:05 -0700)]
[PATCH] numa api: Add policy support to anonymous  memory

From: Andi Kleen <ak@suse.de>

Change to core VM to use alloc_page_vma() instead of alloc_page().

Change the swap readahead to follow the policy of the VMA.

21 years ago[PATCH] numa api: Add statistics
Andrew Morton [Sat, 22 May 2004 15:05:02 +0000 (08:05 -0700)]
[PATCH] numa api: Add statistics

From: Andi Kleen <ak@suse.de>

Add NUMA hit/miss statistics to page allocation and display them in sysfs.

This is not 100% required for NUMA API, but without this it is very

The overhead is quite low because all counters are per CPU and only happens
when CONFIG_NUMA is defined.

21 years ago[PATCH] small numa api fixups
Andrew Morton [Sat, 22 May 2004 15:04:51 +0000 (08:04 -0700)]
[PATCH] small numa api fixups

From: Christoph Hellwig <hch@lst.de>

- don't include mempolicy.h in sched.h and mm.h when a forward delcaration
  is enough.  Andi argued against that in the past, but I'd really hate to add
  another header to two of the includes used in basically every driver when we
  can include it in the six files actually needing it instead (that number is
  for my ppc32 system, maybe other arches need more include in their
  directories)

- make numa api fields in tast_struct conditional on CONFIG_NUMA, this gives
  us a few ugly ifdefs but avoids wasting memory on non-NUMA systems.

21 years ago[PATCH] numa api: Add shared memory support
Andrew Morton [Sat, 22 May 2004 15:04:40 +0000 (08:04 -0700)]
[PATCH] numa api: Add shared memory support

From: Andi Kleen <ak@suse.de>

Add support to tmpfs and hugetlbfs to support NUMA API.  Shared memory is a
bit of a special case for NUMA policy.  Normally policy is associated to VMAs
or to processes, but for a shared memory segment you really want to share the
policy.  The core NUMA API has code for that, this patch adds the necessary
changes to tmpfs and hugetlbfs.

First it changes the custom swapping code in tmpfs to follow the policy set
via VMAs.

It is also useful to have a "backing store" of policy that saves the policy
even when nobody has the shared memory segment mapped.  This allows command
line tools to pre configure policy, which is then later used by programs.

Note that hugetlbfs needs more changes - it is also required to switch it to
lazy allocation, otherwise the prefault prevents mbind() from working.

21 years ago[PATCH] numa api: Add VMA hooks for policy
Andrew Morton [Sat, 22 May 2004 15:04:29 +0000 (08:04 -0700)]
[PATCH] numa api: Add VMA hooks for policy

From: Andi Kleen <ak@suse.de>

NUMA API adds a policy to each VMA.  During VMA creattion, merging and
splitting these policies must be handled properly.  This patch adds the calls
to this.

It is a nop when CONFIG_NUMA is not defined.

21 years ago[PATCH] Re-add NUMA API statistics
Andrew Morton [Sat, 22 May 2004 15:04:17 +0000 (08:04 -0700)]
[PATCH] Re-add NUMA API statistics

From: Andi Kleen <ak@suse.de>

Patch readds the sysfs output of the NUMA API statistics.  All my test
scripts need this and it is very useful to check if the policy actually
works.

This got lost when the huge page numa api changes got dropped.

I decided to not resend the huge pages NUMA API changes for now.  Instead I
will wait for this area to settle when demand paged large pages is merged.

21 years ago[PATCH] numa api core: use SLAB_PANIC
Andrew Morton [Sat, 22 May 2004 15:04:06 +0000 (08:04 -0700)]
[PATCH] numa api core: use SLAB_PANIC

21 years ago[PATCH] mpol in copy_vma
Andrew Morton [Sat, 22 May 2004 15:03:56 +0000 (08:03 -0700)]
[PATCH] mpol in copy_vma

From: Hugh Dickins <hugh@veritas.com>

I think Andi missed the copy_vma I recently added for mremap, and it'll
need something like below....  (Doesn't look like it'll optimize away when
it's not needed - rather bloaty.)

21 years ago[PATCH] numa api: Core NUMA API code
Andrew Morton [Sat, 22 May 2004 15:03:39 +0000 (08:03 -0700)]
[PATCH] numa api: Core NUMA API code

From: Andi Kleen <ak@suse.de>

The following patches add support for configurable NUMA memory policy
for user processes. It is based on the proposal from last kernel summit
with feedback from various people.

This NUMA API doesn't not attempt to implement page migration or anything
else complicated: all it does is to police the allocation when a page
is first allocation or when a page is reallocated after swapping. Currently
only support for shared memory and anonymous memory is there; policy for
file based mappings is not implemented yet (although they get implicitely
policied by the default process policy)

It adds three new system calls: mbind to change the policy of a VMA,
set_mempolicy to change the policy of a process, get_mempolicy to retrieve
memory policy. User tools (numactl, libnuma, test programs, manpages) can be
found in  ftp://ftp.suse.com/pub/people/ak/numa/numactl-0.6.tar.gz

For details on the system calls see the manpages
http://www.firstfloor.org/~andi/mbind.html
http://www.firstfloor.org/~andi/set_mempolicy.html
http://www.firstfloor.org/~andi/get_mempolicy.html
Most user programs should actually not use the system calls directly,
but use the higher level functions in libnuma
(http://www.firstfloor.org/~andi/numa.html) or the command line tools
(http://www.firstfloor.org/~andi/numactl.html

The system calls allow user programs and administors to set various NUMA memory
policies for putting memory on specific nodes. Here is a short description
of the policies copied from the kernel patch:

 * NUMA policy allows the user to give hints in which node(s) memory should
 * be allocated.
 *
 * Support four policies per VMA and per process:
 *
 * The VMA policy has priority over the process policy for a page fault.
 *
 * interleave     Allocate memory interleaved over a set of nodes,
 *                with normal fallback if it fails.
 *                For VMA based allocations this interleaves based on the
 *                offset into the backing object or offset into the mapping
 *                for anonymous memory. For process policy an process counter
 *                is used.
 * bind           Only allocate memory on a specific set of nodes,
 *                no fallback.
 * preferred      Try a specific node first before normal fallback.
 *                As a special case node -1 here means do the allocation
 *                on the local CPU. This is normally identical to default,
 *                but useful to set in a VMA when you have a non default
 *                process policy.
 * default        Allocate on the local node first, or when on a VMA
 *                use the process policy. This is what Linux always did
 *                in a NUMA aware kernel and still does by, ahem, default.
 *
 * The process policy is applied for most non interrupt memory allocations
 * in that process' context. Interrupts ignore the policies and always
 * try to allocate on the local CPU. The VMA policy is only applied for memory
 * allocations for a VMA in the VM.
 *
 * Currently there are a few corner cases in swapping where the policy
 * is not applied, but the majority should be handled. When process policy
 * is used it is not remembered over swap outs/swap ins.
 *
 * Only the highest zone in the zone hierarchy gets policied. Allocations
 * requesting a lower zone just use default policy. This implies that
 * on systems with highmem kernel lowmem allocation don't get policied.
 * Same with GFP_DMA allocations.
 *
 * For shmfs/tmpfs/hugetlbfs shared memory the policy is shared between
 * all users and remembered even when nobody has memory mapped.

This patch:

This is the core NUMA API code. This includes NUMA policy aware
wrappers for get_free_pages and alloc_page_vma(). On non NUMA kernels
these are defined away.

The system calls mbind (see http://www.firstfloor.org/~andi/mbind.html),
get_mempolicy (http://www.firstfloor.org/~andi/get_mempolicy.html) and
set_mempolicy (http://www.firstfloor.org/~andi/set_mempolicy.html) are
implemented here.

Adds a vm_policy field to the VMA and to the process. The process
also has field for interleaving. VMA interleaving uses the offset
into the VMA, but that's not possible for process allocations.

From: Andi Kleen <ak@muc.de>

  > Andi, how come policy_vma() calls ->set_policy under i_shared_sem?

  I think this can be actually dropped now.  In an earlier version I did
  walk the vma shared list to change the policies of other mappings to the
  same shared memory region.  This turned out too complicated with all the
  corner cases, so I eventually gave in and added ->get_policy to the fast
  path.  Also there is still the mmap_sem which prevents races in the same MM.

  Patch to remove it attached.  Also adds documentation and removes the
  bogus __alloc_page_vma() prototype noticed by hch.

From: Andi Kleen <ak@suse.de>

  A few incremental fixes for NUMA API.

  - Fix a few comments

  - Add a compat_ function for get_mem_policy I considered changing the
    ABI to avoid this, but that would have made the API too ugly.  I put it
    directly into the file because a mm/compat.c didn't seem worth it just for
    this.

  - Fix the algorithm for VMA interleave.

From: Matthew Dobson <colpatch@us.ibm.com>

  1) Move the extern of alloc_pages_current() into #ifdef CONFIG_NUMA.
    The only references to the function are in NUMA code in mempolicy.c

  2) Remove the definitions of __alloc_page_vma().  They aren't used.

  3) Move forward declaration of struct vm_area_struct to top of file.

21 years ago[PATCH] numa api: Add IA64 support
Andrew Morton [Sat, 22 May 2004 15:03:26 +0000 (08:03 -0700)]
[PATCH] numa api: Add IA64 support

From: Andi Kleen <ak@suse.de>

Add NUMA API system calls on IA64 and one bug fix required for it.

21 years ago[PATCH] numa api: Add i386 support
Andrew Morton [Sat, 22 May 2004 15:03:15 +0000 (08:03 -0700)]
[PATCH] numa api: Add i386 support

From: Andi Kleen <ak@suse.de>

Add NUMA API system calls for i386

21 years ago[PATCH] numa api: x86_64 support
Andrew Morton [Sat, 22 May 2004 15:03:04 +0000 (08:03 -0700)]
[PATCH] numa api: x86_64 support

From: Andi Kleen <ak@suse.de>

Add NUMA API system calls on x86-64

This includes a bugfix to prevent miscompilation on gcc 3.2 of bitmap.h

21 years ago[PATCH] rmap 14: i_shared_lock fixes
Andrew Morton [Sat, 22 May 2004 15:02:50 +0000 (08:02 -0700)]
[PATCH] rmap 14: i_shared_lock fixes

From: Hugh Dickins <hugh@veritas.com>

First of batch of six patches which introduce Rajesh Venkatasubramanian's
implementation of a radix priority search tree of vmas, to handle object-based
reverse mapping corner cases well.

rmap 14 i_shared_lock fixes

Start the sequence with a couple of outstanding i_shared_lock fixes.

Since i_shared_sem became i_shared_lock, we've had to shift and then
temporarily remove mremap move's protection of concurrent truncation - if
mremap moves ptes while unmap_mapping_range_list is making its way through the
vmas, there's a danger we'd move a pte from an area yet to be cleaned back
into an area already cleared.

Now site the i_shared_lock with the page_table_lock in move_one_page.  Replace
page_table_present by get_one_pte_map, so we know when it's necessary to
allocate a new page table: in which case have to drop i_shared_lock, trylock
and perhaps reorder locks on the way back.  Yet another fix: must check for
NULL dst before pte_unmap(dst).

And over in rmap.c, try_to_unmap_file's cond_resched amidst its lengthy
nonlinear swapping was now causing might_sleep warnings: moved to a rather
unsatisfactory and less frequent cond_resched_lock on i_shared_lock when we
reach the end of the list; and one before starting on the nonlinears too: the
"cursor" may become out-of-date if we do schedule, but I doubt it's worth
bothering about.

21 years ago[PATCH] Convert i_shared_sem back to a spinlock
Andrew Morton [Sat, 22 May 2004 15:02:36 +0000 (08:02 -0700)]
[PATCH] Convert i_shared_sem back to a spinlock

Having a semaphore in there causes modest performance regressions on heavily
mmap-intensive workloads on some hardware.  Specifically, up to 30% in SDET on
NUMAQ and big PPC64.

So switch it back to being a spinlock.  This does mean that unmap_vmas() needs
to be told whether or not it is allowed to schedule away; that's simple to do
via the zap_details structure.

This change means that there will be high scheuling latencies when someone
truncates a large file which is currently mmapped, but nobody does that
anyway.  The scheduling points in unmap_vmas() are mainly for munmap() and
exit(), and they still will work OK for that.

From: Hugh Dickins <hugh@veritas.com>

  Sorry, my premature optimizations (trying to pass down NULL zap_details
  except when needed) have caught you out doubly: unmap_mapping_range_list was
  NULLing the details even though atomic was set; and if it hadn't, then
  zap_pte_range would have missed free_swap_and_cache and pte_clear when pte
  not present.  Moved the optimization into zap_pte_range itself.  Plus
  massive documentation update.

From: Hugh Dickins <hugh@veritas.com>

  Here's a second patch to add to the first: mremap's cows can't come home
  without releasing the i_mmap_lock, better move the whole "Subtle point"
  locking from move_vma into move_page_tables.  And it's possible for the file
  that was behind an anonymous page to be truncated while we drop that lock,
  don't want to abort mremap because of VM_FAULT_SIGBUS.

  (Eek, should we be checking do_swap_page of a vm_file area against the
  truncate_count sequence?  Technically yes, but I doubt we need bother.)

- We cannot hold i_mmap_lock across move_one_page() because
  move_one_page() needs to perform __GFP_WAIT allocations of pagetable pages.

- Move the cond_resched() out so we test it once per page rather than only
  when move_one_page() returns -EAGAIN.

21 years ago[PATCH] rmap 13 include/asm deletions
Andrew Morton [Sat, 22 May 2004 15:02:25 +0000 (08:02 -0700)]
[PATCH] rmap 13 include/asm deletions

From: Hugh Dickins <hugh@veritas.com>

Delete include/asm*/rmap.h
Delete pte_addr_t typedef from include/asm*/pgtable.h
Delete KM_PTE2 from subset of include/asm*/kmap_types.h
Beware when 4G/4G returns to -mm: i386 may need KM_FILLER for 8K stack.

21 years ago[PATCH] rmap 12 pgtable remove rmap
Andrew Morton [Sat, 22 May 2004 15:02:09 +0000 (08:02 -0700)]
[PATCH] rmap 12 pgtable remove rmap

From: Hugh Dickins <hugh@veritas.com>

Remove the support for pte_chain rmap from page table initialization, just
continue to maintain nr_page_table_pages (but only for user page tables -
it also counted vmalloc page tables before, little need, and I'm unsure if
per-cpu stats are safe early enough on all arches).  mm/memory.c is the
only core file affected.

But ppc and ppc64 have found the old rmap page table initialization useful
to support their ptep_test_and_clear_young: so transfer rmap's
initialization to them (even on kernel page tables?  well, okay).

21 years ago[PATCH] rmap 11 mremap moves
Andrew Morton [Sat, 22 May 2004 15:01:58 +0000 (08:01 -0700)]
[PATCH] rmap 11 mremap moves

From: Hugh Dickins <hugh@veritas.com>

A weakness of the anonmm scheme is its difficulty in tracking pages shared
between two or more mms (one being an ancestor of the other), when mremap has
been used to move a range of pages in one of those mms.  mremap move is not
very common anyway, and it's more often used on a page range exclusive to the
mm; but uncommon though it may be, we must not allow unlocked pages to become
unswappable.

This patch follows Linus' suggestion, simply to take a private copy of the
page in such a case: early C-O-W.  My previous implementation was daft with
respect to pages currently on swap: it insisted on swapping them in to copy
them.  No need for that: just take the copy when a page is brought in from
swap, and its intended address is found to clash with what rmap has already
noted.

If do_swap_page has to make this copy in the mremap moved case (simply a call
to do_wp_page), might as well do so also in the case when it's a write access
but the page not exclusive, it's always seemed a little odd that swapin needed
a second fault for that.  A bug even: get_user_pages force imagines that a
single call to handle_mm_fault must break C-O-W.  Another bugfix: swapoff's
unuse_process didn't check is_vm_hugetlb_page.

Andrea's anon_vma has no such problem with mremap moved pages, handling them
with elegant use of vm_pgoff - though at some cost to vma merging.  How
important is it to handle them efficiently?  For now there's a msg
printk(KERN_WARNING "%s: mremap moved %d cows\n", current->comm, cows);

21 years ago[PATCH] rmap 10 add anonmm rmap
Andrew Morton [Sat, 22 May 2004 15:01:46 +0000 (08:01 -0700)]
[PATCH] rmap 10 add anonmm rmap

From: Hugh Dickins <hugh@veritas.com>

Hugh's anonmm object-based reverse mapping scheme for anonymous pages.  We
have not yet decided whether to adopt this scheme, or Andrea's more advanced
anon_vma scheme.  anonmm is easier for me to merge quickly, to replace the
pte_chain rmap taken out in the previous patch; a patch to install Andrea's
anon_vma will follow in due course.

Why build up and tear down chains of pte pointers for anonymous pages, when a
page can only appear at one particular address, in a restricted group of mms
that might share it?  (Except: see next patch on mremap.)

Introduce struct anonmm per mm to track anonymous pages, all forks from one
exec sharing the same bundle of linked anonmms.  Anonymous pages originate in
one mm, but may be forked into another mm of the bundle later on.  Callouts
from fork.c to allocate, dup and exit the anonmm structure private to rmap.c.

From: Hugh Dickins <hugh@veritas.com>

  Two concurrent exits (of the last two mms sharing the anonhd).  First
  exit_rmap brings anonhd->count down to 2, gets preempted (at the
  spin_unlock) by second, which brings anonhd->count down to 1, sees it's 1
  and frees the anonhd (without making any change to anonhd->count itself),
  cpu goes on to do something new which reallocates the old anonhd as a new
  struct anonmm (probably not a head, in which case count will start at 1),
  first resumes after the spin_unlock and sees anonhd->count 1, frees "anonhd"
  again, it's used for something else, a later exit_rmap list_del finds list
  corrupt.

21 years ago[PATCH] rmap 9 remove pte_chains
Andrew Morton [Sat, 22 May 2004 15:01:30 +0000 (08:01 -0700)]
[PATCH] rmap 9 remove pte_chains

From: Hugh Dickins <hugh@veritas.com>

Lots of deletions: the next patch will put in the new anon rmap, which
should look clearer if first we remove all of the old pte-pointer-based
rmap from the core in this patch - which therefore leaves anonymous rmap
totally disabled, anon pages locked in memory until process frees them.

Leave arch files (and page table rmap) untouched for now, clean them up in
a later batch.  A few constructive changes amidst all the deletions:

Choose names (e.g.  page_add_anon_rmap) and args (e.g.  no more pteps) now
so we need not revisit so many files in the next patch.  Inline function
page_dup_rmap for fork's copy_page_range, simply bumps mapcount under lock.
 cond_resched_lock in copy_page_range.  Struct page rearranged: no pte
union, just mapcount moved next to atomic count, so two ints can occupy one
long on 64-bit; i386 struct page now 32 bytes even with PAE.  Never pass
PageReserved to page_remove_rmap, only do_wp_page did so.

From: Hugh Dickins <hugh@veritas.com>

  Move page_add_anon_rmap's BUG_ON(page_mapping(page)) inside the rmap_lock
  (well, might as well just check mapping if !mapcount then): if this page is
  being mapped or unmapped on another cpu at the same time, page_mapping's
  PageAnon(page) and page->mapping are volatile.

  But page_mapping(page) is used more widely: I've a nasty feeling that
  clear_page_anon, page_add_anon_rmap and/or page_mapping need barriers added
  (also in 2.6.6 itself),

21 years ago[PATCH] slab: consolidate panic code
Andrew Morton [Sat, 22 May 2004 15:01:17 +0000 (08:01 -0700)]
[PATCH] slab: consolidate panic code

Many places do:

if (kmem_cache_create(...) == NULL)
panic(...);

We can consolidate all that by passing another flag to kmem_cache_create()
which says "panic if it doesn't work".

21 years ago[PATCH] rmap 8 unmap nonlinear
Andrew Morton [Sat, 22 May 2004 15:01:04 +0000 (08:01 -0700)]
[PATCH] rmap 8 unmap nonlinear

From: Hugh Dickins <hugh@veritas.com>

The previous patch let the ptes of file pages be located via page
->mapping->i_mmap and i_mmap_shared lists of vmas; which works well unless
the vma is VM_NONLINEAR - one in which sys_remap_file_pages has been used
to place pages in unexpected places, to avoid an explosion of distinct
unmergable vmas.  Such pages were effectively locked in memory.

page_referenced_file is already skipping nonlinear vmas, they'd just waste
its time, and age unfairly any pages in their proper positions.  Now extend
try_to_unmap_file, to persuade it to swap from nonlinears.

Ignoring the page requested, try to unmap cluster of 32 neighbouring ptes
(in worst case all empty slots) in a nonlinear vma, then move on to the
next vma; stopping when we've unmapped at least as many maps as the
requested page had (vague guide of how hard to try), or have reached the
end.  With large sparse nonlinear vmas, this could take a long time:
inserted a cond_resched while no locks are held, unusual at this level but
I think okay, shrink_list does so.

Use vm_private_data a little like the old mm->swap_address, as a cursor
recording how far we got, so we don't attack the same ptes next time around
(earlier tried inserting an empty marker vma in the list, but that got
messy).  How well this will work on real- life nonlinear vmas remains to be
seen, but should work better than locking them all in memory, or swapping
everything out all the time.

Existing users of vm_private_data have either VM_RESERVED or VM_DONTEXPAND
set, both of which are in the VM_SPECIAL category where we never try to
merge vmas: so removed the vm_private_data test from is_mergeable_vma, so
we can still merge VM_NONLINEARs.  Of course, we could instead add another
field to vm_area_struct.

21 years ago[PATCH] rmap 7 object-based rmap
Andrew Morton [Sat, 22 May 2004 15:00:54 +0000 (08:00 -0700)]
[PATCH] rmap 7 object-based rmap

From: Hugh Dickins <hugh@veritas.com>

Dave McCracken's object-based reverse mapping scheme for file pages: why
build up and tear down chains of pte pointers for file pages, when
page->mapping has i_mmap and i_mmap_shared lists of all the vmas which
might contain that page, and it appears at one deterministic position
within the vma (unless vma is nonlinear - see next patch)?

Has some drawbacks: more work to locate the ptes from page_referenced and
try_to_unmap, especially if the i_mmap lists contain a lot of vmas covering
different ranges; has to down_trylock the i_shared_sem, and hope that
doesn't fail too often.  But attractive in that it uses less lowmem, and
shifts the rmap burden away from the hot paths, to swapout.

Hybrid scheme for the moment: carry on with pte_chains for anonymous pages,
that's unchanged; but file pages keep mapcount in the pte union of struct
page, where anonymous pages keep chain pointer or direct pte address: so
page_mapped(page) works on both.

Hugh massaged it a little: distinct page_add_file_rmap entry point; list
searches check rss so as not to waste time on mms fully swapped out; check
mapcount to terminate once all ptes have been found; and a WARN_ON if
page_referenced should have but couldn't find all the ptes.

21 years ago[PATCH] __set_page_dirty_nobuffers race fix
Andrew Morton [Sat, 22 May 2004 15:00:42 +0000 (08:00 -0700)]
[PATCH] __set_page_dirty_nobuffers race fix

Running __mark_inode_dirty() against a swapcache page is illegal and will
oops.

I see a race in set_page_dirty() wherein it can be called with a PageSwapCache
page, but if the page is removed from swapcache after
__set_page_dirty_nobuffers() drops tree_lock(), we have the situation where
PageSwapCache() is false, but local variable `mapping' points at swapcache.

Handle that by checking for non-null mapping->host.  We don't care about the
page state at this point - we're only interested in the inode.

There is a converse case: what if a page is added to swapcache as we are
running set_page_dirty() against it?

In this case the page gets its PG_dirty flag set but it is not tagged as dirty
in the swapper_space radix tree.  The swap writeout code will handle this OK
and test_clear_page_dirty()'s call to
radix_tree_tag_clear(PAGECACHE_TAG_DIRTY) will silently have no effect.  The
only downside is that future radix-tree-based writearound won't notice that
such pages are dirty and swap IO scheduling will be a teensy bit worse.

The patch also fixes the (silly) testing of local variable `mapping' to see if
the page was truncated.  We should test page_mapping() for that.

21 years ago[PATCH] Make sync_page use swapper_space again
Andrew Morton [Sat, 22 May 2004 15:00:31 +0000 (08:00 -0700)]
[PATCH] Make sync_page use swapper_space again

Revert recent changes to sync_page().  Now that page_mapping() returns
&swapper_space for swapcache pages we don't need to test for PageSwapCache in
sync_page().

21 years ago[PATCH] vmscan: revert may_enter_fs changes
Andrew Morton [Sat, 22 May 2004 15:00:19 +0000 (08:00 -0700)]
[PATCH] vmscan: revert may_enter_fs changes

Fix up the "may we call writepage" logic for the swapcache changes.

21 years ago[PATCH] revert recent swapcache handling changes
Andrew Morton [Sat, 22 May 2004 15:00:08 +0000 (08:00 -0700)]
[PATCH] revert recent swapcache handling changes

Go back to the 2.6.5 concepts, with rmap additions.  In particular:

- Implement Andrea's flavour of page_mapping().  This function opaquely does
  the right thing for pagecache pages, anon pages and for swapcache pages.

  The critical thing here is that page_mapping() returns &swapper_space for
  swapcache pages without actually requiring the storage at page->mapping.
  This frees page->mapping for the anonmm/anonvma metadata.

- Andrea and Hugh placed the pagecache index of swapcache pages into
  page->private rather than page->index.  So add new page_index() function
  which hides this.

- Make swapper_space.set_page_dirty() again point at
  __set_page_dirty_buffers().  If we don't do that, a bare set_page_dirty()
  will fall through to __set_page_dirty_buffers(), which is silly.

  This way, __set_page_dirty_buffers() can continue to use page->mapping.
  It should never go near anon or swapcache pages.

- Give swapper_space a ->set_page_dirty address_space_operation method, so
  that set_page_dirty() will not fall through to __set_page_dirty_buffers()
  for swapcache pages.  That function is not set up to handle them.

The main effect of these changes is that swapcache pages are treated more
similarly to pagecache pages.  And we are again tagging swapcache pages as
dirty in their radix tree, which is a requirement if we later wish to
implement swapcache writearound based on tagged radix-tree walks.

21 years ago[PATCH] __add_to_swap_cache and add_to_pagecache() simplification
Andrew Morton [Sat, 22 May 2004 14:59:57 +0000 (07:59 -0700)]
[PATCH] __add_to_swap_cache and add_to_pagecache() simplification

Simplify the logic in there a bit.

21 years ago[PATCH] Make swapper_space tree_lock irq-safe
Andrew Morton [Sat, 22 May 2004 14:59:45 +0000 (07:59 -0700)]
[PATCH] Make swapper_space tree_lock irq-safe

->tree_lock is supposed to be IRQ-safe.  Hugh worked out that with his
changes, we never actually take it from interrupt context, so spin_lock() is
sufficient.

Apart from kinda freaking me out, the analysis which led to this decision
becomes untrue with later patches.  So make it irq-safe.

21 years agoMerge bk://kernel.bkbits.net/davem/net-2.6
Linus Torvalds [Sat, 22 May 2004 07:31:41 +0000 (00:31 -0700)]
Merge bk://kernel.bkbits.net/davem/net-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux

21 years agoAvoid type warning in comparison by making it explicit.
Linus Torvalds [Sat, 22 May 2004 07:27:16 +0000 (00:27 -0700)]
Avoid type warning in comparison by making it explicit.

(The difference between two pointers is a "size_t", while
MAX_LEN and the result here are "int"s).

21 years ago[BRIDGE]: Forwarding table sanity checks.
Stephen Hemminger [Sat, 22 May 2004 06:47:44 +0000 (23:47 -0700)]
[BRIDGE]: Forwarding table sanity checks.

Forwarding table paranoia:
* Solve some potential problems if a device changes address and one or
  more device has the same address.
* Warn if new device added to a bridge matches a entry that has shown
  up on the network.
* Also don't put static entries in the timer list, they don't time
  out so shouldn't be there.

21 years ago[BRIDGE]: Compat hooks for new-ioctl interface.
Stephen Hemminger [Sat, 22 May 2004 06:47:01 +0000 (23:47 -0700)]
[BRIDGE]: Compat hooks for new-ioctl interface.

Replacement 64 bit compatibility code for the new ioctl's.  The new
ioctl's all pass through clean, but for the old style ioctl's it uses
the mis-feature of the earlier bridge-utils that they check the API version.

So if an old 32bit version of brctl is run on a 64bit platform it will
report
bridge utilities not compatible with kernel version

Tested on Itanium 1; but should solve issue for sparc, ppc, and x86_64

21 years ago[BRIDGE]: New ioctl interface for 32/64 compatability.
Stephen Hemminger [Sat, 22 May 2004 06:46:09 +0000 (23:46 -0700)]
[BRIDGE]: New ioctl interface for 32/64 compatability.

Add four new ioctl's for the operations that can't be done through sysfs.
The existing bridge ioctl's are multiplexed, and most go through SIOCDEVPRIVATE
so they won't work in a mixed 32/64bit environment.

The new release of bridge-utils will use these if possible, and fall
back to the old interface.

21 years ago[BRIDGE]: Add sysfs support.
Stephen Hemminger [Sat, 22 May 2004 06:44:51 +0000 (23:44 -0700)]
[BRIDGE]: Add sysfs support.

21 years ago[BRIDGE]: Expose timer_residue function for use by sysfs.
Stephen Hemminger [Sat, 22 May 2004 06:39:53 +0000 (23:39 -0700)]
[BRIDGE]: Expose timer_residue function for use by sysfs.

Move the local function timer_residue to br_timer_value so it can
be used by both ioctl and sysfs code.

21 years ago[BRIDGE]: Read forwarding table chunk at a time.
Stephen Hemminger [Sat, 22 May 2004 06:39:18 +0000 (23:39 -0700)]
[BRIDGE]: Read forwarding table chunk at a time.

Change how the read of forwarding table works.  Instead of copying
entries to user one at a time, use an intermediate kernel buffer and
do up to a page at a chunk.

This gets rid of some awkward code dealing with entries getting deleted
during the copy.  And allows same function to be used by later sysfs
hook.

21 years ago[BRIDGE]: Fix deadlock on device removal.
Stephen Hemminger [Sat, 22 May 2004 06:38:39 +0000 (23:38 -0700)]
[BRIDGE]: Fix deadlock on device removal.

Fix a deadlock where deleting a device call br_del_if with lock held.
br_del_if doesn't want to be called under lock anymore.

21 years ago[BRIDGE]: Ioctl cleanup and consolidation.
Stephen Hemminger [Sat, 22 May 2004 06:38:07 +0000 (23:38 -0700)]
[BRIDGE]: Ioctl cleanup and consolidation.

Merge the ioctl stub calls that just end up calling the sub-function
to do the actual ioctl.  Move br_get_XXX_ifindices into the ioctl file
as well where they can be static.

21 years ago[BRIDGE]: Relax locking on add/delete.
Stephen Hemminger [Sat, 22 May 2004 06:37:36 +0000 (23:37 -0700)]
[BRIDGE]: Relax locking on add/delete.

Relax the locking on add/delete interfaces to a bridge.  Since these operations
are already called with RTNL semaphore, only need to hold the bridge lock while
doing operations related to STP and processing path.  This is necessary for later
sysfs support where those operations might sleep.

21 years ago[BRIDGE]: Cleanup of bridge allocation.
Stephen Hemminger [Sat, 22 May 2004 06:36:59 +0000 (23:36 -0700)]
[BRIDGE]: Cleanup of bridge allocation.

Minor cleanup (lead in to later sysfs support).
Change new_nb to new_bridge_dev and return the net_device rather than
bridge because that is what the caller wants anyway.

21 years ago[BRIDGE]: Handle delete of multiple devices with same address.
Stephen Hemminger [Sat, 22 May 2004 06:36:24 +0000 (23:36 -0700)]
[BRIDGE]: Handle delete of multiple devices with same address.

This fixes the issue discovered when removing bluetooth devices from a bridge.
Need to add special case code when forwarding table is being cleaned up to
handle the case where several devices share the same hardware address.

21 years ago[IPSEC]: Lock policy in policy timer.
Herbert Xu [Sat, 22 May 2004 06:35:20 +0000 (23:35 -0700)]
[IPSEC]: Lock policy in policy timer.

21 years ago[PATCH] IDE PCI: don't initialize fields of static chipset tables to zero
Bartlomiej Zolnierkiewicz [Sat, 22 May 2004 06:01:55 +0000 (23:01 -0700)]
[PATCH] IDE PCI: don't initialize fields of static chipset tables to zero

Also remove unused EOL define from ide.h.

This trivial patch makes grepping a lot easier.

21 years ago[PATCH] two fixups for my ARM/ARM26 IDE changes
Bartlomiej Zolnierkiewicz [Sat, 22 May 2004 06:01:44 +0000 (23:01 -0700)]
[PATCH] two fixups for my ARM/ARM26 IDE changes

- initializing needs to be set to 1 before calling ide_arm_init()

- ide_default_io_ctl() should be 0 on arm26

21 years ago[PATCH] remove dead drivers/ide/ppc/swarm.c
Bartlomiej Zolnierkiewicz [Sat, 22 May 2004 06:01:33 +0000 (23:01 -0700)]
[PATCH] remove dead drivers/ide/ppc/swarm.c

This driver was partially merged in 2.5.32 and never compiled in 2.5/2.6.
It was fixed in linux-mips CVS but has been broken again about 5 months ago.
Just remove it for now (it is in wrong directory anyway).

21 years ago[PATCH] more comx removal
Adrian Bunk [Sat, 22 May 2004 03:52:32 +0000 (20:52 -0700)]
[PATCH] more comx removal

The patch below removes the MAINTAINERS entry for the removed comx
driver.

Additionally, the following comx header files could be removed:
  drivers/net/wan/mixcom.h
  drivers/net/wan/hscx.h
  drivers/net/wan/munich32x.h
  drivers/net/wan/falc-lh.h

I've double-checked that none of them are used by any other driver.

21 years ago[PATCH] JFFS2_FS_NAND=y compile error
Adrian Bunk [Sat, 22 May 2004 03:50:24 +0000 (20:50 -0700)]
[PATCH] JFFS2_FS_NAND=y compile error

The case of CONFIG_JFFS2_FS_NAND=y got broken recently.

The bug is obvious, and the fix is trivial:

21 years ago[PATCH] autofs4: MAINTAINERS update
Andrew Morton [Sat, 22 May 2004 03:39:44 +0000 (20:39 -0700)]
[PATCH] autofs4: MAINTAINERS update

From: Ian Kent <raven@themaw.net>

This changes the autofs4 maintainer to me.  Recommended by Joe Perches and
OKed with Jeremy.

21 years ago[PATCH] autofs4: printk cleanup
Andrew Morton [Sat, 22 May 2004 03:39:34 +0000 (20:39 -0700)]
[PATCH] autofs4: printk cleanup

From: Ian Kent <raven@themaw.net>

This is a patch contributed by Joe Perches to automatically include the
function name in the dprintk statements.

21 years ago[PATCH] x86 cpuid cache info update
Andrew Morton [Sat, 22 May 2004 03:39:23 +0000 (20:39 -0700)]
[PATCH] x86 cpuid cache info update

From: Francois Romieu <romieu@fr.zoreil.com>

Missing cache size format for Intel P4E (p.26 of doc.  241618-025, "Intel
Processor Identification and the CPUID Instruction").

21 years ago[PATCH] i4l: Eicon driver: fix __devexit in prototype
Andrew Morton [Sat, 22 May 2004 03:39:12 +0000 (20:39 -0700)]
[PATCH] i4l: Eicon driver: fix __devexit in prototype

From: Armin Schindler <armin@melware.de>

Fixes a compiler warning about unused Eicon ISDN driver function if hotplug is
disabled.

21 years ago[PATCH] swsusp: fix devfs breakage introduced in 2.6.6
Andrew Morton [Sat, 22 May 2004 03:39:01 +0000 (20:39 -0700)]
[PATCH] swsusp: fix devfs breakage introduced in 2.6.6

From: Pavel Machek <pavel@ucw.cz>

This fixes bad interaction between devfs and swsusp.

Check whether the swap device is the specified resume device, irrespective of
whether they are specified by identical names.

(Thus, device inode aliasing is allowed.  You can say /dev/hda4 instead of
/dev/ide/host0/bus0/target0/lun0/part4 [if using devfs] and they'll be
considered the same device.  This is *necessary* for devfs, since the resume
code can only recognize the form /dev/hda4, but the suspend code would like
the long name [as shown in 'cat /proc/mounts'].)

[Thanks to devfs hero whose name I forgot.]

21 years ago[PATCH] swsusp: kill unneccessary debugging
Andrew Morton [Sat, 22 May 2004 03:38:51 +0000 (20:38 -0700)]
[PATCH] swsusp: kill unneccessary debugging

From: Pavel Machek <pavel@ucw.cz>

This is no longer neccessary.  We have enough pauses elsewhere, and it works
well enough that this is not needed.

21 years ago[PATCH] blk: clear completion stack pointer on return
Andrew Morton [Sat, 22 May 2004 03:38:40 +0000 (20:38 -0700)]
[PATCH] blk: clear completion stack pointer on return

From: Jens Axboe <axboe@suse.de>

It doesn't always look safe to let ->waiting remain set when returning from
functions that set it to point to stack area, since various locations check
for != NULL to see if it's valid.  So clear it on return from
ide_do_drive_cmd() and blk_execute_rq().

21 years ago[PATCH] Sanitise handling of unneeded syscall stubs
Andrew Morton [Sat, 22 May 2004 03:38:29 +0000 (20:38 -0700)]
[PATCH] Sanitise handling of unneeded syscall stubs

From: David Mosberger <davidm@napali.hpl.hp.com>

Below is a patch that tries to sanitize the dropping of unneeded system-call
stubs in generic code.  In some instances, it would be possible to move the
optional system-call stubs into a library routine which would avoid the need
for #ifdefs, but in many cases, doing so would require making several
functions global (and possibly exporting additional data-structures in
header-files).  Furthermore, it would inhibit (automatic) inlining in the
cases in the cases where the stubs are needed.  For these reasons, the patch
keeps the #ifdef-approach.

This has been tested on ia64 and there were no objections from the
arch-maintainers (and one positive response).  The patch should be safe but
arch-maintainers may want to take a second look to see if some __ARCH_WANT_foo
macros should be removed for their architecture (I'm quite sure that's the
case, but I wanted to play it safe and only preserved the status-quo in that
regard).

21 years ago[PATCH] trivial: remove duplicated #includes
Andrew Morton [Sat, 22 May 2004 03:38:16 +0000 (20:38 -0700)]
[PATCH] trivial: remove duplicated #includes

From: Rusty Russell <rusty@rustcorp.com.au>

From:  a.othieno@bluewin.ch (Arthur Othieno)
From:  Vinay K Nallamothu <vinay-rc@naturesoft.net>

Remove various duplicated #includes

From:  Vinay K Nallamothu <vinay-rc@naturesoft.net>

        Use mod_timer in drivers_block_floppy98.c

From:  carbonated beverage <ramune@net-ronin.org>

        doc update for bk usage
        bk://... appears to be dead, use http://... instead.

21 years ago[PATCH] trivial: use page_to_phys in dma_map_page()
Andrew Morton [Sat, 22 May 2004 03:38:03 +0000 (20:38 -0700)]
[PATCH] trivial: use page_to_phys in dma_map_page()

From: Trivial Patch Monkey <trivial@rustcorp.com.au>

From:  Adam Lackorzynski <adam@os.inf.tu-dresden.de>

dma_map_page() can be simplified by using page_to_phys instead of writing the
calculation explicitly.

21 years ago[PATCH] fbdev: mode switching fix.
Andrew Morton [Sat, 22 May 2004 03:37:52 +0000 (20:37 -0700)]
[PATCH] fbdev: mode switching fix.

From: James Simmons <jsimmons@infradead.org>

This fixes the bugs that where in mode switch via stty.

The problem was we couldn't set the mode just by using the x and y
resolution.  We use modedb to fill in the rest.  There also was a bug that
allowed you to change the console resolution for drivers with fixed
resolutions.  This would mess up your display.  Now that is fixed.

21 years ago[PATCH] fix sendfile on 64bit architectures
Andrew Morton [Sat, 22 May 2004 03:37:41 +0000 (20:37 -0700)]
[PATCH] fix sendfile on 64bit architectures

From: Andi Kleen <ak@suse.de>

sys_sendfile has a hardcoded 2GB limit.  64bit architectures should
probably always use sys_sendfile64() in their native system tables, because
for them sizeof(off_t) == sizeof(loff_t).  This patch does this.  It seemed
easier to just change the 64bit entry tables instead of fixing up all the
emulation layers to do 2GB checks on their own.

I changed all 64bit architectures except for parisc64, which seemed to
already have a sendfile64.

21 years ago[PATCH] console autodetection for pmac
Andrew Morton [Sat, 22 May 2004 03:37:30 +0000 (20:37 -0700)]
[PATCH] console autodetection for pmac

From: Olaf Hering <olh@suse.de>

This one allows console autodetection for powermacs.

21 years ago[PATCH] gss_api build fix
Andrew Morton [Sat, 22 May 2004 03:37:19 +0000 (20:37 -0700)]
[PATCH] gss_api build fix

From: "J. Bruce Fields" <bfields@fieldses.org>

Older gcc's don't like that dimensionless array.  Remove it in favour of a
pointer to the data.

21 years ago[PATCH] vga16fb warning fix
Andrew Morton [Sat, 22 May 2004 03:37:08 +0000 (20:37 -0700)]
[PATCH] vga16fb warning fix

drivers/video/vga16fb.c:1350: warning: assignment makes pointer from integer without a cast

21 years ago[PATCH] Fix !CONFIG_SYSFS build
Andrew Morton [Sat, 22 May 2004 03:36:55 +0000 (20:36 -0700)]
[PATCH] Fix !CONFIG_SYSFS build

From: Maneesh Soni <maneesh@in.ibm.com>

The sysfs_rename_dir() interface was changed recently but I forgot to
change the definition if CONFIG_SYSFS is not defined.

21 years agoMerge bk://gkernel.bkbits.net/libata-2.6
Linus Torvalds [Fri, 21 May 2004 09:42:20 +0000 (02:42 -0700)]
Merge bk://gkernel.bkbits.net/libata-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux

21 years agoMerge redhat.com:/spare/repo/linux-2.6
Jeff Garzik [Fri, 21 May 2004 13:03:30 +0000 (09:03 -0400)]
Merge redhat.com:/spare/repo/linux-2.6
into redhat.com:/spare/repo/libata-2.6

21 years agoMerge bk://kernel.bkbits.net/jgarzik/i810-audio-2.6
Linus Torvalds [Fri, 21 May 2004 09:41:29 +0000 (02:41 -0700)]
Merge bk://kernel.bkbits.net/jgarzik/i810-audio-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux

21 years agoMerge redhat.com:/spare/repo/linux-2.6
Jeff Garzik [Fri, 21 May 2004 12:54:36 +0000 (08:54 -0400)]
Merge redhat.com:/spare/repo/linux-2.6
into redhat.com:/spare/repo/i810-audio-2.6

21 years agoMerge bk://bk.arm.linux.org.uk/linux-2.6-rmk
Linus Torvalds [Fri, 21 May 2004 08:43:19 +0000 (01:43 -0700)]
Merge bk://bk.arm.linux.org.uk/linux-2.6-rmk
into ppc970.osdl.org:/home/torvalds/v2.6/linux

21 years ago[ARM PATCH] 1887/1: Update OMAP low level debug functions again
Tony Lindgren [Fri, 21 May 2004 23:59:48 +0000 (00:59 +0100)]
[ARM PATCH] 1887/1: Update OMAP low level debug functions again

Patch from Tony Lindgren

This patch makes the low level debug functions work when support is
compiled in for multiple OMAPs. The patch also removes now unnecessary
include, incorrect comment, and SERIAL_REG_SHIFT ifdefs.