On Thu, Oct 11, 2018 at 11:00:12PM -0700, john.hubb...@gmail.com wrote:
> From: John Hubbard <jhubb...@nvidia.com>
> 
> Add two struct page fields that, combined, are unioned with
> struct page->lru. There is no change in the size of
> struct page. These new fields are for type safety and clarity.
> 
> Also add page flag accessors to test, set and clear the new
> page->dma_pinned_flags field.
> 
> The page->dma_pinned_count field will be used in upcoming
> patches
> 
> Signed-off-by: John Hubbard <jhubb...@nvidia.com>
> ---
>  include/linux/mm_types.h   | 22 +++++++++++++-----
>  include/linux/page-flags.h | 47 ++++++++++++++++++++++++++++++++++++++
>  2 files changed, 63 insertions(+), 6 deletions(-)
> 
> diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> index 5ed8f6292a53..017ab82e36ca 100644
> --- a/include/linux/mm_types.h
> +++ b/include/linux/mm_types.h
> @@ -78,12 +78,22 @@ struct page {
>        */
>       union {
>               struct {        /* Page cache and anonymous pages */
> -                     /**
> -                      * @lru: Pageout list, eg. active_list protected by
> -                      * zone_lru_lock.  Sometimes used as a generic list
> -                      * by the page owner.
> -                      */
> -                     struct list_head lru;
> +                     union {
> +                             /**
> +                              * @lru: Pageout list, eg. active_list protected
> +                              * by zone_lru_lock.  Sometimes used as a
> +                              * generic list by the page owner.
> +                              */
> +                             struct list_head lru;
> +                             /* Used by get_user_pages*(). Pages may not be
> +                              * on an LRU while these dma_pinned_* fields
> +                              * are in use.
> +                              */
> +                             struct {
> +                                     unsigned long dma_pinned_flags;
> +                                     atomic_t      dma_pinned_count;
> +                             };
> +                     };

Isn't this broken for mapped file-backed pages? i.e. they may be
passed as the user buffer to read/write direct IO and so the pages
passed to gup will be on the active/inactive LRUs. hence I can't see
how you can have dual use of the LRU list head like this....

What am I missing here?

Cheers,

Dave.
-- 
Dave Chinner
da...@fromorbit.com

Reply via email to