Re: [PATCH v2] cgroup: use new hashtable implementation

2013-01-10 Thread Tejun Heo
On Thu, Jan 10, 2013 at 11:49:27AM +0800, Li Zefan wrote:
> Switch cgroup to use the new hashtable implementation. No functional changes.
> 
> Signed-off-by: Li Zefan 

Applied to cgroup/for-3.9.  Thanks!

-- 
tejun
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2] cgroup: use new hashtable implementation

2013-01-10 Thread Tejun Heo
On Thu, Jan 10, 2013 at 11:49:27AM +0800, Li Zefan wrote:
 Switch cgroup to use the new hashtable implementation. No functional changes.
 
 Signed-off-by: Li Zefan lize...@huawei.com

Applied to cgroup/for-3.9.  Thanks!

-- 
tejun
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2] cgroup: use new hashtable implementation

2013-01-09 Thread Li Zefan
Switch cgroup to use the new hashtable implementation. No functional changes.

Signed-off-by: Li Zefan 
---

v2: convert a hlist_del() to hash_del().

---
 kernel/cgroup.c | 92 -
 1 file changed, 39 insertions(+), 53 deletions(-)

diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 4855892..a5262d9 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -52,7 +52,7 @@
 #include 
 #include 
 #include 
-#include 
+#include 
 #include 
 #include 
 #include 
@@ -376,22 +376,18 @@ static int css_set_count;
  * account cgroups in empty hierarchies.
  */
 #define CSS_SET_HASH_BITS  7
-#define CSS_SET_TABLE_SIZE (1 << CSS_SET_HASH_BITS)
-static struct hlist_head css_set_table[CSS_SET_TABLE_SIZE];
+static DEFINE_HASHTABLE(css_set_table, CSS_SET_HASH_BITS);
 
-static struct hlist_head *css_set_hash(struct cgroup_subsys_state *css[])
+static unsigned long css_set_hash(struct cgroup_subsys_state *css[])
 {
int i;
-   int index;
-   unsigned long tmp = 0UL;
+   unsigned long key = 0UL;
 
for (i = 0; i < CGROUP_SUBSYS_COUNT; i++)
-   tmp += (unsigned long)css[i];
-   tmp = (tmp >> 16) ^ tmp;
+   key += (unsigned long)css[i];
+   key = (key >> 16) ^ key;
 
-   index = hash_long(tmp, CSS_SET_HASH_BITS);
-
-   return _set_table[index];
+   return key;
 }
 
 /* We don't maintain the lists running through each css_set to its
@@ -418,7 +414,7 @@ static void __put_css_set(struct css_set *cg, int taskexit)
}
 
/* This css_set is dead. unlink it and release cgroup refcounts */
-   hlist_del(>hlist);
+   hash_del(>hlist);
css_set_count--;
 
list_for_each_entry_safe(link, saved_link, >cg_links,
@@ -550,9 +546,9 @@ static struct css_set *find_existing_css_set(
 {
int i;
struct cgroupfs_root *root = cgrp->root;
-   struct hlist_head *hhead;
struct hlist_node *node;
struct css_set *cg;
+   unsigned long key;
 
/*
 * Build the set of subsystem state objects that we want to see in the
@@ -572,8 +568,8 @@ static struct css_set *find_existing_css_set(
}
}
 
-   hhead = css_set_hash(template);
-   hlist_for_each_entry(cg, node, hhead, hlist) {
+   key = css_set_hash(template);
+   hash_for_each_possible(css_set_table, cg, node, hlist, key) {
if (!compare_css_sets(cg, oldcg, cgrp, template))
continue;
 
@@ -657,8 +653,8 @@ static struct css_set *find_css_set(
 
struct list_head tmp_cg_links;
 
-   struct hlist_head *hhead;
struct cg_cgroup_link *link;
+   unsigned long key;
 
/* First see if we already have a cgroup group that matches
 * the desired set */
@@ -704,8 +700,8 @@ static struct css_set *find_css_set(
css_set_count++;
 
/* Add this cgroup group to the hash table */
-   hhead = css_set_hash(res->subsys);
-   hlist_add_head(>hlist, hhead);
+   key = css_set_hash(res->subsys);
+   hash_add(css_set_table, >hlist, key);
 
write_unlock(_set_lock);
 
@@ -1597,6 +1593,8 @@ static struct dentry *cgroup_mount(struct 
file_system_type *fs_type,
struct cgroupfs_root *existing_root;
const struct cred *cred;
int i;
+   struct hlist_node *node;
+   struct css_set *cg;
 
BUG_ON(sb->s_root != NULL);
 
@@ -1650,14 +1648,8 @@ static struct dentry *cgroup_mount(struct 
file_system_type *fs_type,
/* Link the top cgroup in this hierarchy into all
 * the css_set objects */
write_lock(_set_lock);
-   for (i = 0; i < CSS_SET_TABLE_SIZE; i++) {
-   struct hlist_head *hhead = _set_table[i];
-   struct hlist_node *node;
-   struct css_set *cg;
-
-   hlist_for_each_entry(cg, node, hhead, hlist)
-   link_css_set(_cg_links, cg, root_cgrp);
-   }
+   hash_for_each(css_set_table, i, node, cg, hlist)
+   link_css_set(_cg_links, cg, root_cgrp);
write_unlock(_set_lock);
 
free_cg_links(_cg_links);
@@ -4438,6 +4430,9 @@ int __init_or_module cgroup_load_subsys(struct 
cgroup_subsys *ss)
 {
struct cgroup_subsys_state *css;
int i, ret;
+   struct hlist_node *node, *tmp;
+   struct css_set *cg;
+   unsigned long key;
 
/* check name and function validity */
if (ss->name == NULL || strlen(ss->name) > MAX_CGROUP_TYPE_NAMELEN ||
@@ -4503,23 +4498,17 @@ int __init_or_module cgroup_load_subsys(struct 
cgroup_subsys *ss)
 * this is all done under the css_set_lock.
 */
write_lock(_set_lock);
-   for (i = 0; i < CSS_SET_TABLE_SIZE; i++) {
-   struct css_set *cg;
-   struct 

[PATCH v2] cgroup: use new hashtable implementation

2013-01-09 Thread Li Zefan
Switch cgroup to use the new hashtable implementation. No functional changes.

Signed-off-by: Li Zefan lize...@huawei.com
---

v2: convert a hlist_del() to hash_del().

---
 kernel/cgroup.c | 92 -
 1 file changed, 39 insertions(+), 53 deletions(-)

diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 4855892..a5262d9 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -52,7 +52,7 @@
 #include linux/module.h
 #include linux/delayacct.h
 #include linux/cgroupstats.h
-#include linux/hash.h
+#include linux/hashtable.h
 #include linux/namei.h
 #include linux/pid_namespace.h
 #include linux/idr.h
@@ -376,22 +376,18 @@ static int css_set_count;
  * account cgroups in empty hierarchies.
  */
 #define CSS_SET_HASH_BITS  7
-#define CSS_SET_TABLE_SIZE (1  CSS_SET_HASH_BITS)
-static struct hlist_head css_set_table[CSS_SET_TABLE_SIZE];
+static DEFINE_HASHTABLE(css_set_table, CSS_SET_HASH_BITS);
 
-static struct hlist_head *css_set_hash(struct cgroup_subsys_state *css[])
+static unsigned long css_set_hash(struct cgroup_subsys_state *css[])
 {
int i;
-   int index;
-   unsigned long tmp = 0UL;
+   unsigned long key = 0UL;
 
for (i = 0; i  CGROUP_SUBSYS_COUNT; i++)
-   tmp += (unsigned long)css[i];
-   tmp = (tmp  16) ^ tmp;
+   key += (unsigned long)css[i];
+   key = (key  16) ^ key;
 
-   index = hash_long(tmp, CSS_SET_HASH_BITS);
-
-   return css_set_table[index];
+   return key;
 }
 
 /* We don't maintain the lists running through each css_set to its
@@ -418,7 +414,7 @@ static void __put_css_set(struct css_set *cg, int taskexit)
}
 
/* This css_set is dead. unlink it and release cgroup refcounts */
-   hlist_del(cg-hlist);
+   hash_del(cg-hlist);
css_set_count--;
 
list_for_each_entry_safe(link, saved_link, cg-cg_links,
@@ -550,9 +546,9 @@ static struct css_set *find_existing_css_set(
 {
int i;
struct cgroupfs_root *root = cgrp-root;
-   struct hlist_head *hhead;
struct hlist_node *node;
struct css_set *cg;
+   unsigned long key;
 
/*
 * Build the set of subsystem state objects that we want to see in the
@@ -572,8 +568,8 @@ static struct css_set *find_existing_css_set(
}
}
 
-   hhead = css_set_hash(template);
-   hlist_for_each_entry(cg, node, hhead, hlist) {
+   key = css_set_hash(template);
+   hash_for_each_possible(css_set_table, cg, node, hlist, key) {
if (!compare_css_sets(cg, oldcg, cgrp, template))
continue;
 
@@ -657,8 +653,8 @@ static struct css_set *find_css_set(
 
struct list_head tmp_cg_links;
 
-   struct hlist_head *hhead;
struct cg_cgroup_link *link;
+   unsigned long key;
 
/* First see if we already have a cgroup group that matches
 * the desired set */
@@ -704,8 +700,8 @@ static struct css_set *find_css_set(
css_set_count++;
 
/* Add this cgroup group to the hash table */
-   hhead = css_set_hash(res-subsys);
-   hlist_add_head(res-hlist, hhead);
+   key = css_set_hash(res-subsys);
+   hash_add(css_set_table, res-hlist, key);
 
write_unlock(css_set_lock);
 
@@ -1597,6 +1593,8 @@ static struct dentry *cgroup_mount(struct 
file_system_type *fs_type,
struct cgroupfs_root *existing_root;
const struct cred *cred;
int i;
+   struct hlist_node *node;
+   struct css_set *cg;
 
BUG_ON(sb-s_root != NULL);
 
@@ -1650,14 +1648,8 @@ static struct dentry *cgroup_mount(struct 
file_system_type *fs_type,
/* Link the top cgroup in this hierarchy into all
 * the css_set objects */
write_lock(css_set_lock);
-   for (i = 0; i  CSS_SET_TABLE_SIZE; i++) {
-   struct hlist_head *hhead = css_set_table[i];
-   struct hlist_node *node;
-   struct css_set *cg;
-
-   hlist_for_each_entry(cg, node, hhead, hlist)
-   link_css_set(tmp_cg_links, cg, root_cgrp);
-   }
+   hash_for_each(css_set_table, i, node, cg, hlist)
+   link_css_set(tmp_cg_links, cg, root_cgrp);
write_unlock(css_set_lock);
 
free_cg_links(tmp_cg_links);
@@ -4438,6 +4430,9 @@ int __init_or_module cgroup_load_subsys(struct 
cgroup_subsys *ss)
 {
struct cgroup_subsys_state *css;
int i, ret;
+   struct hlist_node *node, *tmp;
+   struct css_set *cg;
+   unsigned long key;
 
/* check name and function validity */
if (ss-name == NULL || strlen(ss-name)  MAX_CGROUP_TYPE_NAMELEN ||
@@ -4503,23 +4498,17 @@ int __init_or_module cgroup_load_subsys(struct 
cgroup_subsys *ss)
 * this is all done under the