[lustre-devel] [PATCH 13/21] lustre: make cp_ref in cl_page a refcount_t

James Simmons jsimmons at infradead.org
Sun Feb 10 20:00:42 PST 2019


> As this is used as a refcount, it should be declared
> as one.

Reviewed-by: James Simmons <jsimmons at infradead.org>
 
> Signed-off-by: NeilBrown <neilb at suse.com>
> ---
>  drivers/staging/lustre/lustre/include/cl_object.h |    4 ++--
>  drivers/staging/lustre/lustre/llite/vvp_page.c    |    9 +++++----
>  drivers/staging/lustre/lustre/obdclass/cl_page.c  |   14 +++++++-------
>  3 files changed, 14 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/staging/lustre/lustre/include/cl_object.h b/drivers/staging/lustre/lustre/include/cl_object.h
> index bf7678aed6bf..c2273c3100e8 100644
> --- a/drivers/staging/lustre/lustre/include/cl_object.h
> +++ b/drivers/staging/lustre/lustre/include/cl_object.h
> @@ -717,7 +717,7 @@ enum cl_page_type {
>   */
>  struct cl_page {
>  	/** Reference counter. */
> -	atomic_t			 cp_ref;
> +	refcount_t			 cp_ref;
>  	/** An object this page is a part of. Immutable after creation. */
>  	struct cl_object		*cp_obj;
>  	/** vmpage */
> @@ -1021,7 +1021,7 @@ static inline struct page *cl_page_vmpage(struct cl_page *page)
>   */
>  static inline bool __page_in_use(const struct cl_page *page, int refc)
>  {
> -	return (atomic_read(&page->cp_ref) > refc + 1);
> +	return (refcount_read(&page->cp_ref) > refc + 1);
>  }
>  
>  /**
> diff --git a/drivers/staging/lustre/lustre/llite/vvp_page.c b/drivers/staging/lustre/lustre/llite/vvp_page.c
> index 77bf923f2578..ec0d93313f55 100644
> --- a/drivers/staging/lustre/lustre/llite/vvp_page.c
> +++ b/drivers/staging/lustre/lustre/llite/vvp_page.c
> @@ -157,15 +157,16 @@ static void vvp_page_delete(const struct lu_env *env,
>  	struct inode *inode = vmpage->mapping->host;
>  	struct cl_object *obj = slice->cpl_obj;
>  	struct cl_page *page = slice->cpl_page;
> -	int refc;
>  
>  	LASSERT(PageLocked(vmpage));
>  	LASSERT((struct cl_page *)vmpage->private == page);
>  	LASSERT(inode == vvp_object_inode(obj));
>  
>  	/* Drop the reference count held in vvp_page_init */
> -	refc = atomic_dec_return(&page->cp_ref);
> -	LASSERTF(refc >= 1, "page = %p, refc = %d\n", page, refc);
> +	if (refcount_dec_and_test(&page->cp_ref)) {
> +		/* It mustn't reach zero here! */
> +		LASSERTF(0, "page = %p, refc reached zero\n", page);
> +	}
>  
>  	ClearPagePrivate(vmpage);
>  	vmpage->private = 0;
> @@ -507,7 +508,7 @@ int vvp_page_init(const struct lu_env *env, struct cl_object *obj,
>  
>  	if (page->cp_type == CPT_CACHEABLE) {
>  		/* in cache, decref in vvp_page_delete */
> -		atomic_inc(&page->cp_ref);
> +		refcount_inc(&page->cp_ref);
>  		SetPagePrivate(vmpage);
>  		vmpage->private = (unsigned long)page;
>  		cl_page_slice_add(page, &vpg->vpg_cl, obj, index,
> diff --git a/drivers/staging/lustre/lustre/obdclass/cl_page.c b/drivers/staging/lustre/lustre/obdclass/cl_page.c
> index 31ded52e0499..f0ece7e9a4ac 100644
> --- a/drivers/staging/lustre/lustre/obdclass/cl_page.c
> +++ b/drivers/staging/lustre/lustre/obdclass/cl_page.c
> @@ -67,8 +67,8 @@ static void __cl_page_delete(const struct lu_env *env, struct cl_page *pg);
>   */
>  static void cl_page_get_trust(struct cl_page *page)
>  {
> -	LASSERT(atomic_read(&page->cp_ref) > 0);
> -	atomic_inc(&page->cp_ref);
> +	LASSERT(refcount_read(&page->cp_ref) > 0);
> +	refcount_inc(&page->cp_ref);
>  }
>  
>  /**
> @@ -135,7 +135,7 @@ struct cl_page *cl_page_alloc(const struct lu_env *env,
>  	if (page) {
>  		int result = 0;
>  
> -		atomic_set(&page->cp_ref, 1);
> +		refcount_set(&page->cp_ref, 1);
>  		page->cp_obj = o;
>  		cl_object_get(o);
>  		lu_object_ref_add_at(&o->co_lu, &page->cp_obj_ref, "cl_page",
> @@ -310,12 +310,12 @@ EXPORT_SYMBOL(cl_page_get);
>  void cl_page_put(const struct lu_env *env, struct cl_page *page)
>  {
>  	CL_PAGE_HEADER(D_TRACE, env, page, "%d\n",
> -		       atomic_read(&page->cp_ref));
> +		       refcount_read(&page->cp_ref));
>  
> -	if (atomic_dec_and_test(&page->cp_ref)) {
> +	if (refcount_dec_and_test(&page->cp_ref)) {
>  		LASSERT(page->cp_state == CPS_FREEING);
>  
> -		LASSERT(atomic_read(&page->cp_ref) == 0);
> +		LASSERT(refcount_read(&page->cp_ref) == 0);
>  		PASSERT(env, page, !page->cp_owner);
>  		PASSERT(env, page, list_empty(&page->cp_batch));
>  		/*
> @@ -869,7 +869,7 @@ void cl_page_header_print(const struct lu_env *env, void *cookie,
>  {
>  	(*printer)(env, cookie,
>  		   "page@%p[%d %p %d %d %p]\n",
> -		   pg, atomic_read(&pg->cp_ref), pg->cp_obj,
> +		   pg, refcount_read(&pg->cp_ref), pg->cp_obj,
>  		   pg->cp_state, pg->cp_type,
>  		   pg->cp_owner);
>  }
> 
> 
> 


More information about the lustre-devel mailing list