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 */


Reply via email to