From cc39c6a9bbdebfcf1a7dee64d83bf302bc38d941 Mon Sep 17 00:00:00 2001 From: Shaohua Li Date: Thu, 15 Sep 2011 08:45:19 +0800 Subject: mm: account skipped entries to avoid looping in find_get_pages The found entries by find_get_pages() could be all swap entries. In this case we skip the entries, but make sure the skipped entries are accounted, so we don't keep looping. Using nr_found > nr_skip to simplify code as suggested by Eric. Reported-and-tested-by: Eric Dumazet Signed-off-by: Shaohua Li Signed-off-by: Linus Torvalds --- mm/filemap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'mm/filemap.c') diff --git a/mm/filemap.c b/mm/filemap.c index 645a080ba4df..7771871fa353 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -827,13 +827,14 @@ unsigned find_get_pages(struct address_space *mapping, pgoff_t start, { unsigned int i; unsigned int ret; - unsigned int nr_found; + unsigned int nr_found, nr_skip; rcu_read_lock(); restart: nr_found = radix_tree_gang_lookup_slot(&mapping->page_tree, (void ***)pages, NULL, start, nr_pages); ret = 0; + nr_skip = 0; for (i = 0; i < nr_found; i++) { struct page *page; repeat: @@ -856,6 +857,7 @@ repeat: * here as an exceptional entry: so skip over it - * we only reach this from invalidate_mapping_pages(). */ + nr_skip++; continue; } @@ -876,7 +878,7 @@ repeat: * If all entries were removed before we could secure them, * try again, because callers stop trying once 0 is returned. */ - if (unlikely(!ret && nr_found)) + if (unlikely(!ret && nr_found > nr_skip)) goto restart; rcu_read_unlock(); return ret; -- cgit v1.2.3 From 39be79c16f2b8eb07dd0d4e965cddfe39cc0534a Mon Sep 17 00:00:00 2001 From: Jeff Layton Date: Thu, 27 Oct 2011 23:53:08 +0200 Subject: vfs: iov_iter: have iov_iter_advance decrement nr_segs appropriately Currently, when you call iov_iter_advance, then the pointer to the iovec array can be incremented, but it does not decrement the nr_segs value in the iov_iter struct. The result is a iov_iter struct with a nr_segs value that goes beyond the end of the array. While I'm not aware of anything that's specifically broken by this, it seems odd and a bit dangerous not to decrement that value. If someone were to trust the nr_segs value to be correct, then they could end up walking off the end of the array. Changing this might also provide some micro-optimization when dealing with the last iovec in an array. Many of the other routines that deal with iov_iter have optimized codepaths when nr_segs == 1. Cc: Nick Piggin Signed-off-by: Jeff Layton Signed-off-by: Christoph Hellwig --- mm/filemap.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'mm/filemap.c') diff --git a/mm/filemap.c b/mm/filemap.c index 7771871fa353..5cf820a7c8ec 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2115,6 +2115,7 @@ void iov_iter_advance(struct iov_iter *i, size_t bytes) } else { const struct iovec *iov = i->iov; size_t base = i->iov_offset; + unsigned long nr_segs = i->nr_segs; /* * The !iov->iov_len check ensures we skip over unlikely @@ -2130,11 +2131,13 @@ void iov_iter_advance(struct iov_iter *i, size_t bytes) base += copy; if (iov->iov_len == base) { iov++; + nr_segs--; base = 0; } } i->iov = iov; i->iov_offset = base; + i->nr_segs = nr_segs; } } EXPORT_SYMBOL(iov_iter_advance); -- cgit v1.2.3 From b95f1b31b75588306e32b2afd32166cad48f670b Mon Sep 17 00:00:00 2001 From: Paul Gortmaker Date: Sun, 16 Oct 2011 02:01:52 -0400 Subject: mm: Map most files to use export.h instead of module.h The files changed within are only using the EXPORT_SYMBOL macro variants. They are not using core modular infrastructure and hence don't need module.h but only the export.h header. Signed-off-by: Paul Gortmaker --- mm/bootmem.c | 2 +- mm/bounce.c | 2 +- mm/dmapool.c | 2 +- mm/filemap.c | 2 +- mm/filemap_xip.c | 2 +- mm/highmem.c | 2 +- mm/kmemleak.c | 2 +- mm/maccess.c | 2 +- mm/memory.c | 2 +- mm/memory_hotplug.c | 2 +- mm/mempolicy.c | 2 +- mm/mempool.c | 2 +- mm/migrate.c | 2 +- mm/mlock.c | 2 +- mm/mm_init.c | 2 +- mm/mmap.c | 2 +- mm/mmu_context.c | 2 +- mm/mmu_notifier.c | 2 +- mm/nobootmem.c | 2 +- mm/nommu.c | 2 +- mm/oom_kill.c | 2 +- mm/page-writeback.c | 2 +- mm/readahead.c | 2 +- mm/rmap.c | 2 +- mm/shmem.c | 2 +- mm/slob.c | 2 +- mm/sparse.c | 2 +- mm/swap.c | 2 +- mm/truncate.c | 2 +- mm/util.c | 2 +- 30 files changed, 30 insertions(+), 30 deletions(-) (limited to 'mm/filemap.c') diff --git a/mm/bootmem.c b/mm/bootmem.c index 01d5a4b3dd0c..1a77012ecdb3 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/mm/bounce.c b/mm/bounce.c index 1481de68184b..8f27f07f909a 100644 --- a/mm/bounce.c +++ b/mm/bounce.c @@ -4,7 +4,7 @@ */ #include -#include +#include #include #include #include diff --git a/mm/dmapool.c b/mm/dmapool.c index fbb58e346888..096530690d8d 100644 --- a/mm/dmapool.c +++ b/mm/dmapool.c @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/mm/filemap.c b/mm/filemap.c index 5cf820a7c8ec..c0018f2d50e0 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -9,7 +9,7 @@ * most "normal" filesystems (but you don't /have/ to use this: * the NFS filesystem used to do this differently, for example) */ -#include +#include #include #include #include diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c index 93356cd12828..f91b2f687343 100644 --- a/mm/filemap_xip.c +++ b/mm/filemap_xip.c @@ -10,7 +10,7 @@ #include #include -#include +#include #include #include #include diff --git a/mm/highmem.c b/mm/highmem.c index 5ef672c07f75..0a13577def69 100644 --- a/mm/highmem.c +++ b/mm/highmem.c @@ -17,7 +17,7 @@ */ #include -#include +#include #include #include #include diff --git a/mm/kmemleak.c b/mm/kmemleak.c index d6880f542f95..f3b2a00fe9c1 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -69,7 +69,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/mm/maccess.c b/mm/maccess.c index 4cee182ab5f3..d53adf9ba84b 100644 --- a/mm/maccess.c +++ b/mm/maccess.c @@ -1,7 +1,7 @@ /* * Access kernel memory without faulting. */ -#include +#include #include #include diff --git a/mm/memory.c b/mm/memory.c index a56e3ba816b2..d67b0fa4ed3a 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -47,7 +47,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 6e7d8b21dbfa..2168489c0bc9 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 9c51f9f58cac..5afa4facac34 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -75,7 +75,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/mm/mempool.c b/mm/mempool.c index 1a3bc3d4d554..e73641b79bb5 100644 --- a/mm/mempool.c +++ b/mm/mempool.c @@ -10,7 +10,7 @@ #include #include -#include +#include #include #include #include diff --git a/mm/migrate.c b/mm/migrate.c index 14d0a6a632f6..459c41b19533 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -13,7 +13,7 @@ */ #include -#include +#include #include #include #include diff --git a/mm/mlock.c b/mm/mlock.c index 048260c4e02e..4e185e0f21c8 100644 --- a/mm/mlock.c +++ b/mm/mlock.c @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/mm/mm_init.c b/mm/mm_init.c index 4e0e26591dfa..1ffd97ae26d7 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include "internal.h" #ifdef CONFIG_DEBUG_MEMORY_INIT diff --git a/mm/mmap.c b/mm/mmap.c index a65efd4db3e1..f33c92427003 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/mm/mmu_context.c b/mm/mmu_context.c index 9e82e937000e..cf332bc0080a 100644 --- a/mm/mmu_context.c +++ b/mm/mmu_context.c @@ -5,7 +5,7 @@ #include #include -#include +#include #include #include diff --git a/mm/mmu_notifier.c b/mm/mmu_notifier.c index 8d032de4088e..9a611d3a1848 100644 --- a/mm/mmu_notifier.c +++ b/mm/mmu_notifier.c @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include #include diff --git a/mm/nobootmem.c b/mm/nobootmem.c index 6e93dc7f2586..7fa41b4a07bf 100644 --- a/mm/nobootmem.c +++ b/mm/nobootmem.c @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/mm/nommu.c b/mm/nommu.c index 4358032566e9..73419c55eda6 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -13,7 +13,7 @@ * Copyright (c) 2007-2010 Paul Mundt */ -#include +#include #include #include #include diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 626303b52f3c..fcb2fa5a995f 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 0e309cd1b5b9..44e60691adce 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -12,7 +12,7 @@ */ #include -#include +#include #include #include #include diff --git a/mm/readahead.c b/mm/readahead.c index 867f9dd82dcd..cbcbb02f3e28 100644 --- a/mm/readahead.c +++ b/mm/readahead.c @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/mm/rmap.c b/mm/rmap.c index 8005080fb9e3..d30fdbc17bfe 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -51,7 +51,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/mm/shmem.c b/mm/shmem.c index 2d3577295298..5dbc18b13b9b 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include static struct vfsmount *shm_mnt; diff --git a/mm/slob.c b/mm/slob.c index bf3918187165..8105be42cad1 100644 --- a/mm/slob.c +++ b/mm/slob.c @@ -63,7 +63,7 @@ #include /* struct reclaim_state */ #include #include -#include +#include #include #include #include diff --git a/mm/sparse.c b/mm/sparse.c index 858e1dff9b2a..61d7cde23111 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include #include "internal.h" diff --git a/mm/swap.c b/mm/swap.c index 3a442f18b0b3..70445ac3bad4 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include /* for try_to_release_page() */ #include diff --git a/mm/truncate.c b/mm/truncate.c index b40ac6d4e86e..632b15e29f74 100644 --- a/mm/truncate.c +++ b/mm/truncate.c @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/mm/util.c b/mm/util.c index 88ea1bd661c0..136ac4f322b8 100644 --- a/mm/util.c +++ b/mm/util.c @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include #include #include -- cgit v1.2.3