cxl: Add timeout to process element commands
authorIan Munsie <imunsie@au1.ibm.com>
Mon, 8 Dec 2014 08:17:56 +0000 (19:17 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 12 Dec 2014 02:06:47 +0000 (13:06 +1100)
In the event that something goes wrong in the hardware and it is unable
to complete a process element comment we would end up polling forever,
effectively making the associated process unkillable.

This patch adds a timeout to the process element command code path, so
that we will give up if the hardware does not respond in a reasonable
time.

Cc: stable@vger.kernel.org
Signed-off-by: Ian Munsie <imunsie@au1.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
drivers/misc/cxl/native.c

index 1001cf49af94265cc2c74abd5979dee2c1bd6095..f2b37b41a0da6e0b41fc7cbc8d1b02471ecf7fe7 100644 (file)
@@ -277,6 +277,7 @@ static int do_process_element_cmd(struct cxl_context *ctx,
                                  u64 cmd, u64 pe_state)
 {
        u64 state;
+       unsigned long timeout = jiffies + (HZ * CXL_TIMEOUT);
 
        WARN_ON(!ctx->afu->enabled);
 
@@ -286,6 +287,10 @@ static int do_process_element_cmd(struct cxl_context *ctx,
        smp_mb();
        cxl_p1n_write(ctx->afu, CXL_PSL_LLCMD_An, cmd | ctx->pe);
        while (1) {
+               if (time_after_eq(jiffies, timeout)) {
+                       dev_warn(&ctx->afu->dev, "WARNING: Process Element Command timed out!\n");
+                       return -EBUSY;
+               }
                state = be64_to_cpup(ctx->afu->sw_command_status);
                if (state == ~0ULL) {
                        pr_err("cxl: Error adding process element to AFU\n");