ipmi: simplify locking
Now that the the IPMI driver is using a tasklet, we can simplify the locking in the driver and get rid of the message lock. Signed-off-by: Corey Minyard <cminyard@mvista.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
895dcfd1ca
Коммит
f60adf42ad
|
@ -171,7 +171,6 @@ struct smi_info {
|
||||||
struct si_sm_handlers *handlers;
|
struct si_sm_handlers *handlers;
|
||||||
enum si_type si_type;
|
enum si_type si_type;
|
||||||
spinlock_t si_lock;
|
spinlock_t si_lock;
|
||||||
spinlock_t msg_lock;
|
|
||||||
struct list_head xmit_msgs;
|
struct list_head xmit_msgs;
|
||||||
struct list_head hp_xmit_msgs;
|
struct list_head hp_xmit_msgs;
|
||||||
struct ipmi_smi_msg *curr_msg;
|
struct ipmi_smi_msg *curr_msg;
|
||||||
|
@ -350,13 +349,6 @@ static enum si_sm_result start_next_msg(struct smi_info *smi_info)
|
||||||
struct timeval t;
|
struct timeval t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* No need to save flags, we aleady have interrupts off and we
|
|
||||||
* already hold the SMI lock.
|
|
||||||
*/
|
|
||||||
if (!smi_info->run_to_completion)
|
|
||||||
spin_lock(&(smi_info->msg_lock));
|
|
||||||
|
|
||||||
/* Pick the high priority queue first. */
|
/* Pick the high priority queue first. */
|
||||||
if (!list_empty(&(smi_info->hp_xmit_msgs))) {
|
if (!list_empty(&(smi_info->hp_xmit_msgs))) {
|
||||||
entry = smi_info->hp_xmit_msgs.next;
|
entry = smi_info->hp_xmit_msgs.next;
|
||||||
|
@ -394,9 +386,6 @@ static enum si_sm_result start_next_msg(struct smi_info *smi_info)
|
||||||
rv = SI_SM_CALL_WITHOUT_DELAY;
|
rv = SI_SM_CALL_WITHOUT_DELAY;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
if (!smi_info->run_to_completion)
|
|
||||||
spin_unlock(&(smi_info->msg_lock));
|
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -879,19 +868,6 @@ static void sender(void *send_info,
|
||||||
printk("**Enqueue: %d.%9.9d\n", t.tv_sec, t.tv_usec);
|
printk("**Enqueue: %d.%9.9d\n", t.tv_sec, t.tv_usec);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* last_timeout_jiffies is updated here to avoid
|
|
||||||
* smi_timeout() handler passing very large time_diff
|
|
||||||
* value to smi_event_handler() that causes
|
|
||||||
* the send command to abort.
|
|
||||||
*/
|
|
||||||
smi_info->last_timeout_jiffies = jiffies;
|
|
||||||
|
|
||||||
mod_timer(&smi_info->si_timer, jiffies + SI_TIMEOUT_JIFFIES);
|
|
||||||
|
|
||||||
if (smi_info->thread)
|
|
||||||
wake_up_process(smi_info->thread);
|
|
||||||
|
|
||||||
if (smi_info->run_to_completion) {
|
if (smi_info->run_to_completion) {
|
||||||
/*
|
/*
|
||||||
* If we are running to completion, then throw it in
|
* If we are running to completion, then throw it in
|
||||||
|
@ -914,15 +890,26 @@ static void sender(void *send_info,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&smi_info->msg_lock, flags);
|
spin_lock_irqsave(&smi_info->si_lock, flags);
|
||||||
if (priority > 0)
|
if (priority > 0)
|
||||||
list_add_tail(&msg->link, &smi_info->hp_xmit_msgs);
|
list_add_tail(&msg->link, &smi_info->hp_xmit_msgs);
|
||||||
else
|
else
|
||||||
list_add_tail(&msg->link, &smi_info->xmit_msgs);
|
list_add_tail(&msg->link, &smi_info->xmit_msgs);
|
||||||
spin_unlock_irqrestore(&smi_info->msg_lock, flags);
|
|
||||||
|
|
||||||
spin_lock_irqsave(&smi_info->si_lock, flags);
|
|
||||||
if (smi_info->si_state == SI_NORMAL && smi_info->curr_msg == NULL) {
|
if (smi_info->si_state == SI_NORMAL && smi_info->curr_msg == NULL) {
|
||||||
|
/*
|
||||||
|
* last_timeout_jiffies is updated here to avoid
|
||||||
|
* smi_timeout() handler passing very large time_diff
|
||||||
|
* value to smi_event_handler() that causes
|
||||||
|
* the send command to abort.
|
||||||
|
*/
|
||||||
|
smi_info->last_timeout_jiffies = jiffies;
|
||||||
|
|
||||||
|
mod_timer(&smi_info->si_timer, jiffies + SI_TIMEOUT_JIFFIES);
|
||||||
|
|
||||||
|
if (smi_info->thread)
|
||||||
|
wake_up_process(smi_info->thread);
|
||||||
|
|
||||||
start_next_msg(smi_info);
|
start_next_msg(smi_info);
|
||||||
smi_event_handler(smi_info, 0);
|
smi_event_handler(smi_info, 0);
|
||||||
}
|
}
|
||||||
|
@ -1026,16 +1013,19 @@ static int ipmi_thread(void *data)
|
||||||
static void poll(void *send_info)
|
static void poll(void *send_info)
|
||||||
{
|
{
|
||||||
struct smi_info *smi_info = send_info;
|
struct smi_info *smi_info = send_info;
|
||||||
unsigned long flags;
|
unsigned long flags = 0;
|
||||||
|
int run_to_completion = smi_info->run_to_completion;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure there is some delay in the poll loop so we can
|
* Make sure there is some delay in the poll loop so we can
|
||||||
* drive time forward and timeout things.
|
* drive time forward and timeout things.
|
||||||
*/
|
*/
|
||||||
udelay(10);
|
udelay(10);
|
||||||
spin_lock_irqsave(&smi_info->si_lock, flags);
|
if (!run_to_completion)
|
||||||
|
spin_lock_irqsave(&smi_info->si_lock, flags);
|
||||||
smi_event_handler(smi_info, 10);
|
smi_event_handler(smi_info, 10);
|
||||||
spin_unlock_irqrestore(&smi_info->si_lock, flags);
|
if (!run_to_completion)
|
||||||
|
spin_unlock_irqrestore(&smi_info->si_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void request_events(void *send_info)
|
static void request_events(void *send_info)
|
||||||
|
@ -1672,10 +1662,8 @@ static struct smi_info *smi_info_alloc(void)
|
||||||
{
|
{
|
||||||
struct smi_info *info = kzalloc(sizeof(*info), GFP_KERNEL);
|
struct smi_info *info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||||
|
|
||||||
if (info) {
|
if (info)
|
||||||
spin_lock_init(&info->si_lock);
|
spin_lock_init(&info->si_lock);
|
||||||
spin_lock_init(&info->msg_lock);
|
|
||||||
}
|
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче