Messages in this thread | | | Subject | Re: [PATCH v5 5/6] dcdbas: make use of smp_call_on_cpu() | From | Juergen Gross <> | Date | Wed, 15 Jun 2016 13:19:29 +0200 |
| |
On 06/04/16 16:17, Juergen Gross wrote: > Use smp_call_on_cpu() to raise SMI on cpu 0. > Make call secure by adding get_online_cpus() to avoid e.g. suspend > resume cycles in between. > > Signed-off-by: Juergen Gross <jgross@suse.com>
Could please some maintainer comment on this patch?
Juergen
> --- > V4: add call to get_online_cpus() > --- > drivers/firmware/dcdbas.c | 51 ++++++++++++++++++++++++----------------------- > 1 file changed, 26 insertions(+), 25 deletions(-) > > diff --git a/drivers/firmware/dcdbas.c b/drivers/firmware/dcdbas.c > index 829eec8..2fe1a13 100644 > --- a/drivers/firmware/dcdbas.c > +++ b/drivers/firmware/dcdbas.c > @@ -23,6 +23,7 @@ > #include <linux/platform_device.h> > #include <linux/dma-mapping.h> > #include <linux/errno.h> > +#include <linux/cpu.h> > #include <linux/gfp.h> > #include <linux/init.h> > #include <linux/kernel.h> > @@ -238,33 +239,14 @@ static ssize_t host_control_on_shutdown_store(struct device *dev, > return count; > } > > -/** > - * dcdbas_smi_request: generate SMI request > - * > - * Called with smi_data_lock. > - */ > -int dcdbas_smi_request(struct smi_cmd *smi_cmd) > +static int raise_smi(void *par) > { > - cpumask_var_t old_mask; > - int ret = 0; > + struct smi_cmd *smi_cmd = par; > > - if (smi_cmd->magic != SMI_CMD_MAGIC) { > - dev_info(&dcdbas_pdev->dev, "%s: invalid magic value\n", > - __func__); > - return -EBADR; > - } > - > - /* SMI requires CPU 0 */ > - if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) > - return -ENOMEM; > - > - cpumask_copy(old_mask, ¤t->cpus_allowed); > - set_cpus_allowed_ptr(current, cpumask_of(0)); > if (smp_processor_id() != 0) { > dev_dbg(&dcdbas_pdev->dev, "%s: failed to get CPU 0\n", > __func__); > - ret = -EBUSY; > - goto out; > + return -EBUSY; > } > > /* generate SMI */ > @@ -280,9 +262,28 @@ int dcdbas_smi_request(struct smi_cmd *smi_cmd) > : "memory" > ); > > -out: > - set_cpus_allowed_ptr(current, old_mask); > - free_cpumask_var(old_mask); > + return 0; > +} > +/** > + * dcdbas_smi_request: generate SMI request > + * > + * Called with smi_data_lock. > + */ > +int dcdbas_smi_request(struct smi_cmd *smi_cmd) > +{ > + int ret; > + > + if (smi_cmd->magic != SMI_CMD_MAGIC) { > + dev_info(&dcdbas_pdev->dev, "%s: invalid magic value\n", > + __func__); > + return -EBADR; > + } > + > + /* SMI requires CPU 0 */ > + get_online_cpus(); > + ret = smp_call_on_cpu(0, raise_smi, smi_cmd, true); > + put_online_cpus(); > + > return ret; > } > >
| |