Re: [PATCH v3] mm: Create the new vm_fault_t type

2019-01-08 Thread Souptick Joarder
On Tue, Jan 8, 2019 at 4:14 AM Andrew Morton  wrote:
>
> On Mon, 7 Jan 2019 11:47:12 +0530 Souptick Joarder  
> wrote:
>
> > > Do I need to make any further improvement for this patch ?
> >
> > If no further comment, can we get this patch in queue for 5.0-rcX ?
>
> I stopped paying attention a while ago, sorry.
>
> Please resend everything which you believe is ready to go.

Sure, I will resend. no prob :)


Re: [PATCH v3] mm: Create the new vm_fault_t type

2019-01-07 Thread Andrew Morton
On Mon, 7 Jan 2019 11:47:12 +0530 Souptick Joarder  wrote:

> > Do I need to make any further improvement for this patch ?
> 
> If no further comment, can we get this patch in queue for 5.0-rcX ?

I stopped paying attention a while ago, sorry.

Please resend everything which you believe is ready to go.


Re: [PATCH v3] mm: Create the new vm_fault_t type

2019-01-06 Thread Souptick Joarder
On Fri, Dec 14, 2018 at 10:35 AM Souptick Joarder  wrote:
>
> Hi Andrew,
>
> On Sat, Nov 24, 2018 at 10:16 AM Souptick Joarder  
> wrote:
> >
> > On Thu, Nov 15, 2018 at 7:17 AM Mike Rapoport  wrote:
> > >
> > > On Tue, Nov 06, 2018 at 05:36:42PM +0530, Souptick Joarder wrote:
> > > > Page fault handlers are supposed to return VM_FAULT codes,
> > > > but some drivers/file systems mistakenly return error
> > > > numbers. Now that all drivers/file systems have been converted
> > > > to use the vm_fault_t return type, change the type definition
> > > > to no longer be compatible with 'int'. By making it an unsigned
> > > > int, the function prototype becomes incompatible with a function
> > > > which returns int. Sparse will detect any attempts to return a
> > > > value which is not a VM_FAULT code.
> > > >
> > > > VM_FAULT_SET_HINDEX and VM_FAULT_GET_HINDEX values are changed
> > > > to avoid conflict with other VM_FAULT codes.
> > > >
> > > > Signed-off-by: Souptick Joarder 
> > >
> > > For the docs part
> > > Reviewed-by: Mike Rapoport 
> > >
> > > > ---
> > > > v2: Updated the change log and corrected the document part.
> > > > name added to the enum that kernel-doc able to parse it.
> > > >
> > > > v3: Corrected the documentation.
> >
> > If no further comment, can we get this patch in queue for 4.21 ?
>
> Do I need to make any further improvement for this patch ?

If no further comment, can we get this patch in queue for 5.0-rcX ?

> >
> > > >
> > > >  include/linux/mm.h   | 46 --
> > > >  include/linux/mm_types.h | 73 
> > > > +++-
> > > >  2 files changed, 72 insertions(+), 47 deletions(-)
> > > >
> > > > diff --git a/include/linux/mm.h b/include/linux/mm.h
> > > > index fcf9cc9..511a3ce 100644
> > > > --- a/include/linux/mm.h
> > > > +++ b/include/linux/mm.h
> > > > @@ -1267,52 +1267,6 @@ static inline void clear_page_pfmemalloc(struct 
> > > > page *page)
> > > >  }
> > > >
> > > >  /*
> > > > - * Different kinds of faults, as returned by handle_mm_fault().
> > > > - * Used to decide whether a process gets delivered SIGBUS or
> > > > - * just gets major/minor fault counters bumped up.
> > > > - */
> > > > -
> > > > -#define VM_FAULT_OOM 0x0001
> > > > -#define VM_FAULT_SIGBUS  0x0002
> > > > -#define VM_FAULT_MAJOR   0x0004
> > > > -#define VM_FAULT_WRITE   0x0008  /* Special case for 
> > > > get_user_pages */
> > > > -#define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */
> > > > -#define VM_FAULT_HWPOISON_LARGE 0x0020  /* Hit poisoned large page. 
> > > > Index encoded in upper bits */
> > > > -#define VM_FAULT_SIGSEGV 0x0040
> > > > -
> > > > -#define VM_FAULT_NOPAGE  0x0100  /* ->fault installed the pte, not 
> > > > return page */
> > > > -#define VM_FAULT_LOCKED  0x0200  /* ->fault locked the returned 
> > > > page */
> > > > -#define VM_FAULT_RETRY   0x0400  /* ->fault blocked, must retry */
> > > > -#define VM_FAULT_FALLBACK 0x0800 /* huge page fault failed, fall 
> > > > back to small */
> > > > -#define VM_FAULT_DONE_COW   0x1000   /* ->fault has fully handled COW 
> > > > */
> > > > -#define VM_FAULT_NEEDDSYNC  0x2000   /* ->fault did not modify page 
> > > > tables
> > > > -  * and needs fsync() to complete 
> > > > (for
> > > > -  * synchronous page faults in 
> > > > DAX) */
> > > > -
> > > > -#define VM_FAULT_ERROR   (VM_FAULT_OOM | VM_FAULT_SIGBUS | 
> > > > VM_FAULT_SIGSEGV | \
> > > > -  VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \
> > > > -  VM_FAULT_FALLBACK)
> > > > -
> > > > -#define VM_FAULT_RESULT_TRACE \
> > > > - { VM_FAULT_OOM, "OOM" }, \
> > > > - { VM_FAULT_SIGBUS,  "SIGBUS" }, \
> > > > - { VM_FAULT_MAJOR,   "MAJOR" }, \
> > > > - { VM_FAULT_WRITE,   "WRITE" }, \
> > > > - { VM_FAULT_HWPOISON,"HWPOISON" }, \
> > > > - { VM_FAULT_HWPOISON_LARGE,  "HWPOISON_LARGE" }, \
> > > > - { VM_FAULT_SIGSEGV, "SIGSEGV" }, \
> > > > - { VM_FAULT_NOPAGE,  "NOPAGE" }, \
> > > > - { VM_FAULT_LOCKED,  "LOCKED" }, \
> > > > - { VM_FAULT_RETRY,   "RETRY" }, \
> > > > - { VM_FAULT_FALLBACK,"FALLBACK" }, \
> > > > - { VM_FAULT_DONE_COW,"DONE_COW" }, \
> > > > - { VM_FAULT_NEEDDSYNC,   "NEEDDSYNC" }
> > > > -
> > > > -/* Encode hstate index for a hwpoisoned large page */
> > > > -#define VM_FAULT_SET_HINDEX(x) ((x) << 12)
> > > > -#define VM_FAULT_GET_HINDEX(x) (((x) >> 12) & 0xf)
> > > > -
> > > > -/*
> > > >   * Can be called by the pagefault handler when it gets a VM_FAULT_OOM.
> > > >   */
> > > >  extern void pagefault_out_of_memory(void);
> > > > diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> > > > index 5ed8f62..cb25016 100644
> > > 

Re: [PATCH v3] mm: Create the new vm_fault_t type

2018-12-13 Thread Souptick Joarder
Hi Andrew,

On Sat, Nov 24, 2018 at 10:16 AM Souptick Joarder  wrote:
>
> On Thu, Nov 15, 2018 at 7:17 AM Mike Rapoport  wrote:
> >
> > On Tue, Nov 06, 2018 at 05:36:42PM +0530, Souptick Joarder wrote:
> > > Page fault handlers are supposed to return VM_FAULT codes,
> > > but some drivers/file systems mistakenly return error
> > > numbers. Now that all drivers/file systems have been converted
> > > to use the vm_fault_t return type, change the type definition
> > > to no longer be compatible with 'int'. By making it an unsigned
> > > int, the function prototype becomes incompatible with a function
> > > which returns int. Sparse will detect any attempts to return a
> > > value which is not a VM_FAULT code.
> > >
> > > VM_FAULT_SET_HINDEX and VM_FAULT_GET_HINDEX values are changed
> > > to avoid conflict with other VM_FAULT codes.
> > >
> > > Signed-off-by: Souptick Joarder 
> >
> > For the docs part
> > Reviewed-by: Mike Rapoport 
> >
> > > ---
> > > v2: Updated the change log and corrected the document part.
> > > name added to the enum that kernel-doc able to parse it.
> > >
> > > v3: Corrected the documentation.
>
> If no further comment, can we get this patch in queue for 4.21 ?

Do I need to make any further improvement for this patch ?
>
> > >
> > >  include/linux/mm.h   | 46 --
> > >  include/linux/mm_types.h | 73 
> > > +++-
> > >  2 files changed, 72 insertions(+), 47 deletions(-)
> > >
> > > diff --git a/include/linux/mm.h b/include/linux/mm.h
> > > index fcf9cc9..511a3ce 100644
> > > --- a/include/linux/mm.h
> > > +++ b/include/linux/mm.h
> > > @@ -1267,52 +1267,6 @@ static inline void clear_page_pfmemalloc(struct 
> > > page *page)
> > >  }
> > >
> > >  /*
> > > - * Different kinds of faults, as returned by handle_mm_fault().
> > > - * Used to decide whether a process gets delivered SIGBUS or
> > > - * just gets major/minor fault counters bumped up.
> > > - */
> > > -
> > > -#define VM_FAULT_OOM 0x0001
> > > -#define VM_FAULT_SIGBUS  0x0002
> > > -#define VM_FAULT_MAJOR   0x0004
> > > -#define VM_FAULT_WRITE   0x0008  /* Special case for get_user_pages 
> > > */
> > > -#define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */
> > > -#define VM_FAULT_HWPOISON_LARGE 0x0020  /* Hit poisoned large page. 
> > > Index encoded in upper bits */
> > > -#define VM_FAULT_SIGSEGV 0x0040
> > > -
> > > -#define VM_FAULT_NOPAGE  0x0100  /* ->fault installed the pte, not 
> > > return page */
> > > -#define VM_FAULT_LOCKED  0x0200  /* ->fault locked the returned page 
> > > */
> > > -#define VM_FAULT_RETRY   0x0400  /* ->fault blocked, must retry */
> > > -#define VM_FAULT_FALLBACK 0x0800 /* huge page fault failed, fall 
> > > back to small */
> > > -#define VM_FAULT_DONE_COW   0x1000   /* ->fault has fully handled COW */
> > > -#define VM_FAULT_NEEDDSYNC  0x2000   /* ->fault did not modify page 
> > > tables
> > > -  * and needs fsync() to complete 
> > > (for
> > > -  * synchronous page faults in DAX) 
> > > */
> > > -
> > > -#define VM_FAULT_ERROR   (VM_FAULT_OOM | VM_FAULT_SIGBUS | 
> > > VM_FAULT_SIGSEGV | \
> > > -  VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \
> > > -  VM_FAULT_FALLBACK)
> > > -
> > > -#define VM_FAULT_RESULT_TRACE \
> > > - { VM_FAULT_OOM, "OOM" }, \
> > > - { VM_FAULT_SIGBUS,  "SIGBUS" }, \
> > > - { VM_FAULT_MAJOR,   "MAJOR" }, \
> > > - { VM_FAULT_WRITE,   "WRITE" }, \
> > > - { VM_FAULT_HWPOISON,"HWPOISON" }, \
> > > - { VM_FAULT_HWPOISON_LARGE,  "HWPOISON_LARGE" }, \
> > > - { VM_FAULT_SIGSEGV, "SIGSEGV" }, \
> > > - { VM_FAULT_NOPAGE,  "NOPAGE" }, \
> > > - { VM_FAULT_LOCKED,  "LOCKED" }, \
> > > - { VM_FAULT_RETRY,   "RETRY" }, \
> > > - { VM_FAULT_FALLBACK,"FALLBACK" }, \
> > > - { VM_FAULT_DONE_COW,"DONE_COW" }, \
> > > - { VM_FAULT_NEEDDSYNC,   "NEEDDSYNC" }
> > > -
> > > -/* Encode hstate index for a hwpoisoned large page */
> > > -#define VM_FAULT_SET_HINDEX(x) ((x) << 12)
> > > -#define VM_FAULT_GET_HINDEX(x) (((x) >> 12) & 0xf)
> > > -
> > > -/*
> > >   * Can be called by the pagefault handler when it gets a VM_FAULT_OOM.
> > >   */
> > >  extern void pagefault_out_of_memory(void);
> > > diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> > > index 5ed8f62..cb25016 100644
> > > --- a/include/linux/mm_types.h
> > > +++ b/include/linux/mm_types.h
> > > @@ -22,7 +22,6 @@
> > >  #endif
> > >  #define AT_VECTOR_SIZE (2*(AT_VECTOR_SIZE_ARCH + AT_VECTOR_SIZE_BASE + 
> > > 1))
> > >
> > > -typedef int vm_fault_t;
> > >
> > >  struct address_space;
> > >  struct mem_cgroup;
> > > @@ -609,6 +608,78 @@ static inline bool 

Re: [PATCH v3] mm: Create the new vm_fault_t type

2018-11-23 Thread Souptick Joarder
On Thu, Nov 15, 2018 at 7:17 AM Mike Rapoport  wrote:
>
> On Tue, Nov 06, 2018 at 05:36:42PM +0530, Souptick Joarder wrote:
> > Page fault handlers are supposed to return VM_FAULT codes,
> > but some drivers/file systems mistakenly return error
> > numbers. Now that all drivers/file systems have been converted
> > to use the vm_fault_t return type, change the type definition
> > to no longer be compatible with 'int'. By making it an unsigned
> > int, the function prototype becomes incompatible with a function
> > which returns int. Sparse will detect any attempts to return a
> > value which is not a VM_FAULT code.
> >
> > VM_FAULT_SET_HINDEX and VM_FAULT_GET_HINDEX values are changed
> > to avoid conflict with other VM_FAULT codes.
> >
> > Signed-off-by: Souptick Joarder 
>
> For the docs part
> Reviewed-by: Mike Rapoport 
>
> > ---
> > v2: Updated the change log and corrected the document part.
> > name added to the enum that kernel-doc able to parse it.
> >
> > v3: Corrected the documentation.

If no further comment, can we get this patch in queue for 4.21 ?

> >
> >  include/linux/mm.h   | 46 --
> >  include/linux/mm_types.h | 73 
> > +++-
> >  2 files changed, 72 insertions(+), 47 deletions(-)
> >
> > diff --git a/include/linux/mm.h b/include/linux/mm.h
> > index fcf9cc9..511a3ce 100644
> > --- a/include/linux/mm.h
> > +++ b/include/linux/mm.h
> > @@ -1267,52 +1267,6 @@ static inline void clear_page_pfmemalloc(struct page 
> > *page)
> >  }
> >
> >  /*
> > - * Different kinds of faults, as returned by handle_mm_fault().
> > - * Used to decide whether a process gets delivered SIGBUS or
> > - * just gets major/minor fault counters bumped up.
> > - */
> > -
> > -#define VM_FAULT_OOM 0x0001
> > -#define VM_FAULT_SIGBUS  0x0002
> > -#define VM_FAULT_MAJOR   0x0004
> > -#define VM_FAULT_WRITE   0x0008  /* Special case for get_user_pages */
> > -#define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */
> > -#define VM_FAULT_HWPOISON_LARGE 0x0020  /* Hit poisoned large page. Index 
> > encoded in upper bits */
> > -#define VM_FAULT_SIGSEGV 0x0040
> > -
> > -#define VM_FAULT_NOPAGE  0x0100  /* ->fault installed the pte, not 
> > return page */
> > -#define VM_FAULT_LOCKED  0x0200  /* ->fault locked the returned page */
> > -#define VM_FAULT_RETRY   0x0400  /* ->fault blocked, must retry */
> > -#define VM_FAULT_FALLBACK 0x0800 /* huge page fault failed, fall back 
> > to small */
> > -#define VM_FAULT_DONE_COW   0x1000   /* ->fault has fully handled COW */
> > -#define VM_FAULT_NEEDDSYNC  0x2000   /* ->fault did not modify page tables
> > -  * and needs fsync() to complete (for
> > -  * synchronous page faults in DAX) */
> > -
> > -#define VM_FAULT_ERROR   (VM_FAULT_OOM | VM_FAULT_SIGBUS | 
> > VM_FAULT_SIGSEGV | \
> > -  VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \
> > -  VM_FAULT_FALLBACK)
> > -
> > -#define VM_FAULT_RESULT_TRACE \
> > - { VM_FAULT_OOM, "OOM" }, \
> > - { VM_FAULT_SIGBUS,  "SIGBUS" }, \
> > - { VM_FAULT_MAJOR,   "MAJOR" }, \
> > - { VM_FAULT_WRITE,   "WRITE" }, \
> > - { VM_FAULT_HWPOISON,"HWPOISON" }, \
> > - { VM_FAULT_HWPOISON_LARGE,  "HWPOISON_LARGE" }, \
> > - { VM_FAULT_SIGSEGV, "SIGSEGV" }, \
> > - { VM_FAULT_NOPAGE,  "NOPAGE" }, \
> > - { VM_FAULT_LOCKED,  "LOCKED" }, \
> > - { VM_FAULT_RETRY,   "RETRY" }, \
> > - { VM_FAULT_FALLBACK,"FALLBACK" }, \
> > - { VM_FAULT_DONE_COW,"DONE_COW" }, \
> > - { VM_FAULT_NEEDDSYNC,   "NEEDDSYNC" }
> > -
> > -/* Encode hstate index for a hwpoisoned large page */
> > -#define VM_FAULT_SET_HINDEX(x) ((x) << 12)
> > -#define VM_FAULT_GET_HINDEX(x) (((x) >> 12) & 0xf)
> > -
> > -/*
> >   * Can be called by the pagefault handler when it gets a VM_FAULT_OOM.
> >   */
> >  extern void pagefault_out_of_memory(void);
> > diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> > index 5ed8f62..cb25016 100644
> > --- a/include/linux/mm_types.h
> > +++ b/include/linux/mm_types.h
> > @@ -22,7 +22,6 @@
> >  #endif
> >  #define AT_VECTOR_SIZE (2*(AT_VECTOR_SIZE_ARCH + AT_VECTOR_SIZE_BASE + 1))
> >
> > -typedef int vm_fault_t;
> >
> >  struct address_space;
> >  struct mem_cgroup;
> > @@ -609,6 +608,78 @@ static inline bool mm_tlb_flush_nested(struct 
> > mm_struct *mm)
> >
> >  struct vm_fault;
> >
> > +/**
> > + * typedef vm_fault_t - Return type for page fault handlers.
> > + *
> > + * Page fault handlers return a bitmask of %VM_FAULT values.
> > + */
> > +typedef __bitwise unsigned int vm_fault_t;
> > +
> > +/**
> > + * enum vm_fault_reason - Page fault handlers return a bitmask of
> > + * these values to tell the core VM 

Re: [PATCH v3] mm: Create the new vm_fault_t type

2018-11-23 Thread Souptick Joarder
On Thu, Nov 15, 2018 at 7:17 AM Mike Rapoport  wrote:
>
> On Tue, Nov 06, 2018 at 05:36:42PM +0530, Souptick Joarder wrote:
> > Page fault handlers are supposed to return VM_FAULT codes,
> > but some drivers/file systems mistakenly return error
> > numbers. Now that all drivers/file systems have been converted
> > to use the vm_fault_t return type, change the type definition
> > to no longer be compatible with 'int'. By making it an unsigned
> > int, the function prototype becomes incompatible with a function
> > which returns int. Sparse will detect any attempts to return a
> > value which is not a VM_FAULT code.
> >
> > VM_FAULT_SET_HINDEX and VM_FAULT_GET_HINDEX values are changed
> > to avoid conflict with other VM_FAULT codes.
> >
> > Signed-off-by: Souptick Joarder 
>
> For the docs part
> Reviewed-by: Mike Rapoport 
>
> > ---
> > v2: Updated the change log and corrected the document part.
> > name added to the enum that kernel-doc able to parse it.
> >
> > v3: Corrected the documentation.

If no further comment, can we get this patch in queue for 4.21 ?

> >
> >  include/linux/mm.h   | 46 --
> >  include/linux/mm_types.h | 73 
> > +++-
> >  2 files changed, 72 insertions(+), 47 deletions(-)
> >
> > diff --git a/include/linux/mm.h b/include/linux/mm.h
> > index fcf9cc9..511a3ce 100644
> > --- a/include/linux/mm.h
> > +++ b/include/linux/mm.h
> > @@ -1267,52 +1267,6 @@ static inline void clear_page_pfmemalloc(struct page 
> > *page)
> >  }
> >
> >  /*
> > - * Different kinds of faults, as returned by handle_mm_fault().
> > - * Used to decide whether a process gets delivered SIGBUS or
> > - * just gets major/minor fault counters bumped up.
> > - */
> > -
> > -#define VM_FAULT_OOM 0x0001
> > -#define VM_FAULT_SIGBUS  0x0002
> > -#define VM_FAULT_MAJOR   0x0004
> > -#define VM_FAULT_WRITE   0x0008  /* Special case for get_user_pages */
> > -#define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */
> > -#define VM_FAULT_HWPOISON_LARGE 0x0020  /* Hit poisoned large page. Index 
> > encoded in upper bits */
> > -#define VM_FAULT_SIGSEGV 0x0040
> > -
> > -#define VM_FAULT_NOPAGE  0x0100  /* ->fault installed the pte, not 
> > return page */
> > -#define VM_FAULT_LOCKED  0x0200  /* ->fault locked the returned page */
> > -#define VM_FAULT_RETRY   0x0400  /* ->fault blocked, must retry */
> > -#define VM_FAULT_FALLBACK 0x0800 /* huge page fault failed, fall back 
> > to small */
> > -#define VM_FAULT_DONE_COW   0x1000   /* ->fault has fully handled COW */
> > -#define VM_FAULT_NEEDDSYNC  0x2000   /* ->fault did not modify page tables
> > -  * and needs fsync() to complete (for
> > -  * synchronous page faults in DAX) */
> > -
> > -#define VM_FAULT_ERROR   (VM_FAULT_OOM | VM_FAULT_SIGBUS | 
> > VM_FAULT_SIGSEGV | \
> > -  VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \
> > -  VM_FAULT_FALLBACK)
> > -
> > -#define VM_FAULT_RESULT_TRACE \
> > - { VM_FAULT_OOM, "OOM" }, \
> > - { VM_FAULT_SIGBUS,  "SIGBUS" }, \
> > - { VM_FAULT_MAJOR,   "MAJOR" }, \
> > - { VM_FAULT_WRITE,   "WRITE" }, \
> > - { VM_FAULT_HWPOISON,"HWPOISON" }, \
> > - { VM_FAULT_HWPOISON_LARGE,  "HWPOISON_LARGE" }, \
> > - { VM_FAULT_SIGSEGV, "SIGSEGV" }, \
> > - { VM_FAULT_NOPAGE,  "NOPAGE" }, \
> > - { VM_FAULT_LOCKED,  "LOCKED" }, \
> > - { VM_FAULT_RETRY,   "RETRY" }, \
> > - { VM_FAULT_FALLBACK,"FALLBACK" }, \
> > - { VM_FAULT_DONE_COW,"DONE_COW" }, \
> > - { VM_FAULT_NEEDDSYNC,   "NEEDDSYNC" }
> > -
> > -/* Encode hstate index for a hwpoisoned large page */
> > -#define VM_FAULT_SET_HINDEX(x) ((x) << 12)
> > -#define VM_FAULT_GET_HINDEX(x) (((x) >> 12) & 0xf)
> > -
> > -/*
> >   * Can be called by the pagefault handler when it gets a VM_FAULT_OOM.
> >   */
> >  extern void pagefault_out_of_memory(void);
> > diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> > index 5ed8f62..cb25016 100644
> > --- a/include/linux/mm_types.h
> > +++ b/include/linux/mm_types.h
> > @@ -22,7 +22,6 @@
> >  #endif
> >  #define AT_VECTOR_SIZE (2*(AT_VECTOR_SIZE_ARCH + AT_VECTOR_SIZE_BASE + 1))
> >
> > -typedef int vm_fault_t;
> >
> >  struct address_space;
> >  struct mem_cgroup;
> > @@ -609,6 +608,78 @@ static inline bool mm_tlb_flush_nested(struct 
> > mm_struct *mm)
> >
> >  struct vm_fault;
> >
> > +/**
> > + * typedef vm_fault_t - Return type for page fault handlers.
> > + *
> > + * Page fault handlers return a bitmask of %VM_FAULT values.
> > + */
> > +typedef __bitwise unsigned int vm_fault_t;
> > +
> > +/**
> > + * enum vm_fault_reason - Page fault handlers return a bitmask of
> > + * these values to tell the core VM 

Re: [PATCH v3] mm: Create the new vm_fault_t type

2018-11-14 Thread Mike Rapoport
On Tue, Nov 06, 2018 at 05:36:42PM +0530, Souptick Joarder wrote:
> Page fault handlers are supposed to return VM_FAULT codes,
> but some drivers/file systems mistakenly return error
> numbers. Now that all drivers/file systems have been converted
> to use the vm_fault_t return type, change the type definition
> to no longer be compatible with 'int'. By making it an unsigned
> int, the function prototype becomes incompatible with a function
> which returns int. Sparse will detect any attempts to return a
> value which is not a VM_FAULT code.
> 
> VM_FAULT_SET_HINDEX and VM_FAULT_GET_HINDEX values are changed
> to avoid conflict with other VM_FAULT codes.
> 
> Signed-off-by: Souptick Joarder 

For the docs part
Reviewed-by: Mike Rapoport 

> ---
> v2: Updated the change log and corrected the document part.
> name added to the enum that kernel-doc able to parse it.
> 
> v3: Corrected the documentation.
> 
>  include/linux/mm.h   | 46 --
>  include/linux/mm_types.h | 73 
> +++-
>  2 files changed, 72 insertions(+), 47 deletions(-)
> 
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index fcf9cc9..511a3ce 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -1267,52 +1267,6 @@ static inline void clear_page_pfmemalloc(struct page 
> *page)
>  }
>  
>  /*
> - * Different kinds of faults, as returned by handle_mm_fault().
> - * Used to decide whether a process gets delivered SIGBUS or
> - * just gets major/minor fault counters bumped up.
> - */
> -
> -#define VM_FAULT_OOM 0x0001
> -#define VM_FAULT_SIGBUS  0x0002
> -#define VM_FAULT_MAJOR   0x0004
> -#define VM_FAULT_WRITE   0x0008  /* Special case for get_user_pages */
> -#define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */
> -#define VM_FAULT_HWPOISON_LARGE 0x0020  /* Hit poisoned large page. Index 
> encoded in upper bits */
> -#define VM_FAULT_SIGSEGV 0x0040
> -
> -#define VM_FAULT_NOPAGE  0x0100  /* ->fault installed the pte, not 
> return page */
> -#define VM_FAULT_LOCKED  0x0200  /* ->fault locked the returned page */
> -#define VM_FAULT_RETRY   0x0400  /* ->fault blocked, must retry */
> -#define VM_FAULT_FALLBACK 0x0800 /* huge page fault failed, fall back to 
> small */
> -#define VM_FAULT_DONE_COW   0x1000   /* ->fault has fully handled COW */
> -#define VM_FAULT_NEEDDSYNC  0x2000   /* ->fault did not modify page tables
> -  * and needs fsync() to complete (for
> -  * synchronous page faults in DAX) */
> -
> -#define VM_FAULT_ERROR   (VM_FAULT_OOM | VM_FAULT_SIGBUS | 
> VM_FAULT_SIGSEGV | \
> -  VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \
> -  VM_FAULT_FALLBACK)
> -
> -#define VM_FAULT_RESULT_TRACE \
> - { VM_FAULT_OOM, "OOM" }, \
> - { VM_FAULT_SIGBUS,  "SIGBUS" }, \
> - { VM_FAULT_MAJOR,   "MAJOR" }, \
> - { VM_FAULT_WRITE,   "WRITE" }, \
> - { VM_FAULT_HWPOISON,"HWPOISON" }, \
> - { VM_FAULT_HWPOISON_LARGE,  "HWPOISON_LARGE" }, \
> - { VM_FAULT_SIGSEGV, "SIGSEGV" }, \
> - { VM_FAULT_NOPAGE,  "NOPAGE" }, \
> - { VM_FAULT_LOCKED,  "LOCKED" }, \
> - { VM_FAULT_RETRY,   "RETRY" }, \
> - { VM_FAULT_FALLBACK,"FALLBACK" }, \
> - { VM_FAULT_DONE_COW,"DONE_COW" }, \
> - { VM_FAULT_NEEDDSYNC,   "NEEDDSYNC" }
> -
> -/* Encode hstate index for a hwpoisoned large page */
> -#define VM_FAULT_SET_HINDEX(x) ((x) << 12)
> -#define VM_FAULT_GET_HINDEX(x) (((x) >> 12) & 0xf)
> -
> -/*
>   * Can be called by the pagefault handler when it gets a VM_FAULT_OOM.
>   */
>  extern void pagefault_out_of_memory(void);
> diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> index 5ed8f62..cb25016 100644
> --- a/include/linux/mm_types.h
> +++ b/include/linux/mm_types.h
> @@ -22,7 +22,6 @@
>  #endif
>  #define AT_VECTOR_SIZE (2*(AT_VECTOR_SIZE_ARCH + AT_VECTOR_SIZE_BASE + 1))
>  
> -typedef int vm_fault_t;
>  
>  struct address_space;
>  struct mem_cgroup;
> @@ -609,6 +608,78 @@ static inline bool mm_tlb_flush_nested(struct mm_struct 
> *mm)
>  
>  struct vm_fault;
>  
> +/**
> + * typedef vm_fault_t - Return type for page fault handlers.
> + *
> + * Page fault handlers return a bitmask of %VM_FAULT values.
> + */
> +typedef __bitwise unsigned int vm_fault_t;
> +
> +/**
> + * enum vm_fault_reason - Page fault handlers return a bitmask of
> + * these values to tell the core VM what happened when handling the
> + * fault. Used to decide whether a process gets delivered SIGBUS or
> + * just gets major/minor fault counters bumped up.
> + *
> + * @VM_FAULT_OOM:Out Of Memory
> + * @VM_FAULT_SIGBUS: Bad access
> + * @VM_FAULT_MAJOR:  Page read from storage
> + * @VM_FAULT_WRITE:  

Re: [PATCH v3] mm: Create the new vm_fault_t type

2018-11-14 Thread Mike Rapoport
On Tue, Nov 06, 2018 at 05:36:42PM +0530, Souptick Joarder wrote:
> Page fault handlers are supposed to return VM_FAULT codes,
> but some drivers/file systems mistakenly return error
> numbers. Now that all drivers/file systems have been converted
> to use the vm_fault_t return type, change the type definition
> to no longer be compatible with 'int'. By making it an unsigned
> int, the function prototype becomes incompatible with a function
> which returns int. Sparse will detect any attempts to return a
> value which is not a VM_FAULT code.
> 
> VM_FAULT_SET_HINDEX and VM_FAULT_GET_HINDEX values are changed
> to avoid conflict with other VM_FAULT codes.
> 
> Signed-off-by: Souptick Joarder 

For the docs part
Reviewed-by: Mike Rapoport 

> ---
> v2: Updated the change log and corrected the document part.
> name added to the enum that kernel-doc able to parse it.
> 
> v3: Corrected the documentation.
> 
>  include/linux/mm.h   | 46 --
>  include/linux/mm_types.h | 73 
> +++-
>  2 files changed, 72 insertions(+), 47 deletions(-)
> 
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index fcf9cc9..511a3ce 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -1267,52 +1267,6 @@ static inline void clear_page_pfmemalloc(struct page 
> *page)
>  }
>  
>  /*
> - * Different kinds of faults, as returned by handle_mm_fault().
> - * Used to decide whether a process gets delivered SIGBUS or
> - * just gets major/minor fault counters bumped up.
> - */
> -
> -#define VM_FAULT_OOM 0x0001
> -#define VM_FAULT_SIGBUS  0x0002
> -#define VM_FAULT_MAJOR   0x0004
> -#define VM_FAULT_WRITE   0x0008  /* Special case for get_user_pages */
> -#define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */
> -#define VM_FAULT_HWPOISON_LARGE 0x0020  /* Hit poisoned large page. Index 
> encoded in upper bits */
> -#define VM_FAULT_SIGSEGV 0x0040
> -
> -#define VM_FAULT_NOPAGE  0x0100  /* ->fault installed the pte, not 
> return page */
> -#define VM_FAULT_LOCKED  0x0200  /* ->fault locked the returned page */
> -#define VM_FAULT_RETRY   0x0400  /* ->fault blocked, must retry */
> -#define VM_FAULT_FALLBACK 0x0800 /* huge page fault failed, fall back to 
> small */
> -#define VM_FAULT_DONE_COW   0x1000   /* ->fault has fully handled COW */
> -#define VM_FAULT_NEEDDSYNC  0x2000   /* ->fault did not modify page tables
> -  * and needs fsync() to complete (for
> -  * synchronous page faults in DAX) */
> -
> -#define VM_FAULT_ERROR   (VM_FAULT_OOM | VM_FAULT_SIGBUS | 
> VM_FAULT_SIGSEGV | \
> -  VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \
> -  VM_FAULT_FALLBACK)
> -
> -#define VM_FAULT_RESULT_TRACE \
> - { VM_FAULT_OOM, "OOM" }, \
> - { VM_FAULT_SIGBUS,  "SIGBUS" }, \
> - { VM_FAULT_MAJOR,   "MAJOR" }, \
> - { VM_FAULT_WRITE,   "WRITE" }, \
> - { VM_FAULT_HWPOISON,"HWPOISON" }, \
> - { VM_FAULT_HWPOISON_LARGE,  "HWPOISON_LARGE" }, \
> - { VM_FAULT_SIGSEGV, "SIGSEGV" }, \
> - { VM_FAULT_NOPAGE,  "NOPAGE" }, \
> - { VM_FAULT_LOCKED,  "LOCKED" }, \
> - { VM_FAULT_RETRY,   "RETRY" }, \
> - { VM_FAULT_FALLBACK,"FALLBACK" }, \
> - { VM_FAULT_DONE_COW,"DONE_COW" }, \
> - { VM_FAULT_NEEDDSYNC,   "NEEDDSYNC" }
> -
> -/* Encode hstate index for a hwpoisoned large page */
> -#define VM_FAULT_SET_HINDEX(x) ((x) << 12)
> -#define VM_FAULT_GET_HINDEX(x) (((x) >> 12) & 0xf)
> -
> -/*
>   * Can be called by the pagefault handler when it gets a VM_FAULT_OOM.
>   */
>  extern void pagefault_out_of_memory(void);
> diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> index 5ed8f62..cb25016 100644
> --- a/include/linux/mm_types.h
> +++ b/include/linux/mm_types.h
> @@ -22,7 +22,6 @@
>  #endif
>  #define AT_VECTOR_SIZE (2*(AT_VECTOR_SIZE_ARCH + AT_VECTOR_SIZE_BASE + 1))
>  
> -typedef int vm_fault_t;
>  
>  struct address_space;
>  struct mem_cgroup;
> @@ -609,6 +608,78 @@ static inline bool mm_tlb_flush_nested(struct mm_struct 
> *mm)
>  
>  struct vm_fault;
>  
> +/**
> + * typedef vm_fault_t - Return type for page fault handlers.
> + *
> + * Page fault handlers return a bitmask of %VM_FAULT values.
> + */
> +typedef __bitwise unsigned int vm_fault_t;
> +
> +/**
> + * enum vm_fault_reason - Page fault handlers return a bitmask of
> + * these values to tell the core VM what happened when handling the
> + * fault. Used to decide whether a process gets delivered SIGBUS or
> + * just gets major/minor fault counters bumped up.
> + *
> + * @VM_FAULT_OOM:Out Of Memory
> + * @VM_FAULT_SIGBUS: Bad access
> + * @VM_FAULT_MAJOR:  Page read from storage
> + * @VM_FAULT_WRITE:  

Re: [PATCH v3] mm: Create the new vm_fault_t type

2018-11-14 Thread William Kucharski



> On Nov 13, 2018, at 10:13 PM, Souptick Joarder  wrote:
> 
> On Tue, Nov 6, 2018 at 5:33 PM Souptick Joarder  wrote:
>> 
>> Page fault handlers are supposed to return VM_FAULT codes,
>> but some drivers/file systems mistakenly return error
>> numbers. Now that all drivers/file systems have been converted
>> to use the vm_fault_t return type, change the type definition
>> to no longer be compatible with 'int'. By making it an unsigned
>> int, the function prototype becomes incompatible with a function
>> which returns int. Sparse will detect any attempts to return a
>> value which is not a VM_FAULT code.
>> 
>> VM_FAULT_SET_HINDEX and VM_FAULT_GET_HINDEX values are changed
>> to avoid conflict with other VM_FAULT codes.
>> 
>> Signed-off-by: Souptick Joarder 
> 
> Any further comment on this patch ?

Reviewed-by: William Kucharski 



Re: [PATCH v3] mm: Create the new vm_fault_t type

2018-11-14 Thread William Kucharski



> On Nov 13, 2018, at 10:13 PM, Souptick Joarder  wrote:
> 
> On Tue, Nov 6, 2018 at 5:33 PM Souptick Joarder  wrote:
>> 
>> Page fault handlers are supposed to return VM_FAULT codes,
>> but some drivers/file systems mistakenly return error
>> numbers. Now that all drivers/file systems have been converted
>> to use the vm_fault_t return type, change the type definition
>> to no longer be compatible with 'int'. By making it an unsigned
>> int, the function prototype becomes incompatible with a function
>> which returns int. Sparse will detect any attempts to return a
>> value which is not a VM_FAULT code.
>> 
>> VM_FAULT_SET_HINDEX and VM_FAULT_GET_HINDEX values are changed
>> to avoid conflict with other VM_FAULT codes.
>> 
>> Signed-off-by: Souptick Joarder 
> 
> Any further comment on this patch ?

Reviewed-by: William Kucharski 



Re: [PATCH v3] mm: Create the new vm_fault_t type

2018-11-13 Thread Souptick Joarder
On Tue, Nov 6, 2018 at 5:33 PM Souptick Joarder  wrote:
>
> Page fault handlers are supposed to return VM_FAULT codes,
> but some drivers/file systems mistakenly return error
> numbers. Now that all drivers/file systems have been converted
> to use the vm_fault_t return type, change the type definition
> to no longer be compatible with 'int'. By making it an unsigned
> int, the function prototype becomes incompatible with a function
> which returns int. Sparse will detect any attempts to return a
> value which is not a VM_FAULT code.
>
> VM_FAULT_SET_HINDEX and VM_FAULT_GET_HINDEX values are changed
> to avoid conflict with other VM_FAULT codes.
>
> Signed-off-by: Souptick Joarder 

Any further comment on this patch ?
> ---
> v2: Updated the change log and corrected the document part.
> name added to the enum that kernel-doc able to parse it.
>
> v3: Corrected the documentation.
>
>  include/linux/mm.h   | 46 --
>  include/linux/mm_types.h | 73 
> +++-
>  2 files changed, 72 insertions(+), 47 deletions(-)
>
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index fcf9cc9..511a3ce 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -1267,52 +1267,6 @@ static inline void clear_page_pfmemalloc(struct page 
> *page)
>  }
>
>  /*
> - * Different kinds of faults, as returned by handle_mm_fault().
> - * Used to decide whether a process gets delivered SIGBUS or
> - * just gets major/minor fault counters bumped up.
> - */
> -
> -#define VM_FAULT_OOM   0x0001
> -#define VM_FAULT_SIGBUS0x0002
> -#define VM_FAULT_MAJOR 0x0004
> -#define VM_FAULT_WRITE 0x0008  /* Special case for get_user_pages */
> -#define VM_FAULT_HWPOISON 0x0010   /* Hit poisoned small page */
> -#define VM_FAULT_HWPOISON_LARGE 0x0020  /* Hit poisoned large page. Index 
> encoded in upper bits */
> -#define VM_FAULT_SIGSEGV 0x0040
> -
> -#define VM_FAULT_NOPAGE0x0100  /* ->fault installed the pte, not 
> return page */
> -#define VM_FAULT_LOCKED0x0200  /* ->fault locked the returned page */
> -#define VM_FAULT_RETRY 0x0400  /* ->fault blocked, must retry */
> -#define VM_FAULT_FALLBACK 0x0800   /* huge page fault failed, fall back 
> to small */
> -#define VM_FAULT_DONE_COW   0x1000 /* ->fault has fully handled COW */
> -#define VM_FAULT_NEEDDSYNC  0x2000 /* ->fault did not modify page tables
> -* and needs fsync() to complete (for
> -* synchronous page faults in DAX) */
> -
> -#define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | \
> -VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \
> -VM_FAULT_FALLBACK)
> -
> -#define VM_FAULT_RESULT_TRACE \
> -   { VM_FAULT_OOM, "OOM" }, \
> -   { VM_FAULT_SIGBUS,  "SIGBUS" }, \
> -   { VM_FAULT_MAJOR,   "MAJOR" }, \
> -   { VM_FAULT_WRITE,   "WRITE" }, \
> -   { VM_FAULT_HWPOISON,"HWPOISON" }, \
> -   { VM_FAULT_HWPOISON_LARGE,  "HWPOISON_LARGE" }, \
> -   { VM_FAULT_SIGSEGV, "SIGSEGV" }, \
> -   { VM_FAULT_NOPAGE,  "NOPAGE" }, \
> -   { VM_FAULT_LOCKED,  "LOCKED" }, \
> -   { VM_FAULT_RETRY,   "RETRY" }, \
> -   { VM_FAULT_FALLBACK,"FALLBACK" }, \
> -   { VM_FAULT_DONE_COW,"DONE_COW" }, \
> -   { VM_FAULT_NEEDDSYNC,   "NEEDDSYNC" }
> -
> -/* Encode hstate index for a hwpoisoned large page */
> -#define VM_FAULT_SET_HINDEX(x) ((x) << 12)
> -#define VM_FAULT_GET_HINDEX(x) (((x) >> 12) & 0xf)
> -
> -/*
>   * Can be called by the pagefault handler when it gets a VM_FAULT_OOM.
>   */
>  extern void pagefault_out_of_memory(void);
> diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> index 5ed8f62..cb25016 100644
> --- a/include/linux/mm_types.h
> +++ b/include/linux/mm_types.h
> @@ -22,7 +22,6 @@
>  #endif
>  #define AT_VECTOR_SIZE (2*(AT_VECTOR_SIZE_ARCH + AT_VECTOR_SIZE_BASE + 1))
>
> -typedef int vm_fault_t;
>
>  struct address_space;
>  struct mem_cgroup;
> @@ -609,6 +608,78 @@ static inline bool mm_tlb_flush_nested(struct mm_struct 
> *mm)
>
>  struct vm_fault;
>
> +/**
> + * typedef vm_fault_t - Return type for page fault handlers.
> + *
> + * Page fault handlers return a bitmask of %VM_FAULT values.
> + */
> +typedef __bitwise unsigned int vm_fault_t;
> +
> +/**
> + * enum vm_fault_reason - Page fault handlers return a bitmask of
> + * these values to tell the core VM what happened when handling the
> + * fault. Used to decide whether a process gets delivered SIGBUS or
> + * just gets major/minor fault counters bumped up.
> + *
> + * @VM_FAULT_OOM:  Out Of Memory
> + * @VM_FAULT_SIGBUS:   Bad access
> + * @VM_FAULT_MAJOR:Page read from storage
> + * @VM_FAULT_WRITE:

Re: [PATCH v3] mm: Create the new vm_fault_t type

2018-11-13 Thread Souptick Joarder
On Tue, Nov 6, 2018 at 5:33 PM Souptick Joarder  wrote:
>
> Page fault handlers are supposed to return VM_FAULT codes,
> but some drivers/file systems mistakenly return error
> numbers. Now that all drivers/file systems have been converted
> to use the vm_fault_t return type, change the type definition
> to no longer be compatible with 'int'. By making it an unsigned
> int, the function prototype becomes incompatible with a function
> which returns int. Sparse will detect any attempts to return a
> value which is not a VM_FAULT code.
>
> VM_FAULT_SET_HINDEX and VM_FAULT_GET_HINDEX values are changed
> to avoid conflict with other VM_FAULT codes.
>
> Signed-off-by: Souptick Joarder 

Any further comment on this patch ?
> ---
> v2: Updated the change log and corrected the document part.
> name added to the enum that kernel-doc able to parse it.
>
> v3: Corrected the documentation.
>
>  include/linux/mm.h   | 46 --
>  include/linux/mm_types.h | 73 
> +++-
>  2 files changed, 72 insertions(+), 47 deletions(-)
>
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index fcf9cc9..511a3ce 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -1267,52 +1267,6 @@ static inline void clear_page_pfmemalloc(struct page 
> *page)
>  }
>
>  /*
> - * Different kinds of faults, as returned by handle_mm_fault().
> - * Used to decide whether a process gets delivered SIGBUS or
> - * just gets major/minor fault counters bumped up.
> - */
> -
> -#define VM_FAULT_OOM   0x0001
> -#define VM_FAULT_SIGBUS0x0002
> -#define VM_FAULT_MAJOR 0x0004
> -#define VM_FAULT_WRITE 0x0008  /* Special case for get_user_pages */
> -#define VM_FAULT_HWPOISON 0x0010   /* Hit poisoned small page */
> -#define VM_FAULT_HWPOISON_LARGE 0x0020  /* Hit poisoned large page. Index 
> encoded in upper bits */
> -#define VM_FAULT_SIGSEGV 0x0040
> -
> -#define VM_FAULT_NOPAGE0x0100  /* ->fault installed the pte, not 
> return page */
> -#define VM_FAULT_LOCKED0x0200  /* ->fault locked the returned page */
> -#define VM_FAULT_RETRY 0x0400  /* ->fault blocked, must retry */
> -#define VM_FAULT_FALLBACK 0x0800   /* huge page fault failed, fall back 
> to small */
> -#define VM_FAULT_DONE_COW   0x1000 /* ->fault has fully handled COW */
> -#define VM_FAULT_NEEDDSYNC  0x2000 /* ->fault did not modify page tables
> -* and needs fsync() to complete (for
> -* synchronous page faults in DAX) */
> -
> -#define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | \
> -VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \
> -VM_FAULT_FALLBACK)
> -
> -#define VM_FAULT_RESULT_TRACE \
> -   { VM_FAULT_OOM, "OOM" }, \
> -   { VM_FAULT_SIGBUS,  "SIGBUS" }, \
> -   { VM_FAULT_MAJOR,   "MAJOR" }, \
> -   { VM_FAULT_WRITE,   "WRITE" }, \
> -   { VM_FAULT_HWPOISON,"HWPOISON" }, \
> -   { VM_FAULT_HWPOISON_LARGE,  "HWPOISON_LARGE" }, \
> -   { VM_FAULT_SIGSEGV, "SIGSEGV" }, \
> -   { VM_FAULT_NOPAGE,  "NOPAGE" }, \
> -   { VM_FAULT_LOCKED,  "LOCKED" }, \
> -   { VM_FAULT_RETRY,   "RETRY" }, \
> -   { VM_FAULT_FALLBACK,"FALLBACK" }, \
> -   { VM_FAULT_DONE_COW,"DONE_COW" }, \
> -   { VM_FAULT_NEEDDSYNC,   "NEEDDSYNC" }
> -
> -/* Encode hstate index for a hwpoisoned large page */
> -#define VM_FAULT_SET_HINDEX(x) ((x) << 12)
> -#define VM_FAULT_GET_HINDEX(x) (((x) >> 12) & 0xf)
> -
> -/*
>   * Can be called by the pagefault handler when it gets a VM_FAULT_OOM.
>   */
>  extern void pagefault_out_of_memory(void);
> diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> index 5ed8f62..cb25016 100644
> --- a/include/linux/mm_types.h
> +++ b/include/linux/mm_types.h
> @@ -22,7 +22,6 @@
>  #endif
>  #define AT_VECTOR_SIZE (2*(AT_VECTOR_SIZE_ARCH + AT_VECTOR_SIZE_BASE + 1))
>
> -typedef int vm_fault_t;
>
>  struct address_space;
>  struct mem_cgroup;
> @@ -609,6 +608,78 @@ static inline bool mm_tlb_flush_nested(struct mm_struct 
> *mm)
>
>  struct vm_fault;
>
> +/**
> + * typedef vm_fault_t - Return type for page fault handlers.
> + *
> + * Page fault handlers return a bitmask of %VM_FAULT values.
> + */
> +typedef __bitwise unsigned int vm_fault_t;
> +
> +/**
> + * enum vm_fault_reason - Page fault handlers return a bitmask of
> + * these values to tell the core VM what happened when handling the
> + * fault. Used to decide whether a process gets delivered SIGBUS or
> + * just gets major/minor fault counters bumped up.
> + *
> + * @VM_FAULT_OOM:  Out Of Memory
> + * @VM_FAULT_SIGBUS:   Bad access
> + * @VM_FAULT_MAJOR:Page read from storage
> + * @VM_FAULT_WRITE:

Re: [PATCH v3] mm: Create the new vm_fault_t type

2018-11-06 Thread Michal Hocko
[off-list]
Please do not submit a new version of the patch just after a minor
feedback to the documentation. Wait for some more feedback. Sending 3
versions in about 2 days is just way too much.

Thanks!
-- 
Michal Hocko
SUSE Labs


Re: [PATCH v3] mm: Create the new vm_fault_t type

2018-11-06 Thread Michal Hocko
[off-list]
Please do not submit a new version of the patch just after a minor
feedback to the documentation. Wait for some more feedback. Sending 3
versions in about 2 days is just way too much.

Thanks!
-- 
Michal Hocko
SUSE Labs


[PATCH v3] mm: Create the new vm_fault_t type

2018-11-06 Thread Souptick Joarder
Page fault handlers are supposed to return VM_FAULT codes,
but some drivers/file systems mistakenly return error
numbers. Now that all drivers/file systems have been converted
to use the vm_fault_t return type, change the type definition
to no longer be compatible with 'int'. By making it an unsigned
int, the function prototype becomes incompatible with a function
which returns int. Sparse will detect any attempts to return a
value which is not a VM_FAULT code.

VM_FAULT_SET_HINDEX and VM_FAULT_GET_HINDEX values are changed
to avoid conflict with other VM_FAULT codes.

Signed-off-by: Souptick Joarder 
---
v2: Updated the change log and corrected the document part.
name added to the enum that kernel-doc able to parse it.

v3: Corrected the documentation.

 include/linux/mm.h   | 46 --
 include/linux/mm_types.h | 73 +++-
 2 files changed, 72 insertions(+), 47 deletions(-)

diff --git a/include/linux/mm.h b/include/linux/mm.h
index fcf9cc9..511a3ce 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1267,52 +1267,6 @@ static inline void clear_page_pfmemalloc(struct page 
*page)
 }
 
 /*
- * Different kinds of faults, as returned by handle_mm_fault().
- * Used to decide whether a process gets delivered SIGBUS or
- * just gets major/minor fault counters bumped up.
- */
-
-#define VM_FAULT_OOM   0x0001
-#define VM_FAULT_SIGBUS0x0002
-#define VM_FAULT_MAJOR 0x0004
-#define VM_FAULT_WRITE 0x0008  /* Special case for get_user_pages */
-#define VM_FAULT_HWPOISON 0x0010   /* Hit poisoned small page */
-#define VM_FAULT_HWPOISON_LARGE 0x0020  /* Hit poisoned large page. Index 
encoded in upper bits */
-#define VM_FAULT_SIGSEGV 0x0040
-
-#define VM_FAULT_NOPAGE0x0100  /* ->fault installed the pte, not 
return page */
-#define VM_FAULT_LOCKED0x0200  /* ->fault locked the returned page */
-#define VM_FAULT_RETRY 0x0400  /* ->fault blocked, must retry */
-#define VM_FAULT_FALLBACK 0x0800   /* huge page fault failed, fall back to 
small */
-#define VM_FAULT_DONE_COW   0x1000 /* ->fault has fully handled COW */
-#define VM_FAULT_NEEDDSYNC  0x2000 /* ->fault did not modify page tables
-* and needs fsync() to complete (for
-* synchronous page faults in DAX) */
-
-#define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | \
-VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \
-VM_FAULT_FALLBACK)
-
-#define VM_FAULT_RESULT_TRACE \
-   { VM_FAULT_OOM, "OOM" }, \
-   { VM_FAULT_SIGBUS,  "SIGBUS" }, \
-   { VM_FAULT_MAJOR,   "MAJOR" }, \
-   { VM_FAULT_WRITE,   "WRITE" }, \
-   { VM_FAULT_HWPOISON,"HWPOISON" }, \
-   { VM_FAULT_HWPOISON_LARGE,  "HWPOISON_LARGE" }, \
-   { VM_FAULT_SIGSEGV, "SIGSEGV" }, \
-   { VM_FAULT_NOPAGE,  "NOPAGE" }, \
-   { VM_FAULT_LOCKED,  "LOCKED" }, \
-   { VM_FAULT_RETRY,   "RETRY" }, \
-   { VM_FAULT_FALLBACK,"FALLBACK" }, \
-   { VM_FAULT_DONE_COW,"DONE_COW" }, \
-   { VM_FAULT_NEEDDSYNC,   "NEEDDSYNC" }
-
-/* Encode hstate index for a hwpoisoned large page */
-#define VM_FAULT_SET_HINDEX(x) ((x) << 12)
-#define VM_FAULT_GET_HINDEX(x) (((x) >> 12) & 0xf)
-
-/*
  * Can be called by the pagefault handler when it gets a VM_FAULT_OOM.
  */
 extern void pagefault_out_of_memory(void);
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
index 5ed8f62..cb25016 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -22,7 +22,6 @@
 #endif
 #define AT_VECTOR_SIZE (2*(AT_VECTOR_SIZE_ARCH + AT_VECTOR_SIZE_BASE + 1))
 
-typedef int vm_fault_t;
 
 struct address_space;
 struct mem_cgroup;
@@ -609,6 +608,78 @@ static inline bool mm_tlb_flush_nested(struct mm_struct 
*mm)
 
 struct vm_fault;
 
+/**
+ * typedef vm_fault_t - Return type for page fault handlers.
+ *
+ * Page fault handlers return a bitmask of %VM_FAULT values.
+ */
+typedef __bitwise unsigned int vm_fault_t;
+
+/**
+ * enum vm_fault_reason - Page fault handlers return a bitmask of
+ * these values to tell the core VM what happened when handling the
+ * fault. Used to decide whether a process gets delivered SIGBUS or
+ * just gets major/minor fault counters bumped up.
+ *
+ * @VM_FAULT_OOM:  Out Of Memory
+ * @VM_FAULT_SIGBUS:   Bad access
+ * @VM_FAULT_MAJOR:Page read from storage
+ * @VM_FAULT_WRITE:Special case for get_user_pages
+ * @VM_FAULT_HWPOISON: Hit poisoned small page
+ * @VM_FAULT_HWPOISON_LARGE:   Hit poisoned large page. Index encoded
+ * in upper bits
+ * @VM_FAULT_SIGSEGV:  segmentation fault
+ * @VM_FAULT_NOPAGE:   ->fault installed the pte, not 

[PATCH v3] mm: Create the new vm_fault_t type

2018-11-06 Thread Souptick Joarder
Page fault handlers are supposed to return VM_FAULT codes,
but some drivers/file systems mistakenly return error
numbers. Now that all drivers/file systems have been converted
to use the vm_fault_t return type, change the type definition
to no longer be compatible with 'int'. By making it an unsigned
int, the function prototype becomes incompatible with a function
which returns int. Sparse will detect any attempts to return a
value which is not a VM_FAULT code.

VM_FAULT_SET_HINDEX and VM_FAULT_GET_HINDEX values are changed
to avoid conflict with other VM_FAULT codes.

Signed-off-by: Souptick Joarder 
---
v2: Updated the change log and corrected the document part.
name added to the enum that kernel-doc able to parse it.

v3: Corrected the documentation.

 include/linux/mm.h   | 46 --
 include/linux/mm_types.h | 73 +++-
 2 files changed, 72 insertions(+), 47 deletions(-)

diff --git a/include/linux/mm.h b/include/linux/mm.h
index fcf9cc9..511a3ce 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1267,52 +1267,6 @@ static inline void clear_page_pfmemalloc(struct page 
*page)
 }
 
 /*
- * Different kinds of faults, as returned by handle_mm_fault().
- * Used to decide whether a process gets delivered SIGBUS or
- * just gets major/minor fault counters bumped up.
- */
-
-#define VM_FAULT_OOM   0x0001
-#define VM_FAULT_SIGBUS0x0002
-#define VM_FAULT_MAJOR 0x0004
-#define VM_FAULT_WRITE 0x0008  /* Special case for get_user_pages */
-#define VM_FAULT_HWPOISON 0x0010   /* Hit poisoned small page */
-#define VM_FAULT_HWPOISON_LARGE 0x0020  /* Hit poisoned large page. Index 
encoded in upper bits */
-#define VM_FAULT_SIGSEGV 0x0040
-
-#define VM_FAULT_NOPAGE0x0100  /* ->fault installed the pte, not 
return page */
-#define VM_FAULT_LOCKED0x0200  /* ->fault locked the returned page */
-#define VM_FAULT_RETRY 0x0400  /* ->fault blocked, must retry */
-#define VM_FAULT_FALLBACK 0x0800   /* huge page fault failed, fall back to 
small */
-#define VM_FAULT_DONE_COW   0x1000 /* ->fault has fully handled COW */
-#define VM_FAULT_NEEDDSYNC  0x2000 /* ->fault did not modify page tables
-* and needs fsync() to complete (for
-* synchronous page faults in DAX) */
-
-#define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | \
-VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \
-VM_FAULT_FALLBACK)
-
-#define VM_FAULT_RESULT_TRACE \
-   { VM_FAULT_OOM, "OOM" }, \
-   { VM_FAULT_SIGBUS,  "SIGBUS" }, \
-   { VM_FAULT_MAJOR,   "MAJOR" }, \
-   { VM_FAULT_WRITE,   "WRITE" }, \
-   { VM_FAULT_HWPOISON,"HWPOISON" }, \
-   { VM_FAULT_HWPOISON_LARGE,  "HWPOISON_LARGE" }, \
-   { VM_FAULT_SIGSEGV, "SIGSEGV" }, \
-   { VM_FAULT_NOPAGE,  "NOPAGE" }, \
-   { VM_FAULT_LOCKED,  "LOCKED" }, \
-   { VM_FAULT_RETRY,   "RETRY" }, \
-   { VM_FAULT_FALLBACK,"FALLBACK" }, \
-   { VM_FAULT_DONE_COW,"DONE_COW" }, \
-   { VM_FAULT_NEEDDSYNC,   "NEEDDSYNC" }
-
-/* Encode hstate index for a hwpoisoned large page */
-#define VM_FAULT_SET_HINDEX(x) ((x) << 12)
-#define VM_FAULT_GET_HINDEX(x) (((x) >> 12) & 0xf)
-
-/*
  * Can be called by the pagefault handler when it gets a VM_FAULT_OOM.
  */
 extern void pagefault_out_of_memory(void);
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
index 5ed8f62..cb25016 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -22,7 +22,6 @@
 #endif
 #define AT_VECTOR_SIZE (2*(AT_VECTOR_SIZE_ARCH + AT_VECTOR_SIZE_BASE + 1))
 
-typedef int vm_fault_t;
 
 struct address_space;
 struct mem_cgroup;
@@ -609,6 +608,78 @@ static inline bool mm_tlb_flush_nested(struct mm_struct 
*mm)
 
 struct vm_fault;
 
+/**
+ * typedef vm_fault_t - Return type for page fault handlers.
+ *
+ * Page fault handlers return a bitmask of %VM_FAULT values.
+ */
+typedef __bitwise unsigned int vm_fault_t;
+
+/**
+ * enum vm_fault_reason - Page fault handlers return a bitmask of
+ * these values to tell the core VM what happened when handling the
+ * fault. Used to decide whether a process gets delivered SIGBUS or
+ * just gets major/minor fault counters bumped up.
+ *
+ * @VM_FAULT_OOM:  Out Of Memory
+ * @VM_FAULT_SIGBUS:   Bad access
+ * @VM_FAULT_MAJOR:Page read from storage
+ * @VM_FAULT_WRITE:Special case for get_user_pages
+ * @VM_FAULT_HWPOISON: Hit poisoned small page
+ * @VM_FAULT_HWPOISON_LARGE:   Hit poisoned large page. Index encoded
+ * in upper bits
+ * @VM_FAULT_SIGSEGV:  segmentation fault
+ * @VM_FAULT_NOPAGE:   ->fault installed the pte, not