gro: Allow tunnel stacking in the case of FOU/GUE
[linux/fpc-iii.git] / fs / btrfs / async-thread.c
blob0ce4de6430efa2d0f7068f456d5517c4a9d220a9
1 /*
2 * Copyright (C) 2007 Oracle. All rights reserved.
3 * Copyright (C) 2014 Fujitsu. All rights reserved.
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public
7 * License v2 as published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public
15 * License along with this program; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 021110-1307, USA.
20 #include <linux/kthread.h>
21 #include <linux/slab.h>
22 #include <linux/list.h>
23 #include <linux/spinlock.h>
24 #include <linux/freezer.h>
25 #include "async-thread.h"
26 #include "ctree.h"
28 #define WORK_DONE_BIT 0
29 #define WORK_ORDER_DONE_BIT 1
30 #define WORK_HIGH_PRIO_BIT 2
32 #define NO_THRESHOLD (-1)
33 #define DFT_THRESHOLD (32)
35 struct __btrfs_workqueue {
36 struct workqueue_struct *normal_wq;
37 /* List head pointing to ordered work list */
38 struct list_head ordered_list;
40 /* Spinlock for ordered_list */
41 spinlock_t list_lock;
43 /* Thresholding related variants */
44 atomic_t pending;
45 int max_active;
46 int current_max;
47 int thresh;
48 unsigned int count;
49 spinlock_t thres_lock;
52 struct btrfs_workqueue {
53 struct __btrfs_workqueue *normal;
54 struct __btrfs_workqueue *high;
57 static void normal_work_helper(struct btrfs_work *work);
59 #define BTRFS_WORK_HELPER(name) \
60 void btrfs_##name(struct work_struct *arg) \
61 { \
62 struct btrfs_work *work = container_of(arg, struct btrfs_work, \
63 normal_work); \
64 normal_work_helper(work); \
67 bool btrfs_workqueue_normal_congested(struct btrfs_workqueue *wq)
70 * We could compare wq->normal->pending with num_online_cpus()
71 * to support "thresh == NO_THRESHOLD" case, but it requires
72 * moving up atomic_inc/dec in thresh_queue/exec_hook. Let's
73 * postpone it until someone needs the support of that case.
75 if (wq->normal->thresh == NO_THRESHOLD)
76 return false;
78 return atomic_read(&wq->normal->pending) > wq->normal->thresh * 2;
81 BTRFS_WORK_HELPER(worker_helper);
82 BTRFS_WORK_HELPER(delalloc_helper);
83 BTRFS_WORK_HELPER(flush_delalloc_helper);
84 BTRFS_WORK_HELPER(cache_helper);
85 BTRFS_WORK_HELPER(submit_helper);
86 BTRFS_WORK_HELPER(fixup_helper);
87 BTRFS_WORK_HELPER(endio_helper);
88 BTRFS_WORK_HELPER(endio_meta_helper);
89 BTRFS_WORK_HELPER(endio_meta_write_helper);
90 BTRFS_WORK_HELPER(endio_raid56_helper);
91 BTRFS_WORK_HELPER(endio_repair_helper);
92 BTRFS_WORK_HELPER(rmw_helper);
93 BTRFS_WORK_HELPER(endio_write_helper);
94 BTRFS_WORK_HELPER(freespace_write_helper);
95 BTRFS_WORK_HELPER(delayed_meta_helper);
96 BTRFS_WORK_HELPER(readahead_helper);
97 BTRFS_WORK_HELPER(qgroup_rescan_helper);
98 BTRFS_WORK_HELPER(extent_refs_helper);
99 BTRFS_WORK_HELPER(scrub_helper);
100 BTRFS_WORK_HELPER(scrubwrc_helper);
101 BTRFS_WORK_HELPER(scrubnc_helper);
103 static struct __btrfs_workqueue *
104 __btrfs_alloc_workqueue(const char *name, unsigned int flags, int max_active,
105 int thresh)
107 struct __btrfs_workqueue *ret = kzalloc(sizeof(*ret), GFP_NOFS);
109 if (!ret)
110 return NULL;
112 ret->max_active = max_active;
113 atomic_set(&ret->pending, 0);
114 if (thresh == 0)
115 thresh = DFT_THRESHOLD;
116 /* For low threshold, disabling threshold is a better choice */
117 if (thresh < DFT_THRESHOLD) {
118 ret->current_max = max_active;
119 ret->thresh = NO_THRESHOLD;
120 } else {
121 ret->current_max = 1;
122 ret->thresh = thresh;
125 if (flags & WQ_HIGHPRI)
126 ret->normal_wq = alloc_workqueue("%s-%s-high", flags,
127 ret->max_active,
128 "btrfs", name);
129 else
130 ret->normal_wq = alloc_workqueue("%s-%s", flags,
131 ret->max_active, "btrfs",
132 name);
133 if (!ret->normal_wq) {
134 kfree(ret);
135 return NULL;
138 INIT_LIST_HEAD(&ret->ordered_list);
139 spin_lock_init(&ret->list_lock);
140 spin_lock_init(&ret->thres_lock);
141 trace_btrfs_workqueue_alloc(ret, name, flags & WQ_HIGHPRI);
142 return ret;
145 static inline void
146 __btrfs_destroy_workqueue(struct __btrfs_workqueue *wq);
148 struct btrfs_workqueue *btrfs_alloc_workqueue(const char *name,
149 unsigned int flags,
150 int max_active,
151 int thresh)
153 struct btrfs_workqueue *ret = kzalloc(sizeof(*ret), GFP_NOFS);
155 if (!ret)
156 return NULL;
158 ret->normal = __btrfs_alloc_workqueue(name, flags & ~WQ_HIGHPRI,
159 max_active, thresh);
160 if (!ret->normal) {
161 kfree(ret);
162 return NULL;
165 if (flags & WQ_HIGHPRI) {
166 ret->high = __btrfs_alloc_workqueue(name, flags, max_active,
167 thresh);
168 if (!ret->high) {
169 __btrfs_destroy_workqueue(ret->normal);
170 kfree(ret);
171 return NULL;
174 return ret;
178 * Hook for threshold which will be called in btrfs_queue_work.
179 * This hook WILL be called in IRQ handler context,
180 * so workqueue_set_max_active MUST NOT be called in this hook
182 static inline void thresh_queue_hook(struct __btrfs_workqueue *wq)
184 if (wq->thresh == NO_THRESHOLD)
185 return;
186 atomic_inc(&wq->pending);
190 * Hook for threshold which will be called before executing the work,
191 * This hook is called in kthread content.
192 * So workqueue_set_max_active is called here.
194 static inline void thresh_exec_hook(struct __btrfs_workqueue *wq)
196 int new_max_active;
197 long pending;
198 int need_change = 0;
200 if (wq->thresh == NO_THRESHOLD)
201 return;
203 atomic_dec(&wq->pending);
204 spin_lock(&wq->thres_lock);
206 * Use wq->count to limit the calling frequency of
207 * workqueue_set_max_active.
209 wq->count++;
210 wq->count %= (wq->thresh / 4);
211 if (!wq->count)
212 goto out;
213 new_max_active = wq->current_max;
216 * pending may be changed later, but it's OK since we really
217 * don't need it so accurate to calculate new_max_active.
219 pending = atomic_read(&wq->pending);
220 if (pending > wq->thresh)
221 new_max_active++;
222 if (pending < wq->thresh / 2)
223 new_max_active--;
224 new_max_active = clamp_val(new_max_active, 1, wq->max_active);
225 if (new_max_active != wq->current_max) {
226 need_change = 1;
227 wq->current_max = new_max_active;
229 out:
230 spin_unlock(&wq->thres_lock);
232 if (need_change) {
233 workqueue_set_max_active(wq->normal_wq, wq->current_max);
237 static void run_ordered_work(struct __btrfs_workqueue *wq)
239 struct list_head *list = &wq->ordered_list;
240 struct btrfs_work *work;
241 spinlock_t *lock = &wq->list_lock;
242 unsigned long flags;
244 while (1) {
245 spin_lock_irqsave(lock, flags);
246 if (list_empty(list))
247 break;
248 work = list_entry(list->next, struct btrfs_work,
249 ordered_list);
250 if (!test_bit(WORK_DONE_BIT, &work->flags))
251 break;
254 * we are going to call the ordered done function, but
255 * we leave the work item on the list as a barrier so
256 * that later work items that are done don't have their
257 * functions called before this one returns
259 if (test_and_set_bit(WORK_ORDER_DONE_BIT, &work->flags))
260 break;
261 trace_btrfs_ordered_sched(work);
262 spin_unlock_irqrestore(lock, flags);
263 work->ordered_func(work);
265 /* now take the lock again and drop our item from the list */
266 spin_lock_irqsave(lock, flags);
267 list_del(&work->ordered_list);
268 spin_unlock_irqrestore(lock, flags);
271 * we don't want to call the ordered free functions
272 * with the lock held though
274 work->ordered_free(work);
275 trace_btrfs_all_work_done(work);
277 spin_unlock_irqrestore(lock, flags);
280 static void normal_work_helper(struct btrfs_work *work)
282 struct __btrfs_workqueue *wq;
283 int need_order = 0;
286 * We should not touch things inside work in the following cases:
287 * 1) after work->func() if it has no ordered_free
288 * Since the struct is freed in work->func().
289 * 2) after setting WORK_DONE_BIT
290 * The work may be freed in other threads almost instantly.
291 * So we save the needed things here.
293 if (work->ordered_func)
294 need_order = 1;
295 wq = work->wq;
297 trace_btrfs_work_sched(work);
298 thresh_exec_hook(wq);
299 work->func(work);
300 if (need_order) {
301 set_bit(WORK_DONE_BIT, &work->flags);
302 run_ordered_work(wq);
304 if (!need_order)
305 trace_btrfs_all_work_done(work);
308 void btrfs_init_work(struct btrfs_work *work, btrfs_work_func_t uniq_func,
309 btrfs_func_t func,
310 btrfs_func_t ordered_func,
311 btrfs_func_t ordered_free)
313 work->func = func;
314 work->ordered_func = ordered_func;
315 work->ordered_free = ordered_free;
316 INIT_WORK(&work->normal_work, uniq_func);
317 INIT_LIST_HEAD(&work->ordered_list);
318 work->flags = 0;
321 static inline void __btrfs_queue_work(struct __btrfs_workqueue *wq,
322 struct btrfs_work *work)
324 unsigned long flags;
326 work->wq = wq;
327 thresh_queue_hook(wq);
328 if (work->ordered_func) {
329 spin_lock_irqsave(&wq->list_lock, flags);
330 list_add_tail(&work->ordered_list, &wq->ordered_list);
331 spin_unlock_irqrestore(&wq->list_lock, flags);
333 trace_btrfs_work_queued(work);
334 queue_work(wq->normal_wq, &work->normal_work);
337 void btrfs_queue_work(struct btrfs_workqueue *wq,
338 struct btrfs_work *work)
340 struct __btrfs_workqueue *dest_wq;
342 if (test_bit(WORK_HIGH_PRIO_BIT, &work->flags) && wq->high)
343 dest_wq = wq->high;
344 else
345 dest_wq = wq->normal;
346 __btrfs_queue_work(dest_wq, work);
349 static inline void
350 __btrfs_destroy_workqueue(struct __btrfs_workqueue *wq)
352 destroy_workqueue(wq->normal_wq);
353 trace_btrfs_workqueue_destroy(wq);
354 kfree(wq);
357 void btrfs_destroy_workqueue(struct btrfs_workqueue *wq)
359 if (!wq)
360 return;
361 if (wq->high)
362 __btrfs_destroy_workqueue(wq->high);
363 __btrfs_destroy_workqueue(wq->normal);
364 kfree(wq);
367 void btrfs_workqueue_set_max(struct btrfs_workqueue *wq, int max)
369 if (!wq)
370 return;
371 wq->normal->max_active = max;
372 if (wq->high)
373 wq->high->max_active = max;
376 void btrfs_set_work_high_priority(struct btrfs_work *work)
378 set_bit(WORK_HIGH_PRIO_BIT, &work->flags);