[PATCH V6] cxl: Add support for ASB_Notify on POWER9

Frederic Barrat fbarrat at linux.vnet.ibm.com
Thu Jan 11 00:44:45 AEDT 2018


Hi Christophe,


Couple of comments about file.c, the rest of the patch looks ok to me.


> @@ -193,6 +194,7 @@ static long afu_ioctl_start_work(struct cxl_context *ctx,
>   		amr = work.amr & mfspr(SPRN_UAMOR);
> 
>   	ctx->mmio_err_ff = !!(work.flags & CXL_START_WORK_ERR_FF);
> +	ctx->wflags = work.flags;


I would prefer to add a	boolean "need to allocate a TID" to the context 
instead of saving the full user land flags, that seems more in-line with 
the existing code.


>   	/*
>   	 * Increment the mapped context count for adapter. This also checks
> @@ -263,6 +265,12 @@ static long afu_ioctl_start_work(struct cxl_context *ctx,
>   		goto out;
>   	}
> 
> +	if (work.flags & CXL_START_WORK_TID) {
> +		work.tid = ctx->tidr;
> +		if (copy_to_user(uwork, &work, sizeof(work)))
> +			return -EFAULT;
> +	}
> +

In case of error writing the TID value to user space, we still need to 
release the mutex and mark the context as STARTED.

   Fred


>   	ctx->status = STARTED;
>   	rc = 0;
>   out:
> diff --git a/drivers/misc/cxl/native.c b/drivers/misc/cxl/native.c
> index 02b6b45..0cccf27 100644
> --- a/drivers/misc/cxl/native.c
> +++ b/drivers/misc/cxl/native.c
> @@ -16,6 +16,7 @@
>   #include <linux/uaccess.h>
>   #include <linux/delay.h>
>   #include <asm/synch.h>
> +#include <asm/switch_to.h>
>   #include <misc/cxl-base.h>
> 
>   #include "cxl.h"
> @@ -655,6 +656,7 @@ static void update_ivtes_directed(struct cxl_context *ctx)
>   static int process_element_entry_psl9(struct cxl_context *ctx, u64 wed, u64 amr)
>   {
>   	u32 pid;
> +	int rc;
> 
>   	cxl_assign_psn_space(ctx);
> 
> @@ -673,7 +675,16 @@ static int process_element_entry_psl9(struct cxl_context *ctx, u64 wed, u64 amr)
>   		pid = ctx->mm->context.id;
>   	}
> 
> -	ctx->elem->common.tid = 0;
> +	/* Assign a unique TIDR (thread id) for the current thread */
> +	if (!(ctx->tidr) && (ctx->wflags & CXL_START_WORK_TID)) {
> +		rc = set_thread_tidr(current);
> +		if (rc)
> +			return -ENODEV;
> +		ctx->tidr = current->thread.tidr;
> +		pr_devel("%s: current tidr: %d\n", __func__, ctx->tidr);
> +	}
> +
> +	ctx->elem->common.tid = cpu_to_be32(ctx->tidr);
>   	ctx->elem->common.pid = cpu_to_be32(pid);
> 
>   	ctx->elem->sr = cpu_to_be64(calculate_sr(ctx));
> diff --git a/include/uapi/misc/cxl.h b/include/uapi/misc/cxl.h
> index 49e8fd0..56376d3 100644
> --- a/include/uapi/misc/cxl.h
> +++ b/include/uapi/misc/cxl.h
> @@ -20,20 +20,22 @@ struct cxl_ioctl_start_work {
>   	__u64 work_element_descriptor;
>   	__u64 amr;
>   	__s16 num_interrupts;
> -	__s16 reserved1;
> -	__s32 reserved2;
> +	__u16 tid;
> +	__s32 reserved1;
> +	__u64 reserved2;
>   	__u64 reserved3;
>   	__u64 reserved4;
>   	__u64 reserved5;
> -	__u64 reserved6;
>   };
> 
>   #define CXL_START_WORK_AMR		0x0000000000000001ULL
>   #define CXL_START_WORK_NUM_IRQS		0x0000000000000002ULL
>   #define CXL_START_WORK_ERR_FF		0x0000000000000004ULL
> +#define CXL_START_WORK_TID		0x0000000000000008ULL
>   #define CXL_START_WORK_ALL		(CXL_START_WORK_AMR |\
>   					 CXL_START_WORK_NUM_IRQS |\
> -					 CXL_START_WORK_ERR_FF)
> +					 CXL_START_WORK_ERR_FF |\
> +					 CXL_START_WORK_TID)
> 
> 
>   /* Possible modes that an afu can be in */
> 



More information about the Linuxppc-dev mailing list