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 3595CA0A05; Wed, 20 Jan 2021 16:32:30 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E8981140DA1; Wed, 20 Jan 2021 16:32:29 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mails.dpdk.org (Postfix) with ESMTP id 689B7140D98 for ; Wed, 20 Jan 2021 16:32:28 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1611156747; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=EA2vOG/wT6R97F+Tpozl5m0b3Psm1kM7a1c1XRpq2vk=; b=Nk/u5XDBHunm2tLQdAWBrMMRht5QzBKxtCSdK55VvUPFsX7tRBfVO/Ks/j7c/7PUIKzAn4 WWj3cIDX2qmO9y7/RfE6PZ5dwAvgYRZtJQG4MwNaDbnHtXJ7lyis8fxi1d82sa9/RC1JsD 2QSPYSRpv/gbhAS/hp76ysofolMluCk= Received: from mail-ua1-f69.google.com (mail-ua1-f69.google.com [209.85.222.69]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-165-3rLYZWGaO_-LLiahdXsdUA-1; Wed, 20 Jan 2021 10:32:26 -0500 X-MC-Unique: 3rLYZWGaO_-LLiahdXsdUA-1 Received: by mail-ua1-f69.google.com with SMTP id y38so9142819uad.2 for ; Wed, 20 Jan 2021 07:32:25 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=EA2vOG/wT6R97F+Tpozl5m0b3Psm1kM7a1c1XRpq2vk=; b=WWYjWYcVm/UaJKu4OsdGGfHlyOuqTVSJSo1uL8jr/5vJGESuSdgAUpXo2yN5u4UJpg K7NtcR6JNoXzyly0crF5NWeDvH3XcJZJDqC1J8SVIDTXTHzzZnfMN6vxBAA9p0zdl7Vd kH+tJFy/fw3YFZeO0DeBgVn3I52T/XS3F77mCdzblzrSuSIRFQOmofaHGg7O5AZ4IJZl IbZwQcTXkUbxEo5EH5T7izifCJljdhV/4f9sfMFZXc6axgZHeAlvR+QvvvN6/HxB7HRO te/D7UL5HP0f0suclUA6vjhjwln4dsf/OI/WU/nXZJJN1A75tf6VgZn+Mc26qJ3ZiJUJ lnIg== X-Gm-Message-State: AOAM532DU+yFYng1k7TsIwOID9NMur3lWPrGbRSeMGdz/bmv5J7I7QZW phaq1vWSZ1c2aCTmZ3J9Ot15Oe0YpbAomLNtBjqUhwRSMfqkA8+Q6iQCxcGVmCjAs2pAhQzlJTU AlYi/2aq17mXSgttJbfE= X-Received: by 2002:ab0:43a1:: with SMTP id l30mr6363750ual.126.1611156745375; Wed, 20 Jan 2021 07:32:25 -0800 (PST) X-Google-Smtp-Source: ABdhPJyhs5xojWRGsWriuIhdDtvPomesq+QE7/HW/b961qwNU93dw8TQf1ahdLDcB5mEdd4CO1HVoWuzfU3JwkFH9rg= X-Received: by 2002:ab0:43a1:: with SMTP id l30mr6363715ual.126.1611156745062; Wed, 20 Jan 2021 07:32:25 -0800 (PST) MIME-Version: 1.0 References: <20210119212507.1043636-1-maxime.coquelin@redhat.com> <20210119212507.1043636-3-maxime.coquelin@redhat.com> In-Reply-To: <20210119212507.1043636-3-maxime.coquelin@redhat.com> From: David Marchand Date: Wed, 20 Jan 2021 16:32:13 +0100 Message-ID: To: Maxime Coquelin , Ray Kinsella Cc: dev , "Xia, Chenbo" , Olivier Matz , Adrian Moreno Zapata , Thomas Monjalon Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=dmarchan@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="UTF-8" Subject: Re: [dpdk-dev] [PATCH v2 02/44] bus/vdev: add driver IOVA VA mode requirement X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On Tue, Jan 19, 2021 at 10:25 PM Maxime Coquelin wrote: > > This patch adds driver flag in vdev bus driver so that > vdev drivers can require VA IOVA mode to be used, which > for example the case of Virtio-user PMD. > > The patch implements the .get_iommu_class() callback, that > is called before devices probing to determine the IOVA mode > to be used. > > It also adds a check right before the device is probed to > ensure compatible IOVa mode has been selected. > > Signed-off-by: Maxime Coquelin > --- > drivers/bus/vdev/rte_bus_vdev.h | 4 ++++ > drivers/bus/vdev/vdev.c | 31 +++++++++++++++++++++++++++++++ > 2 files changed, 35 insertions(+) > > diff --git a/drivers/bus/vdev/rte_bus_vdev.h b/drivers/bus/vdev/rte_bus_vdev.h > index f99a41f825..c8b41e649c 100644 > --- a/drivers/bus/vdev/rte_bus_vdev.h > +++ b/drivers/bus/vdev/rte_bus_vdev.h > @@ -113,8 +113,12 @@ struct rte_vdev_driver { > rte_vdev_remove_t *remove; /**< Virtual device remove function. */ > rte_vdev_dma_map_t *dma_map; /**< Virtual device DMA map function. */ > rte_vdev_dma_unmap_t *dma_unmap; /**< Virtual device DMA unmap function. */ > + uint32_t drv_flags; /**< Flags RTE_VDEV_DRV_*. */ This will probably get broken in the future, but for now, can you indent the comment in the same way as earlier lines? The ABI check will complain about this change so we need an exception. rte_vdev_driver is exposed only through driver API. We could flag the whole structure like we did for ethdev. But there is also the alternative of just flagging the required symbols so that we won't miss later the inclusion of this structure in an API used by final users. How about: diff --git a/devtools/libabigail.abignore b/devtools/libabigail.abignore index 1dc84fa74b..435913d908 100644 --- a/devtools/libabigail.abignore +++ b/devtools/libabigail.abignore @@ -11,6 +11,8 @@ ; Explicit ignore for driver-only ABI [suppress_type] name = eth_dev_ops +[suppress_function] + name_regexp = rte_vdev_(|un)register ; Ignore fields inserted in cacheline boundary of rte_cryptodev [suppress_type] > }; > > +/** Device driver needs IOVA as VA and cannot work with IOVA as PA */ > +#define RTE_VDEV_DRV_NEED_IOVA_AS_VA 0x0001 > + > /** > * Register a virtual device driver. > * > diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c > index acfd78828f..56f15e8201 100644 > --- a/drivers/bus/vdev/vdev.c > +++ b/drivers/bus/vdev/vdev.c > @@ -189,6 +189,7 @@ vdev_probe_all_drivers(struct rte_vdev_device *dev) > { > const char *name; > struct rte_vdev_driver *driver; > + enum rte_iova_mode iova_mode; > int ret; > > if (rte_dev_is_probed(&dev->device)) > @@ -199,6 +200,14 @@ vdev_probe_all_drivers(struct rte_vdev_device *dev) > > if (vdev_parse(name, &driver)) > return -1; > + > + iova_mode = rte_eal_iova_mode(); > + if ((driver->drv_flags & RTE_VDEV_DRV_NEED_IOVA_AS_VA) && (iova_mode == RTE_IOVA_PA)) { > + VDEV_LOG(ERR, "%s requires VA IOVA mode but current mode is PA, not initializing", > + name); > + return -1; > + } > + > ret = driver->probe(dev); > if (ret == 0) > dev->device.driver = &driver->driver; > @@ -594,6 +603,27 @@ vdev_unplug(struct rte_device *dev) > return rte_vdev_uninit(dev->name); > } > > +static enum rte_iova_mode > +vdev_get_iommu_class(void) > +{ > + const char *name; > + struct rte_vdev_device *dev; > + struct rte_vdev_driver *driver; > + > + TAILQ_FOREACH(dev, &vdev_device_list, next) { > + name = rte_vdev_device_name(dev); > + if (!name) > + continue; Afaics, a device in vdev_device_list always has a name. > + if (vdev_parse(name, &driver)) > + continue; > + > + if (driver->drv_flags & RTE_VDEV_DRV_NEED_IOVA_AS_VA) > + return RTE_IOVA_VA; > + } > + > + return RTE_IOVA_DC; > +} > + > static struct rte_bus rte_vdev_bus = { > .scan = vdev_scan, > .probe = vdev_probe, > @@ -603,6 +633,7 @@ static struct rte_bus rte_vdev_bus = { > .parse = vdev_parse, > .dma_map = vdev_dma_map, > .dma_unmap = vdev_dma_unmap, > + .get_iommu_class = vdev_get_iommu_class, > .dev_iterate = rte_vdev_dev_iterate, > }; > > -- > 2.29.2 > -- David Marchand