From mboxrd@z Thu Jan 1 00:00:00 1970 From: Pascal Mazon Subject: Re: [PATCH V4 2/2] net/tap: convert to new Rx offloads API Date: Wed, 10 Jan 2018 17:42:53 +0100 Message-ID: References: <1515093521-185221-3-git-send-email-motih@mellanox.com> <1515601248-39458-1-git-send-email-motih@mellanox.com> <1515601248-39458-2-git-send-email-motih@mellanox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Cc: ferruh.yigit@intel.com, dev@dpdk.org To: Moti Haimovsky Return-path: Received: from mail-wr0-f196.google.com (mail-wr0-f196.google.com [209.85.128.196]) by dpdk.org (Postfix) with ESMTP id 95E2E1B1D6 for ; Wed, 10 Jan 2018 17:42:55 +0100 (CET) Received: by mail-wr0-f196.google.com with SMTP id 60so8920050wrl.5 for ; Wed, 10 Jan 2018 08:42:55 -0800 (PST) In-Reply-To: <1515601248-39458-2-git-send-email-motih@mellanox.com> Content-Language: en-US List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Acked-by: Pascal Mazon On 10/01/2018 17:20, Moti Haimovsky wrote: > Ethdev Rx offloads API has changed since: > commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API") > This commit support the new Rx offloads API. > > Signed-off-by: Moti Haimovsky > --- > V4: > Modifications according to inputs from Pascal Mazon > * Removed extra braces. > > V3: > * Fixed coding style warnings > > V2: > * Fixed coding style warnings > --- > drivers/net/tap/rte_eth_tap.c | 66 +++++++++++++++++++++++++++++++++++++------ > 1 file changed, 58 insertions(+), 8 deletions(-) > > diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c > index 1a84adb..8e790d1 100644 > --- a/drivers/net/tap/rte_eth_tap.c > +++ b/drivers/net/tap/rte_eth_tap.c > @@ -286,6 +286,43 @@ enum ioctl_mode { > } > } > > +static uint64_t > +tap_rx_offload_get_port_capa(void) > +{ > + /* > + * In order to support legacy apps, > + * report capabilities also as port capabilities. > + */ > + return DEV_RX_OFFLOAD_SCATTER | > + DEV_RX_OFFLOAD_IPV4_CKSUM | > + DEV_RX_OFFLOAD_UDP_CKSUM | > + DEV_RX_OFFLOAD_TCP_CKSUM; > +} > + > +static uint64_t > +tap_rx_offload_get_queue_capa(void) > +{ > + return DEV_RX_OFFLOAD_SCATTER | > + DEV_RX_OFFLOAD_IPV4_CKSUM | > + DEV_RX_OFFLOAD_UDP_CKSUM | > + DEV_RX_OFFLOAD_TCP_CKSUM; > +} > + > +static bool > +tap_rxq_are_offloads_valid(struct rte_eth_dev *dev, uint64_t offloads) > +{ > + uint64_t port_offloads = dev->data->dev_conf.rxmode.offloads; > + uint64_t queue_supp_offloads = tap_rx_offload_get_queue_capa(); > + uint64_t port_supp_offloads = tap_rx_offload_get_port_capa(); > + > + if ((offloads & (queue_supp_offloads | port_supp_offloads)) != > + offloads) > + return false; > + if ((port_offloads ^ offloads) & port_supp_offloads) > + return false; > + return true; > +} > + > /* Callback to handle the rx burst of packets to the correct interface and > * file descriptor(s) in a multi-queue setup. > */ > @@ -310,8 +347,9 @@ enum ioctl_mode { > int len; > > len = readv(rxq->fd, *rxq->iovecs, > - 1 + (rxq->rxmode->enable_scatter ? > - rxq->nb_rx_desc : 1)); > + 1 + > + (rxq->rxmode->offloads & DEV_RX_OFFLOAD_SCATTER ? > + rxq->nb_rx_desc : 1)); > if (len < (int)sizeof(struct tun_pi)) > break; > > @@ -366,7 +404,7 @@ enum ioctl_mode { > seg->next = NULL; > mbuf->packet_type = rte_net_get_ptype(mbuf, NULL, > RTE_PTYPE_ALL_MASK); > - if (rxq->rxmode->hw_ip_checksum) > + if (rxq->rxmode->offloads & DEV_RX_OFFLOAD_CHECKSUM) > tap_verify_csum(mbuf); > > /* account for the receive frame */ > @@ -727,12 +765,12 @@ enum ioctl_mode { > dev_info->min_rx_bufsize = 0; > dev_info->pci_dev = NULL; > dev_info->speed_capa = tap_dev_speed_capa(); > - dev_info->rx_offload_capa = (DEV_RX_OFFLOAD_IPV4_CKSUM | > - DEV_RX_OFFLOAD_UDP_CKSUM | > - DEV_RX_OFFLOAD_TCP_CKSUM); > + dev_info->rx_queue_offload_capa = tap_rx_offload_get_queue_capa(); > + dev_info->rx_offload_capa = tap_rx_offload_get_port_capa() | > + dev_info->rx_queue_offload_capa; > 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(); > + dev_info->tx_offload_capa = tap_tx_offload_get_port_capa() | > + dev_info->tx_queue_offload_capa; > } > > static int > @@ -1048,6 +1086,18 @@ enum ioctl_mode { > return -1; > } > > + /* Verify application offloads are valid for our port and queue. */ > + if (!tap_rxq_are_offloads_valid(dev, rx_conf->offloads)) { > + rte_errno = ENOTSUP; > + RTE_LOG(ERR, PMD, > + "%p: Rx queue offloads 0x%lx don't match port " > + "offloads 0x%lx or supported offloads 0x%lx\n", > + (void *)dev, rx_conf->offloads, > + dev->data->dev_conf.rxmode.offloads, > + (tap_rx_offload_get_port_capa() | > + tap_rx_offload_get_queue_capa())); > + return -rte_errno; > + } > rxq->mp = mp; > rxq->trigger_seen = 1; /* force initial burst */ > rxq->in_port = dev->data->port_id;