From: Andrew Morton <akpm@linux-foundation.org>
To: Hugh Dickins <hughd@google.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com>,
Minchan Kim <minchan.kim@gmail.com>,
Rik van Riel <riel@redhat.com>, Shaohua Li <shaohua.li@intel.com>,
Eric Dumazet <eric.dumazet@gmail.com>,
Johannes Weiner <hannes@cmpxchg.org>,
Michel Lespinasse <walken@google.com>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
stable@vger.kernel.org
Subject: Re: [PATCH 1/2] SHM_UNLOCK: fix long unpreemptible section
Date: Wed, 18 Jan 2012 14:37:18 -0800 [thread overview]
Message-ID: <20120118143718.663b8cf5.akpm@linux-foundation.org> (raw)
In-Reply-To: <alpine.LSU.2.00.1201141615440.1338@eggly.anvils>
On Sat, 14 Jan 2012 16:18:43 -0800 (PST)
Hugh Dickins <hughd@google.com> wrote:
> scan_mapping_unevictable_pages() is used to make SysV SHM_LOCKed pages
> evictable again once the shared memory is unlocked. It does this with
> pagevec_lookup()s across the whole object (which might occupy most of
> memory), and takes 300ms to unlock 7GB here. A cond_resched() every
> PAGEVEC_SIZE pages would be good.
>
> However, KOSAKI-san points out that this is called under shmem.c's
> info->lock, and it's also under shm.c's shm_lock(), both spinlocks.
> There is no strong reason for that: we need to take these pages off
> the unevictable list soonish, but those locks are not required for it.
>
> So move the call to scan_mapping_unevictable_pages() from shmem.c's
> unlock handling up to shm.c's unlock handling. Remove the recently
> added barrier, not needed now we have spin_unlock() before the scan.
>
> Use get_file(), with subsequent fput(), to make sure we have a
> reference to mapping throughout scan_mapping_unevictable_pages():
> that's something that was previously guaranteed by the shm_lock().
>
> Remove shmctl's lru_add_drain_all(): we don't fault in pages at
> SHM_LOCK time, and we lazily discover them to be Unevictable later,
> so it serves no purpose for SHM_LOCK; and serves no purpose for
> SHM_UNLOCK, since pages still on pagevec are not marked Unevictable.
>
> The original code avoided redundant rescans by checking VM_LOCKED
> flag at its level: now avoid them by checking shp's SHM_LOCKED.
>
> The original code called scan_mapping_unevictable_pages() on a
> locked area at shm_destroy() time: perhaps we once had accounting
> cross-checks which required that, but not now, so skip the overhead
> and just let inode eviction deal with them.
>
> Put check_move_unevictable_page() and scan_mapping_unevictable_pages()
> under CONFIG_SHMEM (with stub for the TINY case when ramfs is used),
> more as comment than to save space; comment them used for SHM_UNLOCK.
>
> Signed-off-by: Hugh Dickins <hughd@google.com>
> Reviewed-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
> Cc: stable@vger.kernel.org [back to 2.6.32 but will need respins]
Is -stable backporting really warranted? AFAICT the only thing we're
fixing here is a long latency glitch during a rare operation on large
machines. Usually it will be on only one CPU, too.
"[PATCH 2/2] SHM_UNLOCK: fix Unevictable pages stranded after swap"
does loko like -stable material, so omitting 1/1 will probably screw
things up :(
> Resend in the hope that it can get into 3.3.
That we can do ;)
>
> ...
>
> --- mmotm.orig/mm/vmscan.c 2012-01-06 10:04:54.000000000 -0800
> +++ mmotm/mm/vmscan.c 2012-01-06 10:06:13.941943604 -0800
> @@ -3499,6 +3499,7 @@ int page_evictable(struct page *page, st
> return 1;
> }
>
> +#ifdef CONFIG_SHMEM
> /**
> * check_move_unevictable_page - check page for evictability and move to appropriate zone lru list
> * @page: page to check evictability and move to appropriate lru list
> @@ -3509,6 +3510,8 @@ int page_evictable(struct page *page, st
> *
> * Restrictions: zone->lru_lock must be held, page must be on LRU and must
> * have PageUnevictable set.
> + *
> + * This function is only used for SysV IPC SHM_UNLOCK.
> */
> static void check_move_unevictable_page(struct page *page, struct zone *zone)
> {
> @@ -3545,6 +3548,8 @@ retry:
> *
> * Scan all pages in mapping. Check unevictable pages for
> * evictability and move them to the appropriate zone lru list.
> + *
> + * This function is only used for SysV IPC SHM_UNLOCK.
> */
> void scan_mapping_unevictable_pages(struct address_space *mapping)
> {
> @@ -3590,9 +3595,14 @@ void scan_mapping_unevictable_pages(stru
> pagevec_release(&pvec);
>
> count_vm_events(UNEVICTABLE_PGSCANNED, pg_scanned);
> + cond_resched();
> }
> -
> }
> +#else
> +void scan_mapping_unevictable_pages(struct address_space *mapping)
> +{
> +}
> +#endif /* CONFIG_SHMEM */
Inlining the CONFIG_SHMEM=n stub would have been mroe efficient.
next prev parent reply other threads:[~2012-01-18 22:37 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-06 21:10 [PATCH 1/2] SHM_UNLOCK: fix long unpreemptible section Hugh Dickins
2012-01-06 21:12 ` [PATCH 2/2] SHM_UNLOCK: fix Unevictable pages stranded after swap Hugh Dickins
2012-01-09 20:42 ` KOSAKI Motohiro
2012-01-09 22:25 ` Hugh Dickins
2012-01-09 23:09 ` KOSAKI Motohiro
2012-01-09 23:56 ` Hugh Dickins
2012-01-15 0:20 ` Hugh Dickins
2012-01-07 8:28 ` [PATCH 1/2] SHM_UNLOCK: fix long unpreemptible section KOSAKI Motohiro
2012-01-15 0:18 ` Hugh Dickins
2012-01-18 22:37 ` Andrew Morton [this message]
2012-01-18 23:26 ` Hugh Dickins
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120118143718.663b8cf5.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=eric.dumazet@gmail.com \
--cc=hannes@cmpxchg.org \
--cc=hughd@google.com \
--cc=kosaki.motohiro@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=minchan.kim@gmail.com \
--cc=riel@redhat.com \
--cc=shaohua.li@intel.com \
--cc=stable@vger.kernel.org \
--cc=walken@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).