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 v7 08/16] block,elevator: use new hashtable implementation
Date: Sun, 28 Oct 2012 15:02:20 -0400 [thread overview]
Message-ID: <1351450948-15618-8-git-send-email-levinsasha928@gmail.com> (raw)
In-Reply-To: <1351450948-15618-1-git-send-email-levinsasha928@gmail.com>
Switch elevator to use the new hashtable implementation. This reduces the amount of
generic unrelated code in the elevator.
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>
---
block/blk.h | 2 +-
block/elevator.c | 23 ++++-------------------
include/linux/elevator.h | 5 ++++-
3 files changed, 9 insertions(+), 21 deletions(-)
diff --git a/block/blk.h b/block/blk.h
index ca51543..a0abbf6 100644
--- a/block/blk.h
+++ b/block/blk.h
@@ -61,7 +61,7 @@ static inline void blk_clear_rq_complete(struct request *rq)
/*
* Internal elevator interface
*/
-#define ELV_ON_HASH(rq) (!hlist_unhashed(&(rq)->hash))
+#define ELV_ON_HASH(rq) hash_hashed(&(rq)->hash)
void blk_insert_flush(struct request *rq);
void blk_abort_flushes(struct request_queue *q);
diff --git a/block/elevator.c b/block/elevator.c
index 9b1d42b..898d0eb 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -46,11 +46,6 @@ static LIST_HEAD(elv_list);
/*
* Merge hash stuff.
*/
-static const int elv_hash_shift = 6;
-#define ELV_HASH_BLOCK(sec) ((sec) >> 3)
-#define ELV_HASH_FN(sec) \
- (hash_long(ELV_HASH_BLOCK((sec)), elv_hash_shift))
-#define ELV_HASH_ENTRIES (1 << elv_hash_shift)
#define rq_hash_key(rq) (blk_rq_pos(rq) + blk_rq_sectors(rq))
/*
@@ -142,7 +137,6 @@ static struct elevator_queue *elevator_alloc(struct request_queue *q,
struct elevator_type *e)
{
struct elevator_queue *eq;
- int i;
eq = kmalloc_node(sizeof(*eq), GFP_KERNEL | __GFP_ZERO, q->node);
if (unlikely(!eq))
@@ -151,14 +145,7 @@ static struct elevator_queue *elevator_alloc(struct request_queue *q,
eq->type = e;
kobject_init(&eq->kobj, &elv_ktype);
mutex_init(&eq->sysfs_lock);
-
- eq->hash = kmalloc_node(sizeof(struct hlist_head) * ELV_HASH_ENTRIES,
- GFP_KERNEL, q->node);
- if (!eq->hash)
- goto err;
-
- for (i = 0; i < ELV_HASH_ENTRIES; i++)
- INIT_HLIST_HEAD(&eq->hash[i]);
+ hash_init(eq->hash);
return eq;
err:
@@ -173,7 +160,6 @@ static void elevator_release(struct kobject *kobj)
e = container_of(kobj, struct elevator_queue, kobj);
elevator_put(e->type);
- kfree(e->hash);
kfree(e);
}
@@ -240,7 +226,7 @@ EXPORT_SYMBOL(elevator_exit);
static inline void __elv_rqhash_del(struct request *rq)
{
- hlist_del_init(&rq->hash);
+ hash_del(&rq->hash);
}
static void elv_rqhash_del(struct request_queue *q, struct request *rq)
@@ -254,7 +240,7 @@ static void elv_rqhash_add(struct request_queue *q, struct request *rq)
struct elevator_queue *e = q->elevator;
BUG_ON(ELV_ON_HASH(rq));
- hlist_add_head(&rq->hash, &e->hash[ELV_HASH_FN(rq_hash_key(rq))]);
+ hash_add(e->hash, &rq->hash, rq_hash_key(rq));
}
static void elv_rqhash_reposition(struct request_queue *q, struct request *rq)
@@ -266,11 +252,10 @@ static void elv_rqhash_reposition(struct request_queue *q, struct request *rq)
static struct request *elv_rqhash_find(struct request_queue *q, sector_t offset)
{
struct elevator_queue *e = q->elevator;
- struct hlist_head *hash_list = &e->hash[ELV_HASH_FN(offset)];
struct hlist_node *entry, *next;
struct request *rq;
- hlist_for_each_entry_safe(rq, entry, next, hash_list, hash) {
+ hash_for_each_possible_safe(e->hash, rq, entry, next, hash, offset) {
BUG_ON(!ELV_ON_HASH(rq));
if (unlikely(!rq_mergeable(rq))) {
diff --git a/include/linux/elevator.h b/include/linux/elevator.h
index c03af76..7587f7f 100644
--- a/include/linux/elevator.h
+++ b/include/linux/elevator.h
@@ -2,6 +2,7 @@
#define _LINUX_ELEVATOR_H
#include <linux/percpu.h>
+#include <linux/hashtable.h>
#ifdef CONFIG_BLOCK
@@ -96,6 +97,8 @@ struct elevator_type
struct list_head list;
};
+#define ELV_HASH_BITS 6
+
/*
* each queue has an elevator_queue associated with it
*/
@@ -105,7 +108,7 @@ struct elevator_queue
void *elevator_data;
struct kobject kobj;
struct mutex sysfs_lock;
- struct hlist_head *hash;
+ DECLARE_HASHTABLE(hash, ELV_HASH_BITS);
unsigned int registered:1;
};
--
1.7.12.4
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2012-10-28 19:03 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-28 19:02 [PATCH v7 01/16] hashtable: introduce a small and naive hashtable Sasha Levin
2012-10-28 19:02 ` [PATCH v7 02/16] userns: use new hashtable implementation Sasha Levin
2012-10-28 19:02 ` [PATCH v7 03/16] mm,ksm: " Sasha Levin
2012-10-28 19:02 ` [PATCH v7 04/16] workqueue: " Sasha Levin
2012-10-29 1:25 ` Tejun Heo
2012-10-28 19:02 ` [PATCH v7 05/16] mm/huge_memory: " Sasha Levin
2012-10-28 19:02 ` [PATCH v7 06/16] tracepoint: " Sasha Levin
2012-10-29 11:35 ` Mathieu Desnoyers
2012-10-29 17:29 ` Sasha Levin
2012-10-29 17:50 ` Mathieu Desnoyers
2012-10-29 18:31 ` Josh Triplett
2012-10-29 18:42 ` Sasha Levin
2012-10-29 18:53 ` Mathieu Desnoyers
2012-10-29 18:58 ` Tejun Heo
2012-10-29 19:01 ` Tejun Heo
2012-10-29 19:10 ` Mathieu Desnoyers
2012-10-29 19:09 ` Sasha Levin
2012-10-29 19:12 ` Tejun Heo
2012-10-29 19:17 ` Sasha Levin
2012-10-29 19:16 ` Mathieu Desnoyers
2012-10-28 19:02 ` [PATCH v7 07/16] net,9p: " Sasha Levin
2012-10-29 12:15 ` Mathieu Desnoyers
2012-10-28 19:02 ` Sasha Levin [this message]
2012-10-29 1:29 ` [PATCH v7 08/16] block,elevator: " Tejun Heo
2012-10-29 12:20 ` Mathieu Desnoyers
2012-10-28 19:02 ` [PATCH v7 09/16] SUNRPC/cache: " Sasha Levin
2012-10-29 12:42 ` Mathieu Desnoyers
2012-10-29 14:49 ` Linus Torvalds
2012-10-29 15:13 ` Mathieu Desnoyers
2012-10-29 15:16 ` J. Bruce Fields
2012-10-29 15:41 ` Mathieu Desnoyers
2012-10-29 16:27 ` Andrew Morton
2012-10-28 19:02 ` [PATCH v7 10/16] dlm: " Sasha Levin
2012-10-29 12:46 ` Mathieu Desnoyers
2012-10-29 13:07 ` Mathieu Desnoyers
2012-10-29 15:53 ` Sasha Levin
2012-10-29 16:07 ` Mathieu Desnoyers
2012-10-29 16:23 ` David Teigland
2012-10-28 19:02 ` [PATCH v7 11/16] net,l2tp: " Sasha Levin
2012-10-29 13:04 ` Mathieu Desnoyers
2012-10-28 19:02 ` [PATCH v7 12/16] dm: " Sasha Levin
2012-10-28 19:02 ` [PATCH v7 13/16] lockd: " Sasha Levin
2012-10-29 13:23 ` Mathieu Desnoyers
2012-10-28 19:02 ` [PATCH v7 14/16] net,rds: " Sasha Levin
2012-10-29 13:25 ` Mathieu Desnoyers
2012-10-28 19:02 ` [PATCH v7 15/16] openvswitch: " Sasha Levin
2012-10-29 13:29 ` Mathieu Desnoyers
2012-10-29 15:43 ` Sasha Levin
2012-10-29 15:59 ` Mathieu Desnoyers
2012-10-29 17:35 ` Sasha Levin
2012-10-29 18:16 ` Mathieu Desnoyers
2012-10-29 18:22 ` Tejun Heo
2012-10-29 18:35 ` Mathieu Desnoyers
2012-10-28 19:02 ` [PATCH v7 16/16] tracing output: " Sasha Levin
2012-10-29 11:29 ` [PATCH v7 01/16] hashtable: introduce a small and naive hashtable Mathieu Desnoyers
2012-10-29 16:06 ` Sasha Levin
2012-10-29 16:14 ` Mathieu Desnoyers
2012-10-29 16:18 ` Tejun Heo
2012-10-29 16:22 ` Mathieu Desnoyers
2012-10-29 16:26 ` Sasha Levin
2012-10-29 16:29 ` Mathieu Desnoyers
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=1351450948-15618-8-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).