From: mel@skynet.ie (Mel Gorman)
To: Christoph Lameter <clameter@sgi.com>
Cc: akpm@linux-foundatin.org, linux-kernel@vger.kernel.org,
linux-mm@kvack.org
Subject: Re: [patch 12/23] SLUB: Trigger defragmentation from memory reclaim
Date: Thu, 8 Nov 2007 15:12:49 +0000 [thread overview]
Message-ID: <20071108151249.GE2591@skynet.ie> (raw)
In-Reply-To: <20071107011229.423714790@sgi.com>
On (06/11/07 17:11), Christoph Lameter didst pronounce:
> This patch triggers slab defragmentation from memory reclaim.
> The logical point for this is after slab shrinking was performed in
> vmscan.c. At that point the fragmentation ratio of a slab was increased
> because objects were freed via the LRUs. So we call kmem_cache_defrag from
> there.
>
> slab_shrink() from vmscan.c is called in some contexts to do
> global shrinking of slabs and in others to do shrinking for
> a particular zone. Pass the zone to slab_shrink, so that slab_shrink
> can call kmem_cache_defrag() and restrict the defragmentation to
> the node that is under memory pressure.
>
> Reviewed-by: Rik van Riel <riel@redhat.com>
> Signed-off-by: Christoph Lameter <clameter@sgi.com>
> ---
> fs/drop_caches.c | 2 +-
> include/linux/mm.h | 2 +-
> include/linux/slab.h | 1 +
> mm/vmscan.c | 26 +++++++++++++++++++-------
> 4 files changed, 22 insertions(+), 9 deletions(-)
>
> Index: linux-2.6/fs/drop_caches.c
> ===================================================================
> --- linux-2.6.orig/fs/drop_caches.c 2007-08-29 19:30:53.000000000 -0700
> +++ linux-2.6/fs/drop_caches.c 2007-11-06 12:53:40.000000000 -0800
> @@ -50,7 +50,7 @@ void drop_slab(void)
> int nr_objects;
>
> do {
> - nr_objects = shrink_slab(1000, GFP_KERNEL, 1000);
> + nr_objects = shrink_slab(1000, GFP_KERNEL, 1000, NULL);
> } while (nr_objects > 10);
> }
>
> Index: linux-2.6/include/linux/mm.h
> ===================================================================
> --- linux-2.6.orig/include/linux/mm.h 2007-11-06 12:33:55.000000000 -0800
> +++ linux-2.6/include/linux/mm.h 2007-11-06 12:54:11.000000000 -0800
> @@ -1118,7 +1118,7 @@ int in_gate_area_no_task(unsigned long a
> int drop_caches_sysctl_handler(struct ctl_table *, int, struct file *,
> void __user *, size_t *, loff_t *);
> unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask,
> - unsigned long lru_pages);
> + unsigned long lru_pages, struct zone *z);
> void drop_pagecache(void);
> void drop_slab(void);
>
> Index: linux-2.6/include/linux/slab.h
> ===================================================================
> --- linux-2.6.orig/include/linux/slab.h 2007-11-06 12:37:51.000000000 -0800
> +++ linux-2.6/include/linux/slab.h 2007-11-06 12:53:40.000000000 -0800
> @@ -63,6 +63,7 @@ void kmem_cache_free(struct kmem_cache *
> unsigned int kmem_cache_size(struct kmem_cache *);
> const char *kmem_cache_name(struct kmem_cache *);
> int kmem_ptr_validate(struct kmem_cache *cachep, const void *ptr);
> +int kmem_cache_defrag(int node);
>
> /*
> * Please use this macro to create slab caches. Simply specify the
> Index: linux-2.6/mm/vmscan.c
> ===================================================================
> --- linux-2.6.orig/mm/vmscan.c 2007-10-25 18:28:41.000000000 -0700
> +++ linux-2.6/mm/vmscan.c 2007-11-06 12:55:25.000000000 -0800
> @@ -150,10 +150,18 @@ EXPORT_SYMBOL(unregister_shrinker);
> * are eligible for the caller's allocation attempt. It is used for balancing
> * slab reclaim versus page reclaim.
> *
> + * zone is the zone for which we are shrinking the slabs. If the intent
> + * is to do a global shrink then zone may be NULL. Specification of a
> + * zone is currently only used to limit slab defragmentation to a NUMA node.
> + * The performace of shrink_slab would be better (in particular under NUMA)
> + * if it could be targeted as a whole to the zone that is under memory
> + * pressure but the VFS infrastructure does not allow that at the present
> + * time.
> + *
> * Returns the number of slab objects which we shrunk.
> */
> unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask,
> - unsigned long lru_pages)
> + unsigned long lru_pages, struct zone *zone)
> {
> struct shrinker *shrinker;
> unsigned long ret = 0;
> @@ -210,6 +218,8 @@ unsigned long shrink_slab(unsigned long
> shrinker->nr += total_scan;
> }
> up_read(&shrinker_rwsem);
> + if (gfp_mask & __GFP_FS)
> + kmem_cache_defrag(zone ? zone_to_nid(zone) : -1);
Does this make an assumption that only filesystem-related slabs may be
targetted for reclaim? What if there is a slab that can free its objects
without ever caring about a filesystem?
> return ret;
> }
>
> @@ -1241,7 +1251,7 @@ unsigned long try_to_free_pages(struct z
> if (!priority)
> disable_swap_token();
> nr_reclaimed += shrink_zones(priority, zones, &sc);
> - shrink_slab(sc.nr_scanned, gfp_mask, lru_pages);
> + shrink_slab(sc.nr_scanned, gfp_mask, lru_pages, NULL);
> if (reclaim_state) {
> nr_reclaimed += reclaim_state->reclaimed_slab;
> reclaim_state->reclaimed_slab = 0;
> @@ -1419,7 +1429,7 @@ loop_again:
> nr_reclaimed += shrink_zone(priority, zone, &sc);
> reclaim_state->reclaimed_slab = 0;
> nr_slab = shrink_slab(sc.nr_scanned, GFP_KERNEL,
> - lru_pages);
> + lru_pages, zone);
> nr_reclaimed += reclaim_state->reclaimed_slab;
> total_scanned += sc.nr_scanned;
> if (zone_is_all_unreclaimable(zone))
> @@ -1658,7 +1668,7 @@ unsigned long shrink_all_memory(unsigned
> /* If slab caches are huge, it's better to hit them first */
> while (nr_slab >= lru_pages) {
> reclaim_state.reclaimed_slab = 0;
> - shrink_slab(nr_pages, sc.gfp_mask, lru_pages);
> + shrink_slab(nr_pages, sc.gfp_mask, lru_pages, NULL);
> if (!reclaim_state.reclaimed_slab)
> break;
>
> @@ -1696,7 +1706,7 @@ unsigned long shrink_all_memory(unsigned
>
> reclaim_state.reclaimed_slab = 0;
> shrink_slab(sc.nr_scanned, sc.gfp_mask,
> - count_lru_pages());
> + count_lru_pages(), NULL);
> ret += reclaim_state.reclaimed_slab;
> if (ret >= nr_pages)
> goto out;
> @@ -1713,7 +1723,8 @@ unsigned long shrink_all_memory(unsigned
> if (!ret) {
> do {
> reclaim_state.reclaimed_slab = 0;
> - shrink_slab(nr_pages, sc.gfp_mask, count_lru_pages());
> + shrink_slab(nr_pages, sc.gfp_mask,
> + count_lru_pages(), NULL);
> ret += reclaim_state.reclaimed_slab;
> } while (ret < nr_pages && reclaim_state.reclaimed_slab > 0);
> }
> @@ -1875,7 +1886,8 @@ static int __zone_reclaim(struct zone *z
> * Note that shrink_slab will free memory on all zones and may
> * take a long time.
> */
> - while (shrink_slab(sc.nr_scanned, gfp_mask, order) &&
> + while (shrink_slab(sc.nr_scanned, gfp_mask, order,
> + zone) &&
> zone_page_state(zone, NR_SLAB_RECLAIMABLE) >
> slab_reclaimable - nr_pages)
> ;
>
> --
>
--
--
Mel Gorman
Part-time Phd Student Linux Technology Center
University of Limerick IBM Dublin Software Lab
next prev parent reply other threads:[~2007-11-08 15:13 UTC|newest]
Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-07 1:11 [patch 00/23] Slab defragmentation V6 Christoph Lameter
2007-11-07 1:11 ` [patch 01/23] SLUB: Move count_partial() Christoph Lameter
2007-11-07 1:11 ` [patch 02/23] SLUB: Rename NUMA defrag_ratio to remote_node_defrag_ratio Christoph Lameter
2007-11-08 14:50 ` Mel Gorman
2007-11-08 17:25 ` Matt Mackall
2007-11-08 19:16 ` Christoph Lameter
2007-11-08 19:47 ` Matt Mackall
2007-11-08 20:01 ` Christoph Lameter
2007-11-08 21:03 ` Matt Mackall
2007-11-08 21:28 ` Christoph Lameter
2007-11-08 23:08 ` Matt Mackall
2007-11-08 18:56 ` Christoph Lameter
2007-11-08 20:10 ` Mel Gorman
2007-11-07 1:11 ` [patch 03/23] bufferhead: Revert constructor removal Christoph Lameter
2007-11-07 1:11 ` [patch 04/23] dentries: Extract common code to remove dentry from lru Christoph Lameter
2007-11-07 8:50 ` Johannes Weiner
2007-11-07 9:43 ` Jörn Engel
2007-11-07 18:55 ` Christoph Lameter
2007-11-07 18:54 ` Jörn Engel
2007-11-07 19:00 ` Christoph Lameter
2007-11-07 18:28 ` Christoph Lameter
2007-11-07 1:11 ` [patch 05/23] VM: Allow get_page_unless_zero on compound pages Christoph Lameter
2007-11-07 1:11 ` [patch 06/23] SLUB: Extend slabinfo to support -D and -C options Christoph Lameter
2007-11-08 15:00 ` Mel Gorman
2007-11-07 1:11 ` [patch 07/23] SLUB: Add defrag_ratio field and sysfs support Christoph Lameter
2007-11-07 8:55 ` Johannes Weiner
2007-11-07 18:30 ` Christoph Lameter
2007-11-08 15:07 ` Mel Gorman
2007-11-08 18:59 ` Christoph Lameter
2007-11-07 1:11 ` [patch 08/23] SLUB: Replace ctor field with ops field in /sys/slab/:0000008 /sys/slab/:0000016 /sys/slab/:0000024 /sys/slab/:0000032 /sys/slab/:0000040 /sys/slab/:0000048 /sys/slab/:0000056 /sys/slab/:0000064 /sys/slab/:0000072 /sys/slab/:0000080 /sys/slab/:0000088 /sys/slab/:0000096 /sys/slab/:0000104 /sys/slab/:0000128 /sys/slab/:0000144 /sys/slab/:0000184 /sys/slab/:0000192 /sys/slab/:0000216 /sys/slab/:0000256 /sys/slab/:0000344 /sys/slab/:0000384 /sys/slab/:0000448 /sys/slab/:0000512 /sys/slab/:0000768 /sys/slab/:0000968 /sys/slab/:0001024 /sys/slab/:0001152 /sys/slab/:0001312 /sys/slab/:0001536 /sys/slab/:0002048 /sys/slab/:0003072 /sys/slab/:0004096 /sys/slab/:a-0000016 /sys/slab/:a-0000024 /sys/slab/:a-0000056 /sys/slab/:a-0000080 /sys/slab/:a-0000128 /sys/slab/Acpi-Namespace /sys/slab/Acpi-Operand /sys/slab/Acpi-Parse /sys/slab/Acpi-ParseExt /sys/slab/Acpi-State /sys/slab/RAW /sys/slab/TCP /sys/slab/UDP /sys/slab/UDP-Lite /sys/slab/UNIX /sys/slab/anon_vma /s ys/slab/arp_cache /sys/slab/bdev_cache /sys/slab/bio /sys/slab/biovec-1 /sys/slab/biovec-128 /sys/slab/biovec-16 /sys/slab/biovec-256 /sys/slab/biovec-4 /sys/slab/biovec-64 /sys/slab/blkdev_ioc /sys/slab/blkdev_queue /sys/slab/blkdev_requests /sys/slab/buffer_head /sys/slab/cfq_io_context /sys/slab/cfq_queue /sys/slab/dentry /sys/slab/eventpoll_epi /sys/slab/eventpoll_pwq /sys/slab/ext2_inode_cache /sys/slab/ext3_inode_cache /sys/slab/fasync_cache /sys/slab/file_lock_cache /sys/slab/files_cache /sys/slab/filp /sys/slab/flow_cache /sys/slab/fs_cache /sys/slab/idr_layer_cache /sys/slab/inet_peer_cache /sys/slab/inode_cache /sys/slab/inotify_event_cache /sys/slab/inotify_watch_cache /sys/slab/ip_dst_cache /sys/slab/ip_fib_alias /sys/slab/ip_fib_hash /sys/slab/jbd_1k /sys/slab/jbd_4k /sys/slab/journal_handle /sys/slab/journal_head /sys/slab/kiocb /sys/slab/kioctx /sys/slab/kmalloc-1024 /sys/slab/kmalloc-128 /sys/slab/kmalloc-16 /sys/slab/kmalloc-192 /sys/slab/kmalloc-2048 /sys/s lab/kmalloc-256 /sys/slab/kmalloc-32 /sys/slab/kmalloc-512 /sys/slab/kmalloc-64 /sys/slab/kmalloc-8 /sys/slab/kmalloc-96 /sys/slab/mm_struct /sys/slab/mnt_cache /sys/slab/mqueue_inode_cache /sys/slab/names_cache /sys/slab/net_namespace /sys/slab/nfs_direct_cache /sys/slab/nfs_inode_cache /sys/slab/nfs_page /sys/slab/nfs_read_data /sys/slab/nfs_write_data /sys/slab/nfsd4_delegations /sys/slab/nfsd4_files /sys/slab/nfsd4_stateids /sys/slab/nfsd4_stateowners /sys/slab/nsproxy /sys/slab/pid /sys/slab/posix_timers_cache /sys/slab/proc_inode_cache /sys/slab/radix_tree_node /sys/slab/request_sock_TCP /sys/slab/revoke_record /sys/slab/revoke_table /sys/slab/rpc_buffers /sys/slab/rpc_inode_cache /sys/slab/rpc_tasks /sys/slab/scsi_cmd_cache /sys/slab/scsi_io_context /sys/slab/secpath_cache /sys/slab/sgpool-128 /sys/slab/sgpool-16 /sys/slab/sgpool-32 /sys/slab/sgpool-64 /sys/slab/sgpool-8 /sys/slab/shmem_inode_cache /sys/slab/sighand_cache /sys/slab/signal_cache /sys/slab/sigqueue /sys /slab/skbuff_fclone_cache /sys/slab/skbuff_head_cache /sys/slab/sock_inode_cache /sys/slab/sysfs_dir_cache /sys/slab/task_struct /sys/slab/tcp_bind_bucket /sys/slab/tw_sock_TCP /sys/slab/uhci_urb_priv /sys/slab/uid_cache /sys/slab/vm_area_struct /sys/slab/xfrm_dst_cache Christoph Lameter
2007-11-07 1:11 ` [patch 09/23] SLUB: Add get() and kick() methods Christoph Lameter
2007-11-07 2:37 ` Adrian Bunk
2007-11-07 3:07 ` Christoph Lameter
2007-11-07 3:26 ` Adrian Bunk
2007-11-07 1:11 ` [patch 10/23] SLUB: Sort slab cache list and establish maximum objects for defrag slabs Christoph Lameter
2007-11-07 1:11 ` [patch 11/23] SLUB: Slab defrag core Christoph Lameter
2007-11-07 22:13 ` Christoph Lameter
2007-11-07 1:11 ` [patch 12/23] SLUB: Trigger defragmentation from memory reclaim Christoph Lameter
2007-11-07 9:28 ` Johannes Weiner
2007-11-07 18:34 ` Christoph Lameter
2007-11-08 15:12 ` Mel Gorman [this message]
2007-11-08 19:00 ` Christoph Lameter
2007-11-07 1:11 ` [patch 13/23] Buffer heads: Support slab defrag Christoph Lameter
2007-11-07 1:11 ` [patch 14/23] inodes: Support generic defragmentation Christoph Lameter
2007-11-07 10:17 ` Jörn Engel
2007-11-07 10:31 ` Jörn Engel
2007-11-07 10:35 ` Andreas Schwab
2007-11-07 10:35 ` Jörn Engel
2007-11-07 18:40 ` Christoph Lameter
2007-11-07 18:51 ` Jörn Engel
2007-11-07 19:00 ` Christoph Lameter
2007-11-07 1:11 ` [patch 15/23] FS: ExtX filesystem defrag Christoph Lameter
2007-11-07 1:11 ` [patch 16/23] FS: XFS slab defragmentation Christoph Lameter
2007-11-07 1:11 ` [patch 17/23] FS: Proc filesystem support for slab defrag Christoph Lameter
2007-11-07 1:11 ` [patch 18/23] FS: Slab defrag: Reiserfs support Christoph Lameter
2007-11-07 1:11 ` [patch 19/23] FS: Socket inode defragmentation Christoph Lameter
2007-11-07 1:11 ` [patch 20/23] dentries: Add constructor Christoph Lameter
2007-11-08 15:23 ` Mel Gorman
2007-11-08 19:03 ` Christoph Lameter
2007-11-07 1:11 ` [patch 21/23] dentries: dentry defragmentation Christoph Lameter
2007-11-07 1:11 ` [patch 22/23] SLUB: Slab reclaim through Lumpy reclaim Christoph Lameter
2007-11-07 1:11 ` [patch 23/23] SLUB: Add SlabReclaimable() to avoid repeated reclaim attempts Christoph Lameter
2007-11-07 8:37 ` [patch 00/23] Slab defragmentation V6 Peter Zijlstra
2007-11-07 18:04 ` Christoph Lameter
2007-11-08 15:26 ` Mel Gorman
2007-11-08 16:01 ` Plans for Onezonelist patch series ??? Lee Schermerhorn
2007-11-08 18:34 ` Christoph Lameter
2007-11-08 18:40 ` Mel Gorman
2007-11-08 18:43 ` Christoph Lameter
2007-11-08 20:06 ` Mel Gorman
2007-11-08 20:20 ` Christoph Lameter
2007-11-08 20:29 ` Mel Gorman
2007-11-08 18:39 ` Mel Gorman
2007-11-08 19:39 ` Christoph Lameter
2007-11-08 19:12 ` [patch 00/23] Slab defragmentation V6 Christoph Lameter
2007-11-08 20:24 ` Mel Gorman
2007-11-08 20:28 ` Christoph Lameter
2007-11-08 20:58 ` Lee Schermerhorn
2007-11-08 21:27 ` Christoph Lameter
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=20071108151249.GE2591@skynet.ie \
--to=mel@skynet.ie \
--cc=akpm@linux-foundatin.org \
--cc=clameter@sgi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
/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
all inboxes | Powered by JetHome®