[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] cpupool: Fix __cpupool_find_by_id(), clean up accessor functions.
# HG changeset patch # User Keir Fraser <keir@xxxxxxx> # Date 1297241623 0 # Node ID 8ef21ac0b464f244f7d72f768436a1137ddb8aeb # Parent fc986c1314bc8d061aa9f0bebc0eb40624089d4b cpupool: Fix __cpupool_find_by_id(), clean up accessor functions. Firstly, __cpupool_find_by_id() would dereference NULL, at the end of an exact search if the search loop exited with *q==NULL. Fix this. Secondly, provide suitable accessor functions so that no caller needs to use the __-prefixed versions which take a boolean flag. Signed-off-by: Keir Fraser <keir@xxxxxxx> --- xen/common/cpupool.c | 26 ++++++++++++++++++-------- 1 files changed, 18 insertions(+), 8 deletions(-) diff -r fc986c1314bc -r 8ef21ac0b464 xen/common/cpupool.c --- a/xen/common/cpupool.c Wed Feb 09 08:44:38 2011 +0000 +++ b/xen/common/cpupool.c Wed Feb 09 08:53:43 2011 +0000 @@ -53,7 +53,7 @@ static void free_cpupool_struct(struct c * the searched id is returned * returns NULL if not found. */ -static struct cpupool *cpupool_find_by_id(int id, int exact) +static struct cpupool *__cpupool_find_by_id(int id, int exact) { struct cpupool **q; @@ -63,14 +63,19 @@ static struct cpupool *cpupool_find_by_i if ( (*q)->cpupool_id >= id ) break; - return (!exact || ((*q)->cpupool_id == id)) ? *q : NULL; + return (!exact || (*q == NULL) || ((*q)->cpupool_id == id)) ? *q : NULL; +} + +static struct cpupool *cpupool_find_by_id(int poolid) +{ + return __cpupool_find_by_id(poolid, 1); } static struct cpupool *__cpupool_get_by_id(int poolid, int exact) { struct cpupool *c; spin_lock(&cpupool_lock); - c = cpupool_find_by_id(poolid, exact); + c = __cpupool_find_by_id(poolid, exact); if ( c != NULL ) atomic_inc(&c->refcnt); spin_unlock(&cpupool_lock); @@ -80,6 +85,11 @@ struct cpupool *cpupool_get_by_id(int po struct cpupool *cpupool_get_by_id(int poolid) { return __cpupool_get_by_id(poolid, 1); +} + +static struct cpupool *cpupool_get_next_by_id(int poolid) +{ + return __cpupool_get_by_id(poolid, 0); } void cpupool_put(struct cpupool *pool) @@ -351,7 +361,7 @@ int cpupool_add_domain(struct domain *d, if ( poolid == CPUPOOLID_NONE ) return 0; spin_lock(&cpupool_lock); - c = cpupool_find_by_id(poolid, 1); + c = cpupool_find_by_id(poolid); if ( (c != NULL) && cpus_weight(c->cpu_valid) ) { c->n_dom++; @@ -457,7 +467,7 @@ int cpupool_do_sysctl(struct xen_sysctl_ case XEN_SYSCTL_CPUPOOL_OP_INFO: { - c = __cpupool_get_by_id(op->cpupool_id, 0); + c = cpupool_get_next_by_id(op->cpupool_id); ret = -ENOENT; if ( c == NULL ) break; @@ -485,7 +495,7 @@ int cpupool_do_sysctl(struct xen_sysctl_ ret = -EBUSY; if ( !cpu_isset(cpu, cpupool_free_cpus) ) goto addcpu_out; - c = cpupool_find_by_id(op->cpupool_id, 1); + c = cpupool_find_by_id(op->cpupool_id); ret = -ENOENT; if ( c == NULL ) goto addcpu_out; @@ -501,7 +511,7 @@ int cpupool_do_sysctl(struct xen_sysctl_ { unsigned cpu; - c = __cpupool_get_by_id(op->cpupool_id, 1); + c = cpupool_get_by_id(op->cpupool_id); ret = -ENOENT; if ( c == NULL ) break; @@ -540,7 +550,7 @@ int cpupool_do_sysctl(struct xen_sysctl_ d->domain_id, op->cpupool_id); ret = -ENOENT; spin_lock(&cpupool_lock); - c = cpupool_find_by_id(op->cpupool_id, 1); + c = cpupool_find_by_id(op->cpupool_id); if ( (c != NULL) && cpus_weight(c->cpu_valid) ) { d->cpupool->n_dom--; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |