From patchwork Tue Oct 30 18:46:01 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sasha Levin X-Patchwork-Id: 1672841 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 0088BDFF3D for ; Tue, 30 Oct 2012 18:52:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934210Ab2J3Svo (ORCPT ); Tue, 30 Oct 2012 14:51:44 -0400 Received: from mail-qc0-f174.google.com ([209.85.216.174]:46116 "EHLO mail-qc0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965462Ab2J3SrT (ORCPT ); Tue, 30 Oct 2012 14:47:19 -0400 Received: by mail-qc0-f174.google.com with SMTP id o22so398523qcr.19 for ; Tue, 30 Oct 2012 11:47:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=jTi8MSENCWoa78MLLepB4hyhweCakU4KqEVjpCiZMrg=; b=ZXPmIu+bed8qPLAR2BDmxxSv920fbkZE+1XtyhtR4EDKX81yuVRINH9sjFFtaoOLrC Rtjuc7VUjzQZiRXJz9z5Odlrf2pbXRGauBvrM0JFLvcoH0nOW9Lz7FeJZOBD+zqRUAZu 0qJGJFGO+Qt1JKikk/3PQjEXlbuAQrgTAI8U9UiMzZMt2EHu3pdKBDEomWSwm4Vk8u9G qmEb7DX7FirNETtjJkMKh0fPsfw4EoVXBmPw/mVkXS/tmqO5tzTemSSXH2RduPjMiR00 zcs5b7n8VOzcPp045Q4I0y77x10DDE36uFPb8HqdUe5NoC5PmZmWRd8b9KA/SBet75RG oW7w== Received: by 10.224.185.212 with SMTP id cp20mr14088405qab.2.1351622839139; Tue, 30 Oct 2012 11:47:19 -0700 (PDT) Received: from localhost.localdomain ([50.145.164.180]) by mx.google.com with ESMTPS id ga9sm682790qab.22.2012.10.30.11.47.13 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 30 Oct 2012 11:47:18 -0700 (PDT) From: Sasha Levin 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 Subject: [PATCH v8 05/16] mm/huge_memory: use new hashtable implementation Date: Tue, 30 Oct 2012 14:46:01 -0400 Message-Id: <1351622772-16400-5-git-send-email-levinsasha928@gmail.com> X-Mailer: git-send-email 1.7.12.4 In-Reply-To: <1351622772-16400-1-git-send-email-levinsasha928@gmail.com> References: <1351622772-16400-1-git-send-email-levinsasha928@gmail.com> Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org 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 --- mm/huge_memory.c | 53 ++++++++++++----------------------------------------- 1 file changed, 12 insertions(+), 41 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 3c14a96..4b32238 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include "internal.h" @@ -59,12 +60,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; /** @@ -545,12 +546,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 @@ -1694,47 +1689,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) @@ -1803,7 +1774,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; } @@ -2252,7 +2223,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); /*