diff options
| author | Corey Minyard <cminyard@mvista.com> | 2012-03-28 17:42:50 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-28 20:14:36 -0400 |
| commit | f60adf42ad55405d1b17e9e5c33fdb63f1eb8861 (patch) | |
| tree | b4a7689884c8ee44dc21656ab03b74f56877c672 /drivers/char | |
| parent | 895dcfd1cab84d7e1c22af645a7f2f3c9bb5f24e (diff) | |
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>
Diffstat (limited to 'drivers/char')
| -rw-r--r-- | drivers/char/ipmi/ipmi_si_intf.c | 54 |
1 files changed, 21 insertions, 33 deletions
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 01e53cd105dd..3c7e693018d9 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
| @@ -171,7 +171,6 @@ struct smi_info { | |||
| 171 | struct si_sm_handlers *handlers; | 171 | struct si_sm_handlers *handlers; |
| 172 | enum si_type si_type; | 172 | enum si_type si_type; |
| 173 | spinlock_t si_lock; | 173 | spinlock_t si_lock; |
| 174 | spinlock_t msg_lock; | ||
| 175 | struct list_head xmit_msgs; | 174 | struct list_head xmit_msgs; |
| 176 | struct list_head hp_xmit_msgs; | 175 | struct list_head hp_xmit_msgs; |
| 177 | struct ipmi_smi_msg *curr_msg; | 176 | struct ipmi_smi_msg *curr_msg; |
| @@ -350,13 +349,6 @@ static enum si_sm_result start_next_msg(struct smi_info *smi_info) | |||
| 350 | struct timeval t; | 349 | struct timeval t; |
| 351 | #endif | 350 | #endif |
| 352 | 351 | ||
| 353 | /* | ||
| 354 | * No need to save flags, we aleady have interrupts off and we | ||
| 355 | * already hold the SMI lock. | ||
| 356 | */ | ||
| 357 | if (!smi_info->run_to_completion) | ||
| 358 | spin_lock(&(smi_info->msg_lock)); | ||
| 359 | |||
| 360 | /* Pick the high priority queue first. */ | 352 | /* Pick the high priority queue first. */ |
| 361 | if (!list_empty(&(smi_info->hp_xmit_msgs))) { | 353 | if (!list_empty(&(smi_info->hp_xmit_msgs))) { |
| 362 | entry = smi_info->hp_xmit_msgs.next; | 354 | entry = smi_info->hp_xmit_msgs.next; |
| @@ -394,9 +386,6 @@ static enum si_sm_result start_next_msg(struct smi_info *smi_info) | |||
| 394 | rv = SI_SM_CALL_WITHOUT_DELAY; | 386 | rv = SI_SM_CALL_WITHOUT_DELAY; |
| 395 | } | 387 | } |
| 396 | out: | 388 | out: |
| 397 | if (!smi_info->run_to_completion) | ||
| 398 | spin_unlock(&(smi_info->msg_lock)); | ||
| 399 | |||
| 400 | return rv; | 389 | return rv; |
| 401 | } | 390 | } |
| 402 | 391 | ||
| @@ -879,19 +868,6 @@ static void sender(void *send_info, | |||
| 879 | printk("**Enqueue: %d.%9.9d\n", t.tv_sec, t.tv_usec); | 868 | printk("**Enqueue: %d.%9.9d\n", t.tv_sec, t.tv_usec); |
| 880 | #endif | 869 | #endif |
| 881 | 870 | ||
| 882 | /* | ||
| 883 | * last_timeout_jiffies is updated here to avoid | ||
| 884 | * smi_timeout() handler passing very large time_diff | ||
| 885 | * value to smi_event_handler() that causes | ||
| 886 | * the send command to abort. | ||
| 887 | */ | ||
| 888 | smi_info->last_timeout_jiffies = jiffies; | ||
| 889 | |||
| 890 | mod_timer(&smi_info->si_timer, jiffies + SI_TIMEOUT_JIFFIES); | ||
| 891 | |||
| 892 | if (smi_info->thread) | ||
| 893 | wake_up_process(smi_info->thread); | ||
| 894 | |||
| 895 | if (smi_info->run_to_completion) { | 871 | if (smi_info->run_to_completion) { |
| 896 | /* | 872 | /* |
| 897 | * If we are running to completion, then throw it in | 873 | * If we are running to completion, then throw it in |
| @@ -914,15 +890,26 @@ static void sender(void *send_info, | |||
| 914 | return; | 890 | return; |
| 915 | } | 891 | } |
| 916 | 892 | ||
| 917 | spin_lock_irqsave(&smi_info->msg_lock, flags); | 893 | spin_lock_irqsave(&smi_info->si_lock, flags); |
| 918 | if (priority > 0) | 894 | if (priority > 0) |
| 919 | list_add_tail(&msg->link, &smi_info->hp_xmit_msgs); | 895 | list_add_tail(&msg->link, &smi_info->hp_xmit_msgs); |
| 920 | else | 896 | else |
| 921 | list_add_tail(&msg->link, &smi_info->xmit_msgs); | 897 | list_add_tail(&msg->link, &smi_info->xmit_msgs); |
| 922 | spin_unlock_irqrestore(&smi_info->msg_lock, flags); | ||
| 923 | 898 | ||
| 924 | spin_lock_irqsave(&smi_info->si_lock, flags); | ||
| 925 | if (smi_info->si_state == SI_NORMAL && smi_info->curr_msg == NULL) { | 899 | if (smi_info->si_state == SI_NORMAL && smi_info->curr_msg == NULL) { |
| 900 | /* | ||
| 901 | * last_timeout_jiffies is updated here to avoid | ||
| 902 | * smi_timeout() handler passing very large time_diff | ||
| 903 | * value to smi_event_handler() that causes | ||
| 904 | * the send command to abort. | ||
| 905 | */ | ||
| 906 | smi_info->last_timeout_jiffies = jiffies; | ||
| 907 | |||
| 908 | mod_timer(&smi_info->si_timer, jiffies + SI_TIMEOUT_JIFFIES); | ||
| 909 | |||
| 910 | if (smi_info->thread) | ||
| 911 | wake_up_process(smi_info->thread); | ||
| 912 | |||
| 926 | start_next_msg(smi_info); | 913 | start_next_msg(smi_info); |
| 927 | smi_event_handler(smi_info, 0); | 914 | smi_event_handler(smi_info, 0); |
| 928 | } | 915 | } |
| @@ -1026,16 +1013,19 @@ static int ipmi_thread(void *data) | |||
| 1026 | static void poll(void *send_info) | 1013 | static void poll(void *send_info) |
| 1027 | { | 1014 | { |
| 1028 | struct smi_info *smi_info = send_info; | 1015 | struct smi_info *smi_info = send_info; |
| 1029 | unsigned long flags; | 1016 | unsigned long flags = 0; |
| 1017 | int run_to_completion = smi_info->run_to_completion; | ||
| 1030 | 1018 | ||
| 1031 | /* | 1019 | /* |
| 1032 | * Make sure there is some delay in the poll loop so we can | 1020 | * Make sure there is some delay in the poll loop so we can |
| 1033 | * drive time forward and timeout things. | 1021 | * drive time forward and timeout things. |
| 1034 | */ | 1022 | */ |
| 1035 | udelay(10); | 1023 | udelay(10); |
| 1036 | spin_lock_irqsave(&smi_info->si_lock, flags); | 1024 | if (!run_to_completion) |
| 1025 | spin_lock_irqsave(&smi_info->si_lock, flags); | ||
| 1037 | smi_event_handler(smi_info, 10); | 1026 | smi_event_handler(smi_info, 10); |
| 1038 | spin_unlock_irqrestore(&smi_info->si_lock, flags); | 1027 | if (!run_to_completion) |
| 1028 | spin_unlock_irqrestore(&smi_info->si_lock, flags); | ||
| 1039 | } | 1029 | } |
| 1040 | 1030 | ||
| 1041 | static void request_events(void *send_info) | 1031 | static void request_events(void *send_info) |
| @@ -1672,10 +1662,8 @@ static struct smi_info *smi_info_alloc(void) | |||
| 1672 | { | 1662 | { |
| 1673 | struct smi_info *info = kzalloc(sizeof(*info), GFP_KERNEL); | 1663 | struct smi_info *info = kzalloc(sizeof(*info), GFP_KERNEL); |
| 1674 | 1664 | ||
| 1675 | if (info) { | 1665 | if (info) |
| 1676 | spin_lock_init(&info->si_lock); | 1666 | spin_lock_init(&info->si_lock); |
| 1677 | spin_lock_init(&info->msg_lock); | ||
| 1678 | } | ||
| 1679 | return info; | 1667 | return info; |
| 1680 | } | 1668 | } |
| 1681 | 1669 | ||
