All of lore.kernel.org
 help / color / mirror / Atom feed
From: Muhammad Usama Anjum <usama.anjum@collabora.com>
To: Andrei Vagin <avagin@gmail.com>
Cc: "Muhammad Usama Anjum" <usama.anjum@collabora.com>,
	"Peter Xu" <peterx@redhat.com>,
	"David Hildenbrand" <david@redhat.com>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Michał Mirosław" <emmir@google.com>,
	"Danylo Mocherniuk" <mdanylo@google.com>,
	"Paul Gofman" <pgofman@codeweavers.com>,
	"Cyrill Gorcunov" <gorcunov@gmail.com>,
	"Mike Rapoport" <rppt@kernel.org>,
	"Nadav Amit" <namit@vmware.com>,
	"Alexander Viro" <viro@zeniv.linux.org.uk>,
	"Shuah Khan" <shuah@kernel.org>,
	"Christian Brauner" <brauner@kernel.org>,
	"Yang Shi" <shy828301@gmail.com>,
	"Vlastimil Babka" <vbabka@suse.cz>,
	"Liam R . Howlett" <Liam.Howlett@oracle.com>,
	"Yun Zhou" <yun.zhou@windriver.com>,
	"Suren Baghdasaryan" <surenb@google.com>,
	"Alex Sierra" <alex.sierra@amd.com>,
	"Matthew Wilcox" <willy@infradead.org>,
	"Pasha Tatashin" <pasha.tatashin@soleen.com>,
	"Axel Rasmussen" <axelrasmussen@google.com>,
	"Gustavo A . R . Silva" <gustavoars@kernel.org>,
	"Dan Williams" <dan.j.williams@intel.com>,
	linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	linux-mm@kvack.org, linux-kselftest@vger.kernel.org,
	"Greg KH" <gregkh@linuxfoundation.org>,
	kernel@collabora.com, "Michał Mirosław" <mirq-linux@rere.qmqm.pl>
Subject: Re: [PATCH v27 2/6] fs/proc/task_mmu: Implement IOCTL to get and optionally clear info about PTEs
Date: Wed, 9 Aug 2023 00:35:01 +0500	[thread overview]
Message-ID: <624cfa26-5650-ee0d-8e0a-1d844175bcaf@collabora.com> (raw)
In-Reply-To: <CANaxB-ww6AcO4QThubYw62Mdeid4e3FOQAXvA_GZ=wu4J60-AQ@mail.gmail.com>

On 8/9/23 12:21 AM, Andrei Vagin wrote:
> On Tue, Aug 8, 2023 at 3:43 AM Muhammad Usama Anjum
> <usama.anjum@collabora.com> wrote:
> 
> ....
> 
>> +static int pagemap_scan_output(unsigned long categories,
>> +                              struct pagemap_scan_private *p,
>> +                              unsigned long addr, unsigned long *end)
>> +{
>> +       unsigned long n_pages, total_pages;
>> +       int ret = 0;
>> +
>> +       if (!p->vec_buf)
>> +               return 0;
>> +
>> +       categories &= p->arg.return_mask;
>> +
>> +       n_pages = (*end - addr) / PAGE_SIZE;
>> +       if (check_add_overflow(p->found_pages, n_pages, &total_pages) || //TODO
> 
> Need to fix this TODO.
Sorry, I forgot to remove the "//TODO". As far as I've understood, the last
discussion ended in keeping the check_add_overflow(). [1] I'll just remove
the TODO.

https://lore.kernel.org/all/CABb0KFEfmRz+Z_-7GygTL12E5Y254dvoUfWe4uSv9-wOx+Cs8w@mail.gmail.com


> 
>> +           total_pages > p->arg.max_pages) {
>> +               size_t n_too_much = total_pages - p->arg.max_pages;
>> +               *end -= n_too_much * PAGE_SIZE;
>> +               n_pages -= n_too_much;
>> +               ret = -ENOSPC;
>> +       }
>> +
>> +       if (!pagemap_scan_push_range(categories, p, addr, *end)) {
>> +               *end = addr;
>> +               n_pages = 0;
>> +               ret = -ENOSPC;
>> +       }
>> +
>> +       p->found_pages += n_pages;
>> +       if (ret)
>> +               p->walk_end_addr = *end;
>> +
>> +       return ret;
>> +}
>> +
> 
> ...
> 
>> +static long do_pagemap_scan(struct mm_struct *mm, unsigned long uarg)
>> +{
>> +       struct mmu_notifier_range range;
>> +       struct pagemap_scan_private p;
>> +       unsigned long walk_start;
>> +       size_t n_ranges_out = 0;
>> +       int ret;
>> +
>> +       memset(&p, 0, sizeof(p));
>> +       ret = pagemap_scan_get_args(&p.arg, uarg);
>> +       if (ret)
>> +               return ret;
>> +
>> +       p.masks_of_interest = MASKS_OF_INTEREST(p.arg);
>> +       ret = pagemap_scan_init_bounce_buffer(&p);
>> +       if (ret)
>> +               return ret;
>> +
>> +       /* Protection change for the range is going to happen. */
>> +       if (p.arg.flags & PM_SCAN_WP_MATCHING) {
>> +               mmu_notifier_range_init(&range, MMU_NOTIFY_PROTECTION_VMA, 0,
>> +                                       mm, p.arg.start, p.arg.end);
>> +               mmu_notifier_invalidate_range_start(&range);
>> +       }
>> +
>> +       walk_start = p.arg.start;
>> +       for (; walk_start < p.arg.end; walk_start = p.arg.walk_end) {
>> +               int n_out;
>> +
>> +               if (fatal_signal_pending(current)) {
>> +                       ret = -EINTR;
>> +                       break;
>> +               }
>> +
>> +               ret = mmap_read_lock_killable(mm);
>> +               if (ret)
>> +                       break;
>> +               ret = walk_page_range(mm, walk_start, p.arg.end,
>> +                                     &pagemap_scan_ops, &p);
>> +               mmap_read_unlock(mm);
>> +
>> +               n_out = pagemap_scan_flush_buffer(&p);
>> +               if (n_out < 0)
>> +                       ret = n_out;
>> +               else
>> +                       n_ranges_out += n_out;
>> +
>> +               if (ret != -ENOSPC || p.arg.vec_len - 1 == 0 ||
>> +                   p.found_pages == p.arg.max_pages) {
>> +                       p.walk_end_addr = p.arg.end;
> 
> You should not change p.walk_end_addr If ret is ENOSPC. Pls add a test
> case to check this.
Yeah, I'm not setting walk_end_addr if ret is ENOSPC.

I'm setting walk_end_addr only when ret = 0. I'd added this as a result of
a test case in my local test application. I can look at adding some tests
in pagemap_ioctl.c kselftest as well.

> 
>> +                       break;
>> +               }
>> +       }
>> +
>> +       if (p.cur_buf.start != p.cur_buf.end) {
>> +               if (copy_to_user(p.vec_out, &p.cur_buf, sizeof(p.cur_buf)))
>> +                       ret = -EFAULT;
>> +               else
>> +                       ++n_ranges_out;
>> +       }
>> +
>> +       /* ENOSPC signifies early stop (buffer full) from the walk. */
>> +       if (!ret || ret == -ENOSPC)
>> +               ret = n_ranges_out;
>> +
>> +       p.arg.walk_end = p.walk_end_addr ? p.walk_end_addr : walk_start;
>> +       if (pagemap_scan_writeback_args(&p.arg, uarg))
>> +               ret = -EFAULT;
>> +
>> +       if (p.arg.flags & PM_SCAN_WP_MATCHING)
>> +               mmu_notifier_invalidate_range_end(&range);
>> +
>> +       kfree(p.vec_buf);
>> +       return ret;
>> +}
> 
> Thanks,
> Andrei

-- 
BR,
Muhammad Usama Anjum

  reply	other threads:[~2023-08-08 20:25 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-08 10:43 [PATCH v27 0/6] Implement IOCTL to get and optionally clear info about PTEs Muhammad Usama Anjum
2023-08-08 10:43 ` [PATCH v27 1/6] userfaultfd: UFFD_FEATURE_WP_ASYNC Muhammad Usama Anjum
2023-08-08 10:43 ` [PATCH v27 2/6] fs/proc/task_mmu: Implement IOCTL to get and optionally clear info about PTEs Muhammad Usama Anjum
2023-08-08 19:21   ` Andrei Vagin
2023-08-08 19:35     ` Muhammad Usama Anjum [this message]
2023-08-08 19:55       ` Andrei Vagin
2023-08-09  4:31         ` Muhammad Usama Anjum
2023-08-08 10:43 ` [PATCH v27 3/6] fs/proc/task_mmu: Add fast paths to get/clear PAGE_IS_WRITTEN flag Muhammad Usama Anjum
2023-08-08 10:43 ` [PATCH v27 4/6] tools headers UAPI: Update linux/fs.h with the kernel sources Muhammad Usama Anjum
2023-08-08 10:43 ` [PATCH v27 5/6] mm/pagemap: add documentation of PAGEMAP_SCAN IOCTL Muhammad Usama Anjum
2023-08-08 10:43 ` [PATCH v27 6/6] selftests: mm: add pagemap ioctl tests Muhammad Usama Anjum

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=624cfa26-5650-ee0d-8e0a-1d844175bcaf@collabora.com \
    --to=usama.anjum@collabora.com \
    --cc=Liam.Howlett@oracle.com \
    --cc=akpm@linux-foundation.org \
    --cc=alex.sierra@amd.com \
    --cc=avagin@gmail.com \
    --cc=axelrasmussen@google.com \
    --cc=brauner@kernel.org \
    --cc=dan.j.williams@intel.com \
    --cc=david@redhat.com \
    --cc=emmir@google.com \
    --cc=gorcunov@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=gustavoars@kernel.org \
    --cc=kernel@collabora.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mdanylo@google.com \
    --cc=mirq-linux@rere.qmqm.pl \
    --cc=namit@vmware.com \
    --cc=pasha.tatashin@soleen.com \
    --cc=peterx@redhat.com \
    --cc=pgofman@codeweavers.com \
    --cc=rppt@kernel.org \
    --cc=shuah@kernel.org \
    --cc=shy828301@gmail.com \
    --cc=surenb@google.com \
    --cc=vbabka@suse.cz \
    --cc=viro@zeniv.linux.org.uk \
    --cc=willy@infradead.org \
    --cc=yun.zhou@windriver.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.