|
@@ -22,6 +22,7 @@
|
|
|
#include <linux/frontswap.h>
|
|
|
#include <linux/blkdev.h>
|
|
|
#include <linux/uio.h>
|
|
|
+#include <linux/sched/task.h>
|
|
|
#include <asm/pgtable.h>
|
|
|
|
|
|
static struct bio *get_swap_bio(gfp_t gfp_flags,
|
|
@@ -136,6 +137,7 @@ out:
|
|
|
WRITE_ONCE(bio->bi_private, NULL);
|
|
|
bio_put(bio);
|
|
|
wake_up_process(waiter);
|
|
|
+ put_task_struct(waiter);
|
|
|
}
|
|
|
|
|
|
int generic_swapfile_activate(struct swap_info_struct *sis,
|
|
@@ -378,6 +380,11 @@ int swap_readpage(struct page *page, bool do_poll)
|
|
|
goto out;
|
|
|
}
|
|
|
bdev = bio->bi_bdev;
|
|
|
+ /*
|
|
|
+ * Keep this task valid during swap readpage because the oom killer may
|
|
|
+ * attempt to access it in the page fault retry time check.
|
|
|
+ */
|
|
|
+ get_task_struct(current);
|
|
|
bio->bi_private = current;
|
|
|
bio_set_op_attrs(bio, REQ_OP_READ, 0);
|
|
|
count_vm_event(PSWPIN);
|