[dpdk-dev] [dpdk-stable] [PATCH 3/3] net/pcap: fix concurrent multiseg packet transmits
Ferruh Yigit
ferruh.yigit at intel.com
Thu Jul 25 13:07:06 CEST 2019
On 7/25/2019 9:18 AM, David Marchand wrote:
> 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 ?
Right, +1 to skip 'rte_pktmbuf_is_contiguous()' only it can be good to comment
'rte_pktmbuf_read()' usage to say it covers multi-segment too.
More information about the dev
mailing list