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

[Xen-devel] Re: [PATCH 03/15] [swiotlb] Add swiotlb_register_engine function.



* Konrad Rzeszutek Wilk (konrad.wilk@xxxxxxxxxx) wrote:
> We set the internal iommu_sw pointer to the passed in swiotlb_engine
> structure. Obviously we also check if the existing iommu_sw is
> set and if so, call iommu_sw->release before the switch-over.
> 
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> ---
>  include/linux/swiotlb.h |    2 +
>  lib/swiotlb.c           |   48 
> +++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 50 insertions(+), 0 deletions(-)
> 
> diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h
> index 781c3aa..3bc3c42 100644
> --- a/include/linux/swiotlb.h
> +++ b/include/linux/swiotlb.h
> @@ -118,6 +118,8 @@ struct swiotlb_engine {
>       void* (*bus_to_virt)(struct device *hwdev, dma_addr_t address);
>  };
>  
> +int swiotlb_register_engine(struct swiotlb_engine *iommu);
> +
>  extern void
>  *swiotlb_alloc_coherent(struct device *hwdev, size_t size,
>                       dma_addr_t *dma_handle, gfp_t flags);
> diff --git a/lib/swiotlb.c b/lib/swiotlb.c
> index e6d9e32..e84f269 100644
> --- a/lib/swiotlb.c
> +++ b/lib/swiotlb.c
> @@ -97,6 +97,12 @@ static phys_addr_t *io_tlb_orig_addr;
>   */
>  static DEFINE_SPINLOCK(io_tlb_lock);
>  
> +/*
> + * The software IOMMU this library will utilize.
> + */
> +struct swiotlb_engine *iommu_sw;
> +EXPORT_SYMBOL(iommu_sw);

should be EXPORT_SYMBOL_GPL

>  static int late_alloc;
>  
>  static int __init
> @@ -126,6 +132,48 @@ static dma_addr_t swiotlb_virt_to_bus(struct device 
> *hwdev,
>       return phys_to_dma(hwdev, virt_to_phys(address));
>  }
>  
> +/*
> + * Register a software IO TLB engine.
> + *
> + * The registration allows the software IO TLB functions in the
> + * swiotlb library to function properly.
> + *
> + * All the values in the iotlb structure must be set.
> + *
> + * If the registration fails, it is assumed that the caller will free
> + * all of the resources allocated in the swiotlb_engine structure.
> + */
> +int swiotlb_register_engine(struct swiotlb_engine *iommu)
> +{
> +     if (!iommu || !iommu->name || !iommu->release) {
> +             printk(KERN_ERR "DMA: Trying to register a SWIOTLB engine" \
> +                             " improperly!");
> +             return -EINVAL;
> +     }
> +
> +     if (iommu_sw && iommu_sw->name) {

According to above, you can't have !iommu_sw->name.

> +             int retval = -EINVAL;
> +
> +             /* 'release' must check for out-standing DMAs and flush them
> +              *  out or fail. */
> +             if (iommu_sw->release)
> +                     retval = iommu_sw->release(iommu_sw);

Same here, you can't have !iommu_sw->release, just call unconditionally.

> +
> +             if (retval) {
> +                     printk(KERN_ERR "DMA: %s cannot be released!\n",
> +                             iommu_sw->name);
> +                     return retval;
> +             }
> +             printk(KERN_INFO "DMA: Replacing [%s] with [%s]\n",
> +                     iommu_sw->name, iommu->name);
> +     }
> +
> +     iommu_sw = iommu;
> +
> +     return 0;
> +}
> +EXPORT_SYMBOL(swiotlb_register_engine);
> +
>  void swiotlb_print_info(void)
>  {
>       unsigned long bytes = io_tlb_nslabs << IO_TLB_SHIFT;

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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