diff options
Diffstat (limited to 'fs/btrfs/async-thread.h')
-rw-r--r-- | fs/btrfs/async-thread.h | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/fs/btrfs/async-thread.h b/fs/btrfs/async-thread.h index 1b511c109db6..5077746cf85e 100644 --- a/fs/btrfs/async-thread.h +++ b/fs/btrfs/async-thread.h | |||
@@ -64,6 +64,8 @@ struct btrfs_workers { | |||
64 | /* current number of running workers */ | 64 | /* current number of running workers */ |
65 | int num_workers; | 65 | int num_workers; |
66 | 66 | ||
67 | int num_workers_starting; | ||
68 | |||
67 | /* max number of workers allowed. changed by btrfs_start_workers */ | 69 | /* max number of workers allowed. changed by btrfs_start_workers */ |
68 | int max_workers; | 70 | int max_workers; |
69 | 71 | ||
@@ -73,6 +75,16 @@ struct btrfs_workers { | |||
73 | /* force completions in the order they were queued */ | 75 | /* force completions in the order they were queued */ |
74 | int ordered; | 76 | int ordered; |
75 | 77 | ||
78 | /* more workers required, but in an interrupt handler */ | ||
79 | int atomic_start_pending; | ||
80 | |||
81 | /* | ||
82 | * are we allowed to sleep while starting workers or are we required | ||
83 | * to start them at a later time? If we can't sleep, this indicates | ||
84 | * which queue we need to use to schedule thread creation. | ||
85 | */ | ||
86 | struct btrfs_workers *atomic_worker_start; | ||
87 | |||
76 | /* list with all the work threads. The workers on the idle thread | 88 | /* list with all the work threads. The workers on the idle thread |
77 | * may be actively servicing jobs, but they haven't yet hit the | 89 | * may be actively servicing jobs, but they haven't yet hit the |
78 | * idle thresh limit above. | 90 | * idle thresh limit above. |
@@ -90,6 +102,9 @@ struct btrfs_workers { | |||
90 | /* lock for finding the next worker thread to queue on */ | 102 | /* lock for finding the next worker thread to queue on */ |
91 | spinlock_t lock; | 103 | spinlock_t lock; |
92 | 104 | ||
105 | /* lock for the ordered lists */ | ||
106 | spinlock_t order_lock; | ||
107 | |||
93 | /* extra name for this worker, used for current->name */ | 108 | /* extra name for this worker, used for current->name */ |
94 | char *name; | 109 | char *name; |
95 | }; | 110 | }; |
@@ -97,7 +112,8 @@ struct btrfs_workers { | |||
97 | int btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work); | 112 | int btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work); |
98 | int btrfs_start_workers(struct btrfs_workers *workers, int num_workers); | 113 | int btrfs_start_workers(struct btrfs_workers *workers, int num_workers); |
99 | int btrfs_stop_workers(struct btrfs_workers *workers); | 114 | int btrfs_stop_workers(struct btrfs_workers *workers); |
100 | void btrfs_init_workers(struct btrfs_workers *workers, char *name, int max); | 115 | void btrfs_init_workers(struct btrfs_workers *workers, char *name, int max, |
116 | struct btrfs_workers *async_starter); | ||
101 | int btrfs_requeue_work(struct btrfs_work *work); | 117 | int btrfs_requeue_work(struct btrfs_work *work); |
102 | void btrfs_set_work_high_prio(struct btrfs_work *work); | 118 | void btrfs_set_work_high_prio(struct btrfs_work *work); |
103 | #endif | 119 | #endif |