[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |