~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/kernel/sched/completion.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /kernel/sched/completion.c (Version linux-6.11.5) and /kernel/sched/completion.c (Version policy-sample)


  1 // SPDX-License-Identifier: GPL-2.0                 1 
  2                                                   
  3 /*                                                
  4  * Generic wait-for-completion handler;           
  5  *                                                
  6  * It differs from semaphores in that their de    
  7  * wait_for_completion default blocks whereas     
  8  * interface also makes it easy to 'complete'     
  9  * something which isn't entirely natural for     
 10  *                                                
 11  * But more importantly, the primitive documen    
 12  * typically be used for exclusion which gives    
 13  * Waiting for completion is a typically sync     
 14  */                                               
 15                                                   
 16 static void complete_with_flags(struct complet    
 17 {                                                 
 18         unsigned long flags;                      
 19                                                   
 20         raw_spin_lock_irqsave(&x->wait.lock, f    
 21                                                   
 22         if (x->done != UINT_MAX)                  
 23                 x->done++;                        
 24         swake_up_locked(&x->wait, wake_flags);    
 25         raw_spin_unlock_irqrestore(&x->wait.lo    
 26 }                                                 
 27                                                   
 28 void complete_on_current_cpu(struct completion    
 29 {                                                 
 30         return complete_with_flags(x, WF_CURRE    
 31 }                                                 
 32                                                   
 33 /**                                               
 34  * complete: - signals a single thread waiting    
 35  * @x:  holds the state of this particular com    
 36  *                                                
 37  * This will wake up a single thread waiting o    
 38  * awakened in the same order in which they we    
 39  *                                                
 40  * See also complete_all(), wait_for_completio    
 41  *                                                
 42  * If this function wakes up a task, it execut    
 43  * accessing the task state.                      
 44  */                                               
 45 void complete(struct completion *x)               
 46 {                                                 
 47         complete_with_flags(x, 0);                
 48 }                                                 
 49 EXPORT_SYMBOL(complete);                          
 50                                                   
 51 /**                                               
 52  * complete_all: - signals all threads waiting    
 53  * @x:  holds the state of this particular com    
 54  *                                                
 55  * This will wake up all threads waiting on th    
 56  *                                                
 57  * If this function wakes up a task, it execut    
 58  * accessing the task state.                      
 59  *                                                
 60  * Since complete_all() sets the completion of    
 61  * to allow multiple waiters to finish, a call    
 62  * must be used on @x if @x is to be used agai    
 63  * sure that all waiters have woken and finish    
 64  * @x. Also note that the function completion_    
 65  * to know if there are still waiters after co    
 66  */                                               
 67 void complete_all(struct completion *x)           
 68 {                                                 
 69         unsigned long flags;                      
 70                                                   
 71         lockdep_assert_RT_in_threaded_ctx();      
 72                                                   
 73         raw_spin_lock_irqsave(&x->wait.lock, f    
 74         x->done = UINT_MAX;                       
 75         swake_up_all_locked(&x->wait);            
 76         raw_spin_unlock_irqrestore(&x->wait.lo    
 77 }                                                 
 78 EXPORT_SYMBOL(complete_all);                      
 79                                                   
 80 static inline long __sched                        
 81 do_wait_for_common(struct completion *x,          
 82                    long (*action)(long), long     
 83 {                                                 
 84         if (!x->done) {                           
 85                 DECLARE_SWAITQUEUE(wait);         
 86                                                   
 87                 do {                              
 88                         if (signal_pending_sta    
 89                                 timeout = -ERE    
 90                                 break;            
 91                         }                         
 92                         __prepare_to_swait(&x-    
 93                         __set_current_state(st    
 94                         raw_spin_unlock_irq(&x    
 95                         timeout = action(timeo    
 96                         raw_spin_lock_irq(&x->    
 97                 } while (!x->done && timeout);    
 98                 __finish_swait(&x->wait, &wait    
 99                 if (!x->done)                     
100                         return timeout;           
101         }                                         
102         if (x->done != UINT_MAX)                  
103                 x->done--;                        
104         return timeout ?: 1;                      
105 }                                                 
106                                                   
107 static inline long __sched                        
108 __wait_for_common(struct completion *x,           
109                   long (*action)(long), long t    
110 {                                                 
111         might_sleep();                            
112                                                   
113         complete_acquire(x);                      
114                                                   
115         raw_spin_lock_irq(&x->wait.lock);         
116         timeout = do_wait_for_common(x, action    
117         raw_spin_unlock_irq(&x->wait.lock);       
118                                                   
119         complete_release(x);                      
120                                                   
121         return timeout;                           
122 }                                                 
123                                                   
124 static long __sched                               
125 wait_for_common(struct completion *x, long tim    
126 {                                                 
127         return __wait_for_common(x, schedule_t    
128 }                                                 
129                                                   
130 static long __sched                               
131 wait_for_common_io(struct completion *x, long     
132 {                                                 
133         return __wait_for_common(x, io_schedul    
134 }                                                 
135                                                   
136 /**                                               
137  * wait_for_completion: - waits for completion    
138  * @x:  holds the state of this particular com    
139  *                                                
140  * This waits to be signaled for completion of    
141  * interruptible and there is no timeout.         
142  *                                                
143  * See also similar routines (i.e. wait_for_co    
144  * and interrupt capability. Also see complete    
145  */                                               
146 void __sched wait_for_completion(struct comple    
147 {                                                 
148         wait_for_common(x, MAX_SCHEDULE_TIMEOU    
149 }                                                 
150 EXPORT_SYMBOL(wait_for_completion);               
151                                                   
152 /**                                               
153  * wait_for_completion_timeout: - waits for co    
154  * @x:  holds the state of this particular com    
155  * @timeout:  timeout value in jiffies            
156  *                                                
157  * This waits for either a completion of a spe    
158  * specified timeout to expire. The timeout is    
159  * interruptible.                                 
160  *                                                
161  * Return: 0 if timed out, and positive (at le    
162  * till timeout) if completed.                    
163  */                                               
164 unsigned long __sched                             
165 wait_for_completion_timeout(struct completion     
166 {                                                 
167         return wait_for_common(x, timeout, TAS    
168 }                                                 
169 EXPORT_SYMBOL(wait_for_completion_timeout);       
170                                                   
171 /**                                               
172  * wait_for_completion_io: - waits for complet    
173  * @x:  holds the state of this particular com    
174  *                                                
175  * This waits to be signaled for completion of    
176  * interruptible and there is no timeout. The     
177  * for IO (which traditionally means blkio onl    
178  */                                               
179 void __sched wait_for_completion_io(struct com    
180 {                                                 
181         wait_for_common_io(x, MAX_SCHEDULE_TIM    
182 }                                                 
183 EXPORT_SYMBOL(wait_for_completion_io);            
184                                                   
185 /**                                               
186  * wait_for_completion_io_timeout: - waits for    
187  * @x:  holds the state of this particular com    
188  * @timeout:  timeout value in jiffies            
189  *                                                
190  * This waits for either a completion of a spe    
191  * specified timeout to expire. The timeout is    
192  * interruptible. The caller is accounted as w    
193  * means blkio only).                             
194  *                                                
195  * Return: 0 if timed out, and positive (at le    
196  * till timeout) if completed.                    
197  */                                               
198 unsigned long __sched                             
199 wait_for_completion_io_timeout(struct completi    
200 {                                                 
201         return wait_for_common_io(x, timeout,     
202 }                                                 
203 EXPORT_SYMBOL(wait_for_completion_io_timeout);    
204                                                   
205 /**                                               
206  * wait_for_completion_interruptible: - waits     
207  * @x:  holds the state of this particular com    
208  *                                                
209  * This waits for completion of a specific tas    
210  * interruptible.                                 
211  *                                                
212  * Return: -ERESTARTSYS if interrupted, 0 if c    
213  */                                               
214 int __sched wait_for_completion_interruptible(    
215 {                                                 
216         long t = wait_for_common(x, MAX_SCHEDU    
217                                                   
218         if (t == -ERESTARTSYS)                    
219                 return t;                         
220         return 0;                                 
221 }                                                 
222 EXPORT_SYMBOL(wait_for_completion_interruptibl    
223                                                   
224 /**                                               
225  * wait_for_completion_interruptible_timeout:     
226  * @x:  holds the state of this particular com    
227  * @timeout:  timeout value in jiffies            
228  *                                                
229  * This waits for either a completion of a spe    
230  * specified timeout to expire. It is interrup    
231  *                                                
232  * Return: -ERESTARTSYS if interrupted, 0 if t    
233  * or number of jiffies left till timeout) if     
234  */                                               
235 long __sched                                      
236 wait_for_completion_interruptible_timeout(stru    
237                                           unsi    
238 {                                                 
239         return wait_for_common(x, timeout, TAS    
240 }                                                 
241 EXPORT_SYMBOL(wait_for_completion_interruptibl    
242                                                   
243 /**                                               
244  * wait_for_completion_killable: - waits for c    
245  * @x:  holds the state of this particular com    
246  *                                                
247  * This waits to be signaled for completion of    
248  * interrupted by a kill signal.                  
249  *                                                
250  * Return: -ERESTARTSYS if interrupted, 0 if c    
251  */                                               
252 int __sched wait_for_completion_killable(struc    
253 {                                                 
254         long t = wait_for_common(x, MAX_SCHEDU    
255                                                   
256         if (t == -ERESTARTSYS)                    
257                 return t;                         
258         return 0;                                 
259 }                                                 
260 EXPORT_SYMBOL(wait_for_completion_killable);      
261                                                   
262 int __sched wait_for_completion_state(struct c    
263 {                                                 
264         long t = wait_for_common(x, MAX_SCHEDU    
265                                                   
266         if (t == -ERESTARTSYS)                    
267                 return t;                         
268         return 0;                                 
269 }                                                 
270 EXPORT_SYMBOL(wait_for_completion_state);         
271                                                   
272 /**                                               
273  * wait_for_completion_killable_timeout: - wai    
274  * @x:  holds the state of this particular com    
275  * @timeout:  timeout value in jiffies            
276  *                                                
277  * This waits for either a completion of a spe    
278  * signaled or for a specified timeout to expi    
279  * interrupted by a kill signal. The timeout i    
280  *                                                
281  * Return: -ERESTARTSYS if interrupted, 0 if t    
282  * or number of jiffies left till timeout) if     
283  */                                               
284 long __sched                                      
285 wait_for_completion_killable_timeout(struct co    
286                                      unsigned     
287 {                                                 
288         return wait_for_common(x, timeout, TAS    
289 }                                                 
290 EXPORT_SYMBOL(wait_for_completion_killable_tim    
291                                                   
292 /**                                               
293  *      try_wait_for_completion - try to decre    
294  *      @x:     completion structure              
295  *                                                
296  *      Return: 0 if a decrement cannot be don    
297  *               1 if a decrement succeeded.      
298  *                                                
299  *      If a completion is being used as a cou    
300  *      attempt to decrement the counter witho    
301  *      enables us to avoid waiting if the res    
302  *      is protecting is not available.           
303  */                                               
304 bool try_wait_for_completion(struct completion    
305 {                                                 
306         unsigned long flags;                      
307         bool ret = true;                          
308                                                   
309         /*                                        
310          * Since x->done will need to be locke    
311          * in the non-blocking case, we check     
312          * first without taking the lock so we    
313          * return early in the blocking case.     
314          */                                       
315         if (!READ_ONCE(x->done))                  
316                 return false;                     
317                                                   
318         raw_spin_lock_irqsave(&x->wait.lock, f    
319         if (!x->done)                             
320                 ret = false;                      
321         else if (x->done != UINT_MAX)             
322                 x->done--;                        
323         raw_spin_unlock_irqrestore(&x->wait.lo    
324         return ret;                               
325 }                                                 
326 EXPORT_SYMBOL(try_wait_for_completion);           
327                                                   
328 /**                                               
329  *      completion_done - Test to see if a com    
330  *      @x:     completion structure              
331  *                                                
332  *      Return: 0 if there are waiters (wait_f    
333  *               1 if there are no waiters.       
334  *                                                
335  *      Note, this will always return true if     
336  */                                               
337 bool completion_done(struct completion *x)        
338 {                                                 
339         unsigned long flags;                      
340                                                   
341         if (!READ_ONCE(x->done))                  
342                 return false;                     
343                                                   
344         /*                                        
345          * If ->done, we need to wait for comp    
346          * otherwise we can end up freeing the    
347          * is done referencing it.                
348          */                                       
349         raw_spin_lock_irqsave(&x->wait.lock, f    
350         raw_spin_unlock_irqrestore(&x->wait.lo    
351         return true;                              
352 }                                                 
353 EXPORT_SYMBOL(completion_done);                   
354                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php