From: Martin Wilck <martin.wilck@ts.fujitsu.com>
To: Corey Minyard <minyard@acm.org>
Cc: Greg KH <greg@kroah.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"openipmi-developer@lists.sourceforge.net"
<openipmi-developer@lists.sourceforge.net>,
Bela Lubkin <blubkin@vmware.com>
Subject: [PATCH] limit CPU time spent in kipmid (version 4)
Date: Thu, 04 Jun 2009 20:39:59 +0200 [thread overview]
Message-ID: <4A2814FF.4020400@ts.fujitsu.com> (raw)
In-Reply-To: <49DA0829.20504@ts.fujitsu.com>
[-- Attachment #1: Type: text/plain, Size: 872 bytes --]
Hi all,
I am sorry for the long silence. I am sending here a new version of my
patch which takes into account Bela's suggestions (well, most of them).
I compiled and tested it with 2.6.29.4, the results are similar as
before. By setting kipmid_max_busy_us to a value between 100 and 500, it
is possible to bring down kipmid CPU load to practically 0 without
loosing too much ipmi throughput performance.
Please give me some feedback whether this patch will get merged, and if
not, what improvement is needed.
Regards
Martin
--
Dr. Martin Wilck
PRIMERGY System Software Engineer
x86 Server Engineering
Fujitsu Technology Solutions GmbH
Heinz-Nixdorf-Ring 1
33106 Paderborn, Germany
Phone: ++49 5251 525 2796
Fax: ++49 5251 525 2820
Email: martin.wilck@ts.fujitsu.com
Internet: http://ts.fujitsu.com
Company Details: http://de.ts.fujitsu.com/imprint.html
[-- Attachment #2: kipmid_max_busy_arr2_2.6.29.diff --]
[-- Type: text/x-patch, Size: 2755 bytes --]
Signed-off-by: martin.wilck@ts.fujitsu.com
--- linux-2.6.29.4/drivers/char/ipmi/ipmi_si_intf.c 2009-05-19 01:52:34.000000000 +0200
+++ linux-2.6.29-rc8/drivers/char/ipmi/ipmi_si_intf.c 2009-06-04 15:30:34.855398091 +0200
@@ -297,6 +297,9 @@
static int force_kipmid[SI_MAX_PARMS];
static int num_force_kipmid;
+static unsigned int kipmid_max_busy_us[SI_MAX_PARMS];
+static int num_max_busy_us;
+
static int unload_when_empty = 1;
static int try_smi_init(struct smi_info *smi);
@@ -927,23 +930,56 @@
}
}
+#define ipmi_si_set_not_busy(timespec) \
+ do { (timespec)->tv_nsec = -1; } while (0)
+#define ipmi_si_is_busy(timespec) ((timespec)->tv_nsec != -1)
+
+static int ipmi_thread_busy_wait(enum si_sm_result smi_result,
+ const struct smi_info *smi_info,
+ struct timespec *busy_until)
+{
+ unsigned int max_busy_us = 0;
+
+ if (smi_info->intf_num < num_max_busy_us)
+ max_busy_us = kipmid_max_busy_us[smi_info->intf_num];
+ if (max_busy_us == 0 || smi_result != SI_SM_CALL_WITH_DELAY)
+ ipmi_si_set_not_busy(busy_until);
+ else if (!ipmi_si_is_busy(busy_until)) {
+ getnstimeofday(busy_until);
+ timespec_add_ns(busy_until, max_busy_us*NSEC_PER_USEC);
+ } else {
+ struct timespec now;
+ getnstimeofday(&now);
+ if (unlikely(timespec_compare(&now, busy_until) > 0)) {
+ ipmi_si_set_not_busy(busy_until);
+ return 0;
+ }
+ }
+ return 1;
+}
+
static int ipmi_thread(void *data)
{
struct smi_info *smi_info = data;
unsigned long flags;
enum si_sm_result smi_result;
+ struct timespec busy_until;
+ ipmi_si_set_not_busy(&busy_until);
set_user_nice(current, 19);
while (!kthread_should_stop()) {
+ int busy_wait;
spin_lock_irqsave(&(smi_info->si_lock), flags);
smi_result = smi_event_handler(smi_info, 0);
spin_unlock_irqrestore(&(smi_info->si_lock), flags);
+ busy_wait = ipmi_thread_busy_wait(smi_result, smi_info,
+ &busy_until);
if (smi_result == SI_SM_CALL_WITHOUT_DELAY)
; /* do nothing */
- else if (smi_result == SI_SM_CALL_WITH_DELAY)
+ else if (smi_result == SI_SM_CALL_WITH_DELAY && busy_wait)
schedule();
else
- schedule_timeout_interruptible(1);
+ schedule_timeout_interruptible(0);
}
return 0;
}
@@ -1213,6 +1249,11 @@
MODULE_PARM_DESC(unload_when_empty, "Unload the module if no interfaces are"
" specified or found, default is 1. Setting to 0"
" is useful for hot add of devices using hotmod.");
+module_param_array(kipmid_max_busy_us, uint, &num_max_busy_us, 0644);
+MODULE_PARM_DESC(kipmid_max_busy_us,
+ "Max time (in microseconds) to busy-wait for IPMI data before"
+ " sleeping. 0 (default) means to wait forever. Set to 100-500"
+ " if kipmid is using up a lot of CPU time.");
static void std_irq_cleanup(struct smi_info *info)
next prev parent reply other threads:[~2009-06-04 18:50 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-19 16:27 [PATCH] limit CPU time spent in kipmid Martin Wilck
2009-03-19 21:31 ` Corey Minyard
2009-03-19 23:51 ` Greg KH
2009-03-20 15:30 ` Corey Minyard
2009-03-20 17:47 ` Greg KH
2009-03-20 18:28 ` Corey Minyard
2009-03-23 13:17 ` [PATCH] limit CPU time spent in kipmid (PREVIOUS WAS BROKEN) Martin Wilck
2009-03-23 15:32 ` Greg KH
2009-03-23 16:20 ` Martin Wilck
2009-03-23 20:39 ` Corey Minyard
2009-03-24 9:22 ` Martin Wilck
2009-03-24 9:30 ` Improving IPMI performance under load Martin Wilck
2009-03-24 13:08 ` [Openipmi-developer] " Corey Minyard
2009-03-24 13:21 ` Martin Wilck
2009-03-24 15:50 ` Matt Domsch
2009-03-24 17:15 ` Martin Wilck
2009-04-06 13:48 ` [PATCH] limit CPU time spent in kipmid (PREVIOUS WAS BROKEN) Martin Wilck
2009-06-04 18:39 ` Martin Wilck [this message]
2009-03-23 13:25 ` [PATCH] limit CPU time spent in kipmid Martin Wilck
2009-03-19 22:41 ` [Openipmi-developer] " Bela Lubkin
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=4A2814FF.4020400@ts.fujitsu.com \
--to=martin.wilck@ts.fujitsu.com \
--cc=blubkin@vmware.com \
--cc=greg@kroah.com \
--cc=linux-kernel@vger.kernel.org \
--cc=minyard@acm.org \
--cc=openipmi-developer@lists.sourceforge.net \
/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.