|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH 9/9] xen: Add use_iommu flag to createdomain domctl
On Wed, Apr 19, 2017 at 9:26 PM, Julien Grall <julien.grall@xxxxxxx> wrote:
> Hi Oleksandr,
Hi, Julien
>
> Please CC the appropriate maintainers for all the components you modify.
Sorry, sure.
>
>
> On 15/03/17 20:05, Oleksandr Tyshchenko wrote:
>>
>> From: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx>
>>
>> This flag is intended to let Xen know that the guest has devices
>> which will most likely be used for passthrough.
>> The primary aim of this knowledge is to help the IOMMUs that don't
>> share page tables with the CPU be ready before P2M code starts
>> updating IOMMU mapping.
>> So, if this flag is set the unshared IOMMUs will populate their
>> page tables at the domain creation time and thereby will be able
>> to handle IOMMU mapping updates from *the very beginning*.
>>
>> Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx>
>> ---
>> tools/libxl/libxl_create.c | 5 +++++
>> xen/arch/arm/domain.c | 4 +++-
>> xen/arch/x86/domain.c | 4 +++-
>> xen/common/domctl.c | 5 ++++-
>> xen/include/public/domctl.h | 3 +++
>> xen/include/xen/sched.h | 3 +++
>> 6 files changed, 21 insertions(+), 3 deletions(-)
>>
>> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
>> index e741b9a..4393fa2 100644
>> --- a/tools/libxl/libxl_create.c
>> +++ b/tools/libxl/libxl_create.c
>> @@ -546,6 +546,11 @@ int libxl__domain_make(libxl__gc *gc,
>> libxl_domain_config *d_config,
>> flags |= XEN_DOMCTL_CDF_hap;
>> }
>>
>> + /* TODO Are these assumptions enough to make decision about using
>> IOMMU? */
>> + if ((d_config->num_dtdevs && d_config->dtdevs) ||
>> + (d_config->num_pcidevs && d_config->pcidevs))
>> + flags |= XEN_DOMCTL_CDF_use_iommu;
>
>
> Regardless Jan's comment about the flag, I believe we still want to keep the
> current behavior for x86 (e.g allocating the page table on-demand).
>
> So I think this should be per architecture decision rather than a common
> change. Maybe in, libxl__arch_domain_prepare_config. This also means we
> would switch to xen_arch_domainconfig.
Agree. Will do. So, the use_iommu flag will be included to xen_arch_domainconfig
and passed to iommu_domain_init() on ARM. On x86 we will always pass
the "false" value to
iommu_domain_init(). Right?
>
>> +
>> /* Ultimately, handle is an array of 16 uint8_t, same as uuid */
>> libxl_uuid_copy(ctx, (libxl_uuid *)handle, &info->uuid);
>>
>> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
>> index bab62ee..940bb98 100644
>> --- a/xen/arch/arm/domain.c
>> +++ b/xen/arch/arm/domain.c
>> @@ -539,6 +539,7 @@ int arch_domain_create(struct domain *d, unsigned int
>> domcr_flags,
>> struct xen_arch_domainconfig *config)
>> {
>> int rc, count = 0;
>> + bool_t use_iommu;
>
>
> s/bool_t/bool/
ok
>
>>
>> BUILD_BUG_ON(GUEST_MAX_VCPUS < MAX_VIRT_CPUS);
>> d->arch.relmem = RELMEM_not_started;
>> @@ -550,7 +551,8 @@ int arch_domain_create(struct domain *d, unsigned int
>> domcr_flags,
>> ASSERT(config != NULL);
>>
>> /* p2m_init relies on some value initialized by the IOMMU subsystem
>> */
>> - if ( (rc = iommu_domain_init(d, false)) != 0 )
>> + use_iommu = !!(domcr_flags & DOMCRF_use_iommu);
>> + if ( (rc = iommu_domain_init(d, use_iommu)) != 0 )
>> goto fail;
>>
>> if ( (rc = p2m_init(d)) != 0 )
>> diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
>> index 8ef4160..7d634ff 100644
>> --- a/xen/arch/x86/domain.c
>> +++ b/xen/arch/x86/domain.c
>> @@ -525,6 +525,7 @@ int arch_domain_create(struct domain *d, unsigned int
>> domcr_flags,
>> {
>> bool paging_initialised = false;
>> int rc = -ENOMEM;
>> + bool_t use_iommu;
>
>
> Ditto.
ok
>
>
>>
>> if ( config == NULL && !is_idle_domain(d) )
>> return -EINVAL;
>> @@ -646,7 +647,8 @@ int arch_domain_create(struct domain *d, unsigned int
>> domcr_flags,
>> if ( (rc = init_domain_irq_mapping(d)) != 0 )
>> goto fail;
>>
>> - if ( (rc = iommu_domain_init(d, false)) != 0 )
>> + use_iommu = !!(domcr_flags & DOMCRF_use_iommu);
>> + if ( (rc = iommu_domain_init(d, use_iommu)) != 0 )
>> goto fail;
>> }
>> spin_lock_init(&d->arch.e820_lock);
>> diff --git a/xen/common/domctl.c b/xen/common/domctl.c
>> index 93e3029..56c4d38 100644
>> --- a/xen/common/domctl.c
>> +++ b/xen/common/domctl.c
>> @@ -505,7 +505,8 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t)
>> u_domctl)
>> | XEN_DOMCTL_CDF_hap
>> | XEN_DOMCTL_CDF_s3_integrity
>> | XEN_DOMCTL_CDF_oos_off
>> - | XEN_DOMCTL_CDF_xs_domain)) )
>> + | XEN_DOMCTL_CDF_xs_domain
>> + | XEN_DOMCTL_CDF_use_iommu)) )
>> break;
>>
>> dom = op->domain;
>> @@ -549,6 +550,8 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t)
>> u_domctl)
>> domcr_flags |= DOMCRF_oos_off;
>> if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_xs_domain )
>> domcr_flags |= DOMCRF_xs_domain;
>> + if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_use_iommu )
>> + domcr_flags |= DOMCRF_use_iommu;
>>
>> d = domain_create(dom, domcr_flags, op->u.createdomain.ssidref,
>> &op->u.createdomain.config);
>> diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
>> index 85cbb7c..a37a566 100644
>> --- a/xen/include/public/domctl.h
>> +++ b/xen/include/public/domctl.h
>> @@ -66,6 +66,9 @@ struct xen_domctl_createdomain {
>> /* Is this a xenstore domain? */
>> #define _XEN_DOMCTL_CDF_xs_domain 5
>> #define XEN_DOMCTL_CDF_xs_domain (1U<<_XEN_DOMCTL_CDF_xs_domain)
>> + /* Should IOMMU page tables be populated at the domain creation time? */
>> +#define _XEN_DOMCTL_CDF_use_iommu 6
>> +#define XEN_DOMCTL_CDF_use_iommu (1U<<_XEN_DOMCTL_CDF_use_iommu)
>> uint32_t flags;
>> struct xen_arch_domainconfig config;
>> };
>> diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
>> index 0929c0b..80e6fdc 100644
>> --- a/xen/include/xen/sched.h
>> +++ b/xen/include/xen/sched.h
>> @@ -561,6 +561,9 @@ struct domain *domain_create(domid_t domid, unsigned
>> int domcr_flags,
>> /* DOMCRF_xs_domain: xenstore domain */
>> #define _DOMCRF_xs_domain 6
>> #define DOMCRF_xs_domain (1U<<_DOMCRF_xs_domain)
>> + /* DOMCRF_use_iommu: Populate IOMMU page tables at the domain creation
>> time */
>> +#define _DOMCRF_use_iommu 7
>> +#define DOMCRF_use_iommu (1U<<_DOMCRF_use_iommu)
>>
>> /*
>> * rcu_lock_domain_by_id() is more efficient than get_domain_by_id().
>>
>
> Cheers,
>
> --
> Julien Grall
--
Regards,
Oleksandr Tyshchenko
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |