Commit be4de35263f59ca1f4740edfffbfb02cc3f2189e
Committed by
Linus Torvalds
1 parent
e48880e02e
Exists in
master
and in
7 other branches
completions: uninline try_wait_for_completion and completion_done
m68k fails to build with these functions inlined in completion.h. Move them out of line into sched.c and export them to avoid this problem. Signed-off-by: Dave Chinner <david@fromorbit.com> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 2 changed files with 48 additions and 44 deletions Side-by-side Diff
include/linux/completion.h
... | ... | @@ -49,56 +49,14 @@ |
49 | 49 | unsigned long timeout); |
50 | 50 | extern unsigned long wait_for_completion_interruptible_timeout( |
51 | 51 | struct completion *x, unsigned long timeout); |
52 | +extern bool try_wait_for_completion(struct completion *x); | |
53 | +extern bool completion_done(struct completion *x); | |
52 | 54 | |
53 | 55 | extern void complete(struct completion *); |
54 | 56 | extern void complete_all(struct completion *); |
55 | 57 | |
56 | 58 | #define INIT_COMPLETION(x) ((x).done = 0) |
57 | 59 | |
58 | - | |
59 | -/** | |
60 | - * try_wait_for_completion - try to decrement a completion without blocking | |
61 | - * @x: completion structure | |
62 | - * | |
63 | - * Returns: 0 if a decrement cannot be done without blocking | |
64 | - * 1 if a decrement succeeded. | |
65 | - * | |
66 | - * If a completion is being used as a counting completion, | |
67 | - * attempt to decrement the counter without blocking. This | |
68 | - * enables us to avoid waiting if the resource the completion | |
69 | - * is protecting is not available. | |
70 | - */ | |
71 | -static inline bool try_wait_for_completion(struct completion *x) | |
72 | -{ | |
73 | - int ret = 1; | |
74 | - | |
75 | - spin_lock_irq(&x->wait.lock); | |
76 | - if (!x->done) | |
77 | - ret = 0; | |
78 | - else | |
79 | - x->done--; | |
80 | - spin_unlock_irq(&x->wait.lock); | |
81 | - return ret; | |
82 | -} | |
83 | - | |
84 | -/** | |
85 | - * completion_done - Test to see if a completion has any waiters | |
86 | - * @x: completion structure | |
87 | - * | |
88 | - * Returns: 0 if there are waiters (wait_for_completion() in progress) | |
89 | - * 1 if there are no waiters. | |
90 | - * | |
91 | - */ | |
92 | -static inline bool completion_done(struct completion *x) | |
93 | -{ | |
94 | - int ret = 1; | |
95 | - | |
96 | - spin_lock_irq(&x->wait.lock); | |
97 | - if (!x->done) | |
98 | - ret = 0; | |
99 | - spin_unlock_irq(&x->wait.lock); | |
100 | - return ret; | |
101 | -} | |
102 | 60 | |
103 | 61 | #endif |
kernel/sched.c
... | ... | @@ -4669,6 +4669,52 @@ |
4669 | 4669 | } |
4670 | 4670 | EXPORT_SYMBOL(wait_for_completion_killable); |
4671 | 4671 | |
4672 | +/** | |
4673 | + * try_wait_for_completion - try to decrement a completion without blocking | |
4674 | + * @x: completion structure | |
4675 | + * | |
4676 | + * Returns: 0 if a decrement cannot be done without blocking | |
4677 | + * 1 if a decrement succeeded. | |
4678 | + * | |
4679 | + * If a completion is being used as a counting completion, | |
4680 | + * attempt to decrement the counter without blocking. This | |
4681 | + * enables us to avoid waiting if the resource the completion | |
4682 | + * is protecting is not available. | |
4683 | + */ | |
4684 | +bool try_wait_for_completion(struct completion *x) | |
4685 | +{ | |
4686 | + int ret = 1; | |
4687 | + | |
4688 | + spin_lock_irq(&x->wait.lock); | |
4689 | + if (!x->done) | |
4690 | + ret = 0; | |
4691 | + else | |
4692 | + x->done--; | |
4693 | + spin_unlock_irq(&x->wait.lock); | |
4694 | + return ret; | |
4695 | +} | |
4696 | +EXPORT_SYMBOL(try_wait_for_completion); | |
4697 | + | |
4698 | +/** | |
4699 | + * completion_done - Test to see if a completion has any waiters | |
4700 | + * @x: completion structure | |
4701 | + * | |
4702 | + * Returns: 0 if there are waiters (wait_for_completion() in progress) | |
4703 | + * 1 if there are no waiters. | |
4704 | + * | |
4705 | + */ | |
4706 | +bool completion_done(struct completion *x) | |
4707 | +{ | |
4708 | + int ret = 1; | |
4709 | + | |
4710 | + spin_lock_irq(&x->wait.lock); | |
4711 | + if (!x->done) | |
4712 | + ret = 0; | |
4713 | + spin_unlock_irq(&x->wait.lock); | |
4714 | + return ret; | |
4715 | +} | |
4716 | +EXPORT_SYMBOL(completion_done); | |
4717 | + | |
4672 | 4718 | static long __sched |
4673 | 4719 | sleep_on_common(wait_queue_head_t *q, int state, long timeout) |
4674 | 4720 | { |