From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by dpdk.org (Postfix) with ESMTP id B00187D19 for ; Fri, 5 Jan 2018 09:18:42 +0100 (CET) Received: by mail-wm0-f66.google.com with SMTP id g75so971800wme.0 for ; Fri, 05 Jan 2018 00:18:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding:content-language; bh=IfwjOXsVqQO1HdmJlwQofXgEzrgg5cEBTh+3+Fsecn4=; b=wRGqCat3PDcF6ZxD9p6fxR/Ca697kGNBr/O65j/k7F5Uo8g0DPWHeJ4GUpxMI14JCO DUirRhGHgY93QWZC1H/THSJaHUVGH7TTaeDACvOZ22cyAkGORf74Uh73Ep+GCGXgBoGA DHu2iUfsWoE3x5POsHkym4EGSY0UyxUR3HM+g/mjKcWqnU4lSfaxVMw3S/ekrL4+qBgZ E8L3i0O+CNUeeOrc/nUKbVVJsY71vyoqpzY4mynV84c0nVWzCdEEC/z9Bs32DqTSXhI6 Daeui0Nuf7EVSJHa2zIzUZWUQMT7tJ4oma1gqaDMmgyaY/b8wOqdKRo8MxtcbAJpxuhC ad8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=IfwjOXsVqQO1HdmJlwQofXgEzrgg5cEBTh+3+Fsecn4=; b=HOwH2sPPXYnTPqeEc303J7asWXv3yUF+rMeLDo/VayGDCL+VUqxRHgom5RwkPVCuUh F9Wxwa2vjQ59TFmJYGncB3MzCtjBBafKBQh80s1y9MrAZ5YHMMMEVCgWBHr+hAbnhySA RJ7T6cpdcPvicupRU0fWFr6UINLaL0uv/Cm2pjcuSfcwlcKfWtn6yF/mQnd7r8lBaLdf bVxRh1uu75tw7M0u28eKBN2/WqIqVM6uuLTAydFgGhV/HQMTFgAlN7/FtYrg6F3DLxC5 6Kkt9Ln5lfdNvQcqN1Q9rM7FVQJBj6EMk+DLTFPIPv7Enr2kgwEoswLQ7DikLjVYHpTl xo/w== X-Gm-Message-State: AKGB3mJpGX71PTWxUXldHyGXnpnId0n1JScNLy1/9DnMPEHfbhRm4w9/ 90Wy601XRLc+GZqDr5ficcW6lYw3TFk= X-Google-Smtp-Source: ACJfBovJbt60cLKZlSe12IdmREKjkHrKIRoborSMsCSe41Gl2LsRqGo8hMWXjRKC8Td2hFDcMtauRg== X-Received: by 10.80.183.184 with SMTP id h53mr3055389ede.249.1515140321992; Fri, 05 Jan 2018 00:18:41 -0800 (PST) Received: from [192.168.1.58] (82.107.69.91.rev.sfr.net. [91.69.107.82]) by smtp.gmail.com with ESMTPSA id a10sm1794880edi.40.2018.01.05.00.18.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 05 Jan 2018 00:18:41 -0800 (PST) To: Moti Haimovsky Cc: dev@dpdk.org References: <1515093521-185221-1-git-send-email-motih@mellanox.com> <1515093521-185221-2-git-send-email-motih@mellanox.com> From: Pascal Mazon Message-ID: Date: Fri, 5 Jan 2018 09:18:40 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 MIME-Version: 1.0 In-Reply-To: <1515093521-185221-2-git-send-email-motih@mellanox.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-Language: en-US Subject: Re: [dpdk-dev] [PATCH V3 1/2] net/tap: convert to new Tx offloads API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 05 Jan 2018 08:18:42 -0000 Hi, Good job, this patch looks good to me. Acked-by: Pascal Mazon On 04/01/2018 20:18, Moti Haimovsky wrote: > Ethdev Tx offloads API has changed since: > commit cba7f53b717d ("ethdev: introduce Tx queue offloads API") > This commit support the new Tx offloads API. > > Signed-off-by: Moti Haimovsky > --- > V3: > * Fixed coding style warnings > > V2: > * Fixed coding style warnings > --- > drivers/net/tap/rte_eth_tap.c | 96 +++++++++++++++++++++++++++++++++++++------ > drivers/net/tap/rte_eth_tap.h | 1 + > 2 files changed, 85 insertions(+), 12 deletions(-) > > diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c > index 6b27679..1a84adb 100644 > --- a/drivers/net/tap/rte_eth_tap.c > +++ b/drivers/net/tap/rte_eth_tap.c > @@ -53,6 +53,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -379,6 +380,42 @@ enum ioctl_mode { > return num_rx; > } > > +static uint64_t > +tap_tx_offload_get_port_capa(void) > +{ > + /* > + * In order to support legacy apps, > + * report capabilities also as port capabilities. > + */ > + return DEV_TX_OFFLOAD_IPV4_CKSUM | > + DEV_TX_OFFLOAD_UDP_CKSUM | > + DEV_TX_OFFLOAD_TCP_CKSUM; > +} > + > +static uint64_t > +tap_tx_offload_get_queue_capa(void) > +{ > + return DEV_TX_OFFLOAD_IPV4_CKSUM | > + DEV_TX_OFFLOAD_UDP_CKSUM | > + DEV_TX_OFFLOAD_TCP_CKSUM; > +} > + > +static bool > +tap_txq_are_offloads_valid(struct rte_eth_dev *dev, uint64_t offloads) > +{ > + uint64_t port_offloads = dev->data->dev_conf.txmode.offloads; > + uint64_t queue_supp_offloads = tap_tx_offload_get_queue_capa(); > + uint64_t port_supp_offloads = tap_tx_offload_get_port_capa(); > + > + if ((offloads & (queue_supp_offloads | port_supp_offloads)) != > + offloads) > + return false; > + /* Verify we have no conflict with port offloads */ > + if ((port_offloads ^ offloads) & port_supp_offloads) > + return false; > + return true; > +} > + > static void > tap_tx_offload(char *packet, uint64_t ol_flags, unsigned int l2_len, > unsigned int l3_len) > @@ -465,9 +502,10 @@ enum ioctl_mode { > rte_pktmbuf_mtod(seg, void *); > seg = seg->next; > } > - if (mbuf->ol_flags & (PKT_TX_IP_CKSUM | PKT_TX_IPV4) || > - (mbuf->ol_flags & PKT_TX_L4_MASK) == PKT_TX_UDP_CKSUM || > - (mbuf->ol_flags & PKT_TX_L4_MASK) == PKT_TX_TCP_CKSUM) { > + if (txq->csum && > + ((mbuf->ol_flags & (PKT_TX_IP_CKSUM | PKT_TX_IPV4) || > + (mbuf->ol_flags & PKT_TX_L4_MASK) == PKT_TX_UDP_CKSUM || > + (mbuf->ol_flags & PKT_TX_L4_MASK) == PKT_TX_TCP_CKSUM))) { > /* Support only packets with all data in the same seg */ > if (mbuf->nb_segs > 1) > break; > @@ -605,6 +643,17 @@ enum ioctl_mode { > static int > tap_dev_configure(struct rte_eth_dev *dev) > { > + uint64_t supp_tx_offloads = tap_tx_offload_get_port_capa(); > + uint64_t tx_offloads = dev->data->dev_conf.txmode.offloads; > + > + if ((tx_offloads & supp_tx_offloads) != tx_offloads) { > + rte_errno = ENOTSUP; > + RTE_LOG(ERR, PMD, > + "Some Tx offloads are not supported " > + "requested 0x%lx supported 0x%lx\n", > + tx_offloads, supp_tx_offloads); > + return -rte_errno; > + } > if (dev->data->nb_rx_queues > RTE_PMD_TAP_MAX_QUEUES) { > RTE_LOG(ERR, PMD, > "%s: number of rx queues %d exceeds max num of queues %d\n", > @@ -681,10 +730,9 @@ enum ioctl_mode { > dev_info->rx_offload_capa = (DEV_RX_OFFLOAD_IPV4_CKSUM | > DEV_RX_OFFLOAD_UDP_CKSUM | > DEV_RX_OFFLOAD_TCP_CKSUM); > - dev_info->tx_offload_capa = > - (DEV_TX_OFFLOAD_IPV4_CKSUM | > - DEV_TX_OFFLOAD_UDP_CKSUM | > - DEV_TX_OFFLOAD_TCP_CKSUM); > + dev_info->tx_queue_offload_capa = tap_tx_offload_get_queue_capa(); > + dev_info->tx_offload_capa = dev_info->tx_queue_offload_capa | > + tap_tx_offload_get_port_capa(); > } > > static int > @@ -1058,21 +1106,45 @@ enum ioctl_mode { > uint16_t tx_queue_id, > uint16_t nb_tx_desc __rte_unused, > unsigned int socket_id __rte_unused, > - const struct rte_eth_txconf *tx_conf __rte_unused) > + const struct rte_eth_txconf *tx_conf) > { > struct pmd_internals *internals = dev->data->dev_private; > + struct tx_queue *txq; > int ret; > > if (tx_queue_id >= dev->data->nb_tx_queues) > return -1; > - > dev->data->tx_queues[tx_queue_id] = &internals->txq[tx_queue_id]; > + txq = dev->data->tx_queues[tx_queue_id]; > + /* > + * Don't verify port offloads for application which > + * use the old API. > + */ > + if (tx_conf != NULL && > + !!(tx_conf->txq_flags & ETH_TXQ_FLAGS_IGNORE)) { > + if (tap_txq_are_offloads_valid(dev, tx_conf->offloads)) { > + txq->csum = !!(tx_conf->offloads & > + (DEV_TX_OFFLOAD_IPV4_CKSUM | > + DEV_TX_OFFLOAD_UDP_CKSUM | > + DEV_TX_OFFLOAD_TCP_CKSUM)); > + } else { > + rte_errno = ENOTSUP; > + RTE_LOG(ERR, PMD, > + "%p: Tx queue offloads 0x%lx don't match port " > + "offloads 0x%lx or supported offloads 0x%lx", > + (void *)dev, tx_conf->offloads, > + dev->data->dev_conf.txmode.offloads, > + tap_tx_offload_get_port_capa()); > + return -rte_errno; > + } > + } > ret = tap_setup_queue(dev, internals, tx_queue_id, 0); > if (ret == -1) > return -1; > - > - RTE_LOG(DEBUG, PMD, " TX TAP device name %s, qid %d on fd %d\n", > - internals->name, tx_queue_id, internals->txq[tx_queue_id].fd); > + RTE_LOG(DEBUG, PMD, > + " TX TAP device name %s, qid %d on fd %d csum %s\n", > + internals->name, tx_queue_id, internals->txq[tx_queue_id].fd, > + txq->csum ? "on" : "off"); > > return 0; > } > diff --git a/drivers/net/tap/rte_eth_tap.h b/drivers/net/tap/rte_eth_tap.h > index 829f32f..69a1a08 100644 > --- a/drivers/net/tap/rte_eth_tap.h > +++ b/drivers/net/tap/rte_eth_tap.h > @@ -76,6 +76,7 @@ struct rx_queue { > struct tx_queue { > int fd; > uint16_t *mtu; /* Pointer to MTU from dev_data */ > + uint16_t csum:1; /* Enable checksum offloading */ > struct pkt_stats stats; /* Stats for this TX queue */ > }; >