All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kurz <groug@kaod.org>
To: "Alastair D'Silva" <alastair@au1.ibm.com>
Cc: Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	linux-kernel@vger.kernel.org,
	Andrew Donnellan <andrew.donnellan@au1.ibm.com>,
	Alastair D'Silva <alastair@d-silva.org>,
	Frederic Barrat <fbarrat@linux.ibm.com>,
	linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH 6/7] ocxl: afu_irq only deals with IRQ IDs, not offsets
Date: Fri, 15 Mar 2019 14:56:39 +0100	[thread overview]
Message-ID: <20190315145639.4ae9e257@bahia.lab.toulouse-stg.fr.ibm.com> (raw)
In-Reply-To: <20190313041524.14644-7-alastair@au1.ibm.com>

On Wed, 13 Mar 2019 15:15:21 +1100
"Alastair D'Silva" <alastair@au1.ibm.com> wrote:

> From: Alastair D'Silva <alastair@d-silva.org>
> 
> The use of offsets is required only in the frontend, so alter
> the IRQ API to only work with IRQ IDs in the backend.
> 
> Signed-off-by: Alastair D'Silva <alastair@d-silva.org>
> ---
>  drivers/misc/ocxl/afu_irq.c       | 31 +++++++++++++------------------
>  drivers/misc/ocxl/context.c       |  7 +++++--
>  drivers/misc/ocxl/file.c          | 13 ++++++++-----
>  drivers/misc/ocxl/ocxl_internal.h | 10 ++++++----
>  drivers/misc/ocxl/trace.h         | 12 ++++--------
>  5 files changed, 36 insertions(+), 37 deletions(-)
> 
> diff --git a/drivers/misc/ocxl/afu_irq.c b/drivers/misc/ocxl/afu_irq.c
> index 11ab996657a2..1885c472df58 100644
> --- a/drivers/misc/ocxl/afu_irq.c
> +++ b/drivers/misc/ocxl/afu_irq.c
> @@ -14,14 +14,14 @@ struct afu_irq {
>  	struct eventfd_ctx *ev_ctx;
>  };
>  
> -static int irq_offset_to_id(struct ocxl_context *ctx, u64 offset)
> +int ocxl_irq_offset_to_id(struct ocxl_context *ctx, u64 offset)
>  {
>  	return (offset - ctx->afu->irq_base_offset) >> PAGE_SHIFT;
>  }
>  
> -static u64 irq_id_to_offset(struct ocxl_context *ctx, int id)
> +u64 ocxl_irq_id_to_offset(struct ocxl_context *ctx, int irq_id)
>  {
> -	return ctx->afu->irq_base_offset + (id << PAGE_SHIFT);
> +	return ctx->afu->irq_base_offset + (irq_id << PAGE_SHIFT);
>  }
>  
>  static irqreturn_t afu_irq_handler(int virq, void *data)
> @@ -69,7 +69,7 @@ static void release_afu_irq(struct afu_irq *irq)
>  	kfree(irq->name);
>  }
>  
> -int ocxl_afu_irq_alloc(struct ocxl_context *ctx, u64 *irq_offset)
> +int ocxl_afu_irq_alloc(struct ocxl_context *ctx, int *irq_id)
>  {
>  	struct afu_irq *irq;
>  	int rc;
> @@ -101,10 +101,7 @@ int ocxl_afu_irq_alloc(struct ocxl_context *ctx, u64 *irq_offset)
>  	if (rc)
>  		goto err_alloc;
>  
> -	*irq_offset = irq_id_to_offset(ctx, irq->id);

This should be replaced by:

	*irq_id = irq->id;

> -
> -	trace_ocxl_afu_irq_alloc(ctx->pasid, irq->id, irq->virq, irq->hw_irq,
> -				*irq_offset);
> +	trace_ocxl_afu_irq_alloc(ctx->pasid, irq->id, irq->virq, irq->hw_irq);
>  	mutex_unlock(&ctx->irq_lock);
>  	return 0;
>  
> @@ -123,7 +120,7 @@ static void afu_irq_free(struct afu_irq *irq, struct ocxl_context *ctx)
>  	trace_ocxl_afu_irq_free(ctx->pasid, irq->id);
>  	if (ctx->mapping)
>  		unmap_mapping_range(ctx->mapping,
> -				irq_id_to_offset(ctx, irq->id),
> +				ocxl_irq_id_to_offset(ctx, irq->id),
>  				1 << PAGE_SHIFT, 1);
>  	release_afu_irq(irq);
>  	if (irq->ev_ctx)
> @@ -132,14 +129,13 @@ static void afu_irq_free(struct afu_irq *irq, struct ocxl_context *ctx)
>  	kfree(irq);
>  }
>  
> -int ocxl_afu_irq_free(struct ocxl_context *ctx, u64 irq_offset)
> +int ocxl_afu_irq_free(struct ocxl_context *ctx, int irq_id)
>  {
>  	struct afu_irq *irq;
> -	int id = irq_offset_to_id(ctx, irq_offset);
>  
>  	mutex_lock(&ctx->irq_lock);
>  
> -	irq = idr_find(&ctx->irq_idr, id);
> +	irq = idr_find(&ctx->irq_idr, irq_id);
>  	if (!irq) {
>  		mutex_unlock(&ctx->irq_lock);
>  		return -EINVAL;
> @@ -161,14 +157,14 @@ void ocxl_afu_irq_free_all(struct ocxl_context *ctx)
>  	mutex_unlock(&ctx->irq_lock);
>  }
>  
> -int ocxl_afu_irq_set_fd(struct ocxl_context *ctx, u64 irq_offset, int eventfd)
> +int ocxl_afu_irq_set_fd(struct ocxl_context *ctx, int irq_id, int eventfd)
>  {
>  	struct afu_irq *irq;
>  	struct eventfd_ctx *ev_ctx;
> -	int rc = 0, id = irq_offset_to_id(ctx, irq_offset);
> +	int rc = 0;
>  
>  	mutex_lock(&ctx->irq_lock);
> -	irq = idr_find(&ctx->irq_idr, id);
> +	irq = idr_find(&ctx->irq_idr, irq_id);
>  	if (!irq) {
>  		rc = -EINVAL;
>  		goto unlock;
> @@ -186,14 +182,13 @@ int ocxl_afu_irq_set_fd(struct ocxl_context *ctx, u64 irq_offset, int eventfd)
>  	return rc;
>  }
>  
> -u64 ocxl_afu_irq_get_addr(struct ocxl_context *ctx, u64 irq_offset)
> +u64 ocxl_afu_irq_get_addr(struct ocxl_context *ctx, int irq_id)
>  {
>  	struct afu_irq *irq;
> -	int id = irq_offset_to_id(ctx, irq_offset);
>  	u64 addr = 0;
>  
>  	mutex_lock(&ctx->irq_lock);
> -	irq = idr_find(&ctx->irq_idr, id);
> +	irq = idr_find(&ctx->irq_idr, irq_id);
>  	if (irq)
>  		addr = irq->trigger_page;
>  	mutex_unlock(&ctx->irq_lock);
> diff --git a/drivers/misc/ocxl/context.c b/drivers/misc/ocxl/context.c
> index 9a37e9632cd9..c04887591837 100644
> --- a/drivers/misc/ocxl/context.c
> +++ b/drivers/misc/ocxl/context.c
> @@ -93,8 +93,9 @@ static vm_fault_t map_afu_irq(struct vm_area_struct *vma, unsigned long address,
>  		u64 offset, struct ocxl_context *ctx)
>  {
>  	u64 trigger_addr;
> +	int irq_id = ocxl_irq_offset_to_id(ctx, offset);
>  
> -	trigger_addr = ocxl_afu_irq_get_addr(ctx, offset);
> +	trigger_addr = ocxl_afu_irq_get_addr(ctx, irq_id);
>  	if (!trigger_addr)
>  		return VM_FAULT_SIGBUS;
>  
> @@ -154,12 +155,14 @@ static const struct vm_operations_struct ocxl_vmops = {
>  static int check_mmap_afu_irq(struct ocxl_context *ctx,
>  			struct vm_area_struct *vma)
>  {
> +	int irq_id = ocxl_irq_offset_to_id(ctx, vma->vm_pgoff << PAGE_SHIFT);
> +
>  	/* only one page */
>  	if (vma_pages(vma) != 1)
>  		return -EINVAL;
>  
>  	/* check offset validty */
> -	if (!ocxl_afu_irq_get_addr(ctx, vma->vm_pgoff << PAGE_SHIFT))
> +	if (!ocxl_afu_irq_get_addr(ctx, irq_id))
>  		return -EINVAL;
>  
>  	/*
> diff --git a/drivers/misc/ocxl/file.c b/drivers/misc/ocxl/file.c
> index 424bb0b40afb..d28618c161de 100644
> --- a/drivers/misc/ocxl/file.c
> +++ b/drivers/misc/ocxl/file.c
> @@ -197,6 +197,7 @@ static long afu_ioctl(struct file *file, unsigned int cmd,
>  {
>  	struct ocxl_context *ctx = file->private_data;
>  	struct ocxl_ioctl_irq_fd irq_fd;
> +	int irq_id;
>  	u64 irq_offset;
>  	long rc;
>  	bool closed;
> @@ -218,12 +219,13 @@ static long afu_ioctl(struct file *file, unsigned int cmd,
>  		break;
>  
>  	case OCXL_IOCTL_IRQ_ALLOC:
> -		rc = ocxl_afu_irq_alloc(ctx, &irq_offset);
> +		rc = ocxl_afu_irq_alloc(ctx, &irq_id);
>  		if (!rc) {
> +			irq_offset = ocxl_irq_id_to_offset(ctx, irq_id);
>  			rc = copy_to_user((u64 __user *) args, &irq_offset,
>  					sizeof(irq_offset));
>  			if (rc) {
> -				ocxl_afu_irq_free(ctx, irq_offset);
> +				ocxl_afu_irq_free(ctx, irq_id);
>  				return -EFAULT;
>  			}
>  		}
> @@ -234,7 +236,8 @@ static long afu_ioctl(struct file *file, unsigned int cmd,
>  				sizeof(irq_offset));
>  		if (rc)
>  			return -EFAULT;
> -		rc = ocxl_afu_irq_free(ctx, irq_offset);
> +		irq_id = ocxl_irq_offset_to_id(ctx, irq_offset);
> +		rc = ocxl_afu_irq_free(ctx, irq_id);
>  		break;
>  
>  	case OCXL_IOCTL_IRQ_SET_FD:
> @@ -244,8 +247,8 @@ static long afu_ioctl(struct file *file, unsigned int cmd,
>  			return -EFAULT;
>  		if (irq_fd.reserved)
>  			return -EINVAL;
> -		rc = ocxl_afu_irq_set_fd(ctx, irq_fd.irq_offset,
> -					irq_fd.eventfd);
> +		irq_id = ocxl_irq_offset_to_id(ctx, irq_fd.irq_offset);
> +		rc = ocxl_afu_irq_set_fd(ctx, irq_id, irq_fd.eventfd);
>  		break;
>  
>  	case OCXL_IOCTL_GET_METADATA:
> diff --git a/drivers/misc/ocxl/ocxl_internal.h b/drivers/misc/ocxl/ocxl_internal.h
> index 4fc7e9597ede..871155b464da 100644
> --- a/drivers/misc/ocxl/ocxl_internal.h
> +++ b/drivers/misc/ocxl/ocxl_internal.h
> @@ -140,12 +140,14 @@ void ocxl_context_detach_all(struct ocxl_afu *afu);
>  int ocxl_sysfs_register_afu(struct ocxl_afu *afu);
>  void ocxl_sysfs_unregister_afu(struct ocxl_afu *afu);
>  
> -int ocxl_afu_irq_alloc(struct ocxl_context *ctx, u64 *irq_offset);
> -int ocxl_afu_irq_free(struct ocxl_context *ctx, u64 irq_offset);
> +int ocxl_irq_offset_to_id(struct ocxl_context *ctx, u64 offset);
> +u64 ocxl_irq_id_to_offset(struct ocxl_context *ctx, int irq_id);
> +int ocxl_afu_irq_alloc(struct ocxl_context *ctx, int *irq_id);
> +int ocxl_afu_irq_free(struct ocxl_context *ctx, int irq_id);
>  void ocxl_afu_irq_free_all(struct ocxl_context *ctx);
> -int ocxl_afu_irq_set_fd(struct ocxl_context *ctx, u64 irq_offset,
> +int ocxl_afu_irq_set_fd(struct ocxl_context *ctx, int irq_id,
>  			int eventfd);
> -u64 ocxl_afu_irq_get_addr(struct ocxl_context *ctx, u64 irq_offset);
> +u64 ocxl_afu_irq_get_addr(struct ocxl_context *ctx, int irq_id);
>  
>  /**
>   * Free an AFU
> diff --git a/drivers/misc/ocxl/trace.h b/drivers/misc/ocxl/trace.h
> index 68bf2f173a1a..a081e644f5f3 100644
> --- a/drivers/misc/ocxl/trace.h
> +++ b/drivers/misc/ocxl/trace.h
> @@ -107,16 +107,14 @@ DEFINE_EVENT(ocxl_fault_handler, ocxl_fault_ack,
>  );
>  
>  TRACE_EVENT(ocxl_afu_irq_alloc,
> -	TP_PROTO(int pasid, int irq_id, unsigned int virq, int hw_irq,
> -		u64 irq_offset),
> -	TP_ARGS(pasid, irq_id, virq, hw_irq, irq_offset),
> +	TP_PROTO(int pasid, int irq_id, unsigned int virq, int hw_irq),
> +	TP_ARGS(pasid, irq_id, virq, hw_irq),
>  
>  	TP_STRUCT__entry(
>  		__field(int, pasid)
>  		__field(int, irq_id)
>  		__field(unsigned int, virq)
>  		__field(int, hw_irq)
> -		__field(u64, irq_offset)
>  	),
>  
>  	TP_fast_assign(
> @@ -124,15 +122,13 @@ TRACE_EVENT(ocxl_afu_irq_alloc,
>  		__entry->irq_id = irq_id;
>  		__entry->virq = virq;
>  		__entry->hw_irq = hw_irq;
> -		__entry->irq_offset = irq_offset;
>  	),
>  
> -	TP_printk("pasid=%#x irq_id=%d virq=%u hw_irq=%d irq_offset=%#llx",
> +	TP_printk("pasid=%#x irq_id=%d virq=%u hw_irq=%d",
>  		__entry->pasid,
>  		__entry->irq_id,
>  		__entry->virq,
> -		__entry->hw_irq,
> -		__entry->irq_offset
> +		__entry->hw_irq
>  	)
>  );
>  


  reply	other threads:[~2019-03-15 14:02 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-13  4:15 [PATCH 0/7] Refactor OCXL driver to allow external drivers to use it Alastair D'Silva
2019-03-13  4:15 ` Alastair D'Silva
2019-03-13  4:15 ` [PATCH 1/7] ocxl: Provide global MMIO accessors for external drivers Alastair D'Silva
2019-03-13  4:15   ` Alastair D'Silva
2019-03-13 18:06   ` Frederic Barrat
2019-03-13 18:06     ` Frederic Barrat
2019-03-15  4:11   ` Andrew Donnellan
2019-03-15  4:11     ` Andrew Donnellan
2019-03-13  4:15 ` [PATCH 2/7] ocxl: Allow external drivers to use OpenCAPI contexts Alastair D'Silva
2019-03-13  4:15   ` Alastair D'Silva
2019-03-13 18:20   ` Frederic Barrat
2019-03-13 18:20     ` Frederic Barrat
2019-03-13  4:15 ` [PATCH 3/7] ocxl: Split pci.c Alastair D'Silva
2019-03-13  4:15   ` Alastair D'Silva
2019-03-14 16:48   ` Frederic Barrat
2019-03-13  4:15 ` [PATCH 4/7] ocxl: Don't pass pci_dev around Alastair D'Silva
2019-03-13  4:15   ` Alastair D'Silva
2019-03-14 17:00   ` Frederic Barrat
2019-03-14 17:00     ` Frederic Barrat
2019-03-15  3:32   ` Andrew Donnellan
2019-03-15  3:32     ` Andrew Donnellan
2019-03-13  4:15 ` [PATCH 5/7] ocxl: Create a clear delineation between ocxl backend & frontend Alastair D'Silva
2019-03-13  4:15   ` Alastair D'Silva
2019-03-14 16:27   ` Frederic Barrat
2019-03-14 16:27     ` Frederic Barrat
2019-03-13  4:15 ` [PATCH 6/7] ocxl: afu_irq only deals with IRQ IDs, not offsets Alastair D'Silva
2019-03-13  4:15   ` Alastair D'Silva
2019-03-15 13:56   ` Greg Kurz [this message]
2019-03-20  0:28     ` Alastair D'Silva
2019-03-13  4:15 ` [PATCH 7/7] ocxl: move event_fd handling to frontend Alastair D'Silva
2019-03-13  4:15   ` Alastair D'Silva
2019-03-20  5:08 ` [PATCH v2 0/7] Refactor OCXL driver to allow external drivers to use it Alastair D'Silva
2019-03-20  5:08   ` Alastair D'Silva
2019-03-20  5:08   ` [PATCH v2 1/7] ocxl: Split pci.c Alastair D'Silva
2019-03-20  5:08     ` Alastair D'Silva
2019-03-20  5:08   ` [PATCH v2 2/7] ocxl: Don't pass pci_dev around Alastair D'Silva
2019-03-20  5:08     ` Alastair D'Silva
2019-03-20  5:08   ` [PATCH v2 3/7] ocxl: Create a clear delineation between ocxl backend & frontend Alastair D'Silva
2019-03-20  5:08     ` Alastair D'Silva
2019-03-22 17:38     ` Frederic Barrat
2019-03-22 17:38       ` Frederic Barrat
2019-03-20  5:08   ` [PATCH v2 4/7] ocxl: Allow external drivers to use OpenCAPI contexts Alastair D'Silva
2019-03-20  5:08     ` Alastair D'Silva
2019-03-20  5:08   ` [PATCH v2 5/7] ocxl: afu_irq only deals with IRQ IDs, not offsets Alastair D'Silva
2019-03-20  5:08     ` Alastair D'Silva
2019-03-20  5:08   ` [PATCH v2 6/7] ocxl: move event_fd handling to frontend Alastair D'Silva
2019-03-20  5:08     ` Alastair D'Silva
2019-03-20  5:08   ` [PATCH v2 7/7] ocxl: Provide global MMIO accessors for external drivers Alastair D'Silva
2019-03-20  5:08     ` Alastair D'Silva

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=20190315145639.4ae9e257@bahia.lab.toulouse-stg.fr.ibm.com \
    --to=groug@kaod.org \
    --cc=alastair@au1.ibm.com \
    --cc=alastair@d-silva.org \
    --cc=andrew.donnellan@au1.ibm.com \
    --cc=arnd@arndb.de \
    --cc=fbarrat@linux.ibm.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    /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.