diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/ipmi/ipmi_si_intf.c | 45 |
1 files changed, 15 insertions, 30 deletions
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index fa3be622ca97..ea89dca3dbb5 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include <linux/pci.h> | 52 | #include <linux/pci.h> |
53 | #include <linux/ioport.h> | 53 | #include <linux/ioport.h> |
54 | #include <linux/notifier.h> | 54 | #include <linux/notifier.h> |
55 | #include <linux/kthread.h> | ||
55 | #include <asm/irq.h> | 56 | #include <asm/irq.h> |
56 | #ifdef CONFIG_HIGH_RES_TIMERS | 57 | #ifdef CONFIG_HIGH_RES_TIMERS |
57 | #include <linux/hrtime.h> | 58 | #include <linux/hrtime.h> |
@@ -222,8 +223,7 @@ struct smi_info | |||
222 | unsigned long watchdog_pretimeouts; | 223 | unsigned long watchdog_pretimeouts; |
223 | unsigned long incoming_messages; | 224 | unsigned long incoming_messages; |
224 | 225 | ||
225 | struct completion exiting; | 226 | struct task_struct *thread; |
226 | long thread_pid; | ||
227 | }; | 227 | }; |
228 | 228 | ||
229 | static struct notifier_block *xaction_notifier_list; | 229 | static struct notifier_block *xaction_notifier_list; |
@@ -785,31 +785,22 @@ static void set_run_to_completion(void *send_info, int i_run_to_completion) | |||
785 | static int ipmi_thread(void *data) | 785 | static int ipmi_thread(void *data) |
786 | { | 786 | { |
787 | struct smi_info *smi_info = data; | 787 | struct smi_info *smi_info = data; |
788 | unsigned long flags, last=1; | 788 | unsigned long flags; |
789 | enum si_sm_result smi_result; | 789 | enum si_sm_result smi_result; |
790 | 790 | ||
791 | daemonize("kipmi%d", smi_info->intf_num); | ||
792 | allow_signal(SIGKILL); | ||
793 | set_user_nice(current, 19); | 791 | set_user_nice(current, 19); |
794 | while (!atomic_read(&smi_info->stop_operation)) { | 792 | while (!kthread_should_stop()) { |
795 | schedule_timeout(last); | ||
796 | spin_lock_irqsave(&(smi_info->si_lock), flags); | 793 | spin_lock_irqsave(&(smi_info->si_lock), flags); |
797 | smi_result=smi_event_handler(smi_info, 0); | 794 | smi_result=smi_event_handler(smi_info, 0); |
798 | spin_unlock_irqrestore(&(smi_info->si_lock), flags); | 795 | spin_unlock_irqrestore(&(smi_info->si_lock), flags); |
799 | if (smi_result == SI_SM_CALL_WITHOUT_DELAY) | 796 | if (smi_result == SI_SM_CALL_WITHOUT_DELAY) { |
800 | last = 0; | 797 | /* do nothing */ |
801 | else if (smi_result == SI_SM_CALL_WITH_DELAY) { | ||
802 | udelay(1); | ||
803 | last = 0; | ||
804 | } | ||
805 | else { | ||
806 | /* System is idle; go to sleep */ | ||
807 | last = 1; | ||
808 | current->state = TASK_INTERRUPTIBLE; | ||
809 | } | 798 | } |
799 | else if (smi_result == SI_SM_CALL_WITH_DELAY) | ||
800 | udelay(1); | ||
801 | else | ||
802 | schedule_timeout_interruptible(1); | ||
810 | } | 803 | } |
811 | smi_info->thread_pid = 0; | ||
812 | complete_and_exit(&(smi_info->exiting), 0); | ||
813 | return 0; | 804 | return 0; |
814 | } | 805 | } |
815 | 806 | ||
@@ -2212,11 +2203,8 @@ static void setup_xaction_handlers(struct smi_info *smi_info) | |||
2212 | 2203 | ||
2213 | static inline void wait_for_timer_and_thread(struct smi_info *smi_info) | 2204 | static inline void wait_for_timer_and_thread(struct smi_info *smi_info) |
2214 | { | 2205 | { |
2215 | if (smi_info->thread_pid > 0) { | 2206 | if (smi_info->thread != ERR_PTR(-ENOMEM)) |
2216 | /* wake the potentially sleeping thread */ | 2207 | kthread_stop(smi_info->thread); |
2217 | kill_proc(smi_info->thread_pid, SIGKILL, 0); | ||
2218 | wait_for_completion(&(smi_info->exiting)); | ||
2219 | } | ||
2220 | del_timer_sync(&smi_info->si_timer); | 2208 | del_timer_sync(&smi_info->si_timer); |
2221 | } | 2209 | } |
2222 | 2210 | ||
@@ -2348,12 +2336,9 @@ static int init_one_smi(int intf_num, struct smi_info **smi) | |||
2348 | new_smi->si_timer.expires = jiffies + SI_TIMEOUT_JIFFIES; | 2336 | new_smi->si_timer.expires = jiffies + SI_TIMEOUT_JIFFIES; |
2349 | 2337 | ||
2350 | add_timer(&(new_smi->si_timer)); | 2338 | add_timer(&(new_smi->si_timer)); |
2351 | if (new_smi->si_type != SI_BT) { | 2339 | if (new_smi->si_type != SI_BT) |
2352 | init_completion(&(new_smi->exiting)); | 2340 | new_smi->thread = kthread_run(ipmi_thread, new_smi, |
2353 | new_smi->thread_pid = kernel_thread(ipmi_thread, new_smi, | 2341 | "kipmi%d", new_smi->intf_num); |
2354 | CLONE_FS|CLONE_FILES| | ||
2355 | CLONE_SIGHAND); | ||
2356 | } | ||
2357 | 2342 | ||
2358 | rv = ipmi_register_smi(&handlers, | 2343 | rv = ipmi_register_smi(&handlers, |
2359 | new_smi, | 2344 | new_smi, |