Patch "xen/arm,arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."" has been added to the 4.11-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
xen/arm,arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."
to the 4.11-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
xen-arm-arm64-fix-xen_dma_ops-after-815dd18-consolidate-get_dma_ops.patch
and it can be found in the queue-4.11 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
e058632670b709145730a134acc3f83f392f7aa7Mon Sep 17 00:00:00 2001
From: Stefano Stabellini <[email protected]>
Date: Thu, 13 Apr 2017 14:04:21 -0700
Subject: xen/arm,arm64: fix xen_dma_ops after 815dd18 "Consolidate get_dma_ops..."
From: Stefano Stabellini <[email protected]>
commit e058632670b709145730a134acc3f83f392f7aa7 upstream.
The following commit:
commit 815dd18788fe0d41899f51b91d0560279cf16b0d
Author: Bart Van Assche <[email protected]>
Date: Fri Jan 20 13:04:04 2017 -0800
treewide: Consolidate get_dma_ops() implementations
rearranges get_dma_ops in a way that xen_dma_ops are not returned when running on Xen anymore, dev->dma_ops is returned instead (see arch/arm/include/asm/dma-mapping.h:get_arch_dma_ops and include/linux/dma-mapping.h:get_dma_ops).
Fix the problem by storing dev->dma_ops in dev_archdata, and setting dev->dma_ops to xen_dma_ops. This way, xen_dma_ops is returned naturally by get_dma_ops. The Xen code can retrieve the original dev->dma_ops from dev_archdata when needed. It also allows us to remove __generic_dma_ops from common headers.
--- arch/arm/include/asm/device.h | 3 +++ arch/arm/include/asm/dma-mapping.h | 12 +----------- arch/arm/mm/dma-mapping.c | 7 +++++++ arch/arm64/include/asm/device.h | 3 +++ arch/arm64/include/asm/dma-mapping.h | 13 +------------ arch/arm64/mm/dma-mapping.c | 7 +++++++ include/xen/arm/page-coherent.h | 8 ++++++++ 7 files changed, 30 insertions(+), 23 deletions(-)
arch/arm/include/asm/device.h +3 -0
@@ -16,6 +16,9 @@ struct dev_archdata {#ifdef CONFIG_ARM_DMA_USE_IOMMU struct dma_iommu_mapping *mapping;#endif +#ifdef CONFIG_XEN +const struct dma_map_ops *dev_dma_ops; +#endif bool dma_coherent; };
arch/arm/include/asm/dma-mapping.h +1 -11
@@ -16,19 +16,9 @@extern const struct dma_map_ops arm_dma_ops;extern const struct dma_map_ops arm_coherent_dma_ops; -static inline const struct dma_map_ops *__generic_dma_ops (struct device *dev) -{ -if (dev && dev->dma_ops) -return dev->dma_ops; -return &arm_dma_ops; -} -static inline const struct dma_map_ops *get_arch_dma_ops (struct bus_type *bus) { -if (xen_initial_domain ()) -return xen_dma_ops; -else -return __generic_dma_ops (NULL ); +return &arm_dma_ops; }#define HAVE_ARCH_DMA_SUPPORTED 1
arch/arm/mm/dma-mapping.c +7 -0
@@ -2414,6 +2414,13 @@ void arch_setup_dma_ops(struct device *d dma_ops =arm_get_dma_map_ops (coherent);set_dma_ops (dev, dma_ops); + +#ifdef CONFIG_XEN +if (xen_initial_domain ()) { + dev->archdata.dev_dma_ops = dev->dma_ops; + dev->dma_ops = xen_dma_ops; + } +#endif }void arch_teardown_dma_ops (struct device *dev)
arch/arm64/include/asm/device.h +3 -0
@@ -20,6 +20,9 @@ struct dev_archdata {#ifdef CONFIG_IOMMU_API void *iommu;/* private IOMMU data */ #endif +#ifdef CONFIG_XEN +const struct dma_map_ops *dev_dma_ops; +#endif bool dma_coherent; };
arch/arm64/include/asm/dma-mapping.h +1 -12
@@ -27,11 +27,8 @@#define DMA_ERROR_CODE (~(dma_addr_t)0)extern const struct dma_map_ops dummy_dma_ops; -static inline const struct dma_map_ops *__generic_dma_ops (struct device *dev) +static inline const struct dma_map_ops *get_arch_dma_ops (struct bus_type *bus) { -if (dev && dev->dma_ops) -return dev->dma_ops; -/* * We expect no ISA devices, and all other DMA masters are expected to * have someone call arch_setup_dma_ops at device creation time.
@@ -39,14 +36,6 @@ static inline const struct dma_map_ops *return &dummy_dma_ops; } -static inline const struct dma_map_ops *get_arch_dma_ops (struct bus_type *bus) -{ -if (xen_initial_domain ()) -return xen_dma_ops; -else -return __generic_dma_ops (NULL ); -} -void arch_setup_dma_ops (struct device *dev,u64 dma_base,u64 size,const struct iommu_ops *iommu,bool coherent);#define arch_setup_dma_ops arch_setup_dma_ops
arch/arm64/mm/dma-mapping.c +7 -0
@@ -977,4 +977,11 @@ void arch_setup_dma_ops(struct device *d dev->archdata.dma_coherent = coherent;__iommu_setup_dma_ops (dev, dma_base, size, iommu); + +#ifdef CONFIG_XEN +if (xen_initial_domain ()) { + dev->archdata.dev_dma_ops = dev->dma_ops; + dev->dma_ops = xen_dma_ops; + } +#endif }
include/xen/arm/page-coherent.h +8 -0
@@ -2,8 +2,16 @@#define _ASM_ARM_XEN_PAGE_COHERENT_H#include <asm/page.h> +#include <asm/dma-mapping.h> #include <linux/dma-mapping.h> +static inline const struct dma_map_ops *__generic_dma_ops (struct device *dev) +{ +if (dev && dev->archdata.dev_dma_ops) +return dev->archdata.dev_dma_ops; +return get_arch_dma_ops (NULL ); +} +void __xen_dma_map_page (struct device *hwdev,struct page *page,dma_addr_t dev_addr,unsigned long offset,size_t size,enum dma_data_direction dir,unsigned long attrs);
Patches currently in stable-queue which might be from [email protected] are
queue-4.11/xen-revert-commits-da72ff5bfcb0-and-72a9b186292d.patch queue-4.11/xen-arm-arm64-fix-xen_dma_ops-after-815dd18-consolidate-get_dma_ops.patch