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;
}
/**
next 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.