Commit 74221986 authored by Corey Minyard's avatar Corey Minyard
Browse files

ipmi:msghandler: Move timer handling into a work queue



Get all operations that manipulate the interface list into thread
context.

Signed-off-by: default avatarCorey Minyard <cminyard@mvista.com>
parent 305923bd
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -5083,8 +5083,11 @@ static struct timer_list ipmi_timer;

static atomic_t stop_operation;

static void ipmi_timeout(struct timer_list *unused)
static void ipmi_timeout_work(struct work_struct *work)
{
	if (atomic_read(&stop_operation))
		return;

	struct ipmi_smi *intf;
	bool need_timer = false;
	int index;
@@ -5111,6 +5114,16 @@ static void ipmi_timeout(struct timer_list *unused)
		mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES);
}

static DECLARE_WORK(ipmi_timer_work, ipmi_timeout_work);

static void ipmi_timeout(struct timer_list *unused)
{
	if (atomic_read(&stop_operation))
		return;

	queue_work(system_bh_wq, &ipmi_timer_work);
}

static void need_waiter(struct ipmi_smi *intf)
{
	/* Racy, but worst case we start the timer twice. */
@@ -5538,6 +5551,7 @@ static void __exit cleanup_ipmi(void)
		 */
		atomic_set(&stop_operation, 1);
		timer_delete_sync(&ipmi_timer);
		cancel_work_sync(&ipmi_timer_work);

		initialized = false;