Skip to content

Commit

Permalink
padata: Rearrange set_cpumask functions
Browse files Browse the repository at this point in the history
padata_set_cpumask needs to be protected by a lock. We make
__padata_set_cpumasks unlocked and static. So this function
can be used by the exported and locked padata_set_cpumask and
padata_set_cpumasks functions.

Signed-off-by: Steffen Klassert <[email protected]>
Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
klassert authored and herbertx committed Jul 31, 2010
1 parent e6cc117 commit 65ff577
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 53 deletions.
6 changes: 3 additions & 3 deletions include/linux/padata.h
Original file line number Diff line number Diff line change
Expand Up @@ -178,9 +178,9 @@ extern int padata_get_cpumask(struct padata_instance *pinst,
int cpumask_type, struct cpumask *out_mask);
extern int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type,
cpumask_var_t cpumask);
extern int __padata_set_cpumasks(struct padata_instance *pinst,
cpumask_var_t pcpumask,
cpumask_var_t cbcpumask);
extern int padata_set_cpumasks(struct padata_instance *pinst,
cpumask_var_t pcpumask,
cpumask_var_t cbcpumask);
extern int padata_add_cpu(struct padata_instance *pinst, int cpu, int mask);
extern int padata_remove_cpu(struct padata_instance *pinst, int cpu, int mask);
extern int padata_start(struct padata_instance *pinst);
Expand Down
117 changes: 67 additions & 50 deletions kernel/padata.c
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,66 @@ int padata_get_cpumask(struct padata_instance *pinst,
}
EXPORT_SYMBOL(padata_get_cpumask);

static int __padata_set_cpumasks(struct padata_instance *pinst,
cpumask_var_t pcpumask,
cpumask_var_t cbcpumask)
{
int valid;
struct parallel_data *pd;

valid = padata_validate_cpumask(pinst, pcpumask);
if (!valid) {
__padata_stop(pinst);
goto out_replace;
}

valid = padata_validate_cpumask(pinst, cbcpumask);
if (!valid)
__padata_stop(pinst);

out_replace:
pd = padata_alloc_pd(pinst, pcpumask, cbcpumask);
if (!pd)
return -ENOMEM;

cpumask_copy(pinst->cpumask.pcpu, pcpumask);
cpumask_copy(pinst->cpumask.cbcpu, cbcpumask);

padata_replace(pinst, pd);

if (valid)
__padata_start(pinst);

return 0;
}

/**
* padata_set_cpumasks - Set both parallel and serial cpumasks. The first
* one is used by parallel workers and the second one
* by the wokers doing serialization.
*
* @pinst: padata instance
* @pcpumask: the cpumask to use for parallel workers
* @cbcpumask: the cpumsak to use for serial workers
*/
int padata_set_cpumasks(struct padata_instance *pinst, cpumask_var_t pcpumask,
cpumask_var_t cbcpumask)
{
int err;

mutex_lock(&pinst->lock);
get_online_cpus();

err = __padata_set_cpumasks(pinst, pcpumask, cbcpumask);

put_online_cpus();
mutex_unlock(&pinst->lock);

return err;

}
EXPORT_SYMBOL(padata_set_cpumasks);

/**
* padata_set_cpumask: Sets specified by @cpumask_type cpumask to the value
* equivalent to @cpumask.
Expand All @@ -636,6 +696,10 @@ int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type,
cpumask_var_t cpumask)
{
struct cpumask *serial_mask, *parallel_mask;
int err = -EINVAL;

mutex_lock(&pinst->lock);
get_online_cpus();

switch (cpumask_type) {
case PADATA_CPU_PARALLEL:
Expand All @@ -647,65 +711,18 @@ int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type,
serial_mask = cpumask;
break;
default:
return -EINVAL;
goto out;
}

return __padata_set_cpumasks(pinst, parallel_mask, serial_mask);
}
EXPORT_SYMBOL(padata_set_cpumask);

/**
* __padata_set_cpumasks - Set both parallel and serial cpumasks. The first
* one is used by parallel workers and the second one
* by the wokers doing serialization.
*
* @pinst: padata instance
* @pcpumask: the cpumask to use for parallel workers
* @cbcpumask: the cpumsak to use for serial workers
*/
int __padata_set_cpumasks(struct padata_instance *pinst,
cpumask_var_t pcpumask, cpumask_var_t cbcpumask)
{
int valid;
int err = 0;
struct parallel_data *pd = NULL;

mutex_lock(&pinst->lock);
get_online_cpus();

valid = padata_validate_cpumask(pinst, pcpumask);
if (!valid) {
__padata_stop(pinst);
goto out_replace;
}

valid = padata_validate_cpumask(pinst, cbcpumask);
if (!valid)
__padata_stop(pinst);

out_replace:
pd = padata_alloc_pd(pinst, pcpumask, cbcpumask);
if (!pd) {
err = -ENOMEM;
goto out;
}

cpumask_copy(pinst->cpumask.pcpu, pcpumask);
cpumask_copy(pinst->cpumask.cbcpu, cbcpumask);

padata_replace(pinst, pd);

if (valid)
__padata_start(pinst);
err = __padata_set_cpumasks(pinst, parallel_mask, serial_mask);

out:
put_online_cpus();
mutex_unlock(&pinst->lock);

return err;

}
EXPORT_SYMBOL(__padata_set_cpumasks);
EXPORT_SYMBOL(padata_set_cpumask);

static int __padata_add_cpu(struct padata_instance *pinst, int cpu)
{
Expand Down

0 comments on commit 65ff577

Please sign in to comment.