linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <levinsasha928@gmail.com>
To: torvalds@linux-foundation.org
Cc: tj@kernel.org, akpm@linux-foundation.org,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	paul.gortmaker@windriver.com, davem@davemloft.net,
	rostedt@goodmis.org, mingo@elte.hu, ebiederm@xmission.com,
	aarcange@redhat.com, ericvh@gmail.com, netdev@vger.kernel.org,
	josh@joshtriplett.org, eric.dumazet@gmail.com,
	mathieu.desnoyers@efficios.com, axboe@kernel.dk, agk@redhat.com,
	dm-devel@redhat.com, neilb@suse.de, ccaulfie@redhat.com,
	teigland@redhat.com, Trond.Myklebust@netapp.com,
	bfields@fieldses.org, fweisbec@gmail.com, jesse@nicira.com,
	venkat.x.venkatsubra@oracle.com, ejt@redhat.com,
	snitzer@redhat.com, edumazet@google.com,
	linux-nfs@vger.kernel.org, dev@openvswitch.org,
	rds-devel@oss.oracle.com, lw@cn.fujitsu.com,
	Sasha Levin <levinsasha928@gmail.com>
Subject: [PATCH v3 05/17] mm/huge_memory: use new hashtable implementation
Date: Wed, 22 Aug 2012 04:27:00 +0200	[thread overview]
Message-ID: <1345602432-27673-6-git-send-email-levinsasha928@gmail.com> (raw)
In-Reply-To: <1345602432-27673-1-git-send-email-levinsasha928@gmail.com>

Switch hugemem to use the new hashtable implementation. This reduces the amount of
generic unrelated code in the hugemem.

This also removes the dymanic allocation of the hash table. The size of the table is
constant so there's no point in paying the price of an extra dereference when accessing
it.

Signed-off-by: Sasha Levin <levinsasha928@gmail.com>
---
 mm/huge_memory.c |   57 ++++++++++++++---------------------------------------
 1 files changed, 15 insertions(+), 42 deletions(-)

diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 8b3c55a..cebe345 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -17,6 +17,7 @@
 #include <linux/khugepaged.h>
 #include <linux/freezer.h>
 #include <linux/mman.h>
+#include <linux/hashtable.h>
 #include <asm/tlb.h>
 #include <asm/pgalloc.h>
 #include "internal.h"
@@ -57,12 +58,12 @@ static DECLARE_WAIT_QUEUE_HEAD(khugepaged_wait);
 static unsigned int khugepaged_max_ptes_none __read_mostly = HPAGE_PMD_NR-1;
 
 static int khugepaged(void *none);
-static int mm_slots_hash_init(void);
 static int khugepaged_slab_init(void);
 static void khugepaged_slab_free(void);
 
-#define MM_SLOTS_HASH_HEADS 1024
-static struct hlist_head *mm_slots_hash __read_mostly;
+#define MM_SLOTS_HASH_BITS 10
+static DEFINE_HASHTABLE(mm_slots_hash, MM_SLOTS_HASH_BITS);
+
 static struct kmem_cache *mm_slot_cache __read_mostly;
 
 /**
@@ -140,7 +141,7 @@ static int start_khugepaged(void)
 	int err = 0;
 	if (khugepaged_enabled()) {
 		int wakeup;
-		if (unlikely(!mm_slot_cache || !mm_slots_hash)) {
+		if (unlikely(!mm_slot_cache)) {
 			err = -ENOMEM;
 			goto out;
 		}
@@ -554,12 +555,6 @@ static int __init hugepage_init(void)
 	if (err)
 		goto out;
 
-	err = mm_slots_hash_init();
-	if (err) {
-		khugepaged_slab_free();
-		goto out;
-	}
-
 	/*
 	 * By default disable transparent hugepages on smaller systems,
 	 * where the extra memory used could hurt more than TLB overhead
@@ -1540,6 +1535,8 @@ static int __init khugepaged_slab_init(void)
 	if (!mm_slot_cache)
 		return -ENOMEM;
 
+	hash_init(mm_slots_hash);
+
 	return 0;
 }
 
@@ -1561,47 +1558,23 @@ static inline void free_mm_slot(struct mm_slot *mm_slot)
 	kmem_cache_free(mm_slot_cache, mm_slot);
 }
 
-static int __init mm_slots_hash_init(void)
-{
-	mm_slots_hash = kzalloc(MM_SLOTS_HASH_HEADS * sizeof(struct hlist_head),
-				GFP_KERNEL);
-	if (!mm_slots_hash)
-		return -ENOMEM;
-	return 0;
-}
-
-#if 0
-static void __init mm_slots_hash_free(void)
-{
-	kfree(mm_slots_hash);
-	mm_slots_hash = NULL;
-}
-#endif
-
 static struct mm_slot *get_mm_slot(struct mm_struct *mm)
 {
-	struct mm_slot *mm_slot;
-	struct hlist_head *bucket;
+	struct mm_slot *slot;
 	struct hlist_node *node;
 
-	bucket = &mm_slots_hash[((unsigned long)mm / sizeof(struct mm_struct))
-				% MM_SLOTS_HASH_HEADS];
-	hlist_for_each_entry(mm_slot, node, bucket, hash) {
-		if (mm == mm_slot->mm)
-			return mm_slot;
-	}
+	hash_for_each_possible(mm_slots_hash, slot, node, hash, (unsigned long) mm)
+		if (slot->mm == mm)
+			return slot;
+
 	return NULL;
 }
 
 static void insert_to_mm_slots_hash(struct mm_struct *mm,
 				    struct mm_slot *mm_slot)
 {
-	struct hlist_head *bucket;
-
-	bucket = &mm_slots_hash[((unsigned long)mm / sizeof(struct mm_struct))
-				% MM_SLOTS_HASH_HEADS];
 	mm_slot->mm = mm;
-	hlist_add_head(&mm_slot->hash, bucket);
+	hash_add(mm_slots_hash, &mm_slot->hash, (long)mm);
 }
 
 static inline int khugepaged_test_exit(struct mm_struct *mm)
@@ -1670,7 +1643,7 @@ void __khugepaged_exit(struct mm_struct *mm)
 	spin_lock(&khugepaged_mm_lock);
 	mm_slot = get_mm_slot(mm);
 	if (mm_slot && khugepaged_scan.mm_slot != mm_slot) {
-		hlist_del(&mm_slot->hash);
+		hash_del(&mm_slot->hash);
 		list_del(&mm_slot->mm_node);
 		free = 1;
 	}
@@ -2080,7 +2053,7 @@ static void collect_mm_slot(struct mm_slot *mm_slot)
 
 	if (khugepaged_test_exit(mm)) {
 		/* free mm_slot */
-		hlist_del(&mm_slot->hash);
+		hash_del(&mm_slot->hash);
 		list_del(&mm_slot->mm_node);
 
 		/*
-- 
1.7.8.6


  parent reply	other threads:[~2012-08-22  2:27 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-22  2:26 [PATCH v3 00/17] generic hashtable implementation Sasha Levin
2012-08-22  2:26 ` [PATCH v3 01/17] hashtable: introduce a small and naive hashtable Sasha Levin
2012-08-22 18:01   ` Tejun Heo
2012-08-22 23:54     ` Ryan Mallon
2012-08-23  0:24     ` Sasha Levin
2012-08-23 20:04       ` Tejun Heo
2012-08-24 19:47         ` Sasha Levin
2012-08-24 19:59           ` Tejun Heo
2012-08-24 20:11             ` Sasha Levin
2012-08-24 20:33               ` Tejun Heo
2012-08-24 20:53                 ` Sasha Levin
2012-08-24 21:23                   ` Tejun Heo
2012-08-24 22:59                     ` Sasha Levin
2012-08-24 23:07                       ` Tejun Heo
2012-08-25  4:24                         ` Mathieu Desnoyers
2012-08-28  9:56                           ` Sasha Levin
2012-08-28 10:11                             ` Mathieu Desnoyers
2012-08-28 11:27                               ` Sasha Levin
2012-08-28 11:56                                 ` Mathieu Desnoyers
2012-08-28 23:00                                   ` Mathieu Desnoyers
2012-09-04 15:35                                     ` Steven Rostedt
2012-09-04 16:30                                       ` Pedro Alves
2012-09-04 16:40                                         ` Pedro Alves
2012-09-04 17:01                                           ` Mathieu Desnoyers
2012-09-06 13:53                                             ` Sasha Levin
2012-09-06 14:19                                               ` Pedro Alves
2012-09-06 14:33                                               ` Mathieu Desnoyers
2012-09-06 14:36                                               ` David Laight
2012-09-06 14:55                                               ` Josh Triplett
2012-09-06 15:11                                                 ` Steven Rostedt
2012-09-06 15:49                                                 ` Sasha Levin
2012-09-06 16:00                                                   ` Steven Rostedt
2012-09-06 16:21                                                     ` Sasha Levin
2012-09-06 16:50                                                       ` Mathieu Desnoyers
2012-09-06 17:01                                                         ` Sasha Levin
2012-09-06 17:02                                                           ` Mathieu Desnoyers
2012-09-06 17:15                                                       ` Steven Rostedt
2012-09-04 17:17                                           ` Steven Rostedt
2012-09-04 17:21                                             ` Pedro Alves
2012-09-04 20:59                                               ` Steven Rostedt
2012-09-04 21:51                                                 ` Pedro Alves
2012-09-04 22:41                                                   ` Steven Rostedt
2012-09-04 22:58                                                     ` Pedro Alves
2012-09-04 23:27                                                       ` Steven Rostedt
2012-09-04 16:32                                       ` Mathieu Desnoyers
2012-08-22  2:26 ` [PATCH v3 02/17] userns: use new hashtable implementation Sasha Levin
2012-08-22  2:26 ` [PATCH v3 03/17] mm,ksm: " Sasha Levin
2012-08-22  2:26 ` [PATCH v3 04/17] workqueue: " Sasha Levin
2012-08-22 18:05   ` Tejun Heo
2012-08-22  2:27 ` Sasha Levin [this message]
2012-08-22  2:27 ` [PATCH v3 06/17] tracepoint: " Sasha Levin
2012-08-22  2:27 ` [PATCH v3 07/17] net,9p: " Sasha Levin
2012-08-22  2:27 ` [PATCH v3 08/17] block,elevator: " Sasha Levin
2012-08-22  2:27 ` [PATCH v3 09/17] SUNRPC/cache: " Sasha Levin
2012-08-22  2:27 ` [PATCH v3 10/17] dlm: " Sasha Levin
2012-08-22  2:27 ` [PATCH v3 11/17] net,l2tp: " Sasha Levin
2012-08-22  2:27 ` [PATCH v3 12/17] dm: " Sasha Levin
2012-08-22  2:27 ` [PATCH v3 13/17] lockd: " Sasha Levin
2012-08-22 11:47   ` J. Bruce Fields
2012-08-22 12:13     ` Sasha Levin
2012-08-22 13:12       ` J. Bruce Fields
2012-08-22 13:22       ` Mathieu Desnoyers
2012-08-22 17:32         ` Sasha Levin
2012-08-22  2:27 ` [PATCH v3 14/17] net,rds: " Sasha Levin
2012-08-22  2:27 ` [PATCH v3 15/17] openvswitch: " Sasha Levin
2012-08-22  2:27 ` [PATCH v3 16/17] tracing output: " Sasha Levin
2012-08-22  2:27 ` [PATCH v3 17/17] SUNRPC: use new hashtable implementation in auth Sasha Levin

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=1345602432-27673-6-git-send-email-levinsasha928@gmail.com \
    --to=levinsasha928@gmail.com \
    --cc=Trond.Myklebust@netapp.com \
    --cc=aarcange@redhat.com \
    --cc=agk@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=axboe@kernel.dk \
    --cc=bfields@fieldses.org \
    --cc=ccaulfie@redhat.com \
    --cc=davem@davemloft.net \
    --cc=dev@openvswitch.org \
    --cc=dm-devel@redhat.com \
    --cc=ebiederm@xmission.com \
    --cc=edumazet@google.com \
    --cc=ejt@redhat.com \
    --cc=eric.dumazet@gmail.com \
    --cc=ericvh@gmail.com \
    --cc=fweisbec@gmail.com \
    --cc=jesse@nicira.com \
    --cc=josh@joshtriplett.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=lw@cn.fujitsu.com \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mingo@elte.hu \
    --cc=neilb@suse.de \
    --cc=netdev@vger.kernel.org \
    --cc=paul.gortmaker@windriver.com \
    --cc=rds-devel@oss.oracle.com \
    --cc=rostedt@goodmis.org \
    --cc=snitzer@redhat.com \
    --cc=teigland@redhat.com \
    --cc=tj@kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=venkat.x.venkatsubra@oracle.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).