David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
| 2 | |
| 3 | #ifndef BTRFS_MISC_H |
| 4 | #define BTRFS_MISC_H |
| 5 | |
| 6 | #include <linux/sched.h> |
| 7 | #include <linux/wait.h> |
| 8 | #include <asm/div64.h> |
| 9 | |
| 10 | #define in_range(b, first, len) ((b) >= (first) && (b) < (first) + (len)) |
| 11 | |
| 12 | static inline void cond_wake_up(struct wait_queue_head *wq) |
| 13 | { |
| 14 | /* |
| 15 | * This implies a full smp_mb barrier, see comments for |
| 16 | * waitqueue_active why. |
| 17 | */ |
| 18 | if (wq_has_sleeper(wq)) |
| 19 | wake_up(wq); |
| 20 | } |
| 21 | |
| 22 | static inline void cond_wake_up_nomb(struct wait_queue_head *wq) |
| 23 | { |
| 24 | /* |
| 25 | * Special case for conditional wakeup where the barrier required for |
| 26 | * waitqueue_active is implied by some of the preceding code. Eg. one |
| 27 | * of such atomic operations (atomic_dec_and_return, ...), or a |
| 28 | * unlock/lock sequence, etc. |
| 29 | */ |
| 30 | if (waitqueue_active(wq)) |
| 31 | wake_up(wq); |
| 32 | } |
| 33 | |
| 34 | static inline u64 div_factor(u64 num, int factor) |
| 35 | { |
| 36 | if (factor == 10) |
| 37 | return num; |
| 38 | num *= factor; |
| 39 | return div_u64(num, 10); |
| 40 | } |
| 41 | |
| 42 | static inline u64 div_factor_fine(u64 num, int factor) |
| 43 | { |
| 44 | if (factor == 100) |
| 45 | return num; |
| 46 | num *= factor; |
| 47 | return div_u64(num, 100); |
| 48 | } |
| 49 | |
| 50 | #endif |