Re: [PATCH v2 01/13] mm/vma: remove __private sparse decoration from vma_flags_t

"Liam R. Howlett" <[email protected]>
Newsgroups org.kernel.vger.linux-sgx,dev.linux.lists.ntfs3,dev.linux.lists.nvdimm,org.freedesktop.lists.dri-devel,org.freedesktop.lists.intel-gfx,org.kernel.vger.keyrings,org.kernel.vger.linux-cxl,org.kernel.vger.linux-ext4,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-security-module,org.kernel.vger.linux-xfs,org.kvack.linux-mm,org.ozlabs.lists.linux-erofs
Message-ID <7oqecfml77ievg2p6zks6ka6mv75ttfjvc6i2hr3a3hhrqqinz@akufz44ogdfh>
* Lorenzo Stoakes <[email protected]> [260122 16:06]:
> We need to pass around these values and access them in a way that sparse
> does not allow, as __private implies noderef, i.e. disallowing dereference
> of the value, which manifests as sparse warnings even when passed around
> benignly.
> 
> Signed-off-by: Lorenzo Stoakes <[email protected]>

Reviewed-by: Liam R. Howlett <[email protected]>

> ---
>  include/linux/mm.h       |  4 ++--
>  include/linux/mm_types.h | 14 ++++++++------
>  2 files changed, 10 insertions(+), 8 deletions(-)
> 
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index d7ca837dd8a5..776a7e03f88b 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -943,7 +943,7 @@ static inline void vm_flags_reset_once(struct vm_area_struct *vma,
>  	 * system word.
>  	 */
>  	if (NUM_VMA_FLAG_BITS > BITS_PER_LONG) {
> -		unsigned long *bitmap = ACCESS_PRIVATE(&vma->flags, __vma_flags);
> +		unsigned long *bitmap = vma->flags.__vma_flags;
>  
>  		bitmap_zero(&bitmap[1], NUM_VMA_FLAG_BITS - BITS_PER_LONG);
>  	}
> @@ -1006,7 +1006,7 @@ static inline bool __vma_flag_atomic_valid(struct vm_area_struct *vma,
>  static inline void vma_flag_set_atomic(struct vm_area_struct *vma,
>  				       vma_flag_t bit)
>  {
> -	unsigned long *bitmap = ACCESS_PRIVATE(&vma->flags, __vma_flags);
> +	unsigned long *bitmap = vma->flags.__vma_flags;
>  
>  	vma_assert_stabilised(vma);
>  	if (__vma_flag_atomic_valid(vma, bit))
> diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> index e5ee66f84d9a..592ad065fa75 100644
> --- a/include/linux/mm_types.h
> +++ b/include/linux/mm_types.h
> @@ -866,7 +866,7 @@ struct mmap_action {
>  #define NUM_VMA_FLAG_BITS BITS_PER_LONG
>  typedef struct {
>  	DECLARE_BITMAP(__vma_flags, NUM_VMA_FLAG_BITS);
> -} __private vma_flags_t;
> +} vma_flags_t;
>  
>  /*
>   * Describes a VMA that is about to be mmap()'ed. Drivers may choose to
> @@ -1056,7 +1056,7 @@ struct vm_area_struct {
>  /* Clears all bits in the VMA flags bitmap, non-atomically. */
>  static inline void vma_flags_clear_all(vma_flags_t *flags)
>  {
> -	bitmap_zero(ACCESS_PRIVATE(flags, __vma_flags), NUM_VMA_FLAG_BITS);
> +	bitmap_zero(flags->__vma_flags, NUM_VMA_FLAG_BITS);
>  }
>  
>  /*
> @@ -1067,7 +1067,9 @@ static inline void vma_flags_clear_all(vma_flags_t *flags)
>   */
>  static inline void vma_flags_overwrite_word(vma_flags_t *flags, unsigned long value)
>  {
> -	*ACCESS_PRIVATE(flags, __vma_flags) = value;
> +	unsigned long *bitmap = flags->__vma_flags;
> +
> +	bitmap[0] = value;
>  }
>  
>  /*
> @@ -1078,7 +1080,7 @@ static inline void vma_flags_overwrite_word(vma_flags_t *flags, unsigned long va
>   */
>  static inline void vma_flags_overwrite_word_once(vma_flags_t *flags, unsigned long value)
>  {
> -	unsigned long *bitmap = ACCESS_PRIVATE(flags, __vma_flags);
> +	unsigned long *bitmap = flags->__vma_flags;
>  
>  	WRITE_ONCE(*bitmap, value);
>  }
> @@ -1086,7 +1088,7 @@ static inline void vma_flags_overwrite_word_once(vma_flags_t *flags, unsigned lo
>  /* Update the first system word of VMA flags setting bits, non-atomically. */
>  static inline void vma_flags_set_word(vma_flags_t *flags, unsigned long value)
>  {
> -	unsigned long *bitmap = ACCESS_PRIVATE(flags, __vma_flags);
> +	unsigned long *bitmap = flags->__vma_flags;
>  
>  	*bitmap |= value;
>  }
> @@ -1094,7 +1096,7 @@ static inline void vma_flags_set_word(vma_flags_t *flags, unsigned long value)
>  /* Update the first system word of VMA flags clearing bits, non-atomically. */
>  static inline void vma_flags_clear_word(vma_flags_t *flags, unsigned long value)
>  {
> -	unsigned long *bitmap = ACCESS_PRIVATE(flags, __vma_flags);
> +	unsigned long *bitmap = flags->__vma_flags;
>  
>  	*bitmap &= ~value;
>  }
> -- 
> 2.52.0
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.