From: Doug Ledford <dledford-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: Jubin John <jubin.john-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org,
devel-gWbeCf7V1WCQmaza687I9mD2FQJk+8+b@public.gmane.org,
mike.marciniszyn-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org,
ira.weiny-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org,
Vennila Megavannan
<vennila.megavannan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Subject: Re: [PATCH RESEND v3 5/6] staging/rdma/hfi1: adding per SDMA engine stats to hfistats
Date: Tue, 1 Mar 2016 10:29:43 -0500 [thread overview]
Message-ID: <56D5B567.4040706@redhat.com> (raw)
In-Reply-To: <1452555057-5155-6-git-send-email-jubin.john-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 10936 bytes --]
On 01/11/2016 06:30 PM, Jubin John wrote:
> From: Vennila Megavannan <vennila.megavannan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
>
> Added the following per sdma engine stats:
> - SendDmaDescFetchedCnt
> - software maintained count of SDMA interrupts
> (SDmaInt, SDmaIdleInt, SDmaProgressInt)
> - software maintained counts of SDMA error cases
>
> Reviewed-by: Dennis Dalessandro <dennis.dalessandro-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> Signed-off-by: Mike Marciniszyn <mike.marciniszyn-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> Signed-off-by: Vennila Megavannan <vennila.megavannan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> Signed-off-by: Jubin John <jubin.john-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> ---
> Changes in v2:
> - None
>
> Changes in v3:
> - Refreshed patch against latest staging-next
>
> drivers/staging/rdma/hfi1/chip.c | 110 +++++++++++++++++++++++++++-
> drivers/staging/rdma/hfi1/chip.h | 5 +
> drivers/staging/rdma/hfi1/chip_registers.h | 1 +
> drivers/staging/rdma/hfi1/hfi.h | 1 +
> drivers/staging/rdma/hfi1/sdma.c | 9 ++-
> drivers/staging/rdma/hfi1/sdma.h | 7 ++
> 6 files changed, 129 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/staging/rdma/hfi1/chip.c b/drivers/staging/rdma/hfi1/chip.c
> index 503bfca..f4f720d 100644
> --- a/drivers/staging/rdma/hfi1/chip.c
> +++ b/drivers/staging/rdma/hfi1/chip.c
> @@ -1297,10 +1297,58 @@ static u64 dev_access_u32_csr(const struct cntr_entry *entry,
> void *context, int vl, int mode, u64 data)
> {
> struct hfi1_devdata *dd = context;
> + u64 csr = entry->csr;
>
> - if (vl != CNTR_INVALID_VL)
> - return 0;
> - return read_write_csr(dd, entry->csr, mode, data);
> + if (entry->flags & CNTR_SDMA) {
> + if (vl == CNTR_INVALID_VL)
> + return 0;
> + csr += 0x100 * vl;
> + } else {
> + if (vl != CNTR_INVALID_VL)
> + return 0;
> + }
> + return read_write_csr(dd, csr, mode, data);
> +}
> +
> +static u64 access_sde_err_cnt(const struct cntr_entry *entry,
> + void *context, int idx, int mode, u64 data)
> +{
> + struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
> +
> + if (dd->per_sdma && idx < dd->num_sdma)
> + return dd->per_sdma[idx].err_cnt;
> + return 0;
> +}
> +
> +static u64 access_sde_int_cnt(const struct cntr_entry *entry,
> + void *context, int idx, int mode, u64 data)
> +{
> + struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
> +
> + if (dd->per_sdma && idx < dd->num_sdma)
> + return dd->per_sdma[idx].sdma_int_cnt;
> + return 0;
> +}
> +
> +static u64 access_sde_idle_int_cnt(const struct cntr_entry *entry,
> + void *context, int idx, int mode, u64 data)
> +{
> + struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
> +
> + if (dd->per_sdma && idx < dd->num_sdma)
> + return dd->per_sdma[idx].idle_int_cnt;
> + return 0;
> +}
> +
> +static u64 access_sde_progress_int_cnt(const struct cntr_entry *entry,
> + void *context, int idx, int mode,
> + u64 data)
> +{
> + struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
> +
> + if (dd->per_sdma && idx < dd->num_sdma)
> + return dd->per_sdma[idx].progress_int_cnt;
> + return 0;
> }
>
> static u64 dev_access_u64_csr(const struct cntr_entry *entry, void *context,
> @@ -4070,6 +4118,22 @@ static struct cntr_entry dev_cntrs[DEV_CNTR_LAST] = {
> access_sw_kmem_wait),
> [C_SW_SEND_SCHED] = CNTR_ELEM("SendSched", 0, 0, CNTR_NORMAL,
> access_sw_send_schedule),
> +[C_SDMA_DESC_FETCHED_CNT] = CNTR_ELEM("SDEDscFdCn",
> + SEND_DMA_DESC_FETCHED_CNT, 0,
> + CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
> + dev_access_u32_csr),
> +[C_SDMA_INT_CNT] = CNTR_ELEM("SDMAInt", 0, 0,
> + CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
> + access_sde_int_cnt),
> +[C_SDMA_ERR_CNT] = CNTR_ELEM("SDMAErrCt", 0, 0,
> + CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
> + access_sde_err_cnt),
> +[C_SDMA_IDLE_INT_CNT] = CNTR_ELEM("SDMAIdInt", 0, 0,
> + CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
> + access_sde_idle_int_cnt),
> +[C_SDMA_PROGRESS_INT_CNT] = CNTR_ELEM("SDMAPrIntCn", 0, 0,
> + CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
> + access_sde_progress_int_cnt),
> /* MISC_ERR_STATUS */
> [C_MISC_PLL_LOCK_FAIL_ERR] = CNTR_ELEM("MISC_PLL_LOCK_FAIL_ERR", 0, 0,
> CNTR_NORMAL,
> @@ -5707,6 +5771,7 @@ static void handle_sdma_eng_err(struct hfi1_devdata *dd,
> dd_dev_err(sde->dd, "CONFIG SDMA(%u) source: %u status 0x%llx\n",
> sde->this_idx, source, (unsigned long long)status);
> #endif
> + sde->err_cnt++;
> sdma_engine_error(sde, status);
>
> /*
> @@ -11150,6 +11215,20 @@ u32 hfi1_read_cntrs(struct hfi1_devdata *dd, loff_t pos, char **namep,
> dd->cntrs[entry->offset + j] =
> val;
> }
> + } else if (entry->flags & CNTR_SDMA) {
> + hfi1_cdbg(CNTR,
> + "\t Per SDMA Engine\n");
> + for (j = 0; j < dd->chip_sdma_engines;
> + j++) {
> + val =
> + entry->rw_cntr(entry, dd, j,
> + CNTR_MODE_R, 0);
> + hfi1_cdbg(CNTR,
> + "\t\tRead 0x%llx for %d\n",
> + val, j);
> + dd->cntrs[entry->offset + j] =
> + val;
> + }
> } else {
> val = entry->rw_cntr(entry, dd,
> CNTR_INVALID_VL,
> @@ -11553,6 +11632,21 @@ static int init_cntrs(struct hfi1_devdata *dd)
> dd->ndevcntrs++;
> index++;
> }
> + } else if (dev_cntrs[i].flags & CNTR_SDMA) {
> + hfi1_dbg_early(
> + "\tProcessing per SDE counters chip enginers %u\n",
> + dd->chip_sdma_engines);
> + dev_cntrs[i].offset = index;
> + for (j = 0; j < dd->chip_sdma_engines; j++) {
> + memset(name, '\0', C_MAX_NAME);
> + snprintf(name, C_MAX_NAME, "%s%d",
> + dev_cntrs[i].name, j);
> + sz += strlen(name);
> + sz++;
> + hfi1_dbg_early("\t\t%s\n", name);
> + dd->ndevcntrs++;
> + index++;
> + }
> } else {
> /* +1 for newline */
> sz += strlen(dev_cntrs[i].name) + 1;
> @@ -11594,6 +11688,16 @@ static int init_cntrs(struct hfi1_devdata *dd)
> p += strlen(name);
> *p++ = '\n';
> }
> + } else if (dev_cntrs[i].flags & CNTR_SDMA) {
> + for (j = 0; j < TXE_NUM_SDMA_ENGINES;
> + j++) {
> + memset(name, '\0', C_MAX_NAME);
> + snprintf(name, C_MAX_NAME, "%s%d",
> + dev_cntrs[i].name, j);
> + memcpy(p, name, strlen(name));
> + p += strlen(name);
> + *p++ = '\n';
> + }
> } else {
> memcpy(p, dev_cntrs[i].name,
> strlen(dev_cntrs[i].name));
> diff --git a/drivers/staging/rdma/hfi1/chip.h b/drivers/staging/rdma/hfi1/chip.h
> index 1368a44..b46ef66 100644
> --- a/drivers/staging/rdma/hfi1/chip.h
> +++ b/drivers/staging/rdma/hfi1/chip.h
> @@ -787,6 +787,11 @@ enum {
> C_SW_PIO_WAIT,
> C_SW_KMEM_WAIT,
> C_SW_SEND_SCHED,
> + C_SDMA_DESC_FETCHED_CNT,
> + C_SDMA_INT_CNT,
> + C_SDMA_ERR_CNT,
> + C_SDMA_IDLE_INT_CNT,
> + C_SDMA_PROGRESS_INT_CNT,
> /* MISC_ERR_STATUS */
> C_MISC_PLL_LOCK_FAIL_ERR,
> C_MISC_MBIST_FAIL_ERR,
> diff --git a/drivers/staging/rdma/hfi1/chip_registers.h b/drivers/staging/rdma/hfi1/chip_registers.h
> index 701e9e1..fb36541 100644
> --- a/drivers/staging/rdma/hfi1/chip_registers.h
> +++ b/drivers/staging/rdma/hfi1/chip_registers.h
> @@ -1290,5 +1290,6 @@
> #define CCE_INT_BLOCKED (CCE + 0x000000110C00)
> #define SEND_DMA_IDLE_CNT (TXE + 0x000000200040)
> #define SEND_DMA_DESC_FETCHED_CNT (TXE + 0x000000200058)
> +#define CCE_MSIX_PBA_OFFSET 0X0110000
>
> #endif /* DEF_CHIP_REG */
> diff --git a/drivers/staging/rdma/hfi1/hfi.h b/drivers/staging/rdma/hfi1/hfi.h
> index d4a859f..d32ee84 100644
> --- a/drivers/staging/rdma/hfi1/hfi.h
> +++ b/drivers/staging/rdma/hfi1/hfi.h
> @@ -490,6 +490,7 @@ struct hfi1_sge_state;
> #define CNTR_DISABLED 0x2 /* Disable this counter */
> #define CNTR_32BIT 0x4 /* Simulate 64 bits for this counter */
> #define CNTR_VL 0x8 /* Per VL counter */
> +#define CNTR_SDMA 0x10
> #define CNTR_INVALID_VL -1 /* Specifies invalid VL */
> #define CNTR_MODE_W 0x0
> #define CNTR_MODE_R 0x1
> diff --git a/drivers/staging/rdma/hfi1/sdma.c b/drivers/staging/rdma/hfi1/sdma.c
> index 1d38be5..cb66bd0 100644
> --- a/drivers/staging/rdma/hfi1/sdma.c
> +++ b/drivers/staging/rdma/hfi1/sdma.c
> @@ -1061,7 +1061,6 @@ int sdma_init(struct hfi1_devdata *dd, u8 port)
> sde->desc_avail = sdma_descq_freecnt(sde);
> sde->sdma_shift = ilog2(descq_cnt);
> sde->sdma_mask = (1 << sde->sdma_shift) - 1;
> - sde->descq_full_count = 0;
>
> /* Create a mask for all 3 chip interrupt sources */
> sde->imask = (u64)1 << (0*TXE_NUM_SDMA_ENGINES + this_idx)
> @@ -1073,6 +1072,8 @@ int sdma_init(struct hfi1_devdata *dd, u8 port)
> /* Create a mask specifically for sdma_progress */
> sde->progress_mask =
> (u64)1 << (TXE_NUM_SDMA_ENGINES + this_idx);
> + sde->int_mask =
> + (u64)1 << (0 * TXE_NUM_SDMA_ENGINES + this_idx);
^^^^^^^^^^^^^^^^^^^^^^^^
Why is that there?
> spin_lock_init(&sde->tail_lock);
> seqlock_init(&sde->head_lock);
> spin_lock_init(&sde->senddmactrl_lock);
> @@ -1552,6 +1553,12 @@ void sdma_engine_interrupt(struct sdma_engine *sde, u64 status)
> trace_hfi1_sdma_engine_interrupt(sde, status);
> write_seqlock(&sde->head_lock);
> sdma_set_desc_cnt(sde, sdma_desct_intr);
> + if (status & sde->idle_mask)
> + sde->idle_int_cnt++;
> + else if (status & sde->progress_mask)
> + sde->progress_int_cnt++;
> + else if (status & sde->int_mask)
> + sde->sdma_int_cnt++;
> sdma_make_progress(sde, status);
> write_sequnlock(&sde->head_lock);
> }
> diff --git a/drivers/staging/rdma/hfi1/sdma.h b/drivers/staging/rdma/hfi1/sdma.h
> index da89e64..757017a 100644
> --- a/drivers/staging/rdma/hfi1/sdma.h
> +++ b/drivers/staging/rdma/hfi1/sdma.h
> @@ -409,6 +409,7 @@ struct sdma_engine {
> u64 imask; /* clear interrupt mask */
> u64 idle_mask;
> u64 progress_mask;
> + u64 int_mask;
> /* private: */
> volatile __le64 *head_dma; /* DMA'ed by chip */
> /* private: */
> @@ -465,6 +466,12 @@ struct sdma_engine {
> u16 tx_head;
> /* private: */
> u64 last_status;
> + /* private */
> + u64 err_cnt;
> + /* private */
> + u64 sdma_int_cnt;
> + u64 idle_int_cnt;
> + u64 progress_int_cnt;
>
> /* private: */
> struct list_head dmawait;
>
--
Doug Ledford <dledford-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
GPG KeyID: 0E572FDD
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 884 bytes --]
next prev parent reply other threads:[~2016-03-01 15:29 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-11 23:30 [PATCH RESEND v3 0/6] staging/rdma/hfi1: Driver cleanup and misc fixes Jubin John
2016-01-11 23:30 ` [PATCH RESEND v3 4/6] staging/rdma/hfi1: Change default krcvqs Jubin John
[not found] ` <1452555057-5155-1-git-send-email-jubin.john-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-01-11 23:30 ` [PATCH RESEND v3 1/6] staging/rdma/hfi1: Use BIT macro Jubin John
2016-01-11 23:30 ` [PATCH RESEND v3 2/6] staging/rdma/hfi1: Move s_sde to the read mostly portion of the hfi1_qp structure Jubin John
2016-01-11 23:30 ` [PATCH RESEND v3 3/6] staging/rdma/hfi1: change krcvqs module parameter type from byte to uint Jubin John
2016-01-11 23:30 ` [PATCH RESEND v3 5/6] staging/rdma/hfi1: adding per SDMA engine stats to hfistats Jubin John
[not found] ` <1452555057-5155-6-git-send-email-jubin.john-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-03-01 15:29 ` Doug Ledford [this message]
[not found] ` <56D5B567.4040706-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2016-03-01 20:27 ` Jubin John
[not found] ` <20160301202736.GA8501-W4f6Xiosr+yv7QzWx2u06xL4W9x8LtSr@public.gmane.org>
2016-03-03 15:50 ` Doug Ledford
[not found] ` <56D85D51.40800-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2016-03-04 2:02 ` Jubin John
2016-01-11 23:30 ` [PATCH RESEND v3 6/6] staging/rdma/hfi1: Remove unneeded variable index Jubin John
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56D5B567.4040706@redhat.com \
--to=dledford-h+wxahxf7alqt0dzr+alfa@public.gmane.org \
--cc=devel-gWbeCf7V1WCQmaza687I9mD2FQJk+8+b@public.gmane.org \
--cc=gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org \
--cc=ira.weiny-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=jubin.john-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=mike.marciniszyn-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=vennila.megavannan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.