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 29FA7430EE for ; Thu, 24 Aug 2023 10:09:35 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0A9C340EE1; Thu, 24 Aug 2023 10:09:35 +0200 (CEST) Received: from mail-ot1-f99.google.com (mail-ot1-f99.google.com [209.85.210.99]) by mails.dpdk.org (Postfix) with ESMTP id B7FBA40EE1 for ; Thu, 24 Aug 2023 10:09:33 +0200 (CEST) Received: by mail-ot1-f99.google.com with SMTP id 46e09a7af769-6bd04558784so4774002a34.3 for ; Thu, 24 Aug 2023 01:09:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; t=1692864573; x=1693469373; h=cc:to:from:subject:message-id:date:from:to:cc:subject:date :message-id:reply-to; bh=KpRLmO8Ohoom3c35+hKQ4NIadDnx12YEJCTwKOk2uzQ=; b=Uj6Q0zI+kpJEcPlUxLpBav8aROXeZ9RQp87+s9GZTOuHeuqqaHSVJQr4lD+GwdVuQ2 1vMin/v2LYb5o3xpzZBqHPpFI/KT0f1kiW0HJHNxyyptx1A5nyd0P5/tu6xRaZbo0XcK +8UA8uXqFR0ohJbM/kaZs9YlFLCmJ2Q8dXUg4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1692864573; x=1693469373; h=cc:to:from:subject:message-id:date:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KpRLmO8Ohoom3c35+hKQ4NIadDnx12YEJCTwKOk2uzQ=; b=gzJeGhP0GrZDWleq6uGWpnJ4aoqG7Bz7rNqkcrUDkHIZurdanmzeDWNDtu+UEmMn4v E+f9xhzusjLgbkld6wzZxnNNmHWo+0qj4I8d+hyaXABdbZRTfGc6D8Wnu2P5NR6IOLJc C/oHLxEryckiZKkAUr6R9/FBqnVop87TMEwQy4diA7SW1WTMtWFvjJu0+wELPNmR5tr4 kKIZQTrvWXfqRDk2551hD8YamVggvEM4L7cYsPyu7KrbxUeDPKzODNXeGiBLNeM4tHEE AMyMcRnQlPYx2Sg4oHRkGxxT2XnHnSLHr7mRVjY4EeXxnm60JbDvg5bHjZwE6icCe/Tv bZEw== X-Gm-Message-State: AOJu0YzNyLpvYmEfMKkmUJGZKJ+UCiGN30sAIuGHuQjMXZt2LygWOKj4 uGbP6KatxDg7+QHOcVcjRcaZ7nbupwRC3oSovWHNmOMKWs8kGNQ5gMvWLw== X-Google-Smtp-Source: AGHT+IFOLeh8JFMdnRcv7kM0mIIbgl7uDFe1b75RZdjGIkOcFpYDU4wbSnUOKzJ5LsUiOYxIrzpm45xLyeOW X-Received: by 2002:a9d:6255:0:b0:6bd:7252:9db1 with SMTP id i21-20020a9d6255000000b006bd72529db1mr1773501otk.11.1692864572950; Thu, 24 Aug 2023 01:09:32 -0700 (PDT) Received: from postal.iol.unh.edu (postal.iol.unh.edu. [132.177.123.84]) by smtp-relay.gmail.com with ESMTPS id o15-20020a0568301c4f00b006b9e98ce2casm743063otg.5.2023.08.24.01.09.32 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 24 Aug 2023 01:09:32 -0700 (PDT) X-Relaying-Domain: iol.unh.edu Date: Thu, 24 Aug 2023 01:09:32 -0700 (PDT) Message-ID: <64e7103c.050a0220.e4806.2160SMTPIN_ADDED_MISSING@mx.google.com> Received: from [172.21.0.2] (unknown [172.18.0.240]) by postal.iol.unh.edu (Postfix) with ESMTP id 520F56052471; Thu, 24 Aug 2023 04:09:32 -0400 (EDT) Subject: |WARNING| pw130693-130694 [PATCH] [v3, 3/3] net/tap: rework checksum offloading From: dpdklab@iol.unh.edu To: test-report@dpdk.org Cc: dpdk-test-reports@iol.unh.edu Content-Type: text/plain X-BeenThere: test-report@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: automatic DPDK test reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: test-report-bounces@dpdk.org Test-Label: iol-testing Test-Status: WARNING http://dpdk.org/patch/130693 _apply patch failure_ Submitter: David Marchand Date: Thursday, August 24 2023 07:18:22 Applied on: CommitID:6a5507a4511afd0203d924a08517c55b35e6e74b Apply patch set 130693-130694 failed: Checking patch drivers/net/tap/rte_eth_tap.c... error: while searching for: return num_rx; } /* Finalize l4 checksum calculation */ static void tap_tx_l4_cksum(uint16_t *l4_cksum, uint16_t l4_phdr_cksum, uint32_t l4_raw_cksum) { if (l4_cksum) { uint32_t cksum; cksum = __rte_raw_cksum_reduce(l4_raw_cksum); cksum += l4_phdr_cksum; cksum = ((cksum & 0xffff0000) >> 16) + (cksum & 0xffff); cksum = (~cksum) & 0xffff; if (cksum == 0) cksum = 0xffff; *l4_cksum = cksum; } } /* Accumulate L4 raw checksums */ static void tap_tx_l4_add_rcksum(char *l4_data, unsigned int l4_len, uint16_t *l4_cksum, uint32_t *l4_raw_cksum) { if (l4_cksum == NULL) return; *l4_raw_cksum = __rte_raw_cksum(l4_data, l4_len, *l4_raw_cksum); } /* L3 and L4 pseudo headers checksum offloads */ static void tap_tx_l3_cksum(char *packet, uint64_t ol_flags, unsigned int l2_len, unsigned int l3_len, unsigned int l4_len, uint16_t **l4_cksum, uint16_t *l4_phdr_cksum, uint32_t *l4_raw_cksum) { void *l3_hdr = packet + l2_len; if (ol_flags & RTE_MBUF_F_TX_IP_CKSUM) { struct rte_ipv4_hdr *iph = l3_hdr; uint16_t cksum; iph->hdr_checksum = 0; cksum = rte_raw_cksum(iph, l3_len); iph->hdr_checksum = (cksum == 0xffff) ? cksum : ~cksum; } if (ol_flags & RTE_MBUF_F_TX_L4_MASK) { void *l4_hdr; l4_hdr = packet + l2_len + l3_len; if ((ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_UDP_CKSUM) *l4_cksum = &((struct rte_udp_hdr *)l4_hdr)->dgram_cksum; else if ((ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_TCP_CKSUM) *l4_cksum = &((struct rte_tcp_hdr *)l4_hdr)->cksum; else return; **l4_cksum = 0; if (ol_flags & RTE_MBUF_F_TX_IPV4) *l4_phdr_cksum = rte_ipv4_phdr_cksum(l3_hdr, 0); else *l4_phdr_cksum = rte_ipv6_phdr_cksum(l3_hdr, 0); *l4_raw_cksum = __rte_raw_cksum(l4_hdr, l4_len, 0); } } static inline int tap_write_mbufs(struct tx_queue *txq, uint16_t num_mbufs, struct rte_mbuf **pmbufs, uint16_t *num_packets, unsigned long *num_tx_bytes) { int i; uint16_t l234_hlen; struct pmd_process_private *process_private; process_private = rte_eth_devices[txq->out_port].process_private; error: patch failed: drivers/net/tap/rte_eth_tap.c:521 Hunk #2 succeeded at 602 (offset 66 lines). error: while searching for: iovecs[k].iov_len = sizeof(pi); k++; nb_segs = mbuf->nb_segs; if (txq->csum && ((mbuf->ol_flags & RTE_MBUF_F_TX_IP_CKSUM || (mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_UDP_CKSUM || (mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_TCP_CKSUM))) { unsigned int l4_len = 0; is_cksum = 1; if ((mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_UDP_CKSUM) l4_len = sizeof(struct rte_udp_hdr); else if ((mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_TCP_CKSUM) l4_len = sizeof(struct rte_tcp_hdr); /* Support only packets with at least layer 4 * header included in the first segment */ seg_len = rte_pktmbuf_data_len(mbuf); l234_hlen = mbuf->l2_len + mbuf->l3_len + l4_len; if (seg_len < l234_hlen) return -1; /* To change checksums, work on a * copy of l2, l3 * headers + l4 pseudo header */ rte_memcpy(m_copy, rte_pktmbuf_mtod(mbuf, void *), l234_hlen); tap_tx_l3_cksum(m_copy, mbuf->ol_flags, mbuf->l2_len, mbuf->l3_len, l4_len, &l4_cksum, &l4_phdr_cksum, &l4_raw_cksum); iovecs[k].iov_base = m_copy; iovecs[k].iov_len = l234_hlen; k++; /* Update next iovecs[] beyond l2, l3, l4 headers */ if (seg_len > l234_hlen) { iovecs[k].iov_len = seg_len - l234_hlen; iovecs[k].iov_base = rte_pktmbuf_mtod(seg, char *) + l234_hlen; tap_tx_l4_add_rcksum(iovecs[k].iov_base, iovecs[k].iov_len, l4_cksum, &l4_raw_cksum); k++; nb_segs++; } seg = seg->next; } for (j = k; j <= nb_segs; j++) { iovecs[j].iov_len = rte_pktmbuf_data_len(seg); iovecs[j].iov_base = rte_pktmbuf_mtod(seg, void *); if (is_cksum) tap_tx_l4_add_rcksum(iovecs[j].iov_base, iovecs[j].iov_len, l4_cksum, &l4_raw_cksum); seg = seg->next; } if (is_cksum) tap_tx_l4_cksum(l4_cksum, l4_phdr_cksum, l4_raw_cksum); /* copy the tx frame data */ n = writev(process_private->txq_fds[txq->queue_id], iovecs, j); if (n <= 0) return -1; error: patch failed: drivers/net/tap/rte_eth_tap.c:640 Hunk #4 succeeded at 794 (offset 56 lines). Applying patch drivers/net/tap/rte_eth_tap.c with 2 rejects... Rejected hunk #1. Hunk #2 applied cleanly. Rejected hunk #3. Hunk #4 applied cleanly. hint: Use 'git am --show-current-patch' to see the failed patch diff a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c (rejected hunks) @@ -521,79 +521,13 @@ pmd_rx_burst(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) return num_rx; } -/* Finalize l4 checksum calculation */ -static void -tap_tx_l4_cksum(uint16_t *l4_cksum, uint16_t l4_phdr_cksum, - uint32_t l4_raw_cksum) -{ - if (l4_cksum) { - uint32_t cksum; - - cksum = __rte_raw_cksum_reduce(l4_raw_cksum); - cksum += l4_phdr_cksum; - - cksum = ((cksum & 0xffff0000) >> 16) + (cksum & 0xffff); - cksum = (~cksum) & 0xffff; - if (cksum == 0) - cksum = 0xffff; - *l4_cksum = cksum; - } -} - -/* Accumulate L4 raw checksums */ -static void -tap_tx_l4_add_rcksum(char *l4_data, unsigned int l4_len, uint16_t *l4_cksum, - uint32_t *l4_raw_cksum) -{ - if (l4_cksum == NULL) - return; - - *l4_raw_cksum = __rte_raw_cksum(l4_data, l4_len, *l4_raw_cksum); -} - -/* L3 and L4 pseudo headers checksum offloads */ -static void -tap_tx_l3_cksum(char *packet, uint64_t ol_flags, unsigned int l2_len, - unsigned int l3_len, unsigned int l4_len, uint16_t **l4_cksum, - uint16_t *l4_phdr_cksum, uint32_t *l4_raw_cksum) -{ - void *l3_hdr = packet + l2_len; - - if (ol_flags & RTE_MBUF_F_TX_IP_CKSUM) { - struct rte_ipv4_hdr *iph = l3_hdr; - uint16_t cksum; - - iph->hdr_checksum = 0; - cksum = rte_raw_cksum(iph, l3_len); - iph->hdr_checksum = (cksum == 0xffff) ? cksum : ~cksum; - } - if (ol_flags & RTE_MBUF_F_TX_L4_MASK) { - void *l4_hdr; - - l4_hdr = packet + l2_len + l3_len; - if ((ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_UDP_CKSUM) - *l4_cksum = &((struct rte_udp_hdr *)l4_hdr)->dgram_cksum; - else if ((ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_TCP_CKSUM) - *l4_cksum = &((struct rte_tcp_hdr *)l4_hdr)->cksum; - else - return; - **l4_cksum = 0; - if (ol_flags & RTE_MBUF_F_TX_IPV4) - *l4_phdr_cksum = rte_ipv4_phdr_cksum(l3_hdr, 0); - else - *l4_phdr_cksum = rte_ipv6_phdr_cksum(l3_hdr, 0); - *l4_raw_cksum = __rte_raw_cksum(l4_hdr, l4_len, 0); - } -} - static inline int tap_write_mbufs(struct tx_queue *txq, uint16_t num_mbufs, struct rte_mbuf **pmbufs, uint16_t *num_packets, unsigned long *num_tx_bytes) { - int i; - uint16_t l234_hlen; struct pmd_process_private *process_private; + int i; process_private = rte_eth_devices[txq->out_port].process_private; @@ -640,73 +567,83 @@ tap_write_mbufs(struct tx_queue *txq, uint16_t num_mbufs, iovecs[k].iov_len = sizeof(pi); k++; - nb_segs = mbuf->nb_segs; - if (txq->csum && - ((mbuf->ol_flags & RTE_MBUF_F_TX_IP_CKSUM || - (mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_UDP_CKSUM || - (mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_TCP_CKSUM))) { - unsigned int l4_len = 0; - - is_cksum = 1; - - if ((mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) == - RTE_MBUF_F_TX_UDP_CKSUM) - l4_len = sizeof(struct rte_udp_hdr); - else if ((mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) == - RTE_MBUF_F_TX_TCP_CKSUM) - l4_len = sizeof(struct rte_tcp_hdr); + l4_ol_flags = mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK; + if (txq->csum && (mbuf->ol_flags & RTE_MBUF_F_TX_IP_CKSUM || + l4_ol_flags == RTE_MBUF_F_TX_UDP_CKSUM || + l4_ol_flags == RTE_MBUF_F_TX_TCP_CKSUM)) { + unsigned hdrlens = mbuf->l2_len + mbuf->l3_len; + uint16_t *l4_cksum; + void *l3_hdr; + + if (l4_ol_flags == RTE_MBUF_F_TX_UDP_CKSUM) + hdrlens += sizeof(struct rte_udp_hdr); + else if (l4_ol_flags == RTE_MBUF_F_TX_TCP_CKSUM) + hdrlens += sizeof(struct rte_tcp_hdr); + else if (l4_ol_flags != RTE_MBUF_F_TX_L4_NO_CKSUM) + return -1; /* Support only packets with at least layer 4 * header included in the first segment */ - seg_len = rte_pktmbuf_data_len(mbuf); - l234_hlen = mbuf->l2_len + mbuf->l3_len + l4_len; - if (seg_len < l234_hlen) + if (rte_pktmbuf_data_len(mbuf) < hdrlens) return -1; - /* To change checksums, work on a * copy of l2, l3 - * headers + l4 pseudo header + /* To change checksums (considering that a mbuf can be + * indirect, for example), copy l2, l3 and l4 headers + * in a new segment and chain it to existing data */ - rte_memcpy(m_copy, rte_pktmbuf_mtod(mbuf, void *), - l234_hlen); - tap_tx_l3_cksum(m_copy, mbuf->ol_flags, - mbuf->l2_len, mbuf->l3_len, l4_len, - &l4_cksum, &l4_phdr_cksum, - &l4_raw_cksum); - iovecs[k].iov_base = m_copy; - iovecs[k].iov_len = l234_hlen; - k++; + seg = rte_pktmbuf_copy(mbuf, mbuf->pool, 0, hdrlens); + if (seg == NULL) + return -1; + rte_pktmbuf_adj(mbuf, hdrlens); + rte_pktmbuf_chain(seg, mbuf); + pmbufs[i] = mbuf = seg; + + l3_hdr = rte_pktmbuf_mtod_offset(mbuf, void *, mbuf->l2_len); + if (mbuf->ol_flags & RTE_MBUF_F_TX_IP_CKSUM) { + struct rte_ipv4_hdr *iph = l3_hdr; - /* Update next iovecs[] beyond l2, l3, l4 headers */ - if (seg_len > l234_hlen) { - iovecs[k].iov_len = seg_len - l234_hlen; - iovecs[k].iov_base = - rte_pktmbuf_mtod(seg, char *) + - l234_hlen; - tap_tx_l4_add_rcksum(iovecs[k].iov_base, - iovecs[k].iov_len, l4_cksum, - &l4_raw_cksum); - k++; - nb_segs++; + iph->hdr_checksum = 0; + iph->hdr_checksum = rte_ipv4_cksum(iph); + } + + if (l4_ol_flags == RTE_MBUF_F_TX_L4_NO_CKSUM) + goto skip_l4_cksum; + + if (l4_ol_flags == RTE_MBUF_F_TX_UDP_CKSUM) { + struct rte_udp_hdr *udp_hdr; + + udp_hdr = rte_pktmbuf_mtod_offset(mbuf, struct rte_udp_hdr *, + mbuf->l2_len + mbuf->l3_len); + l4_cksum = &udp_hdr->dgram_cksum; + } else { + struct rte_tcp_hdr *tcp_hdr; + + tcp_hdr = rte_pktmbuf_mtod_offset(mbuf, struct rte_tcp_hdr *, + mbuf->l2_len + mbuf->l3_len); + l4_cksum = &tcp_hdr->cksum; + } + + *l4_cksum = 0; + if (mbuf->ol_flags & RTE_MBUF_F_TX_IPV4) { + *l4_cksum = rte_ipv4_udptcp_cksum_mbuf(mbuf, l3_hdr, + mbuf->l2_len + mbuf->l3_len); + } else { + *l4_cksum = rte_ipv6_udptcp_cksum_mbuf(mbuf, l3_hdr, + mbuf->l2_len + mbuf->l3_len); } - seg = seg->next; } - for (j = k; j <= nb_segs; j++) { - iovecs[j].iov_len = rte_pktmbuf_data_len(seg); - iovecs[j].iov_base = rte_pktmbuf_mtod(seg, void *); - if (is_cksum) - tap_tx_l4_add_rcksum(iovecs[j].iov_base, - iovecs[j].iov_len, l4_cksum, - &l4_raw_cksum); +skip_l4_cksum: + for (j = 0; j < mbuf->nb_segs; j++) { + iovecs[k].iov_len = rte_pktmbuf_data_len(seg); + iovecs[k].iov_base = rte_pktmbuf_mtod(seg, void *); + k++; seg = seg->next; } - if (is_cksum) - tap_tx_l4_cksum(l4_cksum, l4_phdr_cksum, l4_raw_cksum); - /* copy the tx frame data */ - n = writev(process_private->txq_fds[txq->queue_id], iovecs, j); + n = writev(process_private->txq_fds[txq->queue_id], iovecs, k); if (n <= 0) return -1; https://lab.dpdk.org/results/dashboard/patchsets/27431/ UNH-IOL DPDK Community Lab