All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jerome Glisse <jglisse@redhat.com>
To: Dan Williams <dan.j.williams@intel.com>
Cc: akpm@linux-foundation.org, Christoph Hellwig <hch@lst.de>,
	Logan Gunthorpe <logang@deltatee.com>,
	alexander.h.duyck@intel.com, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5 5/7] mm, hmm: Use devm semantics for hmm_devmem_{add, remove}
Date: Tue, 18 Sep 2018 16:34:58 -0400	[thread overview]
Message-ID: <20180918203457.GE14689@redhat.com> (raw)
In-Reply-To: <153680534781.453305.3660438915028111950.stgit@dwillia2-desk3.amr.corp.intel.com>

On Wed, Sep 12, 2018 at 07:22:27PM -0700, Dan Williams wrote:
> devm semantics arrange for resources to be torn down when
> device-driver-probe fails or when device-driver-release completes.
> Similar to devm_memremap_pages() there is no need to support an explicit
> remove operation when the users properly adhere to devm semantics.
> 
> Note that devm_kzalloc() automatically handles allocating node-local
> memory.
> 
> Reviewed-by: Christoph Hellwig <hch@lst.de>

Reviewed-by: Jerome Glisse <jglisse@redhat.com>

> Cc: Logan Gunthorpe <logang@deltatee.com>
> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
> ---
>  include/linux/hmm.h |    4 --
>  mm/hmm.c            |  127 ++++++++++-----------------------------------------
>  2 files changed, 25 insertions(+), 106 deletions(-)
> 
> diff --git a/include/linux/hmm.h b/include/linux/hmm.h
> index 4c92e3ba3e16..5ec8635f602c 100644
> --- a/include/linux/hmm.h
> +++ b/include/linux/hmm.h
> @@ -499,8 +499,7 @@ struct hmm_devmem {
>   * enough and allocate struct page for it.
>   *
>   * The device driver can wrap the hmm_devmem struct inside a private device
> - * driver struct. The device driver must call hmm_devmem_remove() before the
> - * device goes away and before freeing the hmm_devmem struct memory.
> + * driver struct.
>   */
>  struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops,
>  				  struct device *device,
> @@ -508,7 +507,6 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops,
>  struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops,
>  					   struct device *device,
>  					   struct resource *res);
> -void hmm_devmem_remove(struct hmm_devmem *devmem);
>  
>  /*
>   * hmm_devmem_page_set_drvdata - set per-page driver data field
> diff --git a/mm/hmm.c b/mm/hmm.c
> index c968e49f7a0c..ec1d9eccf176 100644
> --- a/mm/hmm.c
> +++ b/mm/hmm.c
> @@ -939,7 +939,6 @@ static void hmm_devmem_ref_exit(void *data)
>  
>  	devmem = container_of(ref, struct hmm_devmem, ref);
>  	percpu_ref_exit(ref);
> -	devm_remove_action(devmem->device, &hmm_devmem_ref_exit, data);
>  }
>  
>  static void hmm_devmem_ref_kill(void *data)
> @@ -950,7 +949,6 @@ static void hmm_devmem_ref_kill(void *data)
>  	devmem = container_of(ref, struct hmm_devmem, ref);
>  	percpu_ref_kill(ref);
>  	wait_for_completion(&devmem->completion);
> -	devm_remove_action(devmem->device, &hmm_devmem_ref_kill, data);
>  }
>  
>  static int hmm_devmem_fault(struct vm_area_struct *vma,
> @@ -988,7 +986,7 @@ static void hmm_devmem_radix_release(struct resource *resource)
>  	mutex_unlock(&hmm_devmem_lock);
>  }
>  
> -static void hmm_devmem_release(struct device *dev, void *data)
> +static void hmm_devmem_release(void *data)
>  {
>  	struct hmm_devmem *devmem = data;
>  	struct resource *resource = devmem->resource;
> @@ -996,11 +994,6 @@ static void hmm_devmem_release(struct device *dev, void *data)
>  	struct zone *zone;
>  	struct page *page;
>  
> -	if (percpu_ref_tryget_live(&devmem->ref)) {
> -		dev_WARN(dev, "%s: page mapping is still live!\n", __func__);
> -		percpu_ref_put(&devmem->ref);
> -	}
> -
>  	/* pages are dead and unused, undo the arch mapping */
>  	start_pfn = (resource->start & ~(PA_SECTION_SIZE - 1)) >> PAGE_SHIFT;
>  	npages = ALIGN(resource_size(resource), PA_SECTION_SIZE) >> PAGE_SHIFT;
> @@ -1124,19 +1117,6 @@ static int hmm_devmem_pages_create(struct hmm_devmem *devmem)
>  	return ret;
>  }
>  
> -static int hmm_devmem_match(struct device *dev, void *data, void *match_data)
> -{
> -	struct hmm_devmem *devmem = data;
> -
> -	return devmem->resource == match_data;
> -}
> -
> -static void hmm_devmem_pages_remove(struct hmm_devmem *devmem)
> -{
> -	devres_release(devmem->device, &hmm_devmem_release,
> -		       &hmm_devmem_match, devmem->resource);
> -}
> -
>  /*
>   * hmm_devmem_add() - hotplug ZONE_DEVICE memory for device memory
>   *
> @@ -1164,8 +1144,7 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops,
>  
>  	dev_pagemap_get_ops();
>  
> -	devmem = devres_alloc_node(&hmm_devmem_release, sizeof(*devmem),
> -				   GFP_KERNEL, dev_to_node(device));
> +	devmem = devm_kzalloc(device, sizeof(*devmem), GFP_KERNEL);
>  	if (!devmem)
>  		return ERR_PTR(-ENOMEM);
>  
> @@ -1179,11 +1158,11 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops,
>  	ret = percpu_ref_init(&devmem->ref, &hmm_devmem_ref_release,
>  			      0, GFP_KERNEL);
>  	if (ret)
> -		goto error_percpu_ref;
> +		return ERR_PTR(ret);
>  
> -	ret = devm_add_action(device, hmm_devmem_ref_exit, &devmem->ref);
> +	ret = devm_add_action_or_reset(device, hmm_devmem_ref_exit, &devmem->ref);
>  	if (ret)
> -		goto error_devm_add_action;
> +		return ERR_PTR(ret);
>  
>  	size = ALIGN(size, PA_SECTION_SIZE);
>  	addr = min((unsigned long)iomem_resource.end,
> @@ -1203,16 +1182,12 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops,
>  
>  		devmem->resource = devm_request_mem_region(device, addr, size,
>  							   dev_name(device));
> -		if (!devmem->resource) {
> -			ret = -ENOMEM;
> -			goto error_no_resource;
> -		}
> +		if (!devmem->resource)
> +			return ERR_PTR(-ENOMEM);
>  		break;
>  	}
> -	if (!devmem->resource) {
> -		ret = -ERANGE;
> -		goto error_no_resource;
> -	}
> +	if (!devmem->resource)
> +		return ERR_PTR(-ERANGE);
>  
>  	devmem->resource->desc = IORES_DESC_DEVICE_PRIVATE_MEMORY;
>  	devmem->pfn_first = devmem->resource->start >> PAGE_SHIFT;
> @@ -1221,28 +1196,13 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops,
>  
>  	ret = hmm_devmem_pages_create(devmem);
>  	if (ret)
> -		goto error_pages;
> -
> -	devres_add(device, devmem);
> +		return ERR_PTR(ret);
>  
> -	ret = devm_add_action(device, hmm_devmem_ref_kill, &devmem->ref);
> -	if (ret) {
> -		hmm_devmem_remove(devmem);
> +	ret = devm_add_action_or_reset(device, hmm_devmem_release, devmem);
> +	if (ret)
>  		return ERR_PTR(ret);
> -	}
>  
>  	return devmem;
> -
> -error_pages:
> -	devm_release_mem_region(device, devmem->resource->start,
> -				resource_size(devmem->resource));
> -error_no_resource:
> -error_devm_add_action:
> -	hmm_devmem_ref_kill(&devmem->ref);
> -	hmm_devmem_ref_exit(&devmem->ref);
> -error_percpu_ref:
> -	devres_free(devmem);
> -	return ERR_PTR(ret);
>  }
>  EXPORT_SYMBOL(hmm_devmem_add);
>  
> @@ -1258,8 +1218,7 @@ struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops,
>  
>  	dev_pagemap_get_ops();
>  
> -	devmem = devres_alloc_node(&hmm_devmem_release, sizeof(*devmem),
> -				   GFP_KERNEL, dev_to_node(device));
> +	devmem = devm_kzalloc(device, sizeof(*devmem), GFP_KERNEL);
>  	if (!devmem)
>  		return ERR_PTR(-ENOMEM);
>  
> @@ -1273,12 +1232,12 @@ struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops,
>  	ret = percpu_ref_init(&devmem->ref, &hmm_devmem_ref_release,
>  			      0, GFP_KERNEL);
>  	if (ret)
> -		goto error_percpu_ref;
> +		return ERR_PTR(ret);
>  
> -	ret = devm_add_action(device, hmm_devmem_ref_exit, &devmem->ref);
> +	ret = devm_add_action_or_reset(device, hmm_devmem_ref_exit,
> +			&devmem->ref);
>  	if (ret)
> -		goto error_devm_add_action;
> -
> +		return ERR_PTR(ret);
>  
>  	devmem->pfn_first = devmem->resource->start >> PAGE_SHIFT;
>  	devmem->pfn_last = devmem->pfn_first +
> @@ -1286,59 +1245,21 @@ struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops,
>  
>  	ret = hmm_devmem_pages_create(devmem);
>  	if (ret)
> -		goto error_devm_add_action;
> +		return ERR_PTR(ret);
>  
> -	devres_add(device, devmem);
> +	ret = devm_add_action_or_reset(device, hmm_devmem_release, devmem);
> +	if (ret)
> +		return ERR_PTR(ret);
>  
> -	ret = devm_add_action(device, hmm_devmem_ref_kill, &devmem->ref);
> -	if (ret) {
> -		hmm_devmem_remove(devmem);
> +	ret = devm_add_action_or_reset(device, hmm_devmem_ref_kill,
> +			&devmem->ref);
> +	if (ret)
>  		return ERR_PTR(ret);
> -	}
>  
>  	return devmem;
> -
> -error_devm_add_action:
> -	hmm_devmem_ref_kill(&devmem->ref);
> -	hmm_devmem_ref_exit(&devmem->ref);
> -error_percpu_ref:
> -	devres_free(devmem);
> -	return ERR_PTR(ret);
>  }
>  EXPORT_SYMBOL(hmm_devmem_add_resource);
>  
> -/*
> - * hmm_devmem_remove() - remove device memory (kill and free ZONE_DEVICE)
> - *
> - * @devmem: hmm_devmem struct use to track and manage the ZONE_DEVICE memory
> - *
> - * This will hot-unplug memory that was hotplugged by hmm_devmem_add on behalf
> - * of the device driver. It will free struct page and remove the resource that
> - * reserved the physical address range for this device memory.
> - */
> -void hmm_devmem_remove(struct hmm_devmem *devmem)
> -{
> -	resource_size_t start, size;
> -	struct device *device;
> -	bool cdm = false;
> -
> -	if (!devmem)
> -		return;
> -
> -	device = devmem->device;
> -	start = devmem->resource->start;
> -	size = resource_size(devmem->resource);
> -
> -	cdm = devmem->resource->desc == IORES_DESC_DEVICE_PUBLIC_MEMORY;
> -	hmm_devmem_ref_kill(&devmem->ref);
> -	hmm_devmem_ref_exit(&devmem->ref);
> -	hmm_devmem_pages_remove(devmem);
> -
> -	if (!cdm)
> -		devm_release_mem_region(device, start, size);
> -}
> -EXPORT_SYMBOL(hmm_devmem_remove);
> -
>  /*
>   * A device driver that wants to handle multiple devices memory through a
>   * single fake device can use hmm_device to do so. This is purely a helper
> 

WARNING: multiple messages have this Message-ID (diff)
From: Jerome Glisse <jglisse@redhat.com>
To: Dan Williams <dan.j.williams@intel.com>
Cc: akpm@linux-foundation.org, Christoph Hellwig <hch@lst.de>,
	Logan Gunthorpe <logang@deltatee.com>,
	alexander.h.duyck@intel.com, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5 5/7] mm, hmm: Use devm semantics for hmm_devmem_{add, remove}
Date: Tue, 18 Sep 2018 16:34:58 -0400	[thread overview]
Message-ID: <20180918203457.GE14689@redhat.com> (raw)
In-Reply-To: <153680534781.453305.3660438915028111950.stgit@dwillia2-desk3.amr.corp.intel.com>

On Wed, Sep 12, 2018 at 07:22:27PM -0700, Dan Williams wrote:
> devm semantics arrange for resources to be torn down when
> device-driver-probe fails or when device-driver-release completes.
> Similar to devm_memremap_pages() there is no need to support an explicit
> remove operation when the users properly adhere to devm semantics.
> 
> Note that devm_kzalloc() automatically handles allocating node-local
> memory.
> 
> Reviewed-by: Christoph Hellwig <hch@lst.de>

Reviewed-by: Jérôme Glisse <jglisse@redhat.com>

> Cc: Logan Gunthorpe <logang@deltatee.com>
> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
> ---
>  include/linux/hmm.h |    4 --
>  mm/hmm.c            |  127 ++++++++++-----------------------------------------
>  2 files changed, 25 insertions(+), 106 deletions(-)
> 
> diff --git a/include/linux/hmm.h b/include/linux/hmm.h
> index 4c92e3ba3e16..5ec8635f602c 100644
> --- a/include/linux/hmm.h
> +++ b/include/linux/hmm.h
> @@ -499,8 +499,7 @@ struct hmm_devmem {
>   * enough and allocate struct page for it.
>   *
>   * The device driver can wrap the hmm_devmem struct inside a private device
> - * driver struct. The device driver must call hmm_devmem_remove() before the
> - * device goes away and before freeing the hmm_devmem struct memory.
> + * driver struct.
>   */
>  struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops,
>  				  struct device *device,
> @@ -508,7 +507,6 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops,
>  struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops,
>  					   struct device *device,
>  					   struct resource *res);
> -void hmm_devmem_remove(struct hmm_devmem *devmem);
>  
>  /*
>   * hmm_devmem_page_set_drvdata - set per-page driver data field
> diff --git a/mm/hmm.c b/mm/hmm.c
> index c968e49f7a0c..ec1d9eccf176 100644
> --- a/mm/hmm.c
> +++ b/mm/hmm.c
> @@ -939,7 +939,6 @@ static void hmm_devmem_ref_exit(void *data)
>  
>  	devmem = container_of(ref, struct hmm_devmem, ref);
>  	percpu_ref_exit(ref);
> -	devm_remove_action(devmem->device, &hmm_devmem_ref_exit, data);
>  }
>  
>  static void hmm_devmem_ref_kill(void *data)
> @@ -950,7 +949,6 @@ static void hmm_devmem_ref_kill(void *data)
>  	devmem = container_of(ref, struct hmm_devmem, ref);
>  	percpu_ref_kill(ref);
>  	wait_for_completion(&devmem->completion);
> -	devm_remove_action(devmem->device, &hmm_devmem_ref_kill, data);
>  }
>  
>  static int hmm_devmem_fault(struct vm_area_struct *vma,
> @@ -988,7 +986,7 @@ static void hmm_devmem_radix_release(struct resource *resource)
>  	mutex_unlock(&hmm_devmem_lock);
>  }
>  
> -static void hmm_devmem_release(struct device *dev, void *data)
> +static void hmm_devmem_release(void *data)
>  {
>  	struct hmm_devmem *devmem = data;
>  	struct resource *resource = devmem->resource;
> @@ -996,11 +994,6 @@ static void hmm_devmem_release(struct device *dev, void *data)
>  	struct zone *zone;
>  	struct page *page;
>  
> -	if (percpu_ref_tryget_live(&devmem->ref)) {
> -		dev_WARN(dev, "%s: page mapping is still live!\n", __func__);
> -		percpu_ref_put(&devmem->ref);
> -	}
> -
>  	/* pages are dead and unused, undo the arch mapping */
>  	start_pfn = (resource->start & ~(PA_SECTION_SIZE - 1)) >> PAGE_SHIFT;
>  	npages = ALIGN(resource_size(resource), PA_SECTION_SIZE) >> PAGE_SHIFT;
> @@ -1124,19 +1117,6 @@ static int hmm_devmem_pages_create(struct hmm_devmem *devmem)
>  	return ret;
>  }
>  
> -static int hmm_devmem_match(struct device *dev, void *data, void *match_data)
> -{
> -	struct hmm_devmem *devmem = data;
> -
> -	return devmem->resource == match_data;
> -}
> -
> -static void hmm_devmem_pages_remove(struct hmm_devmem *devmem)
> -{
> -	devres_release(devmem->device, &hmm_devmem_release,
> -		       &hmm_devmem_match, devmem->resource);
> -}
> -
>  /*
>   * hmm_devmem_add() - hotplug ZONE_DEVICE memory for device memory
>   *
> @@ -1164,8 +1144,7 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops,
>  
>  	dev_pagemap_get_ops();
>  
> -	devmem = devres_alloc_node(&hmm_devmem_release, sizeof(*devmem),
> -				   GFP_KERNEL, dev_to_node(device));
> +	devmem = devm_kzalloc(device, sizeof(*devmem), GFP_KERNEL);
>  	if (!devmem)
>  		return ERR_PTR(-ENOMEM);
>  
> @@ -1179,11 +1158,11 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops,
>  	ret = percpu_ref_init(&devmem->ref, &hmm_devmem_ref_release,
>  			      0, GFP_KERNEL);
>  	if (ret)
> -		goto error_percpu_ref;
> +		return ERR_PTR(ret);
>  
> -	ret = devm_add_action(device, hmm_devmem_ref_exit, &devmem->ref);
> +	ret = devm_add_action_or_reset(device, hmm_devmem_ref_exit, &devmem->ref);
>  	if (ret)
> -		goto error_devm_add_action;
> +		return ERR_PTR(ret);
>  
>  	size = ALIGN(size, PA_SECTION_SIZE);
>  	addr = min((unsigned long)iomem_resource.end,
> @@ -1203,16 +1182,12 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops,
>  
>  		devmem->resource = devm_request_mem_region(device, addr, size,
>  							   dev_name(device));
> -		if (!devmem->resource) {
> -			ret = -ENOMEM;
> -			goto error_no_resource;
> -		}
> +		if (!devmem->resource)
> +			return ERR_PTR(-ENOMEM);
>  		break;
>  	}
> -	if (!devmem->resource) {
> -		ret = -ERANGE;
> -		goto error_no_resource;
> -	}
> +	if (!devmem->resource)
> +		return ERR_PTR(-ERANGE);
>  
>  	devmem->resource->desc = IORES_DESC_DEVICE_PRIVATE_MEMORY;
>  	devmem->pfn_first = devmem->resource->start >> PAGE_SHIFT;
> @@ -1221,28 +1196,13 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops,
>  
>  	ret = hmm_devmem_pages_create(devmem);
>  	if (ret)
> -		goto error_pages;
> -
> -	devres_add(device, devmem);
> +		return ERR_PTR(ret);
>  
> -	ret = devm_add_action(device, hmm_devmem_ref_kill, &devmem->ref);
> -	if (ret) {
> -		hmm_devmem_remove(devmem);
> +	ret = devm_add_action_or_reset(device, hmm_devmem_release, devmem);
> +	if (ret)
>  		return ERR_PTR(ret);
> -	}
>  
>  	return devmem;
> -
> -error_pages:
> -	devm_release_mem_region(device, devmem->resource->start,
> -				resource_size(devmem->resource));
> -error_no_resource:
> -error_devm_add_action:
> -	hmm_devmem_ref_kill(&devmem->ref);
> -	hmm_devmem_ref_exit(&devmem->ref);
> -error_percpu_ref:
> -	devres_free(devmem);
> -	return ERR_PTR(ret);
>  }
>  EXPORT_SYMBOL(hmm_devmem_add);
>  
> @@ -1258,8 +1218,7 @@ struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops,
>  
>  	dev_pagemap_get_ops();
>  
> -	devmem = devres_alloc_node(&hmm_devmem_release, sizeof(*devmem),
> -				   GFP_KERNEL, dev_to_node(device));
> +	devmem = devm_kzalloc(device, sizeof(*devmem), GFP_KERNEL);
>  	if (!devmem)
>  		return ERR_PTR(-ENOMEM);
>  
> @@ -1273,12 +1232,12 @@ struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops,
>  	ret = percpu_ref_init(&devmem->ref, &hmm_devmem_ref_release,
>  			      0, GFP_KERNEL);
>  	if (ret)
> -		goto error_percpu_ref;
> +		return ERR_PTR(ret);
>  
> -	ret = devm_add_action(device, hmm_devmem_ref_exit, &devmem->ref);
> +	ret = devm_add_action_or_reset(device, hmm_devmem_ref_exit,
> +			&devmem->ref);
>  	if (ret)
> -		goto error_devm_add_action;
> -
> +		return ERR_PTR(ret);
>  
>  	devmem->pfn_first = devmem->resource->start >> PAGE_SHIFT;
>  	devmem->pfn_last = devmem->pfn_first +
> @@ -1286,59 +1245,21 @@ struct hmm_devmem *hmm_devmem_add_resource(const struct hmm_devmem_ops *ops,
>  
>  	ret = hmm_devmem_pages_create(devmem);
>  	if (ret)
> -		goto error_devm_add_action;
> +		return ERR_PTR(ret);
>  
> -	devres_add(device, devmem);
> +	ret = devm_add_action_or_reset(device, hmm_devmem_release, devmem);
> +	if (ret)
> +		return ERR_PTR(ret);
>  
> -	ret = devm_add_action(device, hmm_devmem_ref_kill, &devmem->ref);
> -	if (ret) {
> -		hmm_devmem_remove(devmem);
> +	ret = devm_add_action_or_reset(device, hmm_devmem_ref_kill,
> +			&devmem->ref);
> +	if (ret)
>  		return ERR_PTR(ret);
> -	}
>  
>  	return devmem;
> -
> -error_devm_add_action:
> -	hmm_devmem_ref_kill(&devmem->ref);
> -	hmm_devmem_ref_exit(&devmem->ref);
> -error_percpu_ref:
> -	devres_free(devmem);
> -	return ERR_PTR(ret);
>  }
>  EXPORT_SYMBOL(hmm_devmem_add_resource);
>  
> -/*
> - * hmm_devmem_remove() - remove device memory (kill and free ZONE_DEVICE)
> - *
> - * @devmem: hmm_devmem struct use to track and manage the ZONE_DEVICE memory
> - *
> - * This will hot-unplug memory that was hotplugged by hmm_devmem_add on behalf
> - * of the device driver. It will free struct page and remove the resource that
> - * reserved the physical address range for this device memory.
> - */
> -void hmm_devmem_remove(struct hmm_devmem *devmem)
> -{
> -	resource_size_t start, size;
> -	struct device *device;
> -	bool cdm = false;
> -
> -	if (!devmem)
> -		return;
> -
> -	device = devmem->device;
> -	start = devmem->resource->start;
> -	size = resource_size(devmem->resource);
> -
> -	cdm = devmem->resource->desc == IORES_DESC_DEVICE_PUBLIC_MEMORY;
> -	hmm_devmem_ref_kill(&devmem->ref);
> -	hmm_devmem_ref_exit(&devmem->ref);
> -	hmm_devmem_pages_remove(devmem);
> -
> -	if (!cdm)
> -		devm_release_mem_region(device, start, size);
> -}
> -EXPORT_SYMBOL(hmm_devmem_remove);
> -
>  /*
>   * A device driver that wants to handle multiple devices memory through a
>   * single fake device can use hmm_device to do so. This is purely a helper
> 

  parent reply	other threads:[~2018-09-18 20:35 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-13  2:22 [PATCH v5 0/7] mm: Merge hmm into devm_memremap_pages, mark GPL-only Dan Williams
2018-09-13  2:22 ` [PATCH v5 1/7] mm, devm_memremap_pages: Mark devm_memremap_pages() EXPORT_SYMBOL_GPL Dan Williams
2018-09-13  2:22   ` Dan Williams
2018-09-13 16:25   ` Logan Gunthorpe
2018-09-13 16:25     ` Logan Gunthorpe
2018-09-13  2:22 ` [PATCH v5 2/7] mm, devm_memremap_pages: Kill mapping "System RAM" support Dan Williams
2018-09-13  2:22   ` Dan Williams
2018-09-13 16:10   ` Logan Gunthorpe
2018-09-13 16:10     ` Logan Gunthorpe
2018-09-14 13:14   ` Christoph Hellwig
2018-09-14 17:40     ` Dan Williams
2018-09-18 20:28   ` Jerome Glisse
2018-09-18 20:28     ` Jerome Glisse
2018-09-13  2:22 ` [PATCH v5 3/7] mm, devm_memremap_pages: Fix shutdown handling Dan Williams
2018-09-13  2:22   ` Dan Williams
2018-09-14 13:16   ` Christoph Hellwig
2018-09-14 17:25     ` Dan Williams
2018-09-18 20:28   ` Jerome Glisse
2018-09-18 20:28     ` Jerome Glisse
2018-09-18 20:28     ` Jerome Glisse
2018-09-13  2:22 ` [PATCH v5 4/7] mm, devm_memremap_pages: Add MEMORY_DEVICE_PRIVATE support Dan Williams
2018-09-13  2:22   ` Dan Williams
2018-09-14 13:18   ` Christoph Hellwig
2018-09-18 20:34   ` Jerome Glisse
2018-09-18 20:34     ` Jerome Glisse
2018-09-13  2:22 ` [PATCH v5 5/7] mm, hmm: Use devm semantics for hmm_devmem_{add, remove} Dan Williams
2018-09-13  2:22   ` Dan Williams
2018-09-14 13:18   ` Christoph Hellwig
2018-09-14 14:16     ` Jerome Glisse
2018-09-14 14:16       ` Jerome Glisse
2018-09-18 20:34   ` Jerome Glisse [this message]
2018-09-18 20:34     ` Jerome Glisse
2018-09-13  2:22 ` [PATCH v5 6/7] mm, hmm: Replace hmm_devmem_pages_create() with devm_memremap_pages() Dan Williams
2018-09-13  2:22   ` Dan Williams
2018-09-18 20:35   ` Jerome Glisse
2018-09-18 20:35     ` Jerome Glisse
2018-09-19  1:24   ` Balbir Singh
2018-09-19  1:24     ` Balbir Singh
2018-09-13  2:22 ` [PATCH v5 7/7] mm, hmm: Mark hmm_devmem_{add, add_resource} EXPORT_SYMBOL_GPL Dan Williams
2018-09-13  2:22   ` Dan Williams

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180918203457.GE14689@redhat.com \
    --to=jglisse@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=alexander.h.duyck@intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=hch@lst.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=logang@deltatee.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.