Commit 58fd0f3b authored by Logan Gunthorpe's avatar Logan Gunthorpe Committed by Jon Mason

ntb_perf: Return results by reading the run file

Instead of having to watch logs, allow the results to be retrieved
by reading back the run file. This file will return "running" when
the test is running and nothing if no tests have been run yet.
It returns 1 line per thread, and will display an error message if the
corresponding thread returns an error.

With the above change, the pr_info calls that returned the results are
then changed to pr_debug calls.
Signed-off-by: default avatarLogan Gunthorpe <logang@deltatee.com>
Acked-by: default avatarDave Jiang <dave.jiang@intel.com>
Signed-off-by: default avatarJon Mason <jdmason@kudzu.us>
parent da573eaa
...@@ -123,6 +123,9 @@ struct pthr_ctx { ...@@ -123,6 +123,9 @@ struct pthr_ctx {
int src_idx; int src_idx;
void *srcs[MAX_SRCS]; void *srcs[MAX_SRCS];
wait_queue_head_t *wq; wait_queue_head_t *wq;
int status;
u64 copied;
u64 diff_us;
}; };
struct perf_ctx { struct perf_ctx {
...@@ -305,7 +308,7 @@ static int perf_move_data(struct pthr_ctx *pctx, char __iomem *dst, char *src, ...@@ -305,7 +308,7 @@ static int perf_move_data(struct pthr_ctx *pctx, char __iomem *dst, char *src,
} }
if (use_dma) { if (use_dma) {
pr_info("%s: All DMA descriptors submitted\n", current->comm); pr_debug("%s: All DMA descriptors submitted\n", current->comm);
while (atomic_read(&pctx->dma_sync) != 0) { while (atomic_read(&pctx->dma_sync) != 0) {
if (kthread_should_stop()) if (kthread_should_stop())
break; break;
...@@ -317,13 +320,16 @@ static int perf_move_data(struct pthr_ctx *pctx, char __iomem *dst, char *src, ...@@ -317,13 +320,16 @@ static int perf_move_data(struct pthr_ctx *pctx, char __iomem *dst, char *src,
kdiff = ktime_sub(kstop, kstart); kdiff = ktime_sub(kstop, kstart);
diff_us = ktime_to_us(kdiff); diff_us = ktime_to_us(kdiff);
pr_info("%s: copied %llu bytes\n", current->comm, copied); pr_debug("%s: copied %llu bytes\n", current->comm, copied);
pr_info("%s: lasted %llu usecs\n", current->comm, diff_us); pr_debug("%s: lasted %llu usecs\n", current->comm, diff_us);
perf = div64_u64(copied, diff_us); perf = div64_u64(copied, diff_us);
pr_info("%s: MBytes/s: %llu\n", current->comm, perf); pr_debug("%s: MBytes/s: %llu\n", current->comm, perf);
pctx->copied = copied;
pctx->diff_us = diff_us;
return 0; return 0;
} }
...@@ -345,7 +351,7 @@ static int ntb_perf_thread(void *data) ...@@ -345,7 +351,7 @@ static int ntb_perf_thread(void *data)
int rc, node, i; int rc, node, i;
struct dma_chan *dma_chan = NULL; struct dma_chan *dma_chan = NULL;
pr_info("kthread %s starting...\n", current->comm); pr_debug("kthread %s starting...\n", current->comm);
node = dev_to_node(&pdev->dev); node = dev_to_node(&pdev->dev);
...@@ -575,19 +581,44 @@ static ssize_t debugfs_run_read(struct file *filp, char __user *ubuf, ...@@ -575,19 +581,44 @@ static ssize_t debugfs_run_read(struct file *filp, char __user *ubuf,
{ {
struct perf_ctx *perf = filp->private_data; struct perf_ctx *perf = filp->private_data;
char *buf; char *buf;
ssize_t ret, out_offset; ssize_t ret, out_off = 0;
int running; struct pthr_ctx *pctx;
int i;
u64 rate;
if (!perf) if (!perf)
return 0; return 0;
buf = kmalloc(64, GFP_KERNEL); buf = kmalloc(1024, GFP_KERNEL);
if (!buf) if (!buf)
return -ENOMEM; return -ENOMEM;
running = mutex_is_locked(&perf->run_mutex); if (mutex_is_locked(&perf->run_mutex)) {
out_offset = snprintf(buf, 64, "%d\n", running); out_off = snprintf(buf, 64, "running\n");
ret = simple_read_from_buffer(ubuf, count, offp, buf, out_offset); goto read_from_buf;
}
for (i = 0; i < MAX_THREADS; i++) {
pctx = &perf->pthr_ctx[i];
if (pctx->status == -ENODATA)
break;
if (pctx->status) {
out_off += snprintf(buf + out_off, 1024 - out_off,
"%d: error %d\n", i,
pctx->status);
continue;
}
rate = div64_u64(pctx->copied, pctx->diff_us);
out_off += snprintf(buf + out_off, 1024 - out_off,
"%d: copied %llu bytes in %llu usecs, %llu MBytes/s\n",
i, pctx->copied, pctx->diff_us, rate);
}
read_from_buf:
ret = simple_read_from_buffer(ubuf, count, offp, buf, out_off);
kfree(buf); kfree(buf);
return ret; return ret;
...@@ -601,12 +632,20 @@ static void threads_cleanup(struct perf_ctx *perf) ...@@ -601,12 +632,20 @@ static void threads_cleanup(struct perf_ctx *perf)
for (i = 0; i < MAX_THREADS; i++) { for (i = 0; i < MAX_THREADS; i++) {
pctx = &perf->pthr_ctx[i]; pctx = &perf->pthr_ctx[i];
if (pctx->thread) { if (pctx->thread) {
kthread_stop(pctx->thread); pctx->status = kthread_stop(pctx->thread);
pctx->thread = NULL; pctx->thread = NULL;
} }
} }
} }
static void perf_clear_thread_status(struct perf_ctx *perf)
{
int i;
for (i = 0; i < MAX_THREADS; i++)
perf->pthr_ctx[i].status = -ENODATA;
}
static ssize_t debugfs_run_write(struct file *filp, const char __user *ubuf, static ssize_t debugfs_run_write(struct file *filp, const char __user *ubuf,
size_t count, loff_t *offp) size_t count, loff_t *offp)
{ {
...@@ -623,6 +662,8 @@ static ssize_t debugfs_run_write(struct file *filp, const char __user *ubuf, ...@@ -623,6 +662,8 @@ static ssize_t debugfs_run_write(struct file *filp, const char __user *ubuf,
if (!mutex_trylock(&perf->run_mutex)) if (!mutex_trylock(&perf->run_mutex))
return -EBUSY; return -EBUSY;
perf_clear_thread_status(perf);
if (perf->perf_threads > MAX_THREADS) { if (perf->perf_threads > MAX_THREADS) {
perf->perf_threads = MAX_THREADS; perf->perf_threads = MAX_THREADS;
pr_info("Reset total threads to: %u\n", MAX_THREADS); pr_info("Reset total threads to: %u\n", MAX_THREADS);
...@@ -757,6 +798,8 @@ static int perf_probe(struct ntb_client *client, struct ntb_dev *ntb) ...@@ -757,6 +798,8 @@ static int perf_probe(struct ntb_client *client, struct ntb_dev *ntb)
if (rc) if (rc)
goto err_ctx; goto err_ctx;
perf_clear_thread_status(perf);
return 0; return 0;
err_ctx: err_ctx:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment