From: Michal Hocko <mhocko@kernel.org>
To: Minchan Kim <minchan@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
LKML <linux-kernel@vger.kernel.org>,
linux-mm <linux-mm@kvack.org>,
Johannes Weiner <hannes@cmpxchg.org>,
Tim Murray <timmurray@google.com>,
Joel Fernandes <joel@joelfernandes.org>,
Suren Baghdasaryan <surenb@google.com>,
Daniel Colascione <dancol@google.com>,
Shakeel Butt <shakeelb@google.com>,
Sonny Rao <sonnyrao@google.com>,
Brian Geffon <bgeffon@google.com>,
linux-api@vger.kernel.org
Subject: Re: [RFC 6/7] mm: extend process_madvise syscall to support vector arrary
Date: Mon, 20 May 2019 11:22:58 +0200 [thread overview]
Message-ID: <20190520092258.GZ6836@dhcp22.suse.cz> (raw)
In-Reply-To: <20190520035254.57579-7-minchan@kernel.org>
[Cc linux-api]
On Mon 20-05-19 12:52:53, Minchan Kim wrote:
> Currently, process_madvise syscall works for only one address range
> so user should call the syscall several times to give hints to
> multiple address range.
Is that a problem? How big of a problem? Any numbers?
> This patch extends process_madvise syscall to support multiple
> hints, address ranges and return vaules so user could give hints
> all at once.
>
> struct pr_madvise_param {
> int size; /* the size of this structure */
> const struct iovec __user *vec; /* address range array */
> }
>
> int process_madvise(int pidfd, ssize_t nr_elem,
> int *behavior,
> struct pr_madvise_param *results,
> struct pr_madvise_param *ranges,
> unsigned long flags);
>
> - pidfd
>
> target process fd
>
> - nr_elem
>
> the number of elemenent of array behavior, results, ranges
>
> - behavior
>
> hints for each address range in remote process so that user could
> give different hints for each range.
What is the guarantee of a single call? Do all hints get applied or the
first failure backs of? What are the atomicity guarantees?
>
> - results
>
> array of buffers to get results for associated remote address range
> action.
>
> - ranges
>
> array to buffers to have remote process's address ranges to be
> processed
>
> - flags
>
> extra argument for the future. It should be zero this moment.
>
> Example)
>
> struct pr_madvise_param {
> int size;
> const struct iovec *vec;
> };
>
> int main(int argc, char *argv[])
> {
> struct pr_madvise_param retp, rangep;
> struct iovec result_vec[2], range_vec[2];
> int hints[2];
> long ret[2];
> void *addr[2];
>
> pid_t pid;
> char cmd[64] = {0,};
> addr[0] = mmap(NULL, ALLOC_SIZE, PROT_READ|PROT_WRITE,
> MAP_POPULATE|MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);
>
> if (MAP_FAILED == addr[0])
> return 1;
>
> addr[1] = mmap(NULL, ALLOC_SIZE, PROT_READ|PROT_WRITE,
> MAP_POPULATE|MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);
>
> if (MAP_FAILED == addr[1])
> return 1;
>
> hints[0] = MADV_COLD;
> range_vec[0].iov_base = addr[0];
> range_vec[0].iov_len = ALLOC_SIZE;
> result_vec[0].iov_base = &ret[0];
> result_vec[0].iov_len = sizeof(long);
> retp.vec = result_vec;
> retp.size = sizeof(struct pr_madvise_param);
>
> hints[1] = MADV_COOL;
> range_vec[1].iov_base = addr[1];
> range_vec[1].iov_len = ALLOC_SIZE;
> result_vec[1].iov_base = &ret[1];
> result_vec[1].iov_len = sizeof(long);
> rangep.vec = range_vec;
> rangep.size = sizeof(struct pr_madvise_param);
>
> pid = fork();
> if (!pid) {
> sleep(10);
> } else {
> int pidfd = open(cmd, O_DIRECTORY | O_CLOEXEC);
> if (pidfd < 0)
> return 1;
>
> /* munmap to make pages private for the child */
> munmap(addr[0], ALLOC_SIZE);
> munmap(addr[1], ALLOC_SIZE);
> system("cat /proc/vmstat | egrep 'pswpout|deactivate'");
> if (syscall(__NR_process_madvise, pidfd, 2, behaviors,
> &retp, &rangep, 0))
> perror("process_madvise fail\n");
> system("cat /proc/vmstat | egrep 'pswpout|deactivate'");
> }
>
> return 0;
> }
>
> Signed-off-by: Minchan Kim <minchan@kernel.org>
> ---
> include/uapi/asm-generic/mman-common.h | 5 +
> mm/madvise.c | 184 +++++++++++++++++++++----
> 2 files changed, 166 insertions(+), 23 deletions(-)
>
> diff --git a/include/uapi/asm-generic/mman-common.h b/include/uapi/asm-generic/mman-common.h
> index b9b51eeb8e1a..b8e230de84a6 100644
> --- a/include/uapi/asm-generic/mman-common.h
> +++ b/include/uapi/asm-generic/mman-common.h
> @@ -74,4 +74,9 @@
> #define PKEY_ACCESS_MASK (PKEY_DISABLE_ACCESS |\
> PKEY_DISABLE_WRITE)
>
> +struct pr_madvise_param {
> + int size; /* the size of this structure */
> + const struct iovec __user *vec; /* address range array */
> +};
> +
> #endif /* __ASM_GENERIC_MMAN_COMMON_H */
> diff --git a/mm/madvise.c b/mm/madvise.c
> index af02aa17e5c1..f4f569dac2bd 100644
> --- a/mm/madvise.c
> +++ b/mm/madvise.c
> @@ -320,6 +320,7 @@ static int madvise_cool_pte_range(pmd_t *pmd, unsigned long addr,
> struct page *page;
> struct vm_area_struct *vma = walk->vma;
> unsigned long next;
> + long nr_pages = 0;
>
> next = pmd_addr_end(addr, end);
> if (pmd_trans_huge(*pmd)) {
> @@ -380,9 +381,12 @@ static int madvise_cool_pte_range(pmd_t *pmd, unsigned long addr,
>
> ptep_test_and_clear_young(vma, addr, pte);
> deactivate_page(page);
> + nr_pages++;
> +
> }
>
> pte_unmap_unlock(orig_pte, ptl);
> + *(long *)walk->private += nr_pages;
> cond_resched();
>
> return 0;
> @@ -390,11 +394,13 @@ static int madvise_cool_pte_range(pmd_t *pmd, unsigned long addr,
>
> static void madvise_cool_page_range(struct mmu_gather *tlb,
> struct vm_area_struct *vma,
> - unsigned long addr, unsigned long end)
> + unsigned long addr, unsigned long end,
> + long *nr_pages)
> {
> struct mm_walk cool_walk = {
> .pmd_entry = madvise_cool_pte_range,
> .mm = vma->vm_mm,
> + .private = nr_pages
> };
>
> tlb_start_vma(tlb, vma);
> @@ -403,7 +409,8 @@ static void madvise_cool_page_range(struct mmu_gather *tlb,
> }
>
> static long madvise_cool(struct vm_area_struct *vma,
> - unsigned long start_addr, unsigned long end_addr)
> + unsigned long start_addr, unsigned long end_addr,
> + long *nr_pages)
> {
> struct mm_struct *mm = vma->vm_mm;
> struct mmu_gather tlb;
> @@ -413,7 +420,7 @@ static long madvise_cool(struct vm_area_struct *vma,
>
> lru_add_drain();
> tlb_gather_mmu(&tlb, mm, start_addr, end_addr);
> - madvise_cool_page_range(&tlb, vma, start_addr, end_addr);
> + madvise_cool_page_range(&tlb, vma, start_addr, end_addr, nr_pages);
> tlb_finish_mmu(&tlb, start_addr, end_addr);
>
> return 0;
> @@ -429,6 +436,7 @@ static int madvise_cold_pte_range(pmd_t *pmd, unsigned long addr,
> int isolated = 0;
> struct vm_area_struct *vma = walk->vma;
> unsigned long next;
> + long nr_pages = 0;
>
> next = pmd_addr_end(addr, end);
> if (pmd_trans_huge(*pmd)) {
> @@ -492,7 +500,7 @@ static int madvise_cold_pte_range(pmd_t *pmd, unsigned long addr,
> list_add(&page->lru, &page_list);
> if (isolated >= SWAP_CLUSTER_MAX) {
> pte_unmap_unlock(orig_pte, ptl);
> - reclaim_pages(&page_list);
> + nr_pages += reclaim_pages(&page_list);
> isolated = 0;
> pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);
> orig_pte = pte;
> @@ -500,19 +508,22 @@ static int madvise_cold_pte_range(pmd_t *pmd, unsigned long addr,
> }
>
> pte_unmap_unlock(orig_pte, ptl);
> - reclaim_pages(&page_list);
> + nr_pages += reclaim_pages(&page_list);
> cond_resched();
>
> + *(long *)walk->private += nr_pages;
> return 0;
> }
>
> static void madvise_cold_page_range(struct mmu_gather *tlb,
> struct vm_area_struct *vma,
> - unsigned long addr, unsigned long end)
> + unsigned long addr, unsigned long end,
> + long *nr_pages)
> {
> struct mm_walk warm_walk = {
> .pmd_entry = madvise_cold_pte_range,
> .mm = vma->vm_mm,
> + .private = nr_pages,
> };
>
> tlb_start_vma(tlb, vma);
> @@ -522,7 +533,8 @@ static void madvise_cold_page_range(struct mmu_gather *tlb,
>
>
> static long madvise_cold(struct vm_area_struct *vma,
> - unsigned long start_addr, unsigned long end_addr)
> + unsigned long start_addr, unsigned long end_addr,
> + long *nr_pages)
> {
> struct mm_struct *mm = vma->vm_mm;
> struct mmu_gather tlb;
> @@ -532,7 +544,7 @@ static long madvise_cold(struct vm_area_struct *vma,
>
> lru_add_drain();
> tlb_gather_mmu(&tlb, mm, start_addr, end_addr);
> - madvise_cold_page_range(&tlb, vma, start_addr, end_addr);
> + madvise_cold_page_range(&tlb, vma, start_addr, end_addr, nr_pages);
> tlb_finish_mmu(&tlb, start_addr, end_addr);
>
> return 0;
> @@ -922,7 +934,7 @@ static int madvise_inject_error(int behavior,
> static long
> madvise_vma(struct task_struct *tsk, struct vm_area_struct *vma,
> struct vm_area_struct **prev, unsigned long start,
> - unsigned long end, int behavior)
> + unsigned long end, int behavior, long *nr_pages)
> {
> switch (behavior) {
> case MADV_REMOVE:
> @@ -930,9 +942,9 @@ madvise_vma(struct task_struct *tsk, struct vm_area_struct *vma,
> case MADV_WILLNEED:
> return madvise_willneed(vma, prev, start, end);
> case MADV_COOL:
> - return madvise_cool(vma, start, end);
> + return madvise_cool(vma, start, end, nr_pages);
> case MADV_COLD:
> - return madvise_cold(vma, start, end);
> + return madvise_cold(vma, start, end, nr_pages);
> case MADV_FREE:
> case MADV_DONTNEED:
> return madvise_dontneed_free(tsk, vma, prev, start,
> @@ -981,7 +993,7 @@ madvise_behavior_valid(int behavior)
> }
>
> static int madvise_core(struct task_struct *tsk, unsigned long start,
> - size_t len_in, int behavior)
> + size_t len_in, int behavior, long *nr_pages)
> {
> unsigned long end, tmp;
> struct vm_area_struct *vma, *prev;
> @@ -996,6 +1008,7 @@ static int madvise_core(struct task_struct *tsk, unsigned long start,
>
> if (start & ~PAGE_MASK)
> return error;
> +
> len = (len_in + ~PAGE_MASK) & PAGE_MASK;
>
> /* Check to see whether len was rounded up from small -ve to zero */
> @@ -1035,6 +1048,8 @@ static int madvise_core(struct task_struct *tsk, unsigned long start,
> blk_start_plug(&plug);
> for (;;) {
> /* Still start < end. */
> + long pages = 0;
> +
> error = -ENOMEM;
> if (!vma)
> goto out;
> @@ -1053,9 +1068,11 @@ static int madvise_core(struct task_struct *tsk, unsigned long start,
> tmp = end;
>
> /* Here vma->vm_start <= start < tmp <= (end|vma->vm_end). */
> - error = madvise_vma(tsk, vma, &prev, start, tmp, behavior);
> + error = madvise_vma(tsk, vma, &prev, start, tmp,
> + behavior, &pages);
> if (error)
> goto out;
> + *nr_pages += pages;
> start = tmp;
> if (prev && start < prev->vm_end)
> start = prev->vm_end;
> @@ -1140,26 +1157,137 @@ static int madvise_core(struct task_struct *tsk, unsigned long start,
> */
> SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior)
> {
> - return madvise_core(current, start, len_in, behavior);
> + unsigned long dummy;
> +
> + return madvise_core(current, start, len_in, behavior, &dummy);
> }
>
> -SYSCALL_DEFINE4(process_madvise, int, pidfd, unsigned long, start,
> - size_t, len_in, int, behavior)
> +static int pr_madvise_copy_param(struct pr_madvise_param __user *u_param,
> + struct pr_madvise_param *param)
> +{
> + u32 size;
> + int ret;
> +
> + memset(param, 0, sizeof(*param));
> +
> + ret = get_user(size, &u_param->size);
> + if (ret)
> + return ret;
> +
> + if (size > PAGE_SIZE)
> + return -E2BIG;
> +
> + if (!size || size > sizeof(struct pr_madvise_param))
> + return -EINVAL;
> +
> + ret = copy_from_user(param, u_param, size);
> + if (ret)
> + return -EFAULT;
> +
> + return ret;
> +}
> +
> +static int process_madvise_core(struct task_struct *tsk, int *behaviors,
> + struct iov_iter *iter,
> + const struct iovec *range_vec,
> + unsigned long riovcnt,
> + unsigned long flags)
> +{
> + int i;
> + long err;
> +
> + for (err = 0, i = 0; i < riovcnt && iov_iter_count(iter); i++) {
> + long ret = 0;
> +
> + err = madvise_core(tsk, (unsigned long)range_vec[i].iov_base,
> + range_vec[i].iov_len, behaviors[i],
> + &ret);
> + if (err)
> + ret = err;
> +
> + if (copy_to_iter(&ret, sizeof(long), iter) !=
> + sizeof(long)) {
> + err = -EFAULT;
> + break;
> + }
> +
> + err = 0;
> + }
> +
> + return err;
> +}
> +
> +SYSCALL_DEFINE6(process_madvise, int, pidfd, ssize_t, nr_elem,
> + const int __user *, hints,
> + struct pr_madvise_param __user *, results,
> + struct pr_madvise_param __user *, ranges,
> + unsigned long, flags)
> {
> int ret;
> struct fd f;
> struct pid *pid;
> struct task_struct *tsk;
> struct mm_struct *mm;
> + struct pr_madvise_param result_p, range_p;
> + const struct iovec __user *result_vec, __user *range_vec;
> + int *behaviors;
> + struct iovec iovstack_result[UIO_FASTIOV];
> + struct iovec iovstack_r[UIO_FASTIOV];
> + struct iovec *iov_l = iovstack_result;
> + struct iovec *iov_r = iovstack_r;
> + struct iov_iter iter;
> +
> + if (flags != 0)
> + return -EINVAL;
> +
> + ret = pr_madvise_copy_param(results, &result_p);
> + if (ret)
> + return ret;
> +
> + ret = pr_madvise_copy_param(ranges, &range_p);
> + if (ret)
> + return ret;
> +
> + result_vec = result_p.vec;
> + range_vec = range_p.vec;
> +
> + if (result_p.size != sizeof(struct pr_madvise_param) ||
> + range_p.size != sizeof(struct pr_madvise_param))
> + return -EINVAL;
> +
> + behaviors = kmalloc_array(nr_elem, sizeof(int), GFP_KERNEL);
> + if (!behaviors)
> + return -ENOMEM;
> +
> + ret = copy_from_user(behaviors, hints, sizeof(int) * nr_elem);
> + if (ret < 0)
> + goto free_behavior_vec;
> +
> + ret = import_iovec(READ, result_vec, nr_elem, UIO_FASTIOV,
> + &iov_l, &iter);
> + if (ret < 0)
> + goto free_behavior_vec;
> +
> + if (!iov_iter_count(&iter)) {
> + ret = -EINVAL;
> + goto free_iovecs;
> + }
> +
> + ret = rw_copy_check_uvector(CHECK_IOVEC_ONLY, range_vec, nr_elem,
> + UIO_FASTIOV, iovstack_r, &iov_r);
> + if (ret <= 0)
> + goto free_iovecs;
>
> f = fdget(pidfd);
> - if (!f.file)
> - return -EBADF;
> + if (!f.file) {
> + ret = -EBADF;
> + goto free_iovecs;
> + }
>
> pid = pidfd_to_pid(f.file);
> if (IS_ERR(pid)) {
> ret = PTR_ERR(pid);
> - goto err;
> + goto put_fd;
> }
>
> ret = -EINVAL;
> @@ -1167,7 +1295,7 @@ SYSCALL_DEFINE4(process_madvise, int, pidfd, unsigned long, start,
> tsk = pid_task(pid, PIDTYPE_PID);
> if (!tsk) {
> rcu_read_unlock();
> - goto err;
> + goto put_fd;
> }
> get_task_struct(tsk);
> rcu_read_unlock();
> @@ -1176,12 +1304,22 @@ SYSCALL_DEFINE4(process_madvise, int, pidfd, unsigned long, start,
> ret = IS_ERR(mm) ? PTR_ERR(mm) : -ESRCH;
> if (ret == -EACCES)
> ret = -EPERM;
> - goto err;
> + goto put_task;
> }
> - ret = madvise_core(tsk, start, len_in, behavior);
> +
> + ret = process_madvise_core(tsk, behaviors, &iter, iov_r,
> + nr_elem, flags);
> mmput(mm);
> +put_task:
> put_task_struct(tsk);
> -err:
> +put_fd:
> fdput(f);
> +free_iovecs:
> + if (iov_r != iovstack_r)
> + kfree(iov_r);
> + kfree(iov_l);
> +free_behavior_vec:
> + kfree(behaviors);
> +
> return ret;
> }
> --
> 2.21.0.1020.gf2820cf01a-goog
>
--
Michal Hocko
SUSE Labs
next prev parent reply other threads:[~2019-05-20 9:23 UTC|newest]
Thread overview: 132+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-20 3:52 [RFC 0/7] introduce memory hinting API for external process Minchan Kim
2019-05-20 3:52 ` [RFC 1/7] mm: introduce MADV_COOL Minchan Kim
2019-05-20 8:16 ` Michal Hocko
2019-05-20 8:19 ` Michal Hocko
2019-05-20 15:08 ` Suren Baghdasaryan
2019-05-20 22:55 ` Minchan Kim
2019-05-20 22:54 ` Minchan Kim
2019-05-21 6:04 ` Michal Hocko
2019-05-21 9:11 ` Minchan Kim
2019-05-21 10:05 ` Michal Hocko
2019-05-28 10:58 ` Minchan Kim
2019-05-20 3:52 ` [RFC 2/7] mm: change PAGEREF_RECLAIM_CLEAN with PAGE_REFRECLAIM Minchan Kim
2019-05-20 16:50 ` Johannes Weiner
2019-05-20 22:57 ` Minchan Kim
2019-05-20 3:52 ` [RFC 3/7] mm: introduce MADV_COLD Minchan Kim
2019-05-20 8:27 ` Michal Hocko
2019-05-20 23:00 ` Minchan Kim
2019-05-21 6:08 ` Michal Hocko
2019-05-21 9:13 ` Minchan Kim
2019-05-30 0:45 ` Minchan Kim
2019-05-20 3:52 ` [RFC 4/7] mm: factor out madvise's core functionality Minchan Kim
2019-05-20 14:26 ` Oleksandr Natalenko
2019-05-21 1:26 ` Minchan Kim
2019-05-21 6:36 ` Oleksandr Natalenko
2019-05-21 6:50 ` Michal Hocko
2019-05-21 7:06 ` Oleksandr Natalenko
2019-05-21 10:52 ` Minchan Kim
2019-05-21 11:00 ` Michal Hocko
2019-05-21 11:24 ` Minchan Kim
2019-05-21 11:32 ` Michal Hocko
2019-05-21 10:49 ` Minchan Kim
2019-05-21 10:55 ` Michal Hocko
2019-05-20 3:52 ` [RFC 5/7] mm: introduce external memory hinting API Minchan Kim
2019-05-20 9:18 ` Michal Hocko
2019-05-21 2:41 ` Minchan Kim
2019-05-21 6:17 ` Michal Hocko
2019-05-21 10:32 ` Minchan Kim
2019-05-21 9:01 ` Christian Brauner
2019-05-21 11:35 ` Minchan Kim
2019-05-21 11:51 ` Christian Brauner
2019-05-21 15:31 ` Oleg Nesterov
2019-05-27 7:43 ` Minchan Kim
2019-05-27 15:12 ` Oleg Nesterov
2019-05-27 23:33 ` Minchan Kim
2019-05-28 7:23 ` Michal Hocko
2019-05-30 0:38 ` Minchan Kim
2019-05-20 3:52 ` [RFC 6/7] mm: extend process_madvise syscall to support vector arrary Minchan Kim
2019-05-20 9:22 ` Michal Hocko [this message]
2019-05-21 2:48 ` Minchan Kim
2019-05-21 6:24 ` Michal Hocko
2019-05-21 10:26 ` Minchan Kim
2019-05-21 10:37 ` Michal Hocko
2019-05-27 7:49 ` Minchan Kim
2019-05-29 10:08 ` Daniel Colascione
2019-05-29 10:33 ` Michal Hocko
2019-05-30 2:17 ` Minchan Kim
2019-05-30 6:57 ` Michal Hocko
2019-05-30 8:02 ` Minchan Kim
2019-05-30 16:19 ` Daniel Colascione
2019-05-30 18:47 ` Michal Hocko
2019-05-30 0:35 ` Minchan Kim
2019-05-20 3:52 ` [RFC 7/7] mm: madvise support MADV_ANONYMOUS_FILTER and MADV_FILE_FILTER Minchan Kim
2019-05-20 9:28 ` Michal Hocko
2019-05-21 2:55 ` Minchan Kim
2019-05-21 6:26 ` Michal Hocko
2019-05-27 7:58 ` Minchan Kim
2019-05-27 12:44 ` Michal Hocko
2019-05-28 3:26 ` Minchan Kim
2019-05-28 6:29 ` Michal Hocko
2019-05-28 8:13 ` Minchan Kim
2019-05-28 8:31 ` Daniel Colascione
2019-05-28 8:49 ` Minchan Kim
2019-05-28 9:08 ` Michal Hocko
2019-05-28 9:39 ` Daniel Colascione
2019-05-28 10:33 ` Michal Hocko
2019-05-28 11:21 ` Daniel Colascione
2019-05-28 11:49 ` Michal Hocko
2019-05-28 12:11 ` Daniel Colascione
2019-05-28 12:32 ` Michal Hocko
2019-05-28 10:32 ` Minchan Kim
2019-05-28 10:41 ` Michal Hocko
2019-05-28 11:12 ` Minchan Kim
2019-05-28 11:28 ` Michal Hocko
2019-05-28 11:42 ` Daniel Colascione
2019-05-28 11:56 ` Michal Hocko
2019-05-28 12:18 ` Daniel Colascione
2019-05-28 12:38 ` Michal Hocko
2019-05-28 12:10 ` Minchan Kim
2019-05-28 11:44 ` Minchan Kim
2019-05-28 11:51 ` Daniel Colascione
2019-05-28 12:06 ` Michal Hocko
2019-05-28 12:22 ` Minchan Kim
2019-05-28 11:28 ` Daniel Colascione
2019-05-21 15:33 ` Johannes Weiner
2019-05-22 1:50 ` Minchan Kim
2019-05-30 1:00 ` Minchan Kim
2019-05-20 6:37 ` [RFC 0/7] introduce memory hinting API for external process Anshuman Khandual
2019-05-20 16:59 ` Tim Murray
2019-05-21 2:55 ` Anshuman Khandual
2019-05-21 5:14 ` Minchan Kim
2019-05-21 10:34 ` Michal Hocko
2019-05-28 10:50 ` Anshuman Khandual
2019-05-21 12:56 ` Shakeel Butt
2019-05-22 4:23 ` Brian Geffon
2019-05-20 9:28 ` Michal Hocko
2019-05-20 14:42 ` Oleksandr Natalenko
2019-05-21 2:56 ` Minchan Kim
2019-05-20 16:46 ` Johannes Weiner
2019-05-21 4:39 ` Minchan Kim
2019-05-21 6:32 ` Michal Hocko
2019-05-21 1:44 ` Matthew Wilcox
2019-05-21 5:01 ` Minchan Kim
2019-05-21 6:34 ` Michal Hocko
2019-05-21 8:42 ` Christian Brauner
2019-05-21 11:05 ` Minchan Kim
2019-05-21 11:30 ` Christian Brauner
2019-05-21 11:39 ` Christian Brauner
2019-05-22 5:11 ` Daniel Colascione
2019-05-22 8:22 ` Christian Brauner
2019-05-22 13:16 ` Daniel Colascione
2019-05-22 14:52 ` Christian Brauner
2019-05-22 15:17 ` Daniel Colascione
2019-05-22 15:48 ` Christian Brauner
2019-05-22 15:57 ` Daniel Colascione
2019-05-22 16:01 ` Christian Brauner
2019-05-22 16:01 ` Daniel Colascione
2019-05-23 13:07 ` Minchan Kim
2019-05-27 8:06 ` Minchan Kim
2019-05-21 11:41 ` Minchan Kim
2019-05-21 12:04 ` Christian Brauner
2019-05-21 12:15 ` Oleksandr Natalenko
2019-05-21 12:53 ` Shakeel Butt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190520092258.GZ6836@dhcp22.suse.cz \
--to=mhocko@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=bgeffon@google.com \
--cc=dancol@google.com \
--cc=hannes@cmpxchg.org \
--cc=joel@joelfernandes.org \
--cc=linux-api@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=minchan@kernel.org \
--cc=shakeelb@google.com \
--cc=sonnyrao@google.com \
--cc=surenb@google.com \
--cc=timmurray@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).