Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7503bfba authored by Mike Travis's avatar Mike Travis Committed by Ingo Molnar
Browse files

cpumask: use work_on_cpu in acpi-cpufreq.c for drv_read and drv_write



Impact: use new cpumask API to reduce stack usage

Replace the saving of current->cpus_allowed and set_cpus_allowed_ptr() with
a work_on_cpu function for drv_read() and drv_write().

Basically converts do_drv_{read,write} into "work_on_cpu" functions that
are now called by drv_read and drv_write.

Signed-off-by: default avatarMike Travis <travis@sgi.com>
Acked-by: default avatarRusty Russell <rusty@rustcorp.com.au>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 4d8bb537
Loading
Loading
Loading
Loading
+13 −12
Original line number Original line Diff line number Diff line
@@ -150,8 +150,9 @@ struct drv_cmd {
	u32 val;
	u32 val;
};
};


static void do_drv_read(struct drv_cmd *cmd)
static long do_drv_read(void *_cmd)
{
{
	struct drv_cmd *cmd = _cmd;
	u32 h;
	u32 h;


	switch (cmd->type) {
	switch (cmd->type) {
@@ -166,10 +167,12 @@ static void do_drv_read(struct drv_cmd *cmd)
	default:
	default:
		break;
		break;
	}
	}
	return 0;
}
}


static void do_drv_write(struct drv_cmd *cmd)
static long do_drv_write(void *_cmd)
{
{
	struct drv_cmd *cmd = _cmd;
	u32 lo, hi;
	u32 lo, hi;


	switch (cmd->type) {
	switch (cmd->type) {
@@ -186,30 +189,23 @@ static void do_drv_write(struct drv_cmd *cmd)
	default:
	default:
		break;
		break;
	}
	}
	return 0;
}
}


static void drv_read(struct drv_cmd *cmd)
static void drv_read(struct drv_cmd *cmd)
{
{
	cpumask_t saved_mask = current->cpus_allowed;
	cmd->val = 0;
	cmd->val = 0;


	set_cpus_allowed_ptr(current, cmd->mask);
	work_on_cpu(cpumask_any(cmd->mask), do_drv_read, cmd);
	do_drv_read(cmd);
	set_cpus_allowed_ptr(current, &saved_mask);
}
}


static void drv_write(struct drv_cmd *cmd)
static void drv_write(struct drv_cmd *cmd)
{
{
	cpumask_t saved_mask = current->cpus_allowed;
	unsigned int i;
	unsigned int i;


	for_each_cpu(i, cmd->mask) {
	for_each_cpu(i, cmd->mask) {
		set_cpus_allowed_ptr(current, cpumask_of(i));
		work_on_cpu(i, do_drv_write, cmd);
		do_drv_write(cmd);
	}
	}

	set_cpus_allowed_ptr(current, &saved_mask);
	return;
}
}


static u32 get_cur_val(const struct cpumask *mask)
static u32 get_cur_val(const struct cpumask *mask)
@@ -235,10 +231,15 @@ static u32 get_cur_val(const struct cpumask *mask)
		return 0;
		return 0;
	}
	}


	if (unlikely(!alloc_cpumask_var(&cmd.mask, GFP_KERNEL)))
		return 0;

	cpumask_copy(cmd.mask, mask);
	cpumask_copy(cmd.mask, mask);


	drv_read(&cmd);
	drv_read(&cmd);


	free_cpumask_var(cmd.mask);

	dprintk("get_cur_val = %u\n", cmd.val);
	dprintk("get_cur_val = %u\n", cmd.val);


	return cmd.val;
	return cmd.val;