diff options
Diffstat (limited to 'kernel/workqueue.c')
| -rw-r--r-- | kernel/workqueue.c | 293 |
1 files changed, 277 insertions, 16 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index d64913aa486a..f57855f718d7 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
| @@ -36,14 +36,27 @@ | |||
| 36 | #include <linux/idr.h> | 36 | #include <linux/idr.h> |
| 37 | 37 | ||
| 38 | enum { | 38 | enum { |
| 39 | /* global_cwq flags */ | ||
| 40 | GCWQ_FREEZING = 1 << 3, /* freeze in progress */ | ||
| 41 | |||
| 39 | /* worker flags */ | 42 | /* worker flags */ |
| 40 | WORKER_STARTED = 1 << 0, /* started */ | 43 | WORKER_STARTED = 1 << 0, /* started */ |
| 41 | WORKER_DIE = 1 << 1, /* die die die */ | 44 | WORKER_DIE = 1 << 1, /* die die die */ |
| 42 | WORKER_IDLE = 1 << 2, /* is idle */ | 45 | WORKER_IDLE = 1 << 2, /* is idle */ |
| 46 | WORKER_ROGUE = 1 << 4, /* not bound to any cpu */ | ||
| 47 | |||
| 48 | /* gcwq->trustee_state */ | ||
| 49 | TRUSTEE_START = 0, /* start */ | ||
| 50 | TRUSTEE_IN_CHARGE = 1, /* trustee in charge of gcwq */ | ||
| 51 | TRUSTEE_BUTCHER = 2, /* butcher workers */ | ||
| 52 | TRUSTEE_RELEASE = 3, /* release workers */ | ||
| 53 | TRUSTEE_DONE = 4, /* trustee is done */ | ||
| 43 | 54 | ||
| 44 | BUSY_WORKER_HASH_ORDER = 6, /* 64 pointers */ | 55 | BUSY_WORKER_HASH_ORDER = 6, /* 64 pointers */ |
| 45 | BUSY_WORKER_HASH_SIZE = 1 << BUSY_WORKER_HASH_ORDER, | 56 | BUSY_WORKER_HASH_SIZE = 1 << BUSY_WORKER_HASH_ORDER, |
| 46 | BUSY_WORKER_HASH_MASK = BUSY_WORKER_HASH_SIZE - 1, | 57 | BUSY_WORKER_HASH_MASK = BUSY_WORKER_HASH_SIZE - 1, |
| 58 | |||
| 59 | TRUSTEE_COOLDOWN = HZ / 10, /* for trustee draining */ | ||
| 47 | }; | 60 | }; |
| 48 | 61 | ||
| 49 | /* | 62 | /* |
| @@ -83,6 +96,7 @@ struct worker { | |||
| 83 | struct global_cwq { | 96 | struct global_cwq { |
| 84 | spinlock_t lock; /* the gcwq lock */ | 97 | spinlock_t lock; /* the gcwq lock */ |
| 85 | unsigned int cpu; /* I: the associated cpu */ | 98 | unsigned int cpu; /* I: the associated cpu */ |
| 99 | unsigned int flags; /* L: GCWQ_* flags */ | ||
| 86 | 100 | ||
| 87 | int nr_workers; /* L: total number of workers */ | 101 | int nr_workers; /* L: total number of workers */ |
| 88 | int nr_idle; /* L: currently idle ones */ | 102 | int nr_idle; /* L: currently idle ones */ |
| @@ -93,6 +107,10 @@ struct global_cwq { | |||
| 93 | /* L: hash of busy workers */ | 107 | /* L: hash of busy workers */ |
| 94 | 108 | ||
| 95 | struct ida worker_ida; /* L: for worker IDs */ | 109 | struct ida worker_ida; /* L: for worker IDs */ |
| 110 | |||
| 111 | struct task_struct *trustee; /* L: for gcwq shutdown */ | ||
| 112 | unsigned int trustee_state; /* L: trustee state */ | ||
| 113 | wait_queue_head_t trustee_wait; /* trustee wait */ | ||
| 96 | } ____cacheline_aligned_in_smp; | 114 | } ____cacheline_aligned_in_smp; |
| 97 | 115 | ||
| 98 | /* | 116 | /* |
| @@ -148,6 +166,10 @@ struct workqueue_struct { | |||
| 148 | #endif | 166 | #endif |
| 149 | }; | 167 | }; |
| 150 | 168 | ||
| 169 | #define for_each_busy_worker(worker, i, pos, gcwq) \ | ||
| 170 | for (i = 0; i < BUSY_WORKER_HASH_SIZE; i++) \ | ||
| 171 | hlist_for_each_entry(worker, pos, &gcwq->busy_hash[i], hentry) | ||
| 172 | |||
| 151 | #ifdef CONFIG_DEBUG_OBJECTS_WORK | 173 | #ifdef CONFIG_DEBUG_OBJECTS_WORK |
| 152 | 174 | ||
| 153 | static struct debug_obj_descr work_debug_descr; | 175 | static struct debug_obj_descr work_debug_descr; |
| @@ -546,6 +568,9 @@ static void worker_enter_idle(struct worker *worker) | |||
| 546 | 568 | ||
| 547 | /* idle_list is LIFO */ | 569 | /* idle_list is LIFO */ |
| 548 | list_add(&worker->entry, &gcwq->idle_list); | 570 | list_add(&worker->entry, &gcwq->idle_list); |
| 571 | |||
| 572 | if (unlikely(worker->flags & WORKER_ROGUE)) | ||
| 573 | wake_up_all(&gcwq->trustee_wait); | ||
| 549 | } | 574 | } |
| 550 | 575 | ||
| 551 | /** | 576 | /** |
| @@ -622,8 +647,15 @@ static struct worker *create_worker(struct cpu_workqueue_struct *cwq, bool bind) | |||
| 622 | if (IS_ERR(worker->task)) | 647 | if (IS_ERR(worker->task)) |
| 623 | goto fail; | 648 | goto fail; |
| 624 | 649 | ||
| 650 | /* | ||
| 651 | * A rogue worker will become a regular one if CPU comes | ||
| 652 | * online later on. Make sure every worker has | ||
| 653 | * PF_THREAD_BOUND set. | ||
| 654 | */ | ||
| 625 | if (bind) | 655 | if (bind) |
| 626 | kthread_bind(worker->task, gcwq->cpu); | 656 | kthread_bind(worker->task, gcwq->cpu); |
| 657 | else | ||
| 658 | worker->task->flags |= PF_THREAD_BOUND; | ||
| 627 | 659 | ||
| 628 | return worker; | 660 | return worker; |
| 629 | fail: | 661 | fail: |
| @@ -882,10 +914,6 @@ static int worker_thread(void *__worker) | |||
| 882 | struct cpu_workqueue_struct *cwq = worker->cwq; | 914 | struct cpu_workqueue_struct *cwq = worker->cwq; |
| 883 | 915 | ||
| 884 | woke_up: | 916 | woke_up: |
| 885 | if (unlikely(!cpumask_equal(&worker->task->cpus_allowed, | ||
| 886 | get_cpu_mask(gcwq->cpu)))) | ||
| 887 | set_cpus_allowed_ptr(worker->task, get_cpu_mask(gcwq->cpu)); | ||
| 888 | |||
| 889 | spin_lock_irq(&gcwq->lock); | 917 | spin_lock_irq(&gcwq->lock); |
| 890 | 918 | ||
| 891 | /* DIE can be set only while we're idle, checking here is enough */ | 919 | /* DIE can be set only while we're idle, checking here is enough */ |
| @@ -895,7 +923,7 @@ woke_up: | |||
| 895 | } | 923 | } |
| 896 | 924 | ||
| 897 | worker_leave_idle(worker); | 925 | worker_leave_idle(worker); |
| 898 | 926 | recheck: | |
| 899 | /* | 927 | /* |
| 900 | * ->scheduled list can only be filled while a worker is | 928 | * ->scheduled list can only be filled while a worker is |
| 901 | * preparing to process a work or actually processing it. | 929 | * preparing to process a work or actually processing it. |
| @@ -908,6 +936,22 @@ woke_up: | |||
| 908 | list_first_entry(&cwq->worklist, | 936 | list_first_entry(&cwq->worklist, |
| 909 | struct work_struct, entry); | 937 | struct work_struct, entry); |
| 910 | 938 | ||
| 939 | /* | ||
| 940 | * The following is a rather inefficient way to close | ||
| 941 | * race window against cpu hotplug operations. Will | ||
| 942 | * be replaced soon. | ||
| 943 | */ | ||
| 944 | if (unlikely(!(worker->flags & WORKER_ROGUE) && | ||
| 945 | !cpumask_equal(&worker->task->cpus_allowed, | ||
| 946 | get_cpu_mask(gcwq->cpu)))) { | ||
| 947 | spin_unlock_irq(&gcwq->lock); | ||
| 948 | set_cpus_allowed_ptr(worker->task, | ||
| 949 | get_cpu_mask(gcwq->cpu)); | ||
| 950 | cpu_relax(); | ||
| 951 | spin_lock_irq(&gcwq->lock); | ||
| 952 | goto recheck; | ||
| 953 | } | ||
| 954 | |||
| 911 | if (likely(!(*work_data_bits(work) & WORK_STRUCT_LINKED))) { | 955 | if (likely(!(*work_data_bits(work) & WORK_STRUCT_LINKED))) { |
| 912 | /* optimization path, not strictly necessary */ | 956 | /* optimization path, not strictly necessary */ |
| 913 | process_one_work(worker, work); | 957 | process_one_work(worker, work); |
| @@ -1812,29 +1856,237 @@ void destroy_workqueue(struct workqueue_struct *wq) | |||
| 1812 | } | 1856 | } |
| 1813 | EXPORT_SYMBOL_GPL(destroy_workqueue); | 1857 | EXPORT_SYMBOL_GPL(destroy_workqueue); |
| 1814 | 1858 | ||
| 1859 | /* | ||
| 1860 | * CPU hotplug. | ||
| 1861 | * | ||
| 1862 | * CPU hotplug is implemented by allowing cwqs to be detached from | ||
| 1863 | * CPU, running with unbound workers and allowing them to be | ||
| 1864 | * reattached later if the cpu comes back online. A separate thread | ||
| 1865 | * is created to govern cwqs in such state and is called the trustee. | ||
| 1866 | * | ||
| 1867 | * Trustee states and their descriptions. | ||
| 1868 | * | ||
| 1869 | * START Command state used on startup. On CPU_DOWN_PREPARE, a | ||
| 1870 | * new trustee is started with this state. | ||
| 1871 | * | ||
| 1872 | * IN_CHARGE Once started, trustee will enter this state after | ||
| 1873 | * making all existing workers rogue. DOWN_PREPARE waits | ||
| 1874 | * for trustee to enter this state. After reaching | ||
| 1875 | * IN_CHARGE, trustee tries to execute the pending | ||
| 1876 | * worklist until it's empty and the state is set to | ||
| 1877 | * BUTCHER, or the state is set to RELEASE. | ||
| 1878 | * | ||
| 1879 | * BUTCHER Command state which is set by the cpu callback after | ||
| 1880 | * the cpu has went down. Once this state is set trustee | ||
| 1881 | * knows that there will be no new works on the worklist | ||
| 1882 | * and once the worklist is empty it can proceed to | ||
| 1883 | * killing idle workers. | ||
| 1884 | * | ||
| 1885 | * RELEASE Command state which is set by the cpu callback if the | ||
| 1886 | * cpu down has been canceled or it has come online | ||
| 1887 | * again. After recognizing this state, trustee stops | ||
| 1888 | * trying to drain or butcher and transits to DONE. | ||
| 1889 | * | ||
| 1890 | * DONE Trustee will enter this state after BUTCHER or RELEASE | ||
| 1891 | * is complete. | ||
| 1892 | * | ||
| 1893 | * trustee CPU draining | ||
| 1894 | * took over down complete | ||
| 1895 | * START -----------> IN_CHARGE -----------> BUTCHER -----------> DONE | ||
| 1896 | * | | ^ | ||
| 1897 | * | CPU is back online v return workers | | ||
| 1898 | * ----------------> RELEASE -------------- | ||
| 1899 | */ | ||
| 1900 | |||
| 1901 | /** | ||
| 1902 | * trustee_wait_event_timeout - timed event wait for trustee | ||
| 1903 | * @cond: condition to wait for | ||
| 1904 | * @timeout: timeout in jiffies | ||
| 1905 | * | ||
| 1906 | * wait_event_timeout() for trustee to use. Handles locking and | ||
| 1907 | * checks for RELEASE request. | ||
| 1908 | * | ||
| 1909 | * CONTEXT: | ||
| 1910 | * spin_lock_irq(gcwq->lock) which may be released and regrabbed | ||
| 1911 | * multiple times. To be used by trustee. | ||
| 1912 | * | ||
| 1913 | * RETURNS: | ||
| 1914 | * Positive indicating left time if @cond is satisfied, 0 if timed | ||
| 1915 | * out, -1 if canceled. | ||
| 1916 | */ | ||
| 1917 | #define trustee_wait_event_timeout(cond, timeout) ({ \ | ||
| 1918 | long __ret = (timeout); \ | ||
| 1919 | while (!((cond) || (gcwq->trustee_state == TRUSTEE_RELEASE)) && \ | ||
| 1920 | __ret) { \ | ||
| 1921 | spin_unlock_irq(&gcwq->lock); \ | ||
| 1922 | __wait_event_timeout(gcwq->trustee_wait, (cond) || \ | ||
| 1923 | (gcwq->trustee_state == TRUSTEE_RELEASE), \ | ||
| 1924 | __ret); \ | ||
| 1925 | spin_lock_irq(&gcwq->lock); \ | ||
| 1926 | } \ | ||
| 1927 | gcwq->trustee_state == TRUSTEE_RELEASE ? -1 : (__ret); \ | ||
| 1928 | }) | ||
| 1929 | |||
| 1930 | /** | ||
| 1931 | * trustee_wait_event - event wait for trustee | ||
| 1932 | * @cond: condition to wait for | ||
| 1933 | * | ||
| 1934 | * wait_event() for trustee to use. Automatically handles locking and | ||
| 1935 | * checks for CANCEL request. | ||
| 1936 | * | ||
| 1937 | * CONTEXT: | ||
| 1938 | * spin_lock_irq(gcwq->lock) which may be released and regrabbed | ||
| 1939 | * multiple times. To be used by trustee. | ||
| 1940 | * | ||
| 1941 | * RETURNS: | ||
| 1942 | * 0 if @cond is satisfied, -1 if canceled. | ||
| 1943 | */ | ||
| 1944 | #define trustee_wait_event(cond) ({ \ | ||
| 1945 | long __ret1; \ | ||
| 1946 | __ret1 = trustee_wait_event_timeout(cond, MAX_SCHEDULE_TIMEOUT);\ | ||
| 1947 | __ret1 < 0 ? -1 : 0; \ | ||
| 1948 | }) | ||
| 1949 | |||
| 1950 | static int __cpuinit trustee_thread(void *__gcwq) | ||
| 1951 | { | ||
| 1952 | struct global_cwq *gcwq = __gcwq; | ||
| 1953 | struct worker *worker; | ||
| 1954 | struct hlist_node *pos; | ||
| 1955 | int i; | ||
| 1956 | |||
| 1957 | BUG_ON(gcwq->cpu != smp_processor_id()); | ||
| 1958 | |||
| 1959 | spin_lock_irq(&gcwq->lock); | ||
| 1960 | /* | ||
| 1961 | * Make all multithread workers rogue. Trustee must be bound | ||
| 1962 | * to the target cpu and can't be cancelled. | ||
| 1963 | */ | ||
| 1964 | BUG_ON(gcwq->cpu != smp_processor_id()); | ||
| 1965 | |||
| 1966 | list_for_each_entry(worker, &gcwq->idle_list, entry) | ||
| 1967 | if (!(worker->cwq->wq->flags & WQ_SINGLE_THREAD)) | ||
| 1968 | worker->flags |= WORKER_ROGUE; | ||
| 1969 | |||
| 1970 | for_each_busy_worker(worker, i, pos, gcwq) | ||
| 1971 | if (!(worker->cwq->wq->flags & WQ_SINGLE_THREAD)) | ||
| 1972 | worker->flags |= WORKER_ROGUE; | ||
| 1973 | |||
| 1974 | /* | ||
| 1975 | * We're now in charge. Notify and proceed to drain. We need | ||
| 1976 | * to keep the gcwq running during the whole CPU down | ||
| 1977 | * procedure as other cpu hotunplug callbacks may need to | ||
| 1978 | * flush currently running tasks. | ||
| 1979 | */ | ||
| 1980 | gcwq->trustee_state = TRUSTEE_IN_CHARGE; | ||
| 1981 | wake_up_all(&gcwq->trustee_wait); | ||
| 1982 | |||
| 1983 | /* | ||
| 1984 | * The original cpu is in the process of dying and may go away | ||
| 1985 | * anytime now. When that happens, we and all workers would | ||
| 1986 | * be migrated to other cpus. Try draining any left work. | ||
| 1987 | * Note that if the gcwq is frozen, there may be frozen works | ||
| 1988 | * in freezeable cwqs. Don't declare completion while frozen. | ||
| 1989 | */ | ||
| 1990 | while (gcwq->nr_workers != gcwq->nr_idle || | ||
| 1991 | gcwq->flags & GCWQ_FREEZING || | ||
| 1992 | gcwq->trustee_state == TRUSTEE_IN_CHARGE) { | ||
| 1993 | /* give a breather */ | ||
| 1994 | if (trustee_wait_event_timeout(false, TRUSTEE_COOLDOWN) < 0) | ||
| 1995 | break; | ||
| 1996 | } | ||
| 1997 | |||
| 1998 | /* notify completion */ | ||
| 1999 | gcwq->trustee = NULL; | ||
| 2000 | gcwq->trustee_state = TRUSTEE_DONE; | ||
| 2001 | wake_up_all(&gcwq->trustee_wait); | ||
| 2002 | spin_unlock_irq(&gcwq->lock); | ||
| 2003 | return 0; | ||
| 2004 | } | ||
| 2005 | |||
| 2006 | /** | ||
| 2007 | * wait_trustee_state - wait for trustee to enter the specified state | ||
| 2008 | * @gcwq: gcwq the trustee of interest belongs to | ||
| 2009 | * @state: target state to wait for | ||
| 2010 | * | ||
| 2011 | * Wait for the trustee to reach @state. DONE is already matched. | ||
| 2012 | * | ||
| 2013 | * CONTEXT: | ||
| 2014 | * spin_lock_irq(gcwq->lock) which may be released and regrabbed | ||
| 2015 | * multiple times. To be used by cpu_callback. | ||
| 2016 | */ | ||
| 2017 | static void __cpuinit wait_trustee_state(struct global_cwq *gcwq, int state) | ||
| 2018 | { | ||
| 2019 | if (!(gcwq->trustee_state == state || | ||
| 2020 | gcwq->trustee_state == TRUSTEE_DONE)) { | ||
| 2021 | spin_unlock_irq(&gcwq->lock); | ||
| 2022 | __wait_event(gcwq->trustee_wait, | ||
| 2023 | gcwq->trustee_state == state || | ||
| 2024 | gcwq->trustee_state == TRUSTEE_DONE); | ||
| 2025 | spin_lock_irq(&gcwq->lock); | ||
| 2026 | } | ||
| 2027 | } | ||
| 2028 | |||
| 1815 | static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, | 2029 | static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, |
| 1816 | unsigned long action, | 2030 | unsigned long action, |
| 1817 | void *hcpu) | 2031 | void *hcpu) |
| 1818 | { | 2032 | { |
| 1819 | unsigned int cpu = (unsigned long)hcpu; | 2033 | unsigned int cpu = (unsigned long)hcpu; |
| 1820 | struct cpu_workqueue_struct *cwq; | 2034 | struct global_cwq *gcwq = get_gcwq(cpu); |
| 1821 | struct workqueue_struct *wq; | 2035 | struct task_struct *new_trustee = NULL; |
| 2036 | struct worker *worker; | ||
| 2037 | struct hlist_node *pos; | ||
| 2038 | unsigned long flags; | ||
| 2039 | int i; | ||
| 1822 | 2040 | ||
| 1823 | action &= ~CPU_TASKS_FROZEN; | 2041 | action &= ~CPU_TASKS_FROZEN; |
| 1824 | 2042 | ||
| 1825 | list_for_each_entry(wq, &workqueues, list) { | 2043 | switch (action) { |
| 1826 | if (wq->flags & WQ_SINGLE_THREAD) | 2044 | case CPU_DOWN_PREPARE: |
| 1827 | continue; | 2045 | new_trustee = kthread_create(trustee_thread, gcwq, |
| 2046 | "workqueue_trustee/%d\n", cpu); | ||
| 2047 | if (IS_ERR(new_trustee)) | ||
| 2048 | return notifier_from_errno(PTR_ERR(new_trustee)); | ||
| 2049 | kthread_bind(new_trustee, cpu); | ||
| 2050 | } | ||
| 1828 | 2051 | ||
| 1829 | cwq = get_cwq(cpu, wq); | 2052 | /* some are called w/ irq disabled, don't disturb irq status */ |
| 2053 | spin_lock_irqsave(&gcwq->lock, flags); | ||
| 1830 | 2054 | ||
| 1831 | switch (action) { | 2055 | switch (action) { |
| 1832 | case CPU_POST_DEAD: | 2056 | case CPU_DOWN_PREPARE: |
| 1833 | flush_workqueue(wq); | 2057 | /* initialize trustee and tell it to acquire the gcwq */ |
| 1834 | break; | 2058 | BUG_ON(gcwq->trustee || gcwq->trustee_state != TRUSTEE_DONE); |
| 2059 | gcwq->trustee = new_trustee; | ||
| 2060 | gcwq->trustee_state = TRUSTEE_START; | ||
| 2061 | wake_up_process(gcwq->trustee); | ||
| 2062 | wait_trustee_state(gcwq, TRUSTEE_IN_CHARGE); | ||
| 2063 | break; | ||
| 2064 | |||
| 2065 | case CPU_POST_DEAD: | ||
| 2066 | gcwq->trustee_state = TRUSTEE_BUTCHER; | ||
| 2067 | break; | ||
| 2068 | |||
| 2069 | case CPU_DOWN_FAILED: | ||
| 2070 | case CPU_ONLINE: | ||
| 2071 | if (gcwq->trustee_state != TRUSTEE_DONE) { | ||
| 2072 | gcwq->trustee_state = TRUSTEE_RELEASE; | ||
| 2073 | wake_up_process(gcwq->trustee); | ||
| 2074 | wait_trustee_state(gcwq, TRUSTEE_DONE); | ||
| 1835 | } | 2075 | } |
| 2076 | |||
| 2077 | /* clear ROGUE from all multithread workers */ | ||
| 2078 | list_for_each_entry(worker, &gcwq->idle_list, entry) | ||
| 2079 | if (!(worker->cwq->wq->flags & WQ_SINGLE_THREAD)) | ||
| 2080 | worker->flags &= ~WORKER_ROGUE; | ||
| 2081 | |||
| 2082 | for_each_busy_worker(worker, i, pos, gcwq) | ||
| 2083 | if (!(worker->cwq->wq->flags & WQ_SINGLE_THREAD)) | ||
| 2084 | worker->flags &= ~WORKER_ROGUE; | ||
| 2085 | break; | ||
| 1836 | } | 2086 | } |
| 1837 | 2087 | ||
| 2088 | spin_unlock_irqrestore(&gcwq->lock, flags); | ||
| 2089 | |||
| 1838 | return notifier_from_errno(0); | 2090 | return notifier_from_errno(0); |
| 1839 | } | 2091 | } |
| 1840 | 2092 | ||
| @@ -1912,6 +2164,9 @@ void freeze_workqueues_begin(void) | |||
| 1912 | 2164 | ||
| 1913 | spin_lock_irq(&gcwq->lock); | 2165 | spin_lock_irq(&gcwq->lock); |
| 1914 | 2166 | ||
| 2167 | BUG_ON(gcwq->flags & GCWQ_FREEZING); | ||
| 2168 | gcwq->flags |= GCWQ_FREEZING; | ||
| 2169 | |||
| 1915 | list_for_each_entry(wq, &workqueues, list) { | 2170 | list_for_each_entry(wq, &workqueues, list) { |
| 1916 | struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq); | 2171 | struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq); |
| 1917 | 2172 | ||
| @@ -1995,6 +2250,9 @@ void thaw_workqueues(void) | |||
| 1995 | 2250 | ||
| 1996 | spin_lock_irq(&gcwq->lock); | 2251 | spin_lock_irq(&gcwq->lock); |
| 1997 | 2252 | ||
| 2253 | BUG_ON(!(gcwq->flags & GCWQ_FREEZING)); | ||
| 2254 | gcwq->flags &= ~GCWQ_FREEZING; | ||
| 2255 | |||
| 1998 | list_for_each_entry(wq, &workqueues, list) { | 2256 | list_for_each_entry(wq, &workqueues, list) { |
| 1999 | struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq); | 2257 | struct cpu_workqueue_struct *cwq = get_cwq(cpu, wq); |
| 2000 | 2258 | ||
| @@ -2026,7 +2284,7 @@ void __init init_workqueues(void) | |||
| 2026 | int i; | 2284 | int i; |
| 2027 | 2285 | ||
| 2028 | singlethread_cpu = cpumask_first(cpu_possible_mask); | 2286 | singlethread_cpu = cpumask_first(cpu_possible_mask); |
| 2029 | hotcpu_notifier(workqueue_cpu_callback, 0); | 2287 | hotcpu_notifier(workqueue_cpu_callback, CPU_PRI_WORKQUEUE); |
| 2030 | 2288 | ||
| 2031 | /* initialize gcwqs */ | 2289 | /* initialize gcwqs */ |
| 2032 | for_each_possible_cpu(cpu) { | 2290 | for_each_possible_cpu(cpu) { |
| @@ -2040,6 +2298,9 @@ void __init init_workqueues(void) | |||
| 2040 | INIT_HLIST_HEAD(&gcwq->busy_hash[i]); | 2298 | INIT_HLIST_HEAD(&gcwq->busy_hash[i]); |
| 2041 | 2299 | ||
| 2042 | ida_init(&gcwq->worker_ida); | 2300 | ida_init(&gcwq->worker_ida); |
| 2301 | |||
| 2302 | gcwq->trustee_state = TRUSTEE_DONE; | ||
| 2303 | init_waitqueue_head(&gcwq->trustee_wait); | ||
| 2043 | } | 2304 | } |
| 2044 | 2305 | ||
| 2045 | keventd_wq = create_workqueue("events"); | 2306 | keventd_wq = create_workqueue("events"); |
