From patchwork Fri Nov 26 23:51:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cristian Dumitrescu X-Patchwork-Id: 104718 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 0B78FA0C43; Sat, 27 Nov 2021 00:51:34 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 826D34068A; Sat, 27 Nov 2021 00:51:33 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id E304F4068A for ; Sat, 27 Nov 2021 00:51:31 +0100 (CET) X-IronPort-AV: E=McAfee;i="6200,9189,10180"; a="299130306" X-IronPort-AV: E=Sophos;i="5.87,267,1631602800"; d="scan'208";a="299130306" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Nov 2021 15:51:30 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.87,267,1631602800"; d="scan'208";a="510837552" Received: from silpixa00400573.ir.intel.com (HELO silpixa00400573.ger.corp.intel.com) ([10.237.223.107]) by orsmga008.jf.intel.com with ESMTP; 26 Nov 2021 15:51:29 -0800 From: Cristian Dumitrescu To: dev@dpdk.org Cc: yogesh.jangra@intel.com Subject: [PATCH 1/4] pipeline: improve the drop instruction Date: Fri, 26 Nov 2021 23:51:26 +0000 Message-Id: <20211126235129.35781-1-cristian.dumitrescu@intel.com> X-Mailer: git-send-email 2.17.1 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 The output port to be used as the drop port is now determined when the drop instruction is executed as opposed to being statically determined at instruction translation time and hardcoded in the opcode. Signed-off-by: Cristian Dumitrescu Signed-off-by: Yogesh Jangra : --- lib/pipeline/rte_swx_pipeline.c | 38 ++++++++++++++++++------ lib/pipeline/rte_swx_pipeline_internal.h | 20 +++++++++++++ 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/lib/pipeline/rte_swx_pipeline.c b/lib/pipeline/rte_swx_pipeline.c index 2145ca0a42..ff2fe964a5 100644 --- a/lib/pipeline/rte_swx_pipeline.c +++ b/lib/pipeline/rte_swx_pipeline.c @@ -1370,6 +1370,7 @@ instruction_is_tx(enum instruction_type type) switch (type) { case INSTR_TX: case INSTR_TX_I: + case INSTR_DROP: return 1; default: @@ -1383,6 +1384,7 @@ instruction_does_tx(struct instruction *instr) switch (instr->type) { case INSTR_TX: case INSTR_TX_I: + case INSTR_DROP: case INSTR_HDR_EMIT_TX: case INSTR_HDR_EMIT2_TX: case INSTR_HDR_EMIT3_TX: @@ -1591,7 +1593,7 @@ instr_tx_translate(struct rte_swx_pipeline *p, } static int -instr_drop_translate(struct rte_swx_pipeline *p, +instr_drop_translate(struct rte_swx_pipeline *p __rte_unused, struct action *action __rte_unused, char **tokens __rte_unused, int n_tokens, @@ -1600,9 +1602,8 @@ instr_drop_translate(struct rte_swx_pipeline *p, { CHECK(n_tokens == 1, EINVAL); - /* TX_I. */ - instr->type = INSTR_TX_I; - instr->io.io.val = p->n_ports_out - 1; + /* DROP. */ + instr->type = INSTR_DROP; return 0; } @@ -1632,6 +1633,19 @@ instr_tx_i_exec(struct rte_swx_pipeline *p) instr_rx_exec(p); } +static inline void +instr_drop_exec(struct rte_swx_pipeline *p) +{ + struct thread *t = &p->threads[p->thread_id]; + struct instruction *ip = t->ip; + + __instr_drop_exec(p, t, ip); + + /* Thread. */ + thread_ip_reset(p, t); + instr_rx_exec(p); +} + /* * extract. */ @@ -6199,7 +6213,7 @@ instr_pattern_emit_many_tx_search(struct instruction *instr, if (!i) return 0; - if (!instruction_is_tx(instr[i].type)) + if (instr[i].type != INSTR_TX) return 0; if (data[i].n_users) @@ -6643,6 +6657,7 @@ static instr_exec_t instruction_table[] = { [INSTR_RX] = instr_rx_exec, [INSTR_TX] = instr_tx_exec, [INSTR_TX_I] = instr_tx_i_exec, + [INSTR_DROP] = instr_drop_exec, [INSTR_HDR_EXTRACT] = instr_hdr_extract_exec, [INSTR_HDR_EXTRACT2] = instr_hdr_extract2_exec, @@ -9901,6 +9916,7 @@ instr_type_to_name(struct instruction *instr) case INSTR_TX: return "INSTR_TX"; case INSTR_TX_I: return "INSTR_TX_I"; + case INSTR_DROP: return "INSTR_DROP"; case INSTR_HDR_EXTRACT: return "INSTR_HDR_EXTRACT"; case INSTR_HDR_EXTRACT2: return "INSTR_HDR_EXTRACT2"; @@ -10126,8 +10142,9 @@ instr_io_export(struct instruction *instr, FILE *f) instr_type_to_name(instr)); /* instr.io. */ - fprintf(f, - "\t\t.io = {\n"); + if (n_io || n_io_imm || n_hdrs) + fprintf(f, + "\t\t.io = {\n"); /* instr.io.io. */ if (n_io) @@ -10193,8 +10210,9 @@ instr_io_export(struct instruction *instr, FILE *f) } /* instr.io - closing curly brace. */ - fprintf(f, - "\t\t},\n"); + if (n_io || n_io_imm || n_hdrs) + fprintf(f, + "\t\t},\n"); /* instr - closing curly brace. */ fprintf(f, @@ -10767,6 +10785,7 @@ static instruction_export_t export_table[] = { [INSTR_TX] = instr_io_export, [INSTR_TX_I] = instr_io_export, + [INSTR_DROP] = instr_io_export, [INSTR_HDR_EXTRACT] = instr_io_export, [INSTR_HDR_EXTRACT2] = instr_io_export, @@ -10984,6 +11003,7 @@ instr_type_to_func(struct instruction *instr) case INSTR_TX: return "__instr_tx_exec"; case INSTR_TX_I: return "__instr_tx_i_exec"; + case INSTR_DROP: return "__instr_drop_exec"; case INSTR_HDR_EXTRACT: return "__instr_hdr_extract_exec"; case INSTR_HDR_EXTRACT2: return "__instr_hdr_extract2_exec"; diff --git a/lib/pipeline/rte_swx_pipeline_internal.h b/lib/pipeline/rte_swx_pipeline_internal.h index 1921fdcd78..2e86383e45 100644 --- a/lib/pipeline/rte_swx_pipeline_internal.h +++ b/lib/pipeline/rte_swx_pipeline_internal.h @@ -225,6 +225,7 @@ enum instruction_type { */ INSTR_TX, /* port_out = M */ INSTR_TX_I, /* port_out = I */ + INSTR_DROP, /* extract h.header */ INSTR_HDR_EXTRACT, @@ -1631,6 +1632,25 @@ __instr_tx_i_exec(struct rte_swx_pipeline *p, struct thread *t, const struct ins port->pkt_tx(port->obj, pkt); } +static inline void +__instr_drop_exec(struct rte_swx_pipeline *p, + struct thread *t, + const struct instruction *ip __rte_unused) +{ + uint64_t port_id = p->n_ports_out - 1; + struct port_out_runtime *port = &p->out[port_id]; + struct rte_swx_pkt *pkt = &t->pkt; + + TRACE("[Thread %2u]: drop 1 pkt\n", + p->thread_id); + + /* Headers. */ + emit_handler(t); + + /* Packet. */ + port->pkt_tx(port->obj, pkt); +} + /* * extract. */