[dpdk-stable] [PATCH 3/3] net/pcap: fix concurrent multiseg packet transmits
David Marchand
david.marchand at redhat.com
Thu Jul 25 10:18:32 CEST 2019
On Wed, Jul 24, 2019 at 1:55 PM David Marchand
<david.marchand at redhat.com> wrote:
>
> Two cores can send multi segment packets on two different pcap ports.
> Because of this, we can't have one single buffer to linearize packets.
>
> Use rte_pktmbuf_read() to copy the packet into a buffer on the stack
> and remove eth_pcap_gather_data().
>
> Fixes: 6db141c91e1f ("pcap: support jumbo frames")
> Cc: stable at dpdk.org
>
> Signed-off-by: David Marchand <david.marchand at redhat.com>
> ---
> drivers/net/pcap/rte_eth_pcap.c | 90 +++++++++++++++--------------------------
> 1 file changed, 32 insertions(+), 58 deletions(-)
>
> diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c
> index 5e5aab7..7398b1b 100644
> --- a/drivers/net/pcap/rte_eth_pcap.c
> +++ b/drivers/net/pcap/rte_eth_pcap.c
[snip]
> @@ -336,31 +323,25 @@ struct pmd_devargs_all {
> * dumper */
> for (i = 0; i < nb_pkts; i++) {
> mbuf = bufs[i];
> - calculate_timestamp(&header.ts);
> - header.len = mbuf->pkt_len;
> - header.caplen = header.len;
> -
> - if (likely(mbuf->nb_segs == 1)) {
> - pcap_dump((u_char *)dumper, &header,
> - rte_pktmbuf_mtod(mbuf, void*));
> + len = rte_pktmbuf_pkt_len(mbuf);
> + if (likely(rte_pktmbuf_is_contiguous(mbuf))) {
> + data = rte_pktmbuf_mtod(mbuf, unsigned char *);
> + } else if (len <= sizeof(_data)) {
> + data = rte_pktmbuf_read(mbuf, 0, len, _data);
We can actually skip the check on contiguous data, since
rte_pktmbuf_read returns a pointer to the mbuf data without copying.
WDYT ?
--
David Marchand
More information about the stable
mailing list