Since we use ve_idr layer to reserve a id for a ve,
and since a ve is linked there, using of ve_list_head
just for linking VEs becomes redundant.

This patch replaces ve_list_head in the places, we iterate
thru VEs list, with ve_idr mechanish, and kills the
duplicate manner.

Signed-off-by: Kirill Tkhai <[email protected]>
---
 include/linux/ve.h       |    2 --
 include/linux/ve_proto.h |    3 +--
 kernel/ve/ve.c           |   10 +++-------
 kernel/ve/vecalls.c      |   38 +++++++++++++++-----------------------
 kernel/ve/vzlist.c       |    4 ++--
 kernel/ve/vzstat.c       |    4 +++-
 scripts/kconfig/conf     |  Bin
 6 files changed, 24 insertions(+), 37 deletions(-)

diff --git a/include/linux/ve.h b/include/linux/ve.h
index 10c150a..54091a1 100644
--- a/include/linux/ve.h
+++ b/include/linux/ve.h
@@ -37,8 +37,6 @@ struct ve_struct {
 
        const char              *ve_name;
 
-       struct list_head        ve_list;
-
        envid_t                 veid;
        bool                    legacy; /* created using the legacy API
                                           (vzctl ioctl - see do_env_create) */
diff --git a/include/linux/ve_proto.h b/include/linux/ve_proto.h
index 0f5898e..d67341e 100644
--- a/include/linux/ve_proto.h
+++ b/include/linux/ve_proto.h
@@ -49,10 +49,9 @@ void vzmon_unregister_veaddr_print_cb(ve_seq_print_t);
 int venet_init(void);
 #endif
 
-extern struct list_head ve_list_head;
-#define for_each_ve(ve)        list_for_each_entry((ve), &ve_list_head, 
ve_list)
 extern struct mutex ve_list_lock;
 extern struct ve_struct *get_ve_by_id(envid_t);
+extern struct idr ve_idr;
 extern struct cgroup *ve_cgroup_open(struct cgroup *root, int flags, envid_t 
veid);
 extern int ve_cgroup_remove(struct cgroup *root, envid_t veid);
 
diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
index aff3b03..5f6896f 100644
--- a/kernel/ve/ve.c
+++ b/kernel/ve/ve.c
@@ -85,7 +85,6 @@ struct ve_struct ve0 = {
 };
 EXPORT_SYMBOL(ve0);
 
-LIST_HEAD(ve_list_head);
 DEFINE_MUTEX(ve_list_lock);
 
 int nr_ve = 1; /* One VE always exists. Compatibility with vestat */
@@ -94,7 +93,7 @@ EXPORT_SYMBOL(nr_ve);
 int vz_compat;
 EXPORT_SYMBOL(vz_compat);
 
-static DEFINE_IDR(ve_idr);
+DEFINE_IDR(ve_idr);
 
 static int __init vz_compat_setup(char *arg)
 {
@@ -129,7 +128,6 @@ static int ve_list_add(struct ve_struct *ve)
                        err = -EEXIST;
                goto out;
        }
-       list_add(&ve->ve_list, &ve_list_head);
        nr_ve++;
        err = 0;
 out:
@@ -141,7 +139,6 @@ static void ve_list_del(struct ve_struct *ve)
 {
        mutex_lock(&ve_list_lock);
        idr_remove(&ve_idr, ve->veid);
-       list_del_init(&ve->ve_list);
        nr_ve--;
        mutex_unlock(&ve_list_lock);
 }
@@ -194,7 +191,7 @@ struct ve_struct *get_ve_by_id(envid_t veid)
 EXPORT_SYMBOL(get_ve_by_id);
 
 EXPORT_SYMBOL(ve_list_lock);
-EXPORT_SYMBOL(ve_list_head);
+EXPORT_SYMBOL(ve_idr);
 
 int vz_security_family_check(struct net *net, int family)
 {
@@ -627,7 +624,6 @@ static struct cgroup_subsys_state *ve_create(struct cgroup 
*cg)
        init_rwsem(&ve->op_sem);
        mutex_init(&ve->sync_mutex);
        INIT_LIST_HEAD(&ve->devices);
-       INIT_LIST_HEAD(&ve->ve_list);
        INIT_LIST_HEAD(&ve->devmnt_list);
        mutex_init(&ve->devmnt_mutex);
        kmapset_init_key(&ve->ve_sysfs_perms);
@@ -1201,7 +1197,7 @@ EXPORT_SYMBOL(ve_subsys);
 static int __init ve_subsys_init(void)
 {
        ve_cachep = KMEM_CACHE(ve_struct, SLAB_PANIC);
-       list_add(&ve0.ve_list, &ve_list_head);
+       WARN_ON(idr_alloc(&ve_idr, &ve0, 0, 1, GFP_KERNEL) < 0);
        return 0;
 }
 late_initcall(ve_subsys_init);
diff --git a/kernel/ve/vecalls.c b/kernel/ve/vecalls.c
index 9e86615..48c64d2 100644
--- a/kernel/ve/vecalls.c
+++ b/kernel/ve/vecalls.c
@@ -713,8 +713,7 @@ int real_ve_dev_map(envid_t veid, int op, char *dev_name)
 
 static int vestat_seq_show(struct seq_file *m, void *v)
 {
-       struct list_head *entry;
-       struct ve_struct *ve;
+       struct ve_struct *ve = v;
        struct ve_struct *curve;
        int ret;
        unsigned long user_ve, nice_ve, system_ve;
@@ -722,11 +721,8 @@ static int vestat_seq_show(struct seq_file *m, void *v)
        u64 uptime_cycles, idle_time, strv_time, used;
        struct kernel_cpustat kstat;
 
-       entry = (struct list_head *)v;
-       ve = list_entry(entry, struct ve_struct, ve_list);
-
        curve = get_exec_env();
-       if (entry == ve_list_head.next ||
+       if (ve == get_ve0() ||
            (!ve_is_super(curve) && ve == curve)) {
                /* print header */
                seq_printf(m, "%-*s\n",
@@ -772,26 +768,24 @@ static int vestat_seq_show(struct seq_file *m, void *v)
 
 void *ve_seq_start(struct seq_file *m, loff_t *pos)
 {
-       struct ve_struct *curve;
-
-       curve = get_exec_env();
        mutex_lock(&ve_list_lock);
-       if (!ve_is_super(curve)) {
-               if (*pos != 0)
-                       return NULL;
-               return &curve->ve_list;
-       }
 
-       return seq_list_start(&ve_list_head, *pos);
+       return ve_seq_next(m, NULL, pos);
 }
 EXPORT_SYMBOL(ve_seq_start);
 
 void *ve_seq_next(struct seq_file *m, void *v, loff_t *pos)
 {
-       if (!ve_is_super(get_exec_env()))
-               return NULL;
-       else
-               return seq_list_next(v, &ve_list_head, pos);
+       struct ve_struct *ve = get_exec_env();
+       int id = *pos;
+
+       if (!ve_is_super(ve))
+               return *pos ? NULL : ve;
+
+       ve = idr_get_next(&ve_idr, &id);
+       *pos = id + 1;
+
+       return ve;
 }
 EXPORT_SYMBOL(ve_seq_next);
 
@@ -822,7 +816,7 @@ static struct file_operations proc_vestat_operations = {
 
 static int devperms_seq_show(struct seq_file *m, void *v)
 {
-       struct ve_struct *ve = list_entry(v, struct ve_struct, ve_list);
+       struct ve_struct *ve = v;
 
        if (m->private == (void *)0) {
                seq_printf(m, "Version: 2.7\n");
@@ -894,10 +888,8 @@ EXPORT_SYMBOL(vzmon_unregister_veaddr_print_cb);
 
 static int veinfo_seq_show(struct seq_file *m, void *v)
 {
-       struct ve_struct *ve;
        ve_seq_print_t veaddr_seq_print;
-
-       ve = list_entry((struct list_head *)v, struct ve_struct, ve_list);
+       struct ve_struct *ve = v;
 
        seq_printf(m, "%10s %5u %5u", ve_name(ve), ve->class_id, 
nr_threads_ve(ve));
 
diff --git a/kernel/ve/vzlist.c b/kernel/ve/vzlist.c
index 31362ea..39966eb 100644
--- a/kernel/ve/vzlist.c
+++ b/kernel/ve/vzlist.c
@@ -25,7 +25,7 @@ static DEFINE_SEMAPHORE(vzlist_sem);
 static int get_veids(struct vzlist_veidctl *s)
 {
        int ret;
-       int ves;
+       int ves, id;
        unsigned long size;
        envid_t *buf;
        struct ve_struct *ve;
@@ -44,7 +44,7 @@ static int get_veids(struct vzlist_veidctl *s)
 
        ves = 0;
        mutex_lock(&ve_list_lock);
-       for_each_ve(ve) {
+       idr_for_each_entry(&ve_idr, ve, id) {
                if (size >= (ves + 1)*sizeof(envid_t))
                        buf[ves] = ve->veid;
                ves++;
diff --git a/kernel/ve/vzstat.c b/kernel/ve/vzstat.c
index 650010d..1382763 100644
--- a/kernel/ve/vzstat.c
+++ b/kernel/ve/vzstat.c
@@ -302,12 +302,14 @@ static void mem_avg_show(struct seq_file *m, void *v)
 static void update_venum(void)
 {
        struct ve_struct *ve;
+       int id;
 
        mutex_lock(&ve_list_lock);
        spin_lock_irq(&kstat_glb_lock);
-       for_each_ve(ve)
+       idr_for_each_entry(&ve_idr, ve, id) {
                /* max_snap is already set in update_schedule_latency */
                KSTAT_LAT_PCPU_UPDATE(&ve->sched_lat_ve);
+       }
        spin_unlock_irq(&kstat_glb_lock);
        mutex_unlock(&ve_list_lock);
 }
_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to