Staging: rt2870: Revert d44ca7 Removal of kernel_thread() API

Staging: rt2870: Revert d44ca7 Removal of kernel_thread() API

The sanity check this patch introduced triggers on shutdown, apparently due to
threads having already exited by the time BUG_ON() is reached.

Signed-off-by: Mike Galbraith <efault@gmx.de>
Cc: Peter Teoh <htmldeveloper@gmail.com>
Cc: stable <stable@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by Mike Galbraith and committed by Greg Kroah-Hartman 2c63abf9 4d2da07b

+68 -54
+4 -9
drivers/staging/rt2860/rt_linux.h
··· 43 #include "rtmp_type.h" 44 #include <linux/module.h> 45 #include <linux/kernel.h> 46 - #if !defined(RT2860) && !defined(RT30xx) 47 - #include <linux/kthread.h> 48 - #endif 49 50 #include <linux/spinlock.h> 51 #include <linux/init.h> ··· 163 164 #ifndef RT30xx 165 typedef struct pid * THREAD_PID; 166 - #ifdef RT2860 167 #define THREAD_PID_INIT_VALUE NULL 168 - #endif 169 #define GET_PID(_v) find_get_pid(_v) 170 #define GET_PID_NUMBER(_v) pid_nr(_v) 171 #define CHECK_PID_LEGALITY(_pid) if (pid_nr(_pid) >= 0) ··· 183 dma_addr_t pAd_pa; 184 #endif 185 #ifdef RT2870 186 - struct usb_device *pUsb_Dev; 187 188 #ifndef RT30xx 189 - struct task_struct *MLMEThr_task; 190 - struct task_struct *RTUSBCmdThr_task; 191 - struct task_struct *TimerQThr_task; 192 #endif 193 #ifdef RT30xx 194 struct pid *MLMEThr_pid;
··· 43 #include "rtmp_type.h" 44 #include <linux/module.h> 45 #include <linux/kernel.h> 46 47 #include <linux/spinlock.h> 48 #include <linux/init.h> ··· 166 167 #ifndef RT30xx 168 typedef struct pid * THREAD_PID; 169 #define THREAD_PID_INIT_VALUE NULL 170 #define GET_PID(_v) find_get_pid(_v) 171 #define GET_PID_NUMBER(_v) pid_nr(_v) 172 #define CHECK_PID_LEGALITY(_pid) if (pid_nr(_pid) >= 0) ··· 188 dma_addr_t pAd_pa; 189 #endif 190 #ifdef RT2870 191 + struct usb_device *pUsb_Dev; 192 193 #ifndef RT30xx 194 + THREAD_PID MLMEThr_pid; 195 + THREAD_PID RTUSBCmdThr_pid; 196 + THREAD_PID TimerQThr_pid; 197 #endif 198 #ifdef RT30xx 199 struct pid *MLMEThr_pid;
+45 -22
drivers/staging/rt2870/2870_main_dev.c
··· 235 DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__)); 236 237 #ifndef RT30xx 238 - pObj->MLMEThr_task = NULL; 239 #endif 240 #ifdef RT30xx 241 pObj->MLMEThr_pid = NULL; ··· 348 DBGPRINT(RT_DEBUG_TRACE,( "<---RTUSBCmdThread\n")); 349 350 #ifndef RT30xx 351 - pObj->RTUSBCmdThr_task = NULL; 352 #endif 353 #ifdef RT30xx 354 pObj->RTUSBCmdThr_pid = NULL; ··· 447 DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__)); 448 449 #ifndef RT30xx 450 - pObj->TimerQThr_task = NULL; 451 #endif 452 #ifdef RT30xx 453 pObj->TimerQThr_pid = NULL; ··· 883 884 // Terminate Threads 885 #ifndef RT30xx 886 - BUG_ON(pObj->TimerQThr_task == NULL); 887 - CHECK_PID_LEGALITY(task_pid(pObj->TimerQThr_task)) 888 { 889 POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; 890 891 - printk(KERN_DEBUG "Terminate the TimerQThr pid=%d!\n", 892 - pid_nr(task_pid(pObj->TimerQThr_task))); 893 mb(); 894 pAd->TimerFunc_kill = 1; 895 mb(); 896 - kthread_stop(pObj->TimerQThr_task); 897 - pObj->TimerQThr_task = NULL; 898 } 899 900 - BUG_ON(pObj->MLMEThr_task == NULL); 901 - CHECK_PID_LEGALITY(task_pid(pObj->MLMEThr_task)) 902 { 903 - printk(KERN_DEBUG "Terminate the MLMEThr pid=%d!\n", 904 - pid_nr(task_pid(pObj->MLMEThr_task))); 905 mb(); 906 pAd->mlme_kill = 1; 907 //RT28XX_MLME_HANDLER(pAd); 908 mb(); 909 - kthread_stop(pObj->MLMEThr_task); 910 - pObj->MLMEThr_task = NULL; 911 } 912 913 - BUG_ON(pObj->RTUSBCmdThr_task == NULL); 914 - CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task)) 915 { 916 - printk(KERN_DEBUG "Terminate the RTUSBCmdThr pid=%d!\n", 917 - pid_nr(task_pid(pObj->RTUSBCmdThr_task))); 918 mb(); 919 NdisAcquireSpinLock(&pAd->CmdQLock); 920 pAd->CmdQ.CmdQState = RT2870_THREAD_STOPED; 921 NdisReleaseSpinLock(&pAd->CmdQLock); 922 mb(); 923 //RTUSBCMDUp(pAd); 924 - kthread_stop(pObj->RTUSBCmdThr_task); 925 - pObj->RTUSBCmdThr_task = NULL; 926 } 927 #endif 928 #ifdef RT30xx ··· 1068 dev_p->descriptor.idProduct == rtusb_usb_id[i].idProduct) 1069 { 1070 #ifndef RT30xx 1071 - printk(KERN_DEBUG "rt2870: idVendor = 0x%x, idProduct = 0x%x\n", 1072 #endif 1073 #ifdef RT30xx 1074 printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n",
··· 235 DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__)); 236 237 #ifndef RT30xx 238 + pObj->MLMEThr_pid = THREAD_PID_INIT_VALUE; 239 #endif 240 #ifdef RT30xx 241 pObj->MLMEThr_pid = NULL; ··· 348 DBGPRINT(RT_DEBUG_TRACE,( "<---RTUSBCmdThread\n")); 349 350 #ifndef RT30xx 351 + pObj->RTUSBCmdThr_pid = THREAD_PID_INIT_VALUE; 352 #endif 353 #ifdef RT30xx 354 pObj->RTUSBCmdThr_pid = NULL; ··· 447 DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__)); 448 449 #ifndef RT30xx 450 + pObj->TimerQThr_pid = THREAD_PID_INIT_VALUE; 451 #endif 452 #ifdef RT30xx 453 pObj->TimerQThr_pid = NULL; ··· 883 884 // Terminate Threads 885 #ifndef RT30xx 886 + CHECK_PID_LEGALITY(pObj->TimerQThr_pid) 887 { 888 POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; 889 890 + printk("Terminate the TimerQThr_pid=%d!\n", GET_PID_NUMBER(pObj->TimerQThr_pid)); 891 mb(); 892 pAd->TimerFunc_kill = 1; 893 mb(); 894 + ret = KILL_THREAD_PID(pObj->TimerQThr_pid, SIGTERM, 1); 895 + if (ret) 896 + { 897 + printk(KERN_WARNING "%s: unable to stop TimerQThread, pid=%d, ret=%d!\n", 898 + pAd->net_dev->name, GET_PID_NUMBER(pObj->TimerQThr_pid), ret); 899 + } 900 + else 901 + { 902 + wait_for_completion(&pAd->TimerQComplete); 903 + pObj->TimerQThr_pid = THREAD_PID_INIT_VALUE; 904 + } 905 } 906 907 + CHECK_PID_LEGALITY(pObj->MLMEThr_pid) 908 { 909 + printk("Terminate the MLMEThr_pid=%d!\n", GET_PID_NUMBER(pObj->MLMEThr_pid)); 910 mb(); 911 pAd->mlme_kill = 1; 912 //RT28XX_MLME_HANDLER(pAd); 913 mb(); 914 + ret = KILL_THREAD_PID(pObj->MLMEThr_pid, SIGTERM, 1); 915 + if (ret) 916 + { 917 + printk (KERN_WARNING "%s: unable to Mlme thread, pid=%d, ret=%d!\n", 918 + pAd->net_dev->name, GET_PID_NUMBER(pObj->MLMEThr_pid), ret); 919 + } 920 + else 921 + { 922 + //wait_for_completion (&pAd->notify); 923 + wait_for_completion (&pAd->mlmeComplete); 924 + pObj->MLMEThr_pid = THREAD_PID_INIT_VALUE; 925 + } 926 } 927 928 + CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid) 929 { 930 + printk("Terminate the RTUSBCmdThr_pid=%d!\n", GET_PID_NUMBER(pObj->RTUSBCmdThr_pid)); 931 mb(); 932 NdisAcquireSpinLock(&pAd->CmdQLock); 933 pAd->CmdQ.CmdQState = RT2870_THREAD_STOPED; 934 NdisReleaseSpinLock(&pAd->CmdQLock); 935 mb(); 936 //RTUSBCMDUp(pAd); 937 + ret = KILL_THREAD_PID(pObj->RTUSBCmdThr_pid, SIGTERM, 1); 938 + if (ret) 939 + { 940 + printk(KERN_WARNING "%s: unable to RTUSBCmd thread, pid=%d, ret=%d!\n", 941 + pAd->net_dev->name, GET_PID_NUMBER(pObj->RTUSBCmdThr_pid), ret); 942 + } 943 + else 944 + { 945 + //wait_for_completion (&pAd->notify); 946 + wait_for_completion (&pAd->CmdQComplete); 947 + pObj->RTUSBCmdThr_pid = THREAD_PID_INIT_VALUE; 948 + } 949 } 950 #endif 951 #ifdef RT30xx ··· 1045 dev_p->descriptor.idProduct == rtusb_usb_id[i].idProduct) 1046 { 1047 #ifndef RT30xx 1048 + printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n", 1049 #endif 1050 #ifdef RT30xx 1051 printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n",
+16 -17
drivers/staging/rt2870/common/2870_rtmp_init.c
··· 700 usb_dev = pObj->pUsb_Dev; 701 702 #ifndef RT30xx 703 - pObj->MLMEThr_task = NULL; 704 - pObj->RTUSBCmdThr_task = NULL; 705 #endif 706 #ifdef RT30xx 707 pObj->MLMEThr_pid = NULL; ··· 743 PRTMP_ADAPTER pAd = net_dev->ml_priv; 744 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; 745 #ifndef RT30xx 746 - struct task_struct *tsk; 747 #endif 748 #ifdef RT30xx 749 pid_t pid_number; ··· 762 763 // Creat MLME Thread 764 #ifndef RT30xx 765 - pObj->MLMEThr_task = NULL; 766 - tsk = kthread_run(MlmeThread, pAd, "%s", pAd->net_dev->name); 767 - 768 - if (IS_ERR(tsk)) { 769 #endif 770 #ifdef RT30xx 771 pObj->MLMEThr_pid = NULL; ··· 778 } 779 780 #ifndef RT30xx 781 - pObj->MLMEThr_task = tsk; 782 #endif 783 #ifdef RT30xx 784 pObj->MLMEThr_pid = find_get_pid(pid_number); ··· 788 789 // Creat Command Thread 790 #ifndef RT30xx 791 - pObj->RTUSBCmdThr_task = NULL; 792 - tsk = kthread_run(RTUSBCmdThread, pAd, "%s", pAd->net_dev->name); 793 - 794 - if (IS_ERR(tsk) < 0) 795 #endif 796 #ifdef RT30xx 797 pObj->RTUSBCmdThr_pid = NULL; ··· 803 } 804 805 #ifndef RT30xx 806 - pObj->RTUSBCmdThr_task = tsk; 807 #endif 808 #ifdef RT30xx 809 pObj->RTUSBCmdThr_pid = find_get_pid(pid_number); ··· 811 wait_for_completion(&(pAd->CmdQComplete)); 812 813 #ifndef RT30xx 814 - pObj->TimerQThr_task = NULL; 815 - tsk = kthread_run(TimerQThread, pAd, "%s", pAd->net_dev->name); 816 - if (IS_ERR(tsk) < 0) 817 #endif 818 #ifdef RT30xx 819 pObj->TimerQThr_pid = NULL; ··· 825 return NDIS_STATUS_FAILURE; 826 } 827 #ifndef RT30xx 828 - pObj->TimerQThr_task = tsk; 829 #endif 830 #ifdef RT30xx 831 pObj->TimerQThr_pid = find_get_pid(pid_number);
··· 700 usb_dev = pObj->pUsb_Dev; 701 702 #ifndef RT30xx 703 + pObj->MLMEThr_pid = THREAD_PID_INIT_VALUE; 704 + pObj->RTUSBCmdThr_pid = THREAD_PID_INIT_VALUE; 705 #endif 706 #ifdef RT30xx 707 pObj->MLMEThr_pid = NULL; ··· 743 PRTMP_ADAPTER pAd = net_dev->ml_priv; 744 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; 745 #ifndef RT30xx 746 + pid_t pid_number = -1; 747 #endif 748 #ifdef RT30xx 749 pid_t pid_number; ··· 762 763 // Creat MLME Thread 764 #ifndef RT30xx 765 + pObj->MLMEThr_pid= THREAD_PID_INIT_VALUE; 766 + pid_number = kernel_thread(MlmeThread, pAd, CLONE_VM); 767 + if (pid_number < 0) 768 + { 769 #endif 770 #ifdef RT30xx 771 pObj->MLMEThr_pid = NULL; ··· 778 } 779 780 #ifndef RT30xx 781 + pObj->MLMEThr_pid = GET_PID(pid_number); 782 #endif 783 #ifdef RT30xx 784 pObj->MLMEThr_pid = find_get_pid(pid_number); ··· 788 789 // Creat Command Thread 790 #ifndef RT30xx 791 + pObj->RTUSBCmdThr_pid= THREAD_PID_INIT_VALUE; 792 + pid_number = kernel_thread(RTUSBCmdThread, pAd, CLONE_VM); 793 + if (pid_number < 0) 794 #endif 795 #ifdef RT30xx 796 pObj->RTUSBCmdThr_pid = NULL; ··· 804 } 805 806 #ifndef RT30xx 807 + pObj->RTUSBCmdThr_pid = GET_PID(pid_number); 808 #endif 809 #ifdef RT30xx 810 pObj->RTUSBCmdThr_pid = find_get_pid(pid_number); ··· 812 wait_for_completion(&(pAd->CmdQComplete)); 813 814 #ifndef RT30xx 815 + pObj->TimerQThr_pid= THREAD_PID_INIT_VALUE; 816 + pid_number = kernel_thread(TimerQThread, pAd, CLONE_VM); 817 + if (pid_number < 0) 818 #endif 819 #ifdef RT30xx 820 pObj->TimerQThr_pid = NULL; ··· 826 return NDIS_STATUS_FAILURE; 827 } 828 #ifndef RT30xx 829 + pObj->TimerQThr_pid = GET_PID(pid_number); 830 #endif 831 #ifdef RT30xx 832 pObj->TimerQThr_pid = find_get_pid(pid_number);
+1 -2
drivers/staging/rt2870/common/rtusb_io.c
··· 984 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; 985 986 #ifndef RT30xx 987 - BUG_ON(pObj->RTUSBCmdThr_task == NULL); 988 - CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task)) 989 #endif 990 #ifdef RT30xx 991 if (pObj->RTUSBCmdThr_pid < 0)
··· 984 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; 985 986 #ifndef RT30xx 987 + CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid) 988 #endif 989 #ifdef RT30xx 990 if (pObj->RTUSBCmdThr_pid < 0)
+2 -4
drivers/staging/rt2870/rt2870.h
··· 590 #define RTUSBMlmeUp(pAd) \ 591 { \ 592 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \ 593 - BUG_ON(pObj->MLMEThr_task == NULL); \ 594 - CHECK_PID_LEGALITY(task_pid(pObj->MLMEThr_task)) \ 595 up(&(pAd->mlme_semaphore)); \ 596 } 597 598 #define RTUSBCMDUp(pAd) \ 599 { \ 600 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \ 601 - BUG_ON(pObj->RTUSBCmdThr_task == NULL); \ 602 - CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task)) \ 603 up(&(pAd->RTUSBCmd_semaphore)); \ 604 } 605 #endif
··· 590 #define RTUSBMlmeUp(pAd) \ 591 { \ 592 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \ 593 + CHECK_PID_LEGALITY(pObj->MLMEThr_pid) \ 594 up(&(pAd->mlme_semaphore)); \ 595 } 596 597 #define RTUSBCMDUp(pAd) \ 598 { \ 599 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \ 600 + CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid) \ 601 up(&(pAd->RTUSBCmd_semaphore)); \ 602 } 603 #endif