From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7D28A4597D; Fri, 13 Sep 2024 16:10:23 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3E0484060B; Fri, 13 Sep 2024 16:10:23 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 6191940295 for ; Fri, 13 Sep 2024 16:10:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1726236619; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=AibKpaIePQ5V2AUzeQQYl5mCDd2xUSSiEoN4n4r9NsI=; b=HSkG5dtzg7/eZu1BvrbCMBFW19eiPQ+I/DDamscpmxgwIAtiy0b3VZO3s+CoUfqyAOTw1w syeAKt08bEDEki63Sf/lNuQuSeNvtYRU4QdeOe8cmrLYw3w+68j0I4ifdJqeBKGKYfk8Oq lZno+yCWf10MJaO2XQmD1MbS47a2CAA= Received: from mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-550-PUjNlCrDNla3szOo4NPswA-1; Fri, 13 Sep 2024 10:10:18 -0400 X-MC-Unique: PUjNlCrDNla3szOo4NPswA-1 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 8010D19560A2; Fri, 13 Sep 2024 14:10:17 +0000 (UTC) Received: from [10.39.208.29] (unknown [10.39.208.29]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id DAA2E19560AB; Fri, 13 Sep 2024 14:10:14 +0000 (UTC) Message-ID: Date: Fri, 13 Sep 2024 16:10:11 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 1/2] bbdev: add new function to dump debug information To: Nicolas Chautru , dev@dpdk.org Cc: hemant.agrawal@nxp.com, david.marchand@redhat.com, hernan.vargas@intel.com References: <20240829200624.38551-1-nicolas.chautru@intel.com> <20240829200624.38551-2-nicolas.chautru@intel.com> From: Maxime Coquelin Autocrypt: addr=maxime.coquelin@redhat.com; keydata= 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 Mwqu3GQ= In-Reply-To: <20240829200624.38551-2-nicolas.chautru@intel.com> X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org On 8/29/24 22:06, Nicolas Chautru wrote: > This provides a new API to dump more debug information > related to the status on a given bbdev queue. > Some of this information is visible at bbdev level. > This also provides a new option dev op, to print more > information at the lower PMD level. > This helps user to troubleshoot issues related to > previous operations provided into a queue causing > possible hard-to-debug negative scenarios. > > Signed-off-by: Nicolas Chautru > --- > lib/bbdev/rte_bbdev.c | 214 ++++++++++++++++++++++++++++++++++++++ > lib/bbdev/rte_bbdev.h | 41 ++++++++ > lib/bbdev/rte_bbdev_pmd.h | 9 ++ > lib/bbdev/version.map | 4 + > 4 files changed, 268 insertions(+) > > diff --git a/lib/bbdev/rte_bbdev.c b/lib/bbdev/rte_bbdev.c > index 13bde3c25b..9087862c76 100644 > --- a/lib/bbdev/rte_bbdev.c > +++ b/lib/bbdev/rte_bbdev.c > @@ -1190,3 +1190,217 @@ rte_bbdev_enqueue_status_str(enum rte_bbdev_enqueue_status status) > rte_bbdev_log(ERR, "Invalid enqueue status"); > return NULL; > } > + > + > +int > +rte_bbdev_queue_ops_dump(uint16_t dev_id, uint16_t queue_id, FILE *f) > +{ > + struct rte_bbdev_queue_data *q_data; > + struct rte_bbdev_stats *stats; > + uint16_t i; > + struct rte_bbdev *dev = get_dev(dev_id); > + > + VALID_DEV_OR_RET_ERR(dev, dev_id); > + VALID_QUEUE_OR_RET_ERR(queue_id, dev); > + VALID_DEV_OPS_OR_RET_ERR(dev, dev_id); > + VALID_FUNC_OR_RET_ERR(dev->dev_ops->queue_ops_dump, dev_id); > + > + q_data = &dev->data->queues[queue_id]; > + > + if (f == NULL) > + return -EINVAL; > + > + fprintf(f, "Dump of operations on %s queue %d\n", > + dev->data->name, queue_id); > + fprintf(f, " Last Enqueue Status %s\n", > + rte_bbdev_enqueue_status_str(q_data->enqueue_status)); > + for (i = 0; i < RTE_BBDEV_ENQ_STATUS_SIZE_MAX; i++) > + if (q_data->queue_stats.enqueue_status_count[i] > 0) > + fprintf(f, " Enqueue Status Counters %s %" PRIu64 "\n", > + rte_bbdev_enqueue_status_str(i), > + q_data->queue_stats.enqueue_status_count[i]); > + stats = &dev->data->queues[queue_id].queue_stats; > + > + fprintf(f, " Enqueue Count %" PRIu64 " Warning %" PRIu64 " Error %" PRIu64 "\n", > + stats->enqueued_count, stats->enqueue_warn_count, > + stats->enqueue_err_count); > + fprintf(f, " Dequeue Count %" PRIu64 " Warning %" PRIu64 " Error %" PRIu64 "\n", > + stats->dequeued_count, stats->dequeue_warn_count, > + stats->dequeue_err_count); > + > + return dev->dev_ops->queue_ops_dump(dev, queue_id, f); > +} > + > +char * > +rte_bbdev_ops_param_string(void *op, enum rte_bbdev_op_type op_type) > +{ > + static char str[1024]; > + static char partial[1024]; It is better to have the string allocated by the application, it would be passed as a pointer and length of the allocated buffer would be passed also as an argument. > + struct rte_bbdev_dec_op *op_dec; > + struct rte_bbdev_enc_op *op_enc; > + struct rte_bbdev_fft_op *op_fft; > + struct rte_bbdev_mldts_op *op_mldts; > + > + rte_iova_t add0 = 0, add1 = 0, add2 = 0, add3 = 0, add4 = 0; > + > + if (op == NULL) { > + snprintf(str, sizeof(str), "Invalid Operation pointer\n"); > + return str; > + } > + > + if (op_type == RTE_BBDEV_OP_LDPC_DEC) { > + op_dec = op; > + if (op_dec->ldpc_dec.code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) > + snprintf(partial, sizeof(partial), "C %d Cab %d Ea %d Eb %d r %d", > + op_dec->ldpc_dec.tb_params.c, > + op_dec->ldpc_dec.tb_params.cab, > + op_dec->ldpc_dec.tb_params.ea, > + op_dec->ldpc_dec.tb_params.eb, > + op_dec->ldpc_dec.tb_params.r); > + else > + snprintf(partial, sizeof(partial), "E %d", op_dec->ldpc_dec.cb_params.e); > + if (op_dec->ldpc_dec.input.data != NULL) > + add0 = rte_pktmbuf_iova_offset(op_dec->ldpc_dec.input.data, 0); > + if (op_dec->ldpc_dec.hard_output.data != NULL) > + add1 = rte_pktmbuf_iova_offset(op_dec->ldpc_dec.hard_output.data, 0); > + if (op_dec->ldpc_dec.soft_output.data != NULL) > + add2 = rte_pktmbuf_iova_offset(op_dec->ldpc_dec.soft_output.data, 0); > + if (op_dec->ldpc_dec.harq_combined_input.data != NULL) > + add3 = rte_pktmbuf_iova_offset(op_dec->ldpc_dec.harq_combined_input.data, > + 0); > + if (op_dec->ldpc_dec.harq_combined_output.data != NULL) > + add4 = rte_pktmbuf_iova_offset(op_dec->ldpc_dec.harq_combined_output.data, > + 0); > + snprintf(str, sizeof(str), "op %x st %x BG %d Zc %d Ncb %d qm %d F %d Rv %d It %d It %d " > + "HARQin %d in %" PRIx64 " ho %" PRIx64 " so %" PRIx64 " hi %" PRIx64 " " > + "ho %" PRIx64 " %s\n", > + op_dec->ldpc_dec.op_flags, op_dec->status, > + op_dec->ldpc_dec.basegraph, op_dec->ldpc_dec.z_c, > + op_dec->ldpc_dec.n_cb, op_dec->ldpc_dec.q_m, > + op_dec->ldpc_dec.n_filler, op_dec->ldpc_dec.rv_index, > + op_dec->ldpc_dec.iter_max, op_dec->ldpc_dec.iter_count, > + op_dec->ldpc_dec.harq_combined_input.length, > + add0, add1, add2, add3, add4, partial); > + } else if (op_type == RTE_BBDEV_OP_TURBO_DEC) { > + op_dec = op; > + if (op_dec->turbo_dec.code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) > + snprintf(partial, sizeof(partial), "C %d Cab %d Ea %d Eb %d r %d K %d", > + op_dec->turbo_dec.tb_params.c, > + op_dec->turbo_dec.tb_params.cab, > + op_dec->turbo_dec.tb_params.ea, > + op_dec->turbo_dec.tb_params.eb, > + op_dec->turbo_dec.tb_params.r, > + op_dec->turbo_dec.tb_params.k_neg); > + else > + snprintf(partial, sizeof(partial), "E %d K %d", > + op_dec->turbo_dec.cb_params.e, > + op_dec->turbo_dec.cb_params.k); > + if (op_dec->turbo_dec.input.data != NULL) > + add0 = rte_pktmbuf_iova_offset(op_dec->turbo_dec.input.data, 0); > + if (op_dec->turbo_dec.hard_output.data != NULL) > + add1 = rte_pktmbuf_iova_offset(op_dec->turbo_dec.hard_output.data, 0); > + if (op_dec->turbo_dec.soft_output.data != NULL) > + add2 = rte_pktmbuf_iova_offset(op_dec->turbo_dec.soft_output.data, 0); > + snprintf(str, sizeof(str), "op %x st %x CBM %d Iter %d map %d Rv %d ext %d " > + "in %" PRIx64 " ho %" PRIx64 " so %" PRIx64 " %s\n", > + op_dec->turbo_dec.op_flags, op_dec->status, > + op_dec->turbo_dec.code_block_mode, > + op_dec->turbo_dec.iter_max, op_dec->turbo_dec.num_maps, > + op_dec->turbo_dec.rv_index, op_dec->turbo_dec.ext_scale, > + add0, add1, add2, partial); > + } else if (op_type == RTE_BBDEV_OP_LDPC_ENC) { > + op_enc = op; > + if (op_enc->ldpc_enc.code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) > + snprintf(partial, sizeof(partial), "C %d Cab %d Ea %d Eb %d r %d", > + op_enc->ldpc_enc.tb_params.c, > + op_enc->ldpc_enc.tb_params.cab, > + op_enc->ldpc_enc.tb_params.ea, > + op_enc->ldpc_enc.tb_params.eb, > + op_enc->ldpc_enc.tb_params.r); > + else > + snprintf(partial, sizeof(partial), "E %d", > + op_enc->ldpc_enc.cb_params.e); > + if (op_enc->ldpc_enc.input.data != NULL) > + add0 = rte_pktmbuf_iova_offset(op_enc->ldpc_enc.input.data, 0); > + if (op_enc->ldpc_enc.output.data != NULL) > + add1 = rte_pktmbuf_iova_offset(op_enc->ldpc_enc.output.data, 0); > + snprintf(str, sizeof(str), "op %x st %x BG %d Zc %d Ncb %d q_m %d F %d Rv %d " > + "in %" PRIx64 " out %" PRIx64 " %s\n", > + op_enc->ldpc_enc.op_flags, op_enc->status, > + op_enc->ldpc_enc.basegraph, op_enc->ldpc_enc.z_c, > + op_enc->ldpc_enc.n_cb, op_enc->ldpc_enc.q_m, > + op_enc->ldpc_enc.n_filler, op_enc->ldpc_enc.rv_index, > + add0, add1, partial); > + } else if (op_type == RTE_BBDEV_OP_TURBO_ENC) { > + op_enc = op; > + if (op_enc->turbo_enc.code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) > + snprintf(partial, sizeof(partial), > + "C %d Cab %d Ea %d Eb %d r %d K %d Ncb %d", > + op_enc->turbo_enc.tb_params.c, > + op_enc->turbo_enc.tb_params.cab, > + op_enc->turbo_enc.tb_params.ea, > + op_enc->turbo_enc.tb_params.eb, > + op_enc->turbo_enc.tb_params.r, > + op_enc->turbo_enc.tb_params.k_neg, > + op_enc->turbo_enc.tb_params.ncb_neg); > + else > + snprintf(partial, sizeof(partial), "E %d K %d", > + op_enc->turbo_enc.cb_params.e, > + op_enc->turbo_enc.cb_params.k); > + if (op_enc->turbo_enc.input.data != NULL) > + add0 = rte_pktmbuf_iova_offset(op_enc->turbo_enc.input.data, 0); > + if (op_enc->turbo_enc.output.data != NULL) > + add1 = rte_pktmbuf_iova_offset(op_enc->turbo_enc.output.data, 0); > + snprintf(str, sizeof(str), "op %x st %x CBM %d Rv %d In %" PRIx64 " Out %" PRIx64 " %s\n", > + op_enc->turbo_enc.op_flags, op_enc->status, > + op_enc->turbo_enc.code_block_mode, op_enc->turbo_enc.rv_index, > + add0, add1, partial); > + } else if (op_type == RTE_BBDEV_OP_FFT) { > + op_fft = op; > + if (op_fft->fft.base_input.data != NULL) > + add0 = rte_pktmbuf_iova_offset(op_fft->fft.base_input.data, 0); > + if (op_fft->fft.base_output.data != NULL) > + add1 = rte_pktmbuf_iova_offset(op_fft->fft.base_output.data, 0); > + if (op_fft->fft.dewindowing_input.data != NULL) > + add2 = rte_pktmbuf_iova_offset(op_fft->fft.dewindowing_input.data, 0); > + if (op_fft->fft.power_meas_output.data != NULL) > + add3 = rte_pktmbuf_iova_offset(op_fft->fft.power_meas_output.data, 0); > + snprintf(str, sizeof(str), "op %x st %x in %d inl %d out %d outl %d cs %x ants %d " > + "idft %d dft %d cst %d ish %d dsh %d ncs %d pwsh %d fp16 %d fr %d " > + "outde %d in %" PRIx64 " out %" PRIx64 " dw %" PRIx64 " " > + "pm %" PRIx64 "\n", > + op_fft->fft.op_flags, op_fft->status, > + op_fft->fft.input_sequence_size, op_fft->fft.input_leading_padding, > + op_fft->fft.output_sequence_size, > + op_fft->fft.output_leading_depadding, > + op_fft->fft.cs_bitmap, op_fft->fft.num_antennas_log2, > + op_fft->fft.idft_log2, op_fft->fft.dft_log2, > + op_fft->fft.cs_time_adjustment, > + op_fft->fft.idft_shift, op_fft->fft.dft_shift, > + op_fft->fft.ncs_reciprocal, op_fft->fft.power_shift, > + op_fft->fft.fp16_exp_adjust, op_fft->fft.freq_resample_mode, > + op_fft->fft.output_depadded_size, add0, add1, add2, add3); > + } else if (op_type == RTE_BBDEV_OP_MLDTS) { > + op_mldts = op; > + if (op_mldts->mldts.qhy_input.data != NULL) > + add0 = rte_pktmbuf_iova_offset(op_mldts->mldts.qhy_input.data, 0); > + if (op_mldts->mldts.r_input.data != NULL) > + add1 = rte_pktmbuf_iova_offset(op_mldts->mldts.r_input.data, 0); > + if (op_mldts->mldts.output.data != NULL) > + add2 = rte_pktmbuf_iova_offset(op_mldts->mldts.output.data, 0); > + snprintf(str, sizeof(str), > + "op %x st %x rbs %d lay %d rrep %d crep%d qm %d %d %d %d " > + "qhy %" PRIx64 " r %" PRIx64 " out %" PRIx64 "\n", > + op_mldts->mldts.op_flags, op_mldts->status, > + op_mldts->mldts.num_rbs, op_mldts->mldts.num_layers, > + op_mldts->mldts.r_rep, op_mldts->mldts.c_rep, > + op_mldts->mldts.q_m[0], op_mldts->mldts.q_m[1], > + op_mldts->mldts.q_m[2], op_mldts->mldts.q_m[3], > + add0, add1, add2); > + > + } else { > + snprintf(str, sizeof(str), "Invalid Operation type %d\n", op_type); > + } > + > + return str; > +} > diff --git a/lib/bbdev/rte_bbdev.h b/lib/bbdev/rte_bbdev.h > index 0cbfdd1c95..a70d841379 100644 > --- a/lib/bbdev/rte_bbdev.h > +++ b/lib/bbdev/rte_bbdev.h > @@ -1061,6 +1061,47 @@ rte_bbdev_device_status_str(enum rte_bbdev_device_status status); > const char* > rte_bbdev_enqueue_status_str(enum rte_bbdev_enqueue_status status); > > +/** > + * Dump operations info from device to a file. > + * This API is used for debugging provided input operations, not a dataplane API. > + * > + * @param dev_id > + * The device identifier. > + * > + * @param queue_index > + * Index of queue. > + * > + * @param file > + * A pointer to a file for output. > + * > + * @returns > + * - 0 on success > + * - ENOTSUP if interrupts are not supported by the identified device > + * - negative value on failure - as returned from PMD > + * > + */ > +__rte_experimental > +int > +rte_bbdev_queue_ops_dump(uint16_t dev_id, uint16_t queue_index, FILE *file); > + > + > +/** > + * String of parameters related to the parameters of an operation of a given type. > + * > + * @param op > + * Pointer to an operation. > + * > + * @param op_type > + * Operation type enum. > + * > + * @returns > + * String describing the provided operation. > + * > + */ > +__rte_experimental > +char * > +rte_bbdev_ops_param_string(void *op, enum rte_bbdev_op_type op_type); > + > #ifdef __cplusplus > } > #endif > diff --git a/lib/bbdev/rte_bbdev_pmd.h b/lib/bbdev/rte_bbdev_pmd.h > index 442b23943d..c21a7f0c1e 100644 > --- a/lib/bbdev/rte_bbdev_pmd.h > +++ b/lib/bbdev/rte_bbdev_pmd.h > @@ -133,6 +133,13 @@ typedef int (*rte_bbdev_queue_intr_enable_t)(struct rte_bbdev *dev, > typedef int (*rte_bbdev_queue_intr_disable_t)(struct rte_bbdev *dev, > uint16_t queue_id); > > +/* > + * @internal > + * Function to dump previous operations on a queue of a device. > + */ > +typedef int (*rte_bbdev_queue_ops_dump_t)(struct rte_bbdev *dev, > + uint16_t queue_id, FILE *file); > + > /** > * Operations implemented by drivers. Fields marked as "Required" must be > * provided by a driver for a device to have basic functionality. "Optional" > @@ -170,6 +177,8 @@ struct rte_bbdev_ops { > rte_bbdev_queue_intr_enable_t queue_intr_enable; > /** Disable queue interrupt. Optional */ > rte_bbdev_queue_intr_disable_t queue_intr_disable; > + /** Dump operations on the queue. Optional */ > + rte_bbdev_queue_ops_dump_t queue_ops_dump; > }; > > /** > diff --git a/lib/bbdev/version.map b/lib/bbdev/version.map > index e0d82ff752..db6dfdf3c6 100644 > --- a/lib/bbdev/version.map > +++ b/lib/bbdev/version.map > @@ -54,4 +54,8 @@ EXPERIMENTAL { > rte_bbdev_enqueue_mldts_ops; > rte_bbdev_mldts_op_alloc_bulk; > rte_bbdev_mldts_op_free_bulk; > + > + # added in 24.11 > + rte_bbdev_queue_ops_dump; > + rte_bbdev_ops_param_string; > };