diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/char/ipmi/ipmi_msghandler.c | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index 0c81652eaba6..ed75e96d0035 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c | |||
@@ -2747,16 +2747,13 @@ static struct timer_list ipmi_timer; | |||
2747 | the queue and this silliness can go away. */ | 2747 | the queue and this silliness can go away. */ |
2748 | #define IPMI_REQUEST_EV_TIME (1000 / (IPMI_TIMEOUT_TIME)) | 2748 | #define IPMI_REQUEST_EV_TIME (1000 / (IPMI_TIMEOUT_TIME)) |
2749 | 2749 | ||
2750 | static volatile int stop_operation = 0; | 2750 | static atomic_t stop_operation; |
2751 | static volatile int timer_stopped = 0; | ||
2752 | static unsigned int ticks_to_req_ev = IPMI_REQUEST_EV_TIME; | 2751 | static unsigned int ticks_to_req_ev = IPMI_REQUEST_EV_TIME; |
2753 | 2752 | ||
2754 | static void ipmi_timeout(unsigned long data) | 2753 | static void ipmi_timeout(unsigned long data) |
2755 | { | 2754 | { |
2756 | if (stop_operation) { | 2755 | if (atomic_read(&stop_operation)) |
2757 | timer_stopped = 1; | ||
2758 | return; | 2756 | return; |
2759 | } | ||
2760 | 2757 | ||
2761 | ticks_to_req_ev--; | 2758 | ticks_to_req_ev--; |
2762 | if (ticks_to_req_ev == 0) { | 2759 | if (ticks_to_req_ev == 0) { |
@@ -2766,8 +2763,7 @@ static void ipmi_timeout(unsigned long data) | |||
2766 | 2763 | ||
2767 | ipmi_timeout_handler(IPMI_TIMEOUT_TIME); | 2764 | ipmi_timeout_handler(IPMI_TIMEOUT_TIME); |
2768 | 2765 | ||
2769 | ipmi_timer.expires += IPMI_TIMEOUT_JIFFIES; | 2766 | mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES); |
2770 | add_timer(&ipmi_timer); | ||
2771 | } | 2767 | } |
2772 | 2768 | ||
2773 | 2769 | ||
@@ -3130,11 +3126,8 @@ static __exit void cleanup_ipmi(void) | |||
3130 | 3126 | ||
3131 | /* Tell the timer to stop, then wait for it to stop. This avoids | 3127 | /* Tell the timer to stop, then wait for it to stop. This avoids |
3132 | problems with race conditions removing the timer here. */ | 3128 | problems with race conditions removing the timer here. */ |
3133 | stop_operation = 1; | 3129 | atomic_inc(&stop_operation); |
3134 | while (!timer_stopped) { | 3130 | del_timer_sync(&ipmi_timer); |
3135 | set_current_state(TASK_UNINTERRUPTIBLE); | ||
3136 | schedule_timeout(1); | ||
3137 | } | ||
3138 | 3131 | ||
3139 | remove_proc_entry(proc_ipmi_root->name, &proc_root); | 3132 | remove_proc_entry(proc_ipmi_root->name, &proc_root); |
3140 | 3133 | ||