* [PATCH 1/2] xen/gntdev.c: Mark pages as dirty
@ 2020-09-06 6:51 Souptick Joarder
2020-09-06 6:51 ` [PATCH 2/2] xen/gntdev.c: Convert get_user_pages*() to pin_user_pages*() Souptick Joarder
2020-09-11 14:41 ` [PATCH 1/2] xen/gntdev.c: Mark pages as dirty boris.ostrovsky
0 siblings, 2 replies; 8+ messages in thread
From: Souptick Joarder @ 2020-09-06 6:51 UTC (permalink / raw)
To: boris.ostrovsky, jgross, sstabellini, david.vrabel
Cc: xen-devel, linux-kernel, Souptick Joarder, John Hubbard
There seems to be a bug in the original code when gntdev_get_page()
is called with writeable=true then the page needs to be marked dirty
before being put.
To address this, a bool writeable is added in gnt_dev_copy_batch, set
it in gntdev_grant_copy_seg() (and drop `writeable` argument to
gntdev_get_page()) and then, based on batch->writeable, use
set_page_dirty_lock().
Fixes: a4cdb556cae0 (xen/gntdev: add ioctl for grant copy)
Suggested-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com>
Cc: John Hubbard <jhubbard@nvidia.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: David Vrabel <david.vrabel@citrix.com>
---
drivers/xen/gntdev.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
index 64a9025a..5e1411b 100644
--- a/drivers/xen/gntdev.c
+++ b/drivers/xen/gntdev.c
@@ -720,17 +720,18 @@ struct gntdev_copy_batch {
s16 __user *status[GNTDEV_COPY_BATCH];
unsigned int nr_ops;
unsigned int nr_pages;
+ bool writeable;
};
static int gntdev_get_page(struct gntdev_copy_batch *batch, void __user *virt,
- bool writeable, unsigned long *gfn)
+ unsigned long *gfn)
{
unsigned long addr = (unsigned long)virt;
struct page *page;
unsigned long xen_pfn;
int ret;
- ret = get_user_pages_fast(addr, 1, writeable ? FOLL_WRITE : 0, &page);
+ ret = get_user_pages_fast(addr, 1, batch->writeable ? FOLL_WRITE : 0, &page);
if (ret < 0)
return ret;
@@ -746,9 +747,13 @@ static void gntdev_put_pages(struct gntdev_copy_batch *batch)
{
unsigned int i;
- for (i = 0; i < batch->nr_pages; i++)
+ for (i = 0; i < batch->nr_pages; i++) {
+ if (batch->writeable && !PageDirty(batch->pages[i]))
+ set_page_dirty_lock(batch->pages[i]);
put_page(batch->pages[i]);
+ }
batch->nr_pages = 0;
+ batch->writeable = false;
}
static int gntdev_copy(struct gntdev_copy_batch *batch)
@@ -837,8 +842,9 @@ static int gntdev_grant_copy_seg(struct gntdev_copy_batch *batch,
virt = seg->source.virt + copied;
off = (unsigned long)virt & ~XEN_PAGE_MASK;
len = min(len, (size_t)XEN_PAGE_SIZE - off);
+ batch->writeable = false;
- ret = gntdev_get_page(batch, virt, false, &gfn);
+ ret = gntdev_get_page(batch, virt, &gfn);
if (ret < 0)
return ret;
@@ -856,8 +862,9 @@ static int gntdev_grant_copy_seg(struct gntdev_copy_batch *batch,
virt = seg->dest.virt + copied;
off = (unsigned long)virt & ~XEN_PAGE_MASK;
len = min(len, (size_t)XEN_PAGE_SIZE - off);
+ batch->writeable = true;
- ret = gntdev_get_page(batch, virt, true, &gfn);
+ ret = gntdev_get_page(batch, virt, &gfn);
if (ret < 0)
return ret;
--
1.9.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/2] xen/gntdev.c: Convert get_user_pages*() to pin_user_pages*()
2020-09-06 6:51 [PATCH 1/2] xen/gntdev.c: Mark pages as dirty Souptick Joarder
@ 2020-09-06 6:51 ` Souptick Joarder
2020-09-11 14:42 ` boris.ostrovsky
2020-09-11 14:41 ` [PATCH 1/2] xen/gntdev.c: Mark pages as dirty boris.ostrovsky
1 sibling, 1 reply; 8+ messages in thread
From: Souptick Joarder @ 2020-09-06 6:51 UTC (permalink / raw)
To: boris.ostrovsky, jgross, sstabellini, david.vrabel
Cc: xen-devel, linux-kernel, Souptick Joarder, John Hubbard
In 2019, we introduced pin_user_pages*() and now we are converting
get_user_pages*() to the new API as appropriate. [1] & [2] could
be referred for more information. This is case 5 as per document [1].
[1] Documentation/core-api/pin_user_pages.rst
[2] "Explicit pinning of user-space pages":
https://lwn.net/Articles/807108/
Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com>
Cc: John Hubbard <jhubbard@nvidia.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: David Vrabel <david.vrabel@citrix.com>
---
drivers/xen/gntdev.c | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
index 5e1411b..a36b712 100644
--- a/drivers/xen/gntdev.c
+++ b/drivers/xen/gntdev.c
@@ -731,7 +731,7 @@ static int gntdev_get_page(struct gntdev_copy_batch *batch, void __user *virt,
unsigned long xen_pfn;
int ret;
- ret = get_user_pages_fast(addr, 1, batch->writeable ? FOLL_WRITE : 0, &page);
+ ret = pin_user_pages_fast(addr, 1, batch->writeable ? FOLL_WRITE : 0, &page);
if (ret < 0)
return ret;
@@ -745,13 +745,7 @@ static int gntdev_get_page(struct gntdev_copy_batch *batch, void __user *virt,
static void gntdev_put_pages(struct gntdev_copy_batch *batch)
{
- unsigned int i;
-
- for (i = 0; i < batch->nr_pages; i++) {
- if(batch->writeable && !PageDirty(batch->pages[i]))
- set_page_dirty_lock(batch->pages[i]);
- put_page(batch->pages[i]);
- }
+ unpin_user_pages_dirty_lock(batch->pages, batch->nr_pages, batch->writeable);
batch->nr_pages = 0;
batch->writeable = false;
}
--
1.9.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] xen/gntdev.c: Mark pages as dirty
2020-09-06 6:51 [PATCH 1/2] xen/gntdev.c: Mark pages as dirty Souptick Joarder
2020-09-06 6:51 ` [PATCH 2/2] xen/gntdev.c: Convert get_user_pages*() to pin_user_pages*() Souptick Joarder
@ 2020-09-11 14:41 ` boris.ostrovsky
1 sibling, 0 replies; 8+ messages in thread
From: boris.ostrovsky @ 2020-09-11 14:41 UTC (permalink / raw)
To: Souptick Joarder, jgross, sstabellini
Cc: xen-devel, linux-kernel, John Hubbard, stable
On 9/6/20 2:51 AM, Souptick Joarder wrote:
> There seems to be a bug in the original code when gntdev_get_page()
> is called with writeable=true then the page needs to be marked dirty
> before being put.
>
> To address this, a bool writeable is added in gnt_dev_copy_batch, set
> it in gntdev_grant_copy_seg() (and drop `writeable` argument to
> gntdev_get_page()) and then, based on batch->writeable, use
> set_page_dirty_lock().
>
> Fixes: a4cdb556cae0 (xen/gntdev: add ioctl for grant copy)
> Suggested-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com>
> Cc: John Hubbard <jhubbard@nvidia.com>
> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> Cc: Juergen Gross <jgross@suse.com>
> Cc: David Vrabel <david.vrabel@citrix.com>
Cc: stable@vger.kernel.org
(can be added at commit time)
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] xen/gntdev.c: Convert get_user_pages*() to pin_user_pages*()
2020-09-06 6:51 ` [PATCH 2/2] xen/gntdev.c: Convert get_user_pages*() to pin_user_pages*() Souptick Joarder
@ 2020-09-11 14:42 ` boris.ostrovsky
2020-09-29 12:09 ` Souptick Joarder
0 siblings, 1 reply; 8+ messages in thread
From: boris.ostrovsky @ 2020-09-11 14:42 UTC (permalink / raw)
To: Souptick Joarder, jgross, sstabellini
Cc: xen-devel, linux-kernel, John Hubbard
On 9/6/20 2:51 AM, Souptick Joarder wrote:
> In 2019, we introduced pin_user_pages*() and now we are converting
> get_user_pages*() to the new API as appropriate. [1] & [2] could
> be referred for more information. This is case 5 as per document [1].
>
> [1] Documentation/core-api/pin_user_pages.rst
>
> [2] "Explicit pinning of user-space pages":
> https://lwn.net/Articles/807108/
>
> Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com>
> Cc: John Hubbard <jhubbard@nvidia.com>
> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> Cc: Juergen Gross <jgross@suse.com>
> Cc: David Vrabel <david.vrabel@citrix.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] xen/gntdev.c: Convert get_user_pages*() to pin_user_pages*()
2020-09-11 14:42 ` boris.ostrovsky
@ 2020-09-29 12:09 ` Souptick Joarder
2020-09-29 12:30 ` boris.ostrovsky
0 siblings, 1 reply; 8+ messages in thread
From: Souptick Joarder @ 2020-09-29 12:09 UTC (permalink / raw)
To: Boris Ostrovsky
Cc: Juergen Gross, sstabellini, xen-devel, linux-kernel, John Hubbard
On Fri, Sep 11, 2020 at 8:12 PM <boris.ostrovsky@oracle.com> wrote:
>
>
> On 9/6/20 2:51 AM, Souptick Joarder wrote:
> > In 2019, we introduced pin_user_pages*() and now we are converting
> > get_user_pages*() to the new API as appropriate. [1] & [2] could
> > be referred for more information. This is case 5 as per document [1].
> >
> > [1] Documentation/core-api/pin_user_pages.rst
> >
> > [2] "Explicit pinning of user-space pages":
> > https://lwn.net/Articles/807108/
> >
> > Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com>
> > Cc: John Hubbard <jhubbard@nvidia.com>
> > Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> > Cc: Juergen Gross <jgross@suse.com>
> > Cc: David Vrabel <david.vrabel@citrix.com>
>
>
> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Are these 2 patches queued for 5.10-rc1 ?
>
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] xen/gntdev.c: Convert get_user_pages*() to pin_user_pages*()
2020-09-29 12:09 ` Souptick Joarder
@ 2020-09-29 12:30 ` boris.ostrovsky
2020-09-30 2:14 ` Souptick Joarder
0 siblings, 1 reply; 8+ messages in thread
From: boris.ostrovsky @ 2020-09-29 12:30 UTC (permalink / raw)
To: Souptick Joarder
Cc: Juergen Gross, sstabellini, xen-devel, linux-kernel, John Hubbard
On 9/29/20 8:09 AM, Souptick Joarder wrote:
> On Fri, Sep 11, 2020 at 8:12 PM <boris.ostrovsky@oracle.com> wrote:
>>
>> On 9/6/20 2:51 AM, Souptick Joarder wrote:
>>> In 2019, we introduced pin_user_pages*() and now we are converting
>>> get_user_pages*() to the new API as appropriate. [1] & [2] could
>>> be referred for more information. This is case 5 as per document [1].
>>>
>>> [1] Documentation/core-api/pin_user_pages.rst
>>>
>>> [2] "Explicit pinning of user-space pages":
>>> https://lwn.net/Articles/807108/
>>>
>>> Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com>
>>> Cc: John Hubbard <jhubbard@nvidia.com>
>>> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
>>> Cc: Juergen Gross <jgross@suse.com>
>>> Cc: David Vrabel <david.vrabel@citrix.com>
>>
>> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> Are these 2 patches queued for 5.10-rc1 ?
Yes, I am preparing the branch. (BTW, your second patch appears to have been either manually edited or not generated on top of the first patch. Please don't do this next time)
-boris
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] xen/gntdev.c: Convert get_user_pages*() to pin_user_pages*()
2020-09-29 12:30 ` boris.ostrovsky
@ 2020-09-30 2:14 ` Souptick Joarder
2020-09-30 14:10 ` boris.ostrovsky
0 siblings, 1 reply; 8+ messages in thread
From: Souptick Joarder @ 2020-09-30 2:14 UTC (permalink / raw)
To: Boris Ostrovsky
Cc: Juergen Gross, sstabellini, xen-devel, linux-kernel, John Hubbard
On Tue, Sep 29, 2020 at 6:00 PM <boris.ostrovsky@oracle.com> wrote:
>
>
> On 9/29/20 8:09 AM, Souptick Joarder wrote:
> > On Fri, Sep 11, 2020 at 8:12 PM <boris.ostrovsky@oracle.com> wrote:
> >>
> >> On 9/6/20 2:51 AM, Souptick Joarder wrote:
> >>> In 2019, we introduced pin_user_pages*() and now we are converting
> >>> get_user_pages*() to the new API as appropriate. [1] & [2] could
> >>> be referred for more information. This is case 5 as per document [1].
> >>>
> >>> [1] Documentation/core-api/pin_user_pages.rst
> >>>
> >>> [2] "Explicit pinning of user-space pages":
> >>> https://lwn.net/Articles/807108/
> >>>
> >>> Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com>
> >>> Cc: John Hubbard <jhubbard@nvidia.com>
> >>> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> >>> Cc: Juergen Gross <jgross@suse.com>
> >>> Cc: David Vrabel <david.vrabel@citrix.com>
> >>
> >> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> > Are these 2 patches queued for 5.10-rc1 ?
>
>
> Yes, I am preparing the branch. (BTW, your second patch appears to have been either manually edited or not generated on top of the first patch. Please don't do this next time)
I created it on top of the first one and didn't edit manually.
I was able to apply it in my local repository.
What was the error ?
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] xen/gntdev.c: Convert get_user_pages*() to pin_user_pages*()
2020-09-30 2:14 ` Souptick Joarder
@ 2020-09-30 14:10 ` boris.ostrovsky
0 siblings, 0 replies; 8+ messages in thread
From: boris.ostrovsky @ 2020-09-30 14:10 UTC (permalink / raw)
To: Souptick Joarder
Cc: Juergen Gross, sstabellini, xen-devel, linux-kernel, John Hubbard
On 9/29/20 10:14 PM, Souptick Joarder wrote:
> On Tue, Sep 29, 2020 at 6:00 PM <boris.ostrovsky@oracle.com> wrote:
>>
>>
>> On 9/29/20 8:09 AM, Souptick Joarder wrote:
>>> On Fri, Sep 11, 2020 at 8:12 PM <boris.ostrovsky@oracle.com> wrote:
>>>>
>>>> On 9/6/20 2:51 AM, Souptick Joarder wrote:
>>>>> In 2019, we introduced pin_user_pages*() and now we are converting
>>>>> get_user_pages*() to the new API as appropriate. [1] & [2] could
>>>>> be referred for more information. This is case 5 as per document [1].
>>>>>
>>>>> [1] Documentation/core-api/pin_user_pages.rst
>>>>>
>>>>> [2] "Explicit pinning of user-space pages":
>>>>> https://lwn.net/Articles/807108/
>>>>>
>>>>> Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com>
>>>>> Cc: John Hubbard <jhubbard@nvidia.com>
>>>>> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
>>>>> Cc: Juergen Gross <jgross@suse.com>
>>>>> Cc: David Vrabel <david.vrabel@citrix.com>
>>>>
>>>> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
>>> Are these 2 patches queued for 5.10-rc1 ?
>>
>>
>> Yes, I am preparing the branch. (BTW, your second patch appears to have been either manually edited or not generated on top of the first patch. Please don't do this next time)
>
> I created it on top of the first one and didn't edit manually.
> I was able to apply it in my local repository.
> What was the error ?
>
Patch 1:
+ if (batch->writeable && !PageDirty(batch->pages[i]))
Patch 2:
- if(batch->writeable && !PageDirty(batch->pages[i]))
This doesn't look to me like usual whitespace damage in-flight. Anyway, this has been applied to for-linus-5.10
-boris
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2020-09-30 14:11 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-09-06 6:51 [PATCH 1/2] xen/gntdev.c: Mark pages as dirty Souptick Joarder
2020-09-06 6:51 ` [PATCH 2/2] xen/gntdev.c: Convert get_user_pages*() to pin_user_pages*() Souptick Joarder
2020-09-11 14:42 ` boris.ostrovsky
2020-09-29 12:09 ` Souptick Joarder
2020-09-29 12:30 ` boris.ostrovsky
2020-09-30 2:14 ` Souptick Joarder
2020-09-30 14:10 ` boris.ostrovsky
2020-09-11 14:41 ` [PATCH 1/2] xen/gntdev.c: Mark pages as dirty boris.ostrovsky
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.