From mboxrd@z Thu Jan 1 00:00:00 1970 From: Juergen Gross Subject: Re: [PATCH v5 5/6] dcdbas: make use of smp_call_on_cpu() Date: Wed, 15 Jun 2016 13:19:29 +0200 Message-ID: <576139C1.4030301__39053.4619139091$1465989601$gmane$org@suse.com> References: <1459952266-3687-1-git-send-email-jgross@suse.com> <1459952266-3687-6-git-send-email-jgross@suse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1459952266-3687-6-git-send-email-jgross@suse.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: virtualization-bounces@lists.linux-foundation.org Errors-To: virtualization-bounces@lists.linux-foundation.org To: linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org Cc: jeremy@goop.org, jdelvare@suse.com, peterz@infradead.org, hpa@zytor.com, akataria@vmware.com, x86@kernel.org, virtualization@lists.linux-foundation.org, chrisw@sous-sol.org, mingo@redhat.com, david.vrabel@citrix.com, Douglas_Warzecha@dell.com, pali.rohar@gmail.com, boris.ostrovsky@oracle.com, tglx@linutronix.de, linux@roeck-us.net List-Id: virtualization@lists.linuxfoundation.org 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 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 > #include > #include > +#include > #include > #include > #include > @@ -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; > } > >