Re: [PATCH 2/2] vhost: convert get_user_pages() --> pin_user_pages()

2020-06-01 Thread Michael S. Tsirkin
On Fri, May 29, 2020 at 04:43:09PM -0700, John Hubbard wrote:
> This code was using get_user_pages*(), in approximately a "Case 5"
> scenario (accessing the data within a page), using the categorization
> from [1]. That means that it's time to convert the get_user_pages*() +
> put_page() calls to pin_user_pages*() + unpin_user_pages() calls.
> 
> There is some helpful background in [2]: basically, this is a small
> part of fixing a long-standing disconnect between pinning pages, and
> file systems' use of those pages.
> 
> [1] Documentation/core-api/pin_user_pages.rst
> 
> [2] "Explicit pinning of user-space pages":
> https://lwn.net/Articles/807108/
> 
> Cc: Michael S. Tsirkin 
> Cc: Jason Wang 
> Cc: k...@vger.kernel.org
> Cc: virtualizat...@lists.linux-foundation.org
> Cc: net...@vger.kernel.org
> Signed-off-by: John Hubbard 

Acked-by: Michael S. Tsirkin 

> ---
>  drivers/vhost/vhost.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> index 21a59b598ed8..596132a96cd5 100644
> --- a/drivers/vhost/vhost.c
> +++ b/drivers/vhost/vhost.c
> @@ -1762,15 +1762,14 @@ static int set_bit_to_user(int nr, void __user *addr)
>   int bit = nr + (log % PAGE_SIZE) * 8;
>   int r;
>  
> - r = get_user_pages_fast(log, 1, FOLL_WRITE, );
> + r = pin_user_pages_fast(log, 1, FOLL_WRITE, );
>   if (r < 0)
>   return r;
>   BUG_ON(r != 1);
>   base = kmap_atomic(page);
>   set_bit(bit, base);
>   kunmap_atomic(base);
> - set_page_dirty_lock(page);
> - put_page(page);
> + unpin_user_pages_dirty_lock(, 1, true);
>   return 0;
>  }
>  
> -- 
> 2.26.2



Re: [PATCH 2/2] vhost: convert get_user_pages() --> pin_user_pages()

2020-06-01 Thread Jan Kara
On Fri 29-05-20 16:43:09, John Hubbard wrote:
> This code was using get_user_pages*(), in approximately a "Case 5"
> scenario (accessing the data within a page), using the categorization
> from [1]. That means that it's time to convert the get_user_pages*() +
> put_page() calls to pin_user_pages*() + unpin_user_pages() calls.
> 
> There is some helpful background in [2]: basically, this is a small
> part of fixing a long-standing disconnect between pinning pages, and
> file systems' use of those pages.
> 
> [1] Documentation/core-api/pin_user_pages.rst
> 
> [2] "Explicit pinning of user-space pages":
> https://lwn.net/Articles/807108/
> 
> Cc: Michael S. Tsirkin 
> Cc: Jason Wang 
> Cc: k...@vger.kernel.org
> Cc: virtualizat...@lists.linux-foundation.org
> Cc: net...@vger.kernel.org
> Signed-off-by: John Hubbard 

Looks good to me. You can add:

Reviewed-by: Jan Kara 

Honza

> ---
>  drivers/vhost/vhost.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> index 21a59b598ed8..596132a96cd5 100644
> --- a/drivers/vhost/vhost.c
> +++ b/drivers/vhost/vhost.c
> @@ -1762,15 +1762,14 @@ static int set_bit_to_user(int nr, void __user *addr)
>   int bit = nr + (log % PAGE_SIZE) * 8;
>   int r;
>  
> - r = get_user_pages_fast(log, 1, FOLL_WRITE, );
> + r = pin_user_pages_fast(log, 1, FOLL_WRITE, );
>   if (r < 0)
>   return r;
>   BUG_ON(r != 1);
>   base = kmap_atomic(page);
>   set_bit(bit, base);
>   kunmap_atomic(base);
> - set_page_dirty_lock(page);
> - put_page(page);
> + unpin_user_pages_dirty_lock(, 1, true);
>   return 0;
>  }
>  
> -- 
> 2.26.2
> 
-- 
Jan Kara 
SUSE Labs, CR


[PATCH 2/2] vhost: convert get_user_pages() --> pin_user_pages()

2020-05-29 Thread John Hubbard
This code was using get_user_pages*(), in approximately a "Case 5"
scenario (accessing the data within a page), using the categorization
from [1]. That means that it's time to convert the get_user_pages*() +
put_page() calls to pin_user_pages*() + unpin_user_pages() calls.

There is some helpful background in [2]: basically, this is a small
part of fixing a long-standing disconnect between pinning pages, and
file systems' use of those pages.

[1] Documentation/core-api/pin_user_pages.rst

[2] "Explicit pinning of user-space pages":
https://lwn.net/Articles/807108/

Cc: Michael S. Tsirkin 
Cc: Jason Wang 
Cc: k...@vger.kernel.org
Cc: virtualizat...@lists.linux-foundation.org
Cc: net...@vger.kernel.org
Signed-off-by: John Hubbard 
---
 drivers/vhost/vhost.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 21a59b598ed8..596132a96cd5 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -1762,15 +1762,14 @@ static int set_bit_to_user(int nr, void __user *addr)
int bit = nr + (log % PAGE_SIZE) * 8;
int r;
 
-   r = get_user_pages_fast(log, 1, FOLL_WRITE, );
+   r = pin_user_pages_fast(log, 1, FOLL_WRITE, );
if (r < 0)
return r;
BUG_ON(r != 1);
base = kmap_atomic(page);
set_bit(bit, base);
kunmap_atomic(base);
-   set_page_dirty_lock(page);
-   put_page(page);
+   unpin_user_pages_dirty_lock(, 1, true);
return 0;
 }
 
-- 
2.26.2