Re: [Qemu-devel] [PATCH 07/17] mm: madvise MADV_USERFAULT: prepare vm_flags to allow more than 32bits

2014-11-06 Thread Konstantin Khlebnikov
On Fri, Oct 3, 2014 at 9:07 PM, Andrea Arcangeli aarca...@redhat.com wrote:
 We run out of 32bits in vm_flags, noop change for 64bit archs.

What? Again?
As I see there are some free bits: 0x200, 0x1000, 0x8

I prefer to reserve 0x0200 for VM_ARCH_2


 Signed-off-by: Andrea Arcangeli aarca...@redhat.com
 ---
  fs/proc/task_mmu.c   | 4 ++--
  include/linux/huge_mm.h  | 4 ++--
  include/linux/ksm.h  | 4 ++--
  include/linux/mm_types.h | 2 +-
  mm/huge_memory.c | 2 +-
  mm/ksm.c | 2 +-
  mm/madvise.c | 2 +-
  mm/mremap.c  | 2 +-
  8 files changed, 11 insertions(+), 11 deletions(-)

 diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
 index c341568..ee1c3a2 100644
 --- a/fs/proc/task_mmu.c
 +++ b/fs/proc/task_mmu.c
 @@ -532,11 +532,11 @@ static void show_smap_vma_flags(struct seq_file *m, 
 struct vm_area_struct *vma)
 /*
  * Don't forget to update Documentation/ on changes.
  */
 -   static const char mnemonics[BITS_PER_LONG][2] = {
 +   static const char mnemonics[BITS_PER_LONG+1][2] = {
 /*
  * In case if we meet a flag we don't know about.
  */
 -   [0 ... (BITS_PER_LONG-1)] = ??,
 +   [0 ... (BITS_PER_LONG)] = ??,

 [ilog2(VM_READ)]= rd,
 [ilog2(VM_WRITE)]   = wr,
 diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h
 index 63579cb..3aa10e0 100644
 --- a/include/linux/huge_mm.h
 +++ b/include/linux/huge_mm.h
 @@ -121,7 +121,7 @@ extern void split_huge_page_pmd_mm(struct mm_struct *mm, 
 unsigned long address,
  #error hugepages can't be allocated by the buddy allocator
  #endif
  extern int hugepage_madvise(struct vm_area_struct *vma,
 -   unsigned long *vm_flags, int advice);
 +   vm_flags_t *vm_flags, int advice);
  extern void __vma_adjust_trans_huge(struct vm_area_struct *vma,
 unsigned long start,
 unsigned long end,
 @@ -183,7 +183,7 @@ static inline int split_huge_page(struct page *page)
  #define split_huge_page_pmd_mm(__mm, __address, __pmd) \
 do { } while (0)
  static inline int hugepage_madvise(struct vm_area_struct *vma,
 -  unsigned long *vm_flags, int advice)
 +  vm_flags_t *vm_flags, int advice)
  {
 BUG();
 return 0;
 diff --git a/include/linux/ksm.h b/include/linux/ksm.h
 index 3be6bb1..8b35253 100644
 --- a/include/linux/ksm.h
 +++ b/include/linux/ksm.h
 @@ -18,7 +18,7 @@ struct mem_cgroup;

  #ifdef CONFIG_KSM
  int ksm_madvise(struct vm_area_struct *vma, unsigned long start,
 -   unsigned long end, int advice, unsigned long *vm_flags);
 +   unsigned long end, int advice, vm_flags_t *vm_flags);
  int __ksm_enter(struct mm_struct *mm);
  void __ksm_exit(struct mm_struct *mm);

 @@ -94,7 +94,7 @@ static inline int PageKsm(struct page *page)

  #ifdef CONFIG_MMU
  static inline int ksm_madvise(struct vm_area_struct *vma, unsigned long 
 start,
 -   unsigned long end, int advice, unsigned long *vm_flags)
 +   unsigned long end, int advice, vm_flags_t *vm_flags)
  {
 return 0;
  }
 diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
 index 6e0b286..2c876d1 100644
 --- a/include/linux/mm_types.h
 +++ b/include/linux/mm_types.h
 @@ -217,7 +217,7 @@ struct page_frag {
  #endif
  };

 -typedef unsigned long __nocast vm_flags_t;
 +typedef unsigned long long __nocast vm_flags_t;

  /*
   * A region containing a mapping of a non-memory backed file under NOMMU
 diff --git a/mm/huge_memory.c b/mm/huge_memory.c
 index d9a21d06..e913a19 100644
 --- a/mm/huge_memory.c
 +++ b/mm/huge_memory.c
 @@ -1942,7 +1942,7 @@ out:
  #define VM_NO_THP (VM_SPECIAL | VM_HUGETLB | VM_SHARED | VM_MAYSHARE)

  int hugepage_madvise(struct vm_area_struct *vma,
 -unsigned long *vm_flags, int advice)
 +vm_flags_t *vm_flags, int advice)
  {
 switch (advice) {
 case MADV_HUGEPAGE:
 diff --git a/mm/ksm.c b/mm/ksm.c
 index fb75902..faf319e 100644
 --- a/mm/ksm.c
 +++ b/mm/ksm.c
 @@ -1736,7 +1736,7 @@ static int ksm_scan_thread(void *nothing)
  }

  int ksm_madvise(struct vm_area_struct *vma, unsigned long start,
 -   unsigned long end, int advice, unsigned long *vm_flags)
 +   unsigned long end, int advice, vm_flags_t *vm_flags)
  {
 struct mm_struct *mm = vma-vm_mm;
 int err;
 diff --git a/mm/madvise.c b/mm/madvise.c
 index 0938b30..d5aee71 100644
 --- a/mm/madvise.c
 +++ b/mm/madvise.c
 @@ -49,7 +49,7 @@ static long madvise_behavior(struct vm_area_struct *vma,
 struct mm_struct *mm = vma-vm_mm;
 int error = 0;
 pgoff_t pgoff;
 -   unsigned long new_flags = vma-vm_flags;
 +   vm_flags_t new_flags = 

Re: [Qemu-devel] [PATCH 07/17] mm: madvise MADV_USERFAULT: prepare vm_flags to allow more than 32bits

2014-10-07 Thread Kirill A. Shutemov
On Fri, Oct 03, 2014 at 07:07:57PM +0200, Andrea Arcangeli wrote:
 We run out of 32bits in vm_flags, noop change for 64bit archs.
 
 Signed-off-by: Andrea Arcangeli aarca...@redhat.com
 ---
  fs/proc/task_mmu.c   | 4 ++--
  include/linux/huge_mm.h  | 4 ++--
  include/linux/ksm.h  | 4 ++--
  include/linux/mm_types.h | 2 +-
  mm/huge_memory.c | 2 +-
  mm/ksm.c | 2 +-
  mm/madvise.c | 2 +-
  mm/mremap.c  | 2 +-
  8 files changed, 11 insertions(+), 11 deletions(-)
 
 diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
 index c341568..ee1c3a2 100644
 --- a/fs/proc/task_mmu.c
 +++ b/fs/proc/task_mmu.c
 @@ -532,11 +532,11 @@ static void show_smap_vma_flags(struct seq_file *m, 
 struct vm_area_struct *vma)
   /*
* Don't forget to update Documentation/ on changes.
*/
 - static const char mnemonics[BITS_PER_LONG][2] = {
 + static const char mnemonics[BITS_PER_LONG+1][2] = {

I believe here and below should be BITS_PER_LONG_LONG instead: it will
catch unknown vmflags. And +1 is not needed un 64-bit systems.

   /*
* In case if we meet a flag we don't know about.
*/
 - [0 ... (BITS_PER_LONG-1)] = ??,
 + [0 ... (BITS_PER_LONG)] = ??,
  
   [ilog2(VM_READ)]= rd,
   [ilog2(VM_WRITE)]   = wr,
-- 
 Kirill A. Shutemov



[Qemu-devel] [PATCH 07/17] mm: madvise MADV_USERFAULT: prepare vm_flags to allow more than 32bits

2014-10-03 Thread Andrea Arcangeli
We run out of 32bits in vm_flags, noop change for 64bit archs.

Signed-off-by: Andrea Arcangeli aarca...@redhat.com
---
 fs/proc/task_mmu.c   | 4 ++--
 include/linux/huge_mm.h  | 4 ++--
 include/linux/ksm.h  | 4 ++--
 include/linux/mm_types.h | 2 +-
 mm/huge_memory.c | 2 +-
 mm/ksm.c | 2 +-
 mm/madvise.c | 2 +-
 mm/mremap.c  | 2 +-
 8 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index c341568..ee1c3a2 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -532,11 +532,11 @@ static void show_smap_vma_flags(struct seq_file *m, 
struct vm_area_struct *vma)
/*
 * Don't forget to update Documentation/ on changes.
 */
-   static const char mnemonics[BITS_PER_LONG][2] = {
+   static const char mnemonics[BITS_PER_LONG+1][2] = {
/*
 * In case if we meet a flag we don't know about.
 */
-   [0 ... (BITS_PER_LONG-1)] = ??,
+   [0 ... (BITS_PER_LONG)] = ??,
 
[ilog2(VM_READ)]= rd,
[ilog2(VM_WRITE)]   = wr,
diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h
index 63579cb..3aa10e0 100644
--- a/include/linux/huge_mm.h
+++ b/include/linux/huge_mm.h
@@ -121,7 +121,7 @@ extern void split_huge_page_pmd_mm(struct mm_struct *mm, 
unsigned long address,
 #error hugepages can't be allocated by the buddy allocator
 #endif
 extern int hugepage_madvise(struct vm_area_struct *vma,
-   unsigned long *vm_flags, int advice);
+   vm_flags_t *vm_flags, int advice);
 extern void __vma_adjust_trans_huge(struct vm_area_struct *vma,
unsigned long start,
unsigned long end,
@@ -183,7 +183,7 @@ static inline int split_huge_page(struct page *page)
 #define split_huge_page_pmd_mm(__mm, __address, __pmd) \
do { } while (0)
 static inline int hugepage_madvise(struct vm_area_struct *vma,
-  unsigned long *vm_flags, int advice)
+  vm_flags_t *vm_flags, int advice)
 {
BUG();
return 0;
diff --git a/include/linux/ksm.h b/include/linux/ksm.h
index 3be6bb1..8b35253 100644
--- a/include/linux/ksm.h
+++ b/include/linux/ksm.h
@@ -18,7 +18,7 @@ struct mem_cgroup;
 
 #ifdef CONFIG_KSM
 int ksm_madvise(struct vm_area_struct *vma, unsigned long start,
-   unsigned long end, int advice, unsigned long *vm_flags);
+   unsigned long end, int advice, vm_flags_t *vm_flags);
 int __ksm_enter(struct mm_struct *mm);
 void __ksm_exit(struct mm_struct *mm);
 
@@ -94,7 +94,7 @@ static inline int PageKsm(struct page *page)
 
 #ifdef CONFIG_MMU
 static inline int ksm_madvise(struct vm_area_struct *vma, unsigned long start,
-   unsigned long end, int advice, unsigned long *vm_flags)
+   unsigned long end, int advice, vm_flags_t *vm_flags)
 {
return 0;
 }
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
index 6e0b286..2c876d1 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -217,7 +217,7 @@ struct page_frag {
 #endif
 };
 
-typedef unsigned long __nocast vm_flags_t;
+typedef unsigned long long __nocast vm_flags_t;
 
 /*
  * A region containing a mapping of a non-memory backed file under NOMMU
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index d9a21d06..e913a19 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -1942,7 +1942,7 @@ out:
 #define VM_NO_THP (VM_SPECIAL | VM_HUGETLB | VM_SHARED | VM_MAYSHARE)
 
 int hugepage_madvise(struct vm_area_struct *vma,
-unsigned long *vm_flags, int advice)
+vm_flags_t *vm_flags, int advice)
 {
switch (advice) {
case MADV_HUGEPAGE:
diff --git a/mm/ksm.c b/mm/ksm.c
index fb75902..faf319e 100644
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -1736,7 +1736,7 @@ static int ksm_scan_thread(void *nothing)
 }
 
 int ksm_madvise(struct vm_area_struct *vma, unsigned long start,
-   unsigned long end, int advice, unsigned long *vm_flags)
+   unsigned long end, int advice, vm_flags_t *vm_flags)
 {
struct mm_struct *mm = vma-vm_mm;
int err;
diff --git a/mm/madvise.c b/mm/madvise.c
index 0938b30..d5aee71 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -49,7 +49,7 @@ static long madvise_behavior(struct vm_area_struct *vma,
struct mm_struct *mm = vma-vm_mm;
int error = 0;
pgoff_t pgoff;
-   unsigned long new_flags = vma-vm_flags;
+   vm_flags_t new_flags = vma-vm_flags;
 
switch (behavior) {
case MADV_NORMAL:
diff --git a/mm/mremap.c b/mm/mremap.c
index 05f1180..fa7db87 100644
--- a/mm/mremap.c
+++ b/mm/mremap.c
@@ -239,7 +239,7 @@ static unsigned long move_vma(struct vm_area_struct *vma,
 {
struct mm_struct *mm = vma-vm_mm;
struct