mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
![Julien Grall](/assets/img/avatar_default.png)
The swiotlb is required when programming a DMA address on ARM when a device is not protected by an IOMMU. In this case, the DMA address should always be equal to the machine address. For DOM0 memory, Xen ensure it by have an identity mapping between the guest address and host address. However, when mapping a foreign grant reference, the 1:1 model doesn't work. For ARM guest, most of the callers of pfn_to_mfn expects to get a GFN (Guest Frame Number), i.e a PFN (Page Frame Number) from the Linux point of view given that all ARM guest are auto-translated. Even though the name pfn_to_mfn is misleading, we need to ensure that those caller get a GFN and not by mistake a MFN. In pratical, I haven't seen error related to this but we should fix it for the sake of correctness. In order to fix the implementation of pfn_to_mfn on ARM in a follow-up patch, we have to introduce new helpers to return the DMA from a PFN and the invert. On x86, the new helpers will be an alias of pfn_to_mfn and mfn_to_pfn. The helpers will be used in swiotlb and xen_biovec_phys_mergeable. This is necessary in the latter because we have to ensure that the biovec code will not try to merge a biovec using foreign page and another using Linux memory. Lastly, the helper mfn_to_local_pfn has been renamed to bfn_to_local_pfn given that the only usage was in swiotlb. Signed-off-by: Julien Grall <julien.grall@citrix.com> Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
15 lines
451 B
C
15 lines
451 B
C
#include <linux/bio.h>
|
|
#include <linux/io.h>
|
|
#include <linux/export.h>
|
|
#include <xen/page.h>
|
|
|
|
bool xen_biovec_phys_mergeable(const struct bio_vec *vec1,
|
|
const struct bio_vec *vec2)
|
|
{
|
|
unsigned long bfn1 = pfn_to_bfn(page_to_pfn(vec1->bv_page));
|
|
unsigned long bfn2 = pfn_to_bfn(page_to_pfn(vec2->bv_page));
|
|
|
|
return __BIOVEC_PHYS_MERGEABLE(vec1, vec2) &&
|
|
((bfn1 == bfn2) || ((bfn1+1) == bfn2));
|
|
}
|
|
EXPORT_SYMBOL(xen_biovec_phys_mergeable);
|