[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v5 01/15] iommu: turn need_iommu back into a boolean.



>>> On 03.08.18 at 19:22, <paul.durrant@xxxxxxxxxx> wrote:
> As noted in [1] the tri-state nature of need_iommu after commit 3e06b989 is
> confusing.
> 
> Because arch_iommu_populate_page_table() removes pages from the page list
> as it maps them it is actually safe to re-invoke multiple times without
> the need for any specific indication it has been called before, so it
> is actually safe to simply turn need_iommu back into a boolean with no
> change to the population algorithm.
> 
> [1] 
> https://lists.xenproject.org/archives/html/xen-devel/2018-07/msg01870.html 

I have to admit that I wouldn't read "confusing" into that mail. And
given the below, I continue to wonder whether you really, really
need to change this.

> --- a/xen/drivers/passthrough/iommu.c
> +++ b/xen/drivers/passthrough/iommu.c
> @@ -214,14 +214,14 @@ void iommu_teardown(struct domain *d)
>  {
>      const struct domain_iommu *hd = dom_iommu(d);
>  
> -    d->need_iommu = 0;
> +    d->need_iommu = false;
>      hd->platform_ops->teardown(d);
>      tasklet_schedule(&iommu_pt_cleanup_tasklet);
>  }
>  
>  int iommu_construct(struct domain *d)
>  {
> -    if ( need_iommu(d) > 0 )
> +    if ( need_iommu(d) )
>          return 0;
>  
>      if ( !iommu_use_hap_pt(d) )
> @@ -233,7 +233,7 @@ int iommu_construct(struct domain *d)
>              return rc;
>      }
>  
> -    d->need_iommu = 1;
> +    d->need_iommu = true;

So with the setting to -1 gone from the caller, need_iommu(d) will
continue to return false until this completion point is reached. The
fundamental idea of the tristate was that once we've started
populating the IOMMU page tables (recall, the domain is not
paused if this is a hotplug), all _other_ operations requiring IOMMU
page table manipulation (grant table code, for example) will
DTRT (tm) despite the code here perhaps never getting to notice
the relevant page.

Trust me, it wasn't a lightweight decision to make this a tristate,
I just couldn't see a better approach (short of using a second
boolean, which I would have liked even less), and I still can't.

> @@ -493,7 +493,7 @@ static void iommu_dump_p2m_table(unsigned char key)
>      ops = iommu_get_ops();
>      for_each_domain(d)
>      {
> -        if ( is_hardware_domain(d) || need_iommu(d) <= 0 )
> +        if ( is_hardware_domain(d) || !need_iommu(d) )
>              continue;

I don't think the original semantics of the dumping to be skipped for
domains with their IOMMU page tables under construction is being
retained here.

Jan



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.