diff options
Diffstat (limited to 'linux')
-rw-r--r-- | linux/bio.c | 5 | ||||
-rw-r--r-- | linux/closure.c | 12 | ||||
-rw-r--r-- | linux/printk.c | 20 | ||||
-rw-r--r-- | linux/shrinker.c | 5 |
4 files changed, 37 insertions, 5 deletions
diff --git a/linux/bio.c b/linux/bio.c index 08dcd584..eb115a90 100644 --- a/linux/bio.c +++ b/linux/bio.c @@ -225,6 +225,11 @@ int bio_add_page(struct bio *bio, struct page *page, return len; } +void bio_add_virt_nofail(struct bio *bio, void *vaddr, unsigned len) +{ + bio_add_page(bio, virt_to_page(vaddr), len, offset_in_page(vaddr)); +} + static inline bool bio_remaining_done(struct bio *bio) { /* diff --git a/linux/closure.c b/linux/closure.c index 2bfe7d2a..4fb78d18 100644 --- a/linux/closure.c +++ b/linux/closure.c @@ -13,23 +13,25 @@ #include <linux/seq_file.h> #include <linux/sched/debug.h> -static inline void closure_put_after_sub_checks(int flags) +static inline void closure_put_after_sub_checks(struct closure *cl, int flags) { int r = flags & CLOSURE_REMAINING_MASK; if (WARN(flags & CLOSURE_GUARD_MASK, - "closure has guard bits set: %x (%u)", + "closure %ps has guard bits set: %x (%u)", + cl->fn, flags & CLOSURE_GUARD_MASK, (unsigned) __fls(r))) r &= ~CLOSURE_GUARD_MASK; WARN(!r && (flags & ~CLOSURE_DESTRUCTOR), - "closure ref hit 0 with incorrect flags set: %x (%u)", + "closure %ps ref hit 0 with incorrect flags set: %x (%u)", + cl->fn, flags & ~CLOSURE_DESTRUCTOR, (unsigned) __fls(flags)); } static inline void closure_put_after_sub(struct closure *cl, int flags) { - closure_put_after_sub_checks(flags); + closure_put_after_sub_checks(cl, flags); if (!(flags & CLOSURE_REMAINING_MASK)) { smp_acquire__after_ctrl_dep(); @@ -167,7 +169,7 @@ void __sched closure_return_sync(struct closure *cl) unsigned flags = atomic_sub_return_release(1 + CLOSURE_RUNNING - CLOSURE_DESTRUCTOR, &cl->remaining); - closure_put_after_sub_checks(flags); + closure_put_after_sub_checks(cl, flags); if (unlikely(flags & CLOSURE_REMAINING_MASK)) { while (1) { diff --git a/linux/printk.c b/linux/printk.c new file mode 100644 index 00000000..d8f40d59 --- /dev/null +++ b/linux/printk.c @@ -0,0 +1,20 @@ +#include <stdarg.h> +#include <stdio.h> + +static inline const char *real_fmt(const char *fmt) +{ + return fmt[0] == '\001' ? fmt + 2 : fmt; +} + +void vprintk(const char *fmt, va_list args) +{ + vprintf(real_fmt(fmt), args); +} + +void printk(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vprintk(fmt, args); + va_end(args); +} diff --git a/linux/shrinker.c b/linux/shrinker.c index ca34ebc7..c0098cad 100644 --- a/linux/shrinker.c +++ b/linux/shrinker.c @@ -116,10 +116,15 @@ static int shrinker_thread(void *arg) } struct task_struct *shrinker_task; +unsigned long _totalram_pages; __attribute__((constructor(103))) static void shrinker_thread_init(void) { + struct sysinfo info; + si_meminfo(&info); + _totalram_pages = info.totalram >> PAGE_SHIFT; + shrinker_task = kthread_run(shrinker_thread, NULL, "shrinkers"); BUG_ON(IS_ERR(shrinker_task)); } |