work_on_cpu: use on drivers/firmware/dcdbas.c
PATCH 3/7 work_on_cpu: use on drivers/firmware/dcdbas.c
Use work_on_cpu instead of cpumask games.
Doug: note one subtle change. If we can't get to CPU 0 for some reason, the return will be -EINVAL not -EBUSY.
Doug: want me to fix this in the caller? ie:
return work_on_cpu(0, generate_smi, smi_cmd) == 0 ? 0 : -EBUSY;
Signed-off-by Rusty Russell <[email protected]>
--- drivers/firmware/dcdbas.c | 46 +++++++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 27 deletions(-)
drivers/firmware/dcdbas.c +19 -27
@@ -237,31 +237,9 @@ static ssize_t host_control_on_shutdown_return count; } -/** -* smi_request: generate SMI request -* -* Called with smi_data_lock. -*/ -static int smi_request (struct smi_cmd *smi_cmd) +static long generate_smi (void *_smi_cmd) { -cpumask_t old_mask; -int ret =0 ; - -if (smi_cmd->magic !=SMI_CMD_MAGIC ) { -dev_info (&dcdbas_pdev->dev,"%s: invalid magic value\n" , - __func__); -return -EBADR ; - } - -/* SMI requires CPU 0 */ - old_mask = current->cpus_allowed; -set_cpus_allowed_ptr (current, &cpumask_of_cpu (0 )); -if (smp_processor_id () !=0 ) { -dev_dbg (&dcdbas_pdev->dev,"%s: failed to get CPU 0\n" , - __func__); - ret = -EBUSY ; - goto out; - } +struct smi_cmd *smi_cmd = _smi_cmd;/* generate SMI */ asm volatile (
@@ -273,10 +251,24 @@ static int smi_request(struct smi_cmd *s "c" (smi_cmd->ecx) : "memory" ); +return 0 ; +} -out: -set_cpus_allowed_ptr (current, &old_mask); -return ret; +/** +* smi_request: generate SMI request +* +* Called with smi_data_lock. +*/ +static int smi_request (struct smi_cmd *smi_cmd) +{ +if (smi_cmd->magic !=SMI_CMD_MAGIC ) { +dev_info (&dcdbas_pdev->dev,"%s: invalid magic value\n" , + __func__); +return -EBADR ; + } + +/* SMI requires CPU 0 */ +return work_on_cpu (0 , generate_smi, smi_cmd); }/**