All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tejun Heo <tj@kernel.org>
To: Jiri Kosina <jkosina@suse.cz>, "H. Peter Anvin" <hpa@zytor.com>
Cc: x86@kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH] x86, apm: Make on_cpu0() use workqueue instead of work_on_cpu()
Date: Thu, 23 Aug 2012 18:11:34 -0700	[thread overview]
Message-ID: <20120824011134.GB21325@google.com> (raw)

Make APM schedule a work item on CPU0 instead of using the expensive
work_on_cpu(); hopefully, this is the last user of work_on_cpu() and
we can take out work_on_cpu() in not too distant future.

Tested both paths.  Seems to work fine.

Signed-off-by: Tejun Heo <tj@kernel.org>
---
 arch/x86/kernel/apm_32.c |   31 +++++++++++++++++++++++--------
 1 file changed, 23 insertions(+), 8 deletions(-)

diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c
index d65464e..2bdb8c4 100644
--- a/arch/x86/kernel/apm_32.c
+++ b/arch/x86/kernel/apm_32.c
@@ -605,28 +605,43 @@ static long __apm_bios_call(void *_call)
 	return call->eax & 0xff;
 }
 
+struct on_cpu0_arg {
+	struct work_struct	work;
+	long			(*fn)(void *);
+	struct apm_bios_call	*call;
+	int			ret;
+};
+
+static void on_cpu0_workfn(struct work_struct *work)
+{
+	struct on_cpu0_arg *arg = container_of(work, struct on_cpu0_arg, work);
+
+	arg->ret = arg->fn(arg->call);
+}
+
 /* Run __apm_bios_call or __apm_bios_call_simple on CPU 0 */
 static int on_cpu0(long (*fn)(void *), struct apm_bios_call *call)
 {
-	int ret;
+	struct on_cpu0_arg arg = { .fn = fn, .call = call };
 
-	/* Don't bother with work_on_cpu in the common case, so we don't
-	 * have to worry about OOM or overhead. */
+	/* directly invoke on_cpu0_workfn() in the common case */
 	if (get_cpu() == 0) {
-		ret = fn(call);
+		on_cpu0_workfn(&arg.work);
 		put_cpu();
 	} else {
 		put_cpu();
-		ret = work_on_cpu(0, fn, call);
+		INIT_WORK_ONSTACK(&arg.work, on_cpu0_workfn);
+		schedule_work_on(0, &arg.work);
+		flush_work(&arg.work);
 	}
 
 	/* work_on_cpu can fail with -ENOMEM */
-	if (ret < 0)
-		call->err = ret;
+	if (arg.ret < 0)
+		call->err = arg.ret;
 	else
 		call->err = (call->eax >> 8) & 0xff;
 
-	return ret;
+	return arg.ret;
 }
 
 /**

             reply	other threads:[~2012-08-24  1:13 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-24  1:11 Tejun Heo [this message]
2012-08-28 22:57 ` [PATCH] x86, apm: Make on_cpu0() use workqueue instead of work_on_cpu() Jiri Kosina
2012-09-17 21:38   ` Tejun Heo
2012-09-18 10:19     ` Jiri Kosina

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120824011134.GB21325@google.com \
    --to=tj@kernel.org \
    --cc=hpa@zytor.com \
    --cc=jkosina@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.