X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libbcachefs%2Futil.h;h=5fa29dab393bb6492163a36cfc3ea7c101059335;hb=a7b0ba44f04edfddb4db77e962094c061aa4be45;hp=09e272932dff388b2962f853898f6f3786a34338;hpb=a104f0407b7f5de54972389ef10e11dd8c525a96;p=bcachefs-tools-debian diff --git a/libbcachefs/util.h b/libbcachefs/util.h index 09e2729..5fa29da 100644 --- a/libbcachefs/util.h +++ b/libbcachefs/util.h @@ -19,6 +19,8 @@ #include #include +#include "darray.h" + struct closure; #ifdef CONFIG_BCACHEFS_DEBUG @@ -58,12 +60,13 @@ static inline void vpfree(void *p, size_t size) free_pages((unsigned long) p, get_order(size)); } -static inline void *vpmalloc(size_t size, gfp_t gfp_mask) +static inline void *vpmalloc_noprof(size_t size, gfp_t gfp_mask) { - return (void *) __get_free_pages(gfp_mask|__GFP_NOWARN, - get_order(size)) ?: - __vmalloc(size, gfp_mask); + return (void *) get_free_pages_noprof(gfp_mask|__GFP_NOWARN, + get_order(size)) ?: + __vmalloc_noprof(size, gfp_mask); } +#define vpmalloc(_size, _gfp) alloc_hooks(vpmalloc_noprof(_size, _gfp)) static inline void kvpfree(void *p, size_t size) { @@ -73,12 +76,13 @@ static inline void kvpfree(void *p, size_t size) vpfree(p, size); } -static inline void *kvpmalloc(size_t size, gfp_t gfp_mask) +static inline void *kvpmalloc_noprof(size_t size, gfp_t gfp_mask) { return size < PAGE_SIZE - ? kmalloc(size, gfp_mask) - : vpmalloc(size, gfp_mask); + ? kmalloc_noprof(size, gfp_mask) + : vpmalloc_noprof(size, gfp_mask); } +#define kvpmalloc(_size, _gfp) alloc_hooks(kvpmalloc_noprof(_size, _gfp)) int mempool_init_kvpmalloc_pool(mempool_t *, int, size_t); @@ -233,7 +237,7 @@ do { \ #define prt_tab_rjust(_out) bch2_prt_tab_rjust(_out) #define prt_bytes_indented(...) bch2_prt_bytes_indented(__VA_ARGS__) -#define prt_u64(_out, _v) prt_printf(_out, "%llu", _v) +#define prt_u64(_out, _v) prt_printf(_out, "%llu", (u64) (_v)) #define prt_human_readable_u64(...) bch2_prt_human_readable_u64(__VA_ARGS__) #define prt_human_readable_s64(...) bch2_prt_human_readable_s64(__VA_ARGS__) #define prt_units_u64(...) bch2_prt_units_u64(__VA_ARGS__) @@ -360,7 +364,11 @@ u64 bch2_read_flag_list(char *, const char * const[]); void bch2_prt_u64_binary(struct printbuf *, u64, unsigned); void bch2_print_string_as_lines(const char *prefix, const char *lines); -int bch2_prt_backtrace(struct printbuf *, struct task_struct *); + +typedef DARRAY(unsigned long) bch_stacktrace; +int bch2_save_backtrace(bch_stacktrace *stack, struct task_struct *); +void bch2_prt_backtrace(struct printbuf *, bch_stacktrace *); +int bch2_prt_task_backtrace(struct printbuf *, struct task_struct *); #define NR_QUANTILES 15 #define QUANTILE_IDX(i) inorder_to_eytzinger0(i, NR_QUANTILES) @@ -524,7 +532,9 @@ static inline unsigned fract_exp_two(unsigned x, unsigned fract_bits) } void bch2_bio_map(struct bio *bio, void *base, size_t); -int bch2_bio_alloc_pages(struct bio *, size_t, gfp_t); +int bch2_bio_alloc_pages_noprof(struct bio *, size_t, gfp_t); +#define bch2_bio_alloc_pages(_bio, _size, _gfp) \ + alloc_hooks(bch2_bio_alloc_pages_noprof(_bio, _size, _gfp)) static inline sector_t bdev_sectors(struct block_device *bdev) { @@ -537,6 +547,26 @@ do { \ submit_bio(bio); \ } while (0) +#define kthread_wait(cond) \ +({ \ + int _ret = 0; \ + \ + while (1) { \ + set_current_state(TASK_INTERRUPTIBLE); \ + if (kthread_should_stop()) { \ + _ret = -1; \ + break; \ + } \ + \ + if (cond) \ + break; \ + \ + schedule(); \ + } \ + set_current_state(TASK_RUNNING); \ + _ret; \ +}) + #define kthread_wait_freezable(cond) \ ({ \ int _ret = 0; \ @@ -811,4 +841,6 @@ static inline int u8_cmp(u8 l, u8 r) return cmp_int(l, r); } +#include + #endif /* _BCACHEFS_UTIL_H */