summaryrefslogtreecommitdiff
path: root/linux
diff options
context:
space:
mode:
Diffstat (limited to 'linux')
-rw-r--r--linux/bio.c5
-rw-r--r--linux/closure.c12
-rw-r--r--linux/printk.c20
-rw-r--r--linux/shrinker.c5
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));
}