qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 09/17] mm: PT lock: export double_pt_lock/unlock


From: Andrea Arcangeli
Subject: [Qemu-devel] [PATCH 09/17] mm: PT lock: export double_pt_lock/unlock
Date: Fri, 3 Oct 2014 19:07:59 +0200

Those two helpers are needed by remap_anon_pages.

Signed-off-by: Andrea Arcangeli <address@hidden>
---
 include/linux/mm.h |  4 ++++
 mm/fremap.c        | 29 +++++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/include/linux/mm.h b/include/linux/mm.h
index bf3df07..71dbe03 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1408,6 +1408,10 @@ static inline pmd_t *pmd_alloc(struct mm_struct *mm, 
pud_t *pud, unsigned long a
 }
 #endif /* CONFIG_MMU && !__ARCH_HAS_4LEVEL_HACK */
 
+/* mm/fremap.c */
+extern void double_pt_lock(spinlock_t *ptl1, spinlock_t *ptl2);
+extern void double_pt_unlock(spinlock_t *ptl1, spinlock_t *ptl2);
+
 #if USE_SPLIT_PTE_PTLOCKS
 #if ALLOC_SPLIT_PTLOCKS
 void __init ptlock_cache_init(void);
diff --git a/mm/fremap.c b/mm/fremap.c
index 72b8fa3..1e509f7 100644
--- a/mm/fremap.c
+++ b/mm/fremap.c
@@ -281,3 +281,32 @@ out_freed:
 
        return err;
 }
+
+void double_pt_lock(spinlock_t *ptl1,
+                   spinlock_t *ptl2)
+       __acquires(ptl1)
+       __acquires(ptl2)
+{
+       spinlock_t *ptl_tmp;
+
+       if (ptl1 > ptl2) {
+               /* exchange ptl1 and ptl2 */
+               ptl_tmp = ptl1;
+               ptl1 = ptl2;
+               ptl2 = ptl_tmp;
+       }
+       /* lock in virtual address order to avoid lock inversion */
+       spin_lock(ptl1);
+       if (ptl1 != ptl2)
+               spin_lock_nested(ptl2, SINGLE_DEPTH_NESTING);
+}
+
+void double_pt_unlock(spinlock_t *ptl1,
+                     spinlock_t *ptl2)
+       __releases(ptl1)
+       __releases(ptl2)
+{
+       spin_unlock(ptl1);
+       if (ptl1 != ptl2)
+               spin_unlock(ptl2);
+}



reply via email to

[Prev in Thread] Current Thread [Next in Thread]