From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf0-f66.google.com (mail-lf0-f66.google.com [209.85.215.66]) by dpdk.org (Postfix) with ESMTP id 66B6F1B2E7 for ; Thu, 18 Jan 2018 15:02:56 +0100 (CET) Received: by mail-lf0-f66.google.com with SMTP id m8so26804654lfc.6 for ; Thu, 18 Jan 2018 06:02:56 -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=VHdDsjh6UYlf+BzKlJ8xBhjAb0v+OjZIMVpIzafMlwU=; b=vESlIrJw7Nwuc6HZOtaw1+fQ2viu1r9xZNdiDHcIwaUR6SzwYuJTmniFitzLntSbyr ZhV94lm+vridLkASSv+zLd1rlgrOxSKUNc8lNIylEvot6uaxny+4klWTLxjRIZRGCqez Ft8M7DSh9rL0yqJCVpSOPKH9zWj7D44Glw65o+WpWFpfJbZSMJLL+ADg/22M7nuKn4R1 zyRe40iwM9COVlLT2rrnduAh87HT6nad9eRlsIYLitL5o9bjlxzo9Tbq2lIAvqDKMmqT +TSc6/8K6+iDuesi75D45t/jzhxP+Ok+9yfceP/NfXtMGPhP43remLUIJalrJbvwLsQh 1uKg== 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=VHdDsjh6UYlf+BzKlJ8xBhjAb0v+OjZIMVpIzafMlwU=; b=fH/BDBaEBo5p26VI3El+i2RwJmPuT9UrvqmHzXlDHDvi7jUZeC3Sj4DsARz0P20XDv TpbsGdHRsndu94MWpRFqnCnHZZUCg8JKmAMN7dBpeH4Y1zO8V1WxR9wtSPbZM2cus3sz QXjTcMMNRErWcm/JsYuFSa2KlRvFwMgVS1CVwzHMvTTViOj6dhChZfR4FEkrUBxKbki7 3FP7b4M0B58s6ksowjZ694qbsyhJ4rsCpisJ5ip9UsfvXiigQGlFg+AQDbgiRM83G5Mx jTKWTpkbMPL2/NdmoS6Z35vH4oK7ISGwQyKauyt50xYYbm14B4wK2p4MrWWG7PfOdBr4 X9gg== X-Gm-Message-State: AKwxytfK14FGSVj8ujp0K4A71TSEsu5RiEbdR05ZaIikoQiJjLch7dav 4OEJmc7kPzNaNlhlvQYfMn4aSGt1oz4= X-Google-Smtp-Source: ACJfBosHWoNwE1yeyE4A8eqTqYx0peIEgcfMVkCgoGcDDh5kxMjYr7Q/pE93L738kESW3rOO64fTyQ== X-Received: by 10.46.108.5 with SMTP id h5mr12458344ljc.48.1516284175544; Thu, 18 Jan 2018 06:02:55 -0800 (PST) Received: from [192.168.1.79] (82.107.69.91.rev.sfr.net. [91.69.107.82]) by smtp.gmail.com with ESMTPSA id c76sm1269752lfh.35.2018.01.18.06.02.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 Jan 2018 06:02:52 -0800 (PST) To: Moti Haimovsky Cc: ferruh.yigit@intel.com, dev@dpdk.org References: <1515601248-39458-2-git-send-email-motih@mellanox.com> <1516197874-133169-1-git-send-email-motih@mellanox.com> From: Pascal Mazon Message-ID: Date: Thu, 18 Jan 2018 15:02:50 +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: <1516197874-133169-1-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 V5 1/2] net/tap: use 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: Thu, 18 Jan 2018 14:02:56 -0000 Acked-by: Pascal Mazon for the series. On 17/01/2018 15:04, Moti Haimovsky wrote: > Ethdev Tx offloads API has changed since: > commit cba7f53b717d ("ethdev: introduce Tx queue offloads API") > This commit adds support for the new Tx offloads API. > > Signed-off-by: Moti Haimovsky > --- > V5: > * Fixed compilation errors caused by not using PRIx64 in log messages > when displaying uint64_t values. > * Modified patch name > > V3: > * Fixed coding style warnings > > V2: > * Fixed coding style warnings > --- > > drivers/net/tap/rte_eth_tap.c | 97 +++++++++++++++++++++++++++++++++++++------ > drivers/net/tap/rte_eth_tap.h | 1 + > 2 files changed, 86 insertions(+), 12 deletions(-) > > diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c > index be73f93..7357dce 100644 > --- a/drivers/net/tap/rte_eth_tap.c > +++ b/drivers/net/tap/rte_eth_tap.c > @@ -24,6 +24,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -346,6 +347,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) > @@ -432,9 +469,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; > @@ -572,6 +610,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%" PRIx64 " supported 0x%" PRIx64 "\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", > @@ -648,10 +697,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 > @@ -1025,21 +1073,46 @@ 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%" PRIx64 > + " don't match port offloads 0x%" PRIx64 > + " or supported offloads 0x%" PRIx64, > + (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 */ > }; >