[PATCH linux dev-4.13 06/16] fsi: occ: Add tracepoints
Eddie James
eajames at linux.vnet.ibm.com
Fri Feb 23 07:29:58 AEDT 2018
On 02/19/2018 10:18 PM, Andrew Jeffery wrote:
> The OCC driver uses a workqueue to manage calls through to the SBEFIFO, which
> in turn uses a timer callback to execute FIFO transfers. To ease observation of
> end-to-end interactions e.g. from userspace `cat`ing an OCC hwmon attribute,
> add tracing to book-end SBEFIFO transfers. This provides some perspective on
> the time taken for a single OCC operation to take place.
Acked-by: Eddie James <eajames at linux.vnet.ibm.com>
>
> Signed-off-by: Andrew Jeffery <andrew at aj.id.au>
> ---
> drivers/fsi/fsi-occ.c | 9 +++++
> include/trace/events/fsi_occ.h | 86 ++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 95 insertions(+)
> create mode 100644 include/trace/events/fsi_occ.h
>
> diff --git a/drivers/fsi/fsi-occ.c b/drivers/fsi/fsi-occ.c
> index 171355023aec..7e47466d5f55 100644
> --- a/drivers/fsi/fsi-occ.c
> +++ b/drivers/fsi/fsi-occ.c
> @@ -30,6 +30,9 @@
> #include <linux/wait.h>
> #include <linux/workqueue.h>
>
> +#define CREATE_TRACE_POINTS
> +#include <trace/events/fsi_occ.h>
> +
> #define OCC_SRAM_BYTES 4096
> #define OCC_CMD_DATA_BYTES 4090
> #define OCC_RESP_DATA_BYTES 4089
> @@ -132,6 +135,8 @@ static int occ_enqueue_xfr(struct occ_xfr *xfr)
>
> spin_unlock_irqrestore(&occ->list_lock, flags);
>
> + trace_occ_enq_xfer(client, xfr);
> +
> if (empty)
> queue_work(occ_wq, &occ->work);
>
> @@ -277,6 +282,7 @@ static ssize_t occ_read_common(struct occ_client *client, char __user *ubuf,
>
> done:
> spin_unlock_irqrestore(&client->lock, flags);
> + trace_occ_read_complete(client, xfr);
> occ_put_client(client);
> return rc;
> }
> @@ -308,6 +314,7 @@ static ssize_t occ_write_common(struct occ_client *client,
> occ_get_client(client);
> xfr = &client->xfr;
>
> + trace_occ_write_begin(client, xfr);
> spin_lock_irqsave(&client->lock, flags);
>
> if (test_bit(CLIENT_XFR_PENDING, &client->flags)) {
> @@ -638,6 +645,7 @@ static void occ_worker(struct work_struct *work)
> set_bit(XFR_IN_PROGRESS, &xfr->flags);
>
> spin_unlock_irqrestore(&occ->list_lock, flags);
> + trace_occ_worker_xfer_begin(client, xfr);
> mutex_lock(&occ->occ_lock);
>
> start = jiffies;
> @@ -700,6 +708,7 @@ static void occ_worker(struct work_struct *work)
> spin_unlock_irqrestore(&occ->list_lock, flags);
>
> wake_up_interruptible(&client->wait);
> + trace_occ_worker_xfer_complete(client, xfr);
> occ_put_client(client);
>
> if (!empty)
> diff --git a/include/trace/events/fsi_occ.h b/include/trace/events/fsi_occ.h
> new file mode 100644
> index 000000000000..89562436de86
> --- /dev/null
> +++ b/include/trace/events/fsi_occ.h
> @@ -0,0 +1,86 @@
> +#undef TRACE_SYSTEM
> +#define TRACE_SYSTEM fsi_occ
> +
> +#if !defined(_TRACE_TIMER_H) || defined(TRACE_HEADER_MULTI_READ)
> +#define _TRACE_OCC_H
> +
> +#include <linux/tracepoint.h>
> +#include <linux/fsi-occ.h>
> +
> +TRACE_EVENT(occ_enq_xfer,
> + TP_PROTO(const void *client, const void *xfer),
> + TP_ARGS(client, xfer),
> + TP_STRUCT__entry(
> + __field(const void *, client)
> + __field(const void *, xfer)
> + ),
> + TP_fast_assign(
> + __entry->client = client;
> + __entry->xfer = xfer;
> + ),
> + TP_printk("Client %p enqueued xfer %p", __entry->client, __entry->xfer)
> +);
> +
> +TRACE_EVENT(occ_read_complete,
> + TP_PROTO(const void *client, const void *xfer),
> + TP_ARGS(client, xfer),
> + TP_STRUCT__entry(
> + __field(const void *, client)
> + __field(const void *, xfer)
> + ),
> + TP_fast_assign(
> + __entry->client = client;
> + __entry->xfer = xfer;
> + ),
> + TP_printk("Client %p completed read for xfer %p",
> + __entry->client, __entry->xfer)
> +);
> +
> +TRACE_EVENT(occ_write_begin,
> + TP_PROTO(const void *client, const void *xfer),
> + TP_ARGS(client, xfer),
> + TP_STRUCT__entry(
> + __field(const void *, client)
> + __field(const void *, xfer)
> + ),
> + TP_fast_assign(
> + __entry->client = client;
> + __entry->xfer = xfer;
> + ),
> + TP_printk("Client %p began write for xfer %p",
> + __entry->client, __entry->xfer)
> +);
> +
> +TRACE_EVENT(occ_worker_xfer_begin,
> + TP_PROTO(const void *client, const void *xfer),
> + TP_ARGS(client, xfer),
> + TP_STRUCT__entry(
> + __field(const void *, client)
> + __field(const void *, xfer)
> + ),
> + TP_fast_assign(
> + __entry->client = client;
> + __entry->xfer = xfer;
> + ),
> + TP_printk("OCC worker began client %p xfer %p",
> + __entry->client, __entry->xfer)
> +);
> +
> +TRACE_EVENT(occ_worker_xfer_complete,
> + TP_PROTO(const void *client, const void *xfer),
> + TP_ARGS(client, xfer),
> + TP_STRUCT__entry(
> + __field(const void *, client)
> + __field(const void *, xfer)
> + ),
> + TP_fast_assign(
> + __entry->client = client;
> + __entry->xfer = xfer;
> + ),
> + TP_printk("OCC worker completed client %p xfer %p",
> + __entry->client, __entry->xfer)
> +);
> +
> +#endif
> +
> +#include <trace/define_trace.h>
More information about the openbmc
mailing list