From patchwork Thu Jun 2 07:45:49 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Elo, Matias \(Nokia - FI/Espoo\)" X-Patchwork-Id: 69133 Delivered-To: patch@linaro.org Received: by 10.140.23.41 with SMTP id 38csp194671qgo; Thu, 2 Jun 2016 00:49:43 -0700 (PDT) X-Received: by 10.36.10.65 with SMTP id 62mr588037itw.89.1464853781325; Thu, 02 Jun 2016 00:49:41 -0700 (PDT) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id l126si10729753itd.84.2016.06.02.00.49.40; Thu, 02 Jun 2016 00:49:41 -0700 (PDT) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) client-ip=54.225.227.206; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE dis=NONE) header.from=nokia.com Received: by lists.linaro.org (Postfix, from userid 109) id B787261764; Thu, 2 Jun 2016 07:49:40 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 9C5F161734; Thu, 2 Jun 2016 07:46:44 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 146096173A; Thu, 2 Jun 2016 07:46:36 +0000 (UTC) Received: from demumfd001.nsn-inter.net (demumfd001.nsn-inter.net [93.183.12.32]) by lists.linaro.org (Postfix) with ESMTPS id 99B3761744 for ; Thu, 2 Jun 2016 07:45:57 +0000 (UTC) Received: from demuprx016.emea.nsn-intra.net ([10.150.129.55]) by demumfd001.nsn-inter.net (8.15.2/8.15.2) with ESMTPS id u527juGA019279 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 2 Jun 2016 07:45:56 GMT Received: from 10.144.19.15 ([10.144.104.109]) by demuprx016.emea.nsn-intra.net (8.12.11.20060308/8.12.11) with ESMTP id u527jpOK016092 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 2 Jun 2016 09:45:52 +0200 From: Matias Elo To: lng-odp@lists.linaro.org Date: Thu, 2 Jun 2016 10:45:49 +0300 Message-Id: <1464853550-9104-3-git-send-email-matias.elo@nokia.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1464853550-9104-1-git-send-email-matias.elo@nokia.com> References: <1464853550-9104-1-git-send-email-matias.elo@nokia.com> X-purgate-type: clean X-purgate-Ad: Categorized by eleven eXpurgate (R) http://www.eleven.de X-purgate: clean X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate-size: 24536 X-purgate-ID: 151667::1464853556-00004C87-9D9E9C28/0/0 X-Topics: patch Subject: [lng-odp] [PATCH v2 3/4] linux-gen: pktio: remove old single queue recv and send functions X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" RX/TX locks are moved inside pktio implementations and pktios set packet header's input member. Signed-off-by: Matias Elo Reviewed-and-tested-by: Bill Fischofer --- .../linux-generic/include/odp_packet_io_internal.h | 12 ++-- platform/linux-generic/odp_packet_io.c | 74 +--------------------- platform/linux-generic/pktio/dpdk.c | 16 ++--- platform/linux-generic/pktio/ipc.c | 39 ++++++++++-- platform/linux-generic/pktio/loop.c | 26 ++++++-- platform/linux-generic/pktio/netmap.c | 12 ++-- platform/linux-generic/pktio/pcap.c | 41 +++++++----- platform/linux-generic/pktio/socket.c | 25 +++++--- platform/linux-generic/pktio/socket_mmap.c | 29 ++++++--- platform/linux-generic/pktio/tap.c | 37 ++++++++--- 10 files changed, 160 insertions(+), 151 deletions(-) diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h index 8ebff1c..139b1bd 100644 --- a/platform/linux-generic/include/odp_packet_io_internal.h +++ b/platform/linux-generic/include/odp_packet_io_internal.h @@ -188,10 +188,10 @@ typedef struct pktio_if_ops { int (*stats_reset)(pktio_entry_t *pktio_entry); uint64_t (*pktin_ts_res)(pktio_entry_t *pktio_entry); odp_time_t (*pktin_ts_from_ns)(pktio_entry_t *pktio_entry, uint64_t ns); - int (*recv)(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[], - unsigned len); - int (*send)(pktio_entry_t *pktio_entry, const odp_packet_t pkt_table[], - unsigned len); + int (*recv)(pktio_entry_t *entry, int index, odp_packet_t packets[], + int num); + int (*send)(pktio_entry_t *entry, int index, + const odp_packet_t packets[], int num); uint32_t (*mtu_get)(pktio_entry_t *pktio_entry); int (*promisc_mode_set)(pktio_entry_t *pktio_entry, int enable); int (*promisc_mode_get)(pktio_entry_t *pktio_entry); @@ -205,10 +205,6 @@ typedef struct pktio_if_ops { const odp_pktin_queue_param_t *param); int (*output_queues_config)(pktio_entry_t *pktio_entry, const odp_pktout_queue_param_t *p); - int (*recv_queue)(pktio_entry_t *entry, int index, - odp_packet_t packets[], int num); - int (*send_queue)(pktio_entry_t *entry, int index, - const odp_packet_t packets[], int num); } pktio_if_ops_t; int _odp_packet_cls_enq(pktio_entry_t *pktio_entry, const uint8_t *base, diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c index 572db9b..652709e 100644 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@ -531,54 +531,6 @@ odp_pktio_t odp_pktio_lookup(const char *name) return hdl; } -static int _odp_pktio_recv(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[], - int len) -{ - int pkts; - int i; - - if (pktio_entry == NULL) - return -1; - - odp_ticketlock_lock(&pktio_entry->s.rxl); - if (pktio_entry->s.param.in_mode == ODP_PKTIN_MODE_DISABLED) { - odp_ticketlock_unlock(&pktio_entry->s.rxl); - __odp_errno = EPERM; - return -1; - } - pkts = pktio_entry->s.ops->recv(pktio_entry, pkt_table, len); - odp_ticketlock_unlock(&pktio_entry->s.rxl); - - if (pkts < 0) - return pkts; - - for (i = 0; i < pkts; ++i) - odp_packet_hdr(pkt_table[i])->input = pktio_entry->s.handle; - - return pkts; -} - -static int _odp_pktio_send(pktio_entry_t *pktio_entry, - const odp_packet_t pkt_table[], int len) -{ - int pkts; - - if (pktio_entry == NULL) - return -1; - - odp_ticketlock_lock(&pktio_entry->s.txl); - if (pktio_entry->s.state != STATE_STARTED || - pktio_entry->s.param.out_mode == ODP_PKTOUT_MODE_DISABLED) { - odp_ticketlock_unlock(&pktio_entry->s.txl); - __odp_errno = EPERM; - return -1; - } - pkts = pktio_entry->s.ops->send(pktio_entry, pkt_table, len); - odp_ticketlock_unlock(&pktio_entry->s.txl); - - return pkts; -} - int pktout_enqueue(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr) { odp_packet_t pkt = _odp_packet_from_buffer(buf_hdr->handle.handle); @@ -1532,11 +1484,7 @@ int odp_pktin_recv(odp_pktin_queue_t queue, odp_packet_t packets[], int num) return -1; } - if (entry->s.ops->recv_queue) - return entry->s.ops->recv_queue(entry, queue.index, - packets, num); - - return single_recv_queue(entry, queue.index, packets, num); + return entry->s.ops->recv(entry, queue.index, packets, num); } int odp_pktin_recv_tmo(odp_pktin_queue_t queue, odp_packet_t packets[], int num, @@ -1658,11 +1606,7 @@ int odp_pktout_send(odp_pktout_queue_t queue, const odp_packet_t packets[], return -1; } - if (entry->s.ops->send_queue) - return entry->s.ops->send_queue(entry, queue.index, - packets, num); - - return single_send_queue(entry, queue.index, packets, num); + return entry->s.ops->send(entry, queue.index, packets, num); } int single_capability(odp_pktio_capability_t *capa) @@ -1674,17 +1618,3 @@ int single_capability(odp_pktio_capability_t *capa) return 0; } - -int single_recv_queue(pktio_entry_t *entry, int index, odp_packet_t packets[], - int num) -{ - (void)index; - return _odp_pktio_recv(entry, packets, num); -} - -int single_send_queue(pktio_entry_t *entry, int index, - const odp_packet_t packets[], int num) -{ - (void)index; - return _odp_pktio_send(entry, packets, num); -} diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c index 831dc26..25dde7b 100644 --- a/platform/linux-generic/pktio/dpdk.c +++ b/platform/linux-generic/pktio/dpdk.c @@ -807,10 +807,8 @@ static inline int pkt_to_mbuf(pktio_entry_t *pktio_entry, return i; } -static int dpdk_recv_queue(pktio_entry_t *pktio_entry, - int index, - odp_packet_t pkt_table[], - int num) +static int dpdk_recv(pktio_entry_t *pktio_entry, int index, + odp_packet_t pkt_table[], int num) { pkt_dpdk_t *pkt_dpdk = &pktio_entry->s.pkt_dpdk; pkt_cache_t *rx_cache = &pkt_dpdk->rx_cache[index]; @@ -879,10 +877,8 @@ static int dpdk_recv_queue(pktio_entry_t *pktio_entry, return nb_rx; } -static int dpdk_send_queue(pktio_entry_t *pktio_entry, - int index, - const odp_packet_t pkt_table[], - int num) +static int dpdk_send(pktio_entry_t *pktio_entry, int index, + const odp_packet_t pkt_table[], int num) { struct rte_mbuf *tx_mbufs[num]; pkt_dpdk_t *pkt_dpdk = &pktio_entry->s.pkt_dpdk; @@ -1010,8 +1006,8 @@ const pktio_if_ops_t dpdk_pktio_ops = { .stop = dpdk_stop, .stats = dpdk_stats, .stats_reset = dpdk_stats_reset, - .recv_queue = dpdk_recv_queue, - .send_queue = dpdk_send_queue, + .recv = dpdk_recv, + .send = dpdk_send, .link_status = dpdk_link_status, .mtu_get = dpdk_mtu_get, .promisc_mode_set = dpdk_promisc_mode_set, diff --git a/platform/linux-generic/pktio/ipc.c b/platform/linux-generic/pktio/ipc.c index 8508824..93b0d01 100644 --- a/platform/linux-generic/pktio/ipc.c +++ b/platform/linux-generic/pktio/ipc.c @@ -486,8 +486,8 @@ static void _ipc_free_ring_packets(_ring_t *r) } } -static int ipc_pktio_recv(pktio_entry_t *pktio_entry, - odp_packet_t pkt_table[], unsigned len) +static int ipc_pktio_recv_lockless(pktio_entry_t *pktio_entry, + odp_packet_t pkt_table[], int len) { int pkts = 0; int i; @@ -580,6 +580,7 @@ static int ipc_pktio_recv(pktio_entry_t *pktio_entry, odp_packet_hdr(pkt)->frame_len = phdr.frame_len; odp_packet_hdr(pkt)->headroom = phdr.headroom; odp_packet_hdr(pkt)->tailroom = phdr.tailroom; + odp_packet_hdr(pkt)->input = pktio_entry->s.handle; pkt_table[i] = pkt; } @@ -592,13 +593,27 @@ static int ipc_pktio_recv(pktio_entry_t *pktio_entry, return pkts; } -static int ipc_pktio_send(pktio_entry_t *pktio_entry, - const odp_packet_t pkt_table[], unsigned len) +static int ipc_pktio_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, + odp_packet_t pkt_table[], int len) +{ + int ret; + + odp_ticketlock_lock(&pktio_entry->s.rxl); + + ret = ipc_pktio_recv_lockless(pktio_entry, pkt_table, len); + + odp_ticketlock_unlock(&pktio_entry->s.rxl); + + return ret; +} + +static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry, + const odp_packet_t pkt_table[], int len) { _ring_t *r; void **rbuf_p; int ret; - unsigned i; + int i; uint32_t ready = odp_atomic_load_u32(&pktio_entry->s.ipc.ready); odp_packet_t pkt_table_mapped[len]; /**< Ready to send packet has to be * in memory mapped pool. */ @@ -666,6 +681,20 @@ static int ipc_pktio_send(pktio_entry_t *pktio_entry, return ret; } +static int ipc_pktio_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, + const odp_packet_t pkt_table[], int len) +{ + int ret; + + odp_ticketlock_lock(&pktio_entry->s.txl); + + ret = ipc_pktio_send_lockless(pktio_entry, pkt_table, len); + + odp_ticketlock_unlock(&pktio_entry->s.txl); + + return ret; +} + static uint32_t ipc_mtu_get(pktio_entry_t *pktio_entry ODP_UNUSED) { /* mtu not limited, pool settings are used. */ diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c index cbb5ea9..cdf5326 100644 --- a/platform/linux-generic/pktio/loop.c +++ b/platform/linux-generic/pktio/loop.c @@ -48,8 +48,8 @@ static int loopback_close(pktio_entry_t *pktio_entry) return odp_queue_destroy(pktio_entry->s.pkt_loop.loopq); } -static int loopback_recv(pktio_entry_t *pktio_entry, odp_packet_t pkts[], - unsigned len) +static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, + odp_packet_t pkts[], int len) { int nbr, i; odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX]; @@ -62,6 +62,8 @@ static int loopback_recv(pktio_entry_t *pktio_entry, odp_packet_t pkts[], if (odp_unlikely(len > QUEUE_MULTI_MAX)) len = QUEUE_MULTI_MAX; + odp_ticketlock_lock(&pktio_entry->s.rxl); + qentry = queue_to_qentry(pktio_entry->s.pkt_loop.loopq); nbr = queue_deq_multi(qentry, hdr_tbl, len); @@ -85,6 +87,7 @@ static int loopback_recv(pktio_entry_t *pktio_entry, odp_packet_t pkts[], switch (ret) { case 0: packet_set_ts(pkt_hdr, ts); + pkt_hdr->input = pktio_entry->s.handle; pktio_entry->s.stats.in_octets += odp_packet_len(pkt); break; @@ -101,6 +104,9 @@ static int loopback_recv(pktio_entry_t *pktio_entry, odp_packet_t pkts[], pktio_entry->s.stats.in_errors += failed; pktio_entry->s.stats.in_discards += discarded; pktio_entry->s.stats.in_ucast_pkts += nbr - failed - discarded; + + odp_ticketlock_unlock(&pktio_entry->s.rxl); + return -failed; } else { for (i = 0; i < nbr; ++i) { @@ -110,20 +116,24 @@ static int loopback_recv(pktio_entry_t *pktio_entry, odp_packet_t pkts[], packet_parse_reset(pkt_hdr); packet_parse_l2(pkt_hdr); packet_set_ts(pkt_hdr, ts); + pkt_hdr->input = pktio_entry->s.handle; pktio_entry->s.stats.in_octets += odp_packet_len(pkts[i]); } pktio_entry->s.stats.in_ucast_pkts += nbr; + + odp_ticketlock_unlock(&pktio_entry->s.rxl); + return nbr; } } -static int loopback_send(pktio_entry_t *pktio_entry, - const odp_packet_t pkt_tbl[], unsigned len) +static int loopback_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, + const odp_packet_t pkt_tbl[], int len) { odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX]; queue_entry_t *qentry; - unsigned i; + int i; int ret; uint32_t bytes = 0; @@ -135,6 +145,8 @@ static int loopback_send(pktio_entry_t *pktio_entry, bytes += odp_packet_len(pkt_tbl[i]); } + odp_ticketlock_lock(&pktio_entry->s.txl); + qentry = queue_to_qentry(pktio_entry->s.pkt_loop.loopq); ret = queue_enq_multi(qentry, hdr_tbl, len, 0); if (ret > 0) { @@ -142,6 +154,8 @@ static int loopback_send(pktio_entry_t *pktio_entry, pktio_entry->s.stats.out_octets += bytes; } + odp_ticketlock_unlock(&pktio_entry->s.txl); + return ret; } @@ -229,6 +243,4 @@ const pktio_if_ops_t loopback_pktio_ops = { .config = NULL, .input_queues_config = NULL, .output_queues_config = NULL, - .recv_queue = NULL, - .send_queue = NULL }; diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c index 820629c..59cb276 100644 --- a/platform/linux-generic/pktio/netmap.c +++ b/platform/linux-generic/pktio/netmap.c @@ -690,8 +690,8 @@ static inline int netmap_recv_desc(pktio_entry_t *pktio_entry, return num_rx; } -static int netmap_recv_queue(pktio_entry_t *pktio_entry, int index, - odp_packet_t pkt_table[], int num) +static int netmap_recv(pktio_entry_t *pktio_entry, int index, + odp_packet_t pkt_table[], int num) { struct nm_desc *desc; pkt_netmap_t *pkt_nm = &pktio_entry->s.pkt_nm; @@ -744,8 +744,8 @@ static int netmap_recv_queue(pktio_entry_t *pktio_entry, int index, return num_rx; } -static int netmap_send_queue(pktio_entry_t *pktio_entry, int index, - const odp_packet_t pkt_table[], int num) +static int netmap_send(pktio_entry_t *pktio_entry, int index, + const odp_packet_t pkt_table[], int num) { pkt_netmap_t *pkt_nm = &pktio_entry->s.pkt_nm; struct pollfd polld; @@ -913,8 +913,8 @@ const pktio_if_ops_t netmap_pktio_ops = { .config = NULL, .input_queues_config = netmap_input_queues_config, .output_queues_config = netmap_output_queues_config, - .recv_queue = netmap_recv_queue, - .send_queue = netmap_send_queue + .recv = netmap_recv, + .send = netmap_send }; #endif /* ODP_NETMAP */ diff --git a/platform/linux-generic/pktio/pcap.c b/platform/linux-generic/pktio/pcap.c index aeb20ed..b719849 100644 --- a/platform/linux-generic/pktio/pcap.c +++ b/platform/linux-generic/pktio/pcap.c @@ -201,10 +201,10 @@ static int _pcapif_reopen(pkt_pcap_t *pcap) return 0; } -static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, odp_packet_t pkts[], - unsigned len) +static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, + odp_packet_t pkts[], int len) { - unsigned i; + int i; struct pcap_pkthdr *hdr; const u_char *data; odp_packet_t pkt; @@ -214,12 +214,12 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, odp_packet_t pkts[], odp_time_t ts_val; odp_time_t *ts = NULL; - if (pktio_entry->s.state != STATE_STARTED) - return 0; + odp_ticketlock_lock(&pktio_entry->s.rxl); - if (!pcap->rx) + if (pktio_entry->s.state != STATE_STARTED || !pcap->rx) { + odp_ticketlock_unlock(&pktio_entry->s.rxl); return 0; - + } if (pktio_entry->s.config.pktin.bit.ts_all || pktio_entry->s.config.pktin.bit.ts_ptp) ts = &ts_val; @@ -266,17 +266,20 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, odp_packet_t pkts[], pktio_entry->s.stats.in_octets += pkt_hdr->frame_len; packet_set_ts(pkt_hdr, ts); + pkt_hdr->input = pktio_entry->s.handle; pkts[i] = pkt; pkt = ODP_PACKET_INVALID; i++; } + pktio_entry->s.stats.in_ucast_pkts += i; + + odp_ticketlock_unlock(&pktio_entry->s.rxl); if (pkt != ODP_PACKET_INVALID) odp_packet_free(pkt); - pktio_entry->s.stats.in_ucast_pkts += i; return i; } @@ -300,21 +303,27 @@ static int _pcapif_dump_pkt(pkt_pcap_t *pcap, odp_packet_t pkt) return 0; } -static int pcapif_send_pkt(pktio_entry_t *pktio_entry, - const odp_packet_t pkts[], - unsigned len) +static int pcapif_send_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, + const odp_packet_t pkts[], int len) { pkt_pcap_t *pcap = &pktio_entry->s.pkt_pcap; - unsigned i; + int i; - ODP_ASSERT(pktio_entry->s.state == STATE_STARTED); + odp_ticketlock_lock(&pktio_entry->s.txl); + + if (pktio_entry->s.state != STATE_STARTED) { + odp_ticketlock_unlock(&pktio_entry->s.txl); + return 0; + } for (i = 0; i < len; ++i) { int pkt_len = odp_packet_len(pkts[i]); if (pkt_len > PKTIO_PCAP_MTU) { - if (i == 0) + if (i == 0) { + odp_ticketlock_unlock(&pktio_entry->s.txl); return -1; + } break; } @@ -327,6 +336,8 @@ static int pcapif_send_pkt(pktio_entry_t *pktio_entry, pktio_entry->s.stats.out_ucast_pkts += i; + odp_ticketlock_unlock(&pktio_entry->s.txl); + return i; } @@ -440,6 +451,4 @@ const pktio_if_ops_t pcap_pktio_ops = { .config = NULL, .input_queues_config = NULL, .output_queues_config = NULL, - .recv_queue = NULL, - .send_queue = NULL }; diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index c0de59f..c7df7c7 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -606,8 +606,8 @@ static uint32_t _rx_pkt_to_iovec(odp_packet_t pkt, /* * ODP_PACKET_SOCKET_MMSG: */ -static int sock_mmsg_recv(pktio_entry_t *pktio_entry, - odp_packet_t pkt_table[], unsigned len) +static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, + odp_packet_t pkt_table[], int len) { pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock; odp_time_t ts_val; @@ -624,6 +624,8 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, if (odp_unlikely(len > ODP_PACKET_SOCKET_MAX_BURST_RX)) return -1; + odp_ticketlock_lock(&pktio_entry->s.rxl); + if (pktio_entry->s.config.pktin.bit.ts_all || pktio_entry->s.config.pktin.bit.ts_ptp) ts = &ts_val; @@ -707,6 +709,7 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, msgvec[i].msg_len); packet_parse_l2(pkt_hdr); packet_set_ts(pkt_hdr, ts); + pkt_hdr->input = pktio_entry->s.handle; pkt_table[nb_rx] = pkt_table[i]; nb_rx++; @@ -716,6 +719,9 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, for (; i < msgvec_len; i++) odp_packet_free(pkt_table[i]); } + + odp_ticketlock_unlock(&pktio_entry->s.rxl); + return nb_rx; } @@ -741,19 +747,21 @@ static uint32_t _tx_pkt_to_iovec(odp_packet_t pkt, /* * ODP_PACKET_SOCKET_MMSG: */ -static int sock_mmsg_send(pktio_entry_t *pktio_entry, - const odp_packet_t pkt_table[], unsigned len) +static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, + const odp_packet_t pkt_table[], int len) { pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock; struct mmsghdr msgvec[ODP_PACKET_SOCKET_MAX_BURST_TX]; struct iovec iovecs[ODP_PACKET_SOCKET_MAX_BURST_TX][ODP_BUFFER_MAX_SEG]; int ret; int sockfd; - unsigned n, i; + int n, i; if (odp_unlikely(len > ODP_PACKET_SOCKET_MAX_BURST_TX)) return -1; + odp_ticketlock_lock(&pktio_entry->s.txl); + sockfd = pkt_sock->sockfd; memset(msgvec, 0, sizeof(msgvec)); @@ -768,7 +776,8 @@ static int sock_mmsg_send(pktio_entry_t *pktio_entry, if (odp_unlikely(ret <= -1)) { if (i == 0 && SOCK_ERR_REPORT(errno)) { __odp_errno = errno; - ODP_ERR("sendmmsg(): %s\n", strerror(errno)); + ODP_ERR("sendmmsg(): %s\n", strerror(errno)); + odp_ticketlock_unlock(&pktio_entry->s.txl); return -1; } break; @@ -777,6 +786,8 @@ static int sock_mmsg_send(pktio_entry_t *pktio_entry, i += ret; } + odp_ticketlock_unlock(&pktio_entry->s.txl); + for (n = 0; n < i; ++n) odp_packet_free(pkt_table[n]); @@ -891,6 +902,4 @@ const pktio_if_ops_t sock_mmsg_pktio_ops = { .config = NULL, .input_queues_config = NULL, .output_queues_config = NULL, - .recv_queue = NULL, - .send_queue = NULL }; diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c index c14ec9f..ce05775 100644 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@ -219,6 +219,7 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, packet_parse_l2(hdr); packet_set_ts(hdr, ts); + hdr->input = pktio_entry->s.handle; nb_rx++; } @@ -581,22 +582,32 @@ error: return -1; } -static int sock_mmap_recv(pktio_entry_t *pktio_entry, - odp_packet_t pkt_table[], unsigned len) +static int sock_mmap_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, + odp_packet_t pkt_table[], int len) { pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap; + int ret; - return pkt_mmap_v2_rx(pktio_entry, pkt_sock, - pkt_table, len, pkt_sock->if_mac); + odp_ticketlock_lock(&pktio_entry->s.rxl); + ret = pkt_mmap_v2_rx(pktio_entry, pkt_sock, pkt_table, len, + pkt_sock->if_mac); + odp_ticketlock_unlock(&pktio_entry->s.rxl); + + return ret; } -static int sock_mmap_send(pktio_entry_t *pktio_entry, - const odp_packet_t pkt_table[], unsigned len) +static int sock_mmap_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, + const odp_packet_t pkt_table[], int len) { + int ret; pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap; - return pkt_mmap_v2_tx(pkt_sock->tx_ring.sock, &pkt_sock->tx_ring, - pkt_table, len); + odp_ticketlock_lock(&pktio_entry->s.txl); + ret = pkt_mmap_v2_tx(pkt_sock->tx_ring.sock, &pkt_sock->tx_ring, + pkt_table, len); + odp_ticketlock_unlock(&pktio_entry->s.txl); + + return ret; } static uint32_t sock_mmap_mtu_get(pktio_entry_t *pktio_entry) @@ -695,6 +706,4 @@ const pktio_if_ops_t sock_mmap_pktio_ops = { .config = NULL, .input_queues_config = NULL, .output_queues_config = NULL, - .recv_queue = NULL, - .send_queue = NULL }; diff --git a/platform/linux-generic/pktio/tap.c b/platform/linux-generic/pktio/tap.c index 4ca11e6..975ad25 100644 --- a/platform/linux-generic/pktio/tap.c +++ b/platform/linux-generic/pktio/tap.c @@ -179,13 +179,13 @@ static int tap_pktio_close(pktio_entry_t *pktio_entry) return ret; } -static odp_packet_t pack_odp_pkt(odp_pool_t pool, const void *data, +static odp_packet_t pack_odp_pkt(pktio_entry_t *pktio_entry, const void *data, unsigned int len, odp_time_t *ts) { odp_packet_t pkt; odp_packet_hdr_t *pkt_hdr; - pkt = packet_alloc(pool, len, 1); + pkt = packet_alloc(pktio_entry->s.pkt_tap.pool, len, 1); if (pkt == ODP_PACKET_INVALID) return pkt; @@ -199,20 +199,23 @@ static odp_packet_t pack_odp_pkt(odp_pool_t pool, const void *data, pkt_hdr = odp_packet_hdr(pkt); packet_parse_l2(pkt_hdr); packet_set_ts(pkt_hdr, ts); + pkt_hdr->input = pktio_entry->s.handle; return pkt; } -static int tap_pktio_recv(pktio_entry_t *pktio_entry, odp_packet_t pkts[], - unsigned len) +static int tap_pktio_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, + odp_packet_t pkts[], int len) { ssize_t retval; - unsigned i; + int i; uint8_t buf[BUF_SIZE]; pkt_tap_t *tap = &pktio_entry->s.pkt_tap; odp_time_t ts_val; odp_time_t *ts = NULL; + odp_ticketlock_lock(&pktio_entry->s.rxl); + if (pktio_entry->s.config.pktin.bit.ts_all || pktio_entry->s.config.pktin.bit.ts_ptp) ts = &ts_val; @@ -230,19 +233,21 @@ static int tap_pktio_recv(pktio_entry_t *pktio_entry, odp_packet_t pkts[], break; } - pkts[i] = pack_odp_pkt(tap->pool, buf, retval, ts); + pkts[i] = pack_odp_pkt(pktio_entry, buf, retval, ts); if (pkts[i] == ODP_PACKET_INVALID) break; } + odp_ticketlock_unlock(&pktio_entry->s.rxl); + return i; } -static int tap_pktio_send(pktio_entry_t *pktio_entry, const odp_packet_t pkts[], - unsigned len) +static int tap_pktio_send_lockless(pktio_entry_t *pktio_entry, + const odp_packet_t pkts[], int len) { ssize_t retval; - unsigned i, n; + int i, n; uint32_t pkt_len; uint8_t buf[BUF_SIZE]; pkt_tap_t *tap = &pktio_entry->s.pkt_tap; @@ -290,6 +295,20 @@ static int tap_pktio_send(pktio_entry_t *pktio_entry, const odp_packet_t pkts[], return i; } +static int tap_pktio_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, + const odp_packet_t pkts[], int len) +{ + int ret; + + odp_ticketlock_lock(&pktio_entry->s.txl); + + ret = tap_pktio_send_lockless(pktio_entry, pkts, len); + + odp_ticketlock_unlock(&pktio_entry->s.txl); + + return ret; +} + static uint32_t tap_mtu_get(pktio_entry_t *pktio_entry) { uint32_t ret;