diff mbox

[V4,02/32] xen/mm: Align virtual address on PAGE_SIZE in iounmap

Message ID 518D1EB8.1050400@linaro.org
State Accepted, archived
Headers show

Commit Message

Julien Grall May 10, 2013, 4:22 p.m. UTC
ioremap function can unlikely return an unaligned virtual address if
the physical address itself is unaligned on a page size.

Signed-off-by: Julien Grall <julien.grall@linaro.org>
Acked-by: Jan Beulich <jbeulich@suse.com>
CC: keir@xen.org

Changes in v5:
    - replace unsigned int by unsigned long

Changes in v4:
    - replace vaddr_t by unsigned int
---
 xen/include/xen/vmap.h |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Keir Fraser May 10, 2013, 5:08 p.m. UTC | #1
On 10/05/2013 17:22, "Julien Grall" <julien.grall@linaro.org> wrote:

> ioremap function can unlikely return an unaligned virtual address if
> the physical address itself is unaligned on a page size.
> 
> Signed-off-by: Julien Grall <julien.grall@linaro.org>
> Acked-by: Jan Beulich <jbeulich@suse.com>
> CC: keir@xen.org

Acked-by: Keir Fraser <keir@xen.org>

> Changes in v5:
>     - replace unsigned int by unsigned long
> 
> Changes in v4:
>     - replace vaddr_t by unsigned int
> ---
>  xen/include/xen/vmap.h |    4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/xen/include/xen/vmap.h b/xen/include/xen/vmap.h
> index 88e5d99..daee7f5 100644
> --- a/xen/include/xen/vmap.h
> +++ b/xen/include/xen/vmap.h
> @@ -15,7 +15,9 @@ void __iomem *ioremap(paddr_t, size_t);
>  
>  static inline void iounmap(void __iomem *va)
>  {
> -    vunmap((void __force *)va);
> +    unsigned long addr = (unsigned long)(void __force *)va;
> +
> +    vunmap((void *)(addr & PAGE_MASK));
>  }
>  
>  void vm_init(void);
diff mbox

Patch

diff --git a/xen/include/xen/vmap.h b/xen/include/xen/vmap.h
index 88e5d99..daee7f5 100644
--- a/xen/include/xen/vmap.h
+++ b/xen/include/xen/vmap.h
@@ -15,7 +15,9 @@  void __iomem *ioremap(paddr_t, size_t);
 
 static inline void iounmap(void __iomem *va)
 {
-    vunmap((void __force *)va);
+    unsigned long addr = (unsigned long)(void __force *)va;
+
+    vunmap((void *)(addr & PAGE_MASK));
 }
 
 void vm_init(void);