All of lore.kernel.org
 help / color / mirror / Atom feed
From: Prasad Joshi <prasadjoshi124@gmail.com>
To: schwidefsky@de.ibm.com, heiko.carstens@de.ibm.com,
	linux390@de.ibm.com, linux-s390@vger.kernel.org,
	linux-kernel@vger.kernel.org, prasadjoshi124@gmail.com,
	mitra@kqinfotech.com
Subject: Re: [RFC][PATCH v3 09/22] mm, s390: add gfp flags variant of pud, pte, and pte allocations
Date: Fri, 18 Mar 2011 19:56:44 +0000	[thread overview]
Message-ID: <20110318195643.GJ4746@prasad-kvm> (raw)
In-Reply-To: <20110318195507.GI4746@prasad-kvm>


Generic changes
 - Added function __crst_table_alloc() which is similar to crst_table_alloc()
   but accepts an extra argument gfp_t. The function uses given allocation
   flag to allocate pages.

- The function crst_table_alloc() has been modified to call
  __crst_table_alloc() and pass GFP_KERNEL allocation flag.

- Added a function __page_table_alloc() to allocate page table entries. This
  function is allows caller to specify the page allocation flag. The
  allocation flag is then passed to alloc_page(). The rest of the function is
  copy of the original page_table_alloc().

- The function page_table_alloc() is modified to call __page_table_alloc()
  and pass GFP_KERNEL | __GFP_REPEAT allocation flags.

changes for 32 (31) bit architecture (s390)
- Added macros __pud_alloc_one, __pmd_alloc_one which are similar to
  pud_alloc_one and pmd_alloc_one respectively, but has an extra argument
  for gfp_t.

changes for 64 bit architecture (s390x)
- Added __pud_alloc_one() allow caller to pass the memory allocation flag.
  The function passes the allocation flag to __crst_table_alloc(). The rest
  of the function is copy of crst_table_alloc().

- The function pud_alloc_one() is modified to call __pud_alloc_one() and
  pass GFP_KERNEL allocation flag.

- The similar changes are performed for pmd allocations

- Added marco __pte_alloc_one_kernel() to accept additional argument gfp_t.
  This argument is then passed to __page_table_alloc() to allocate the page
  table entry.

- Modified pte_alloc_one_kernel() to call __pte_alloc_one_kernel() passing
  GFP_KERNEL|__GFP_REPEAT allocation flags.

- The changes for both architectures help in fixing Bug 30702

Signed-off-by: Prasad Joshi <prasadjoshi124@gmail.com>
Signed-off-by: Anand Mitra <mitra@kqinfotech.com>
---
 arch/s390/include/asm/pgalloc.h |   30 +++++++++++++++++++++++++-----
 arch/s390/mm/pgtable.c          |   22 +++++++++++++++++-----
 2 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/arch/s390/include/asm/pgalloc.h b/arch/s390/include/asm/pgalloc.h
index 082eb4e..459e89a 100644
--- a/arch/s390/include/asm/pgalloc.h
+++ b/arch/s390/include/asm/pgalloc.h
@@ -20,10 +20,12 @@
 #define check_pgt_cache()	do {} while (0)
 
 unsigned long *crst_table_alloc(struct mm_struct *, int);
+unsigned long * __crst_table_alloc(struct mm_struct *, int , gfp_t);
 void crst_table_free(struct mm_struct *, unsigned long *);
 void crst_table_free_rcu(struct mm_struct *, unsigned long *);
 
 unsigned long *page_table_alloc(struct mm_struct *);
+unsigned long *__page_table_alloc(struct mm_struct *, gfp_t);
 void page_table_free(struct mm_struct *, unsigned long *);
 void page_table_free_rcu(struct mm_struct *, unsigned long *);
 void disable_noexec(struct mm_struct *, struct task_struct *);
@@ -62,9 +64,11 @@ static inline unsigned long pgd_entry_type(struct mm_struct *mm)
 	return _SEGMENT_ENTRY_EMPTY;
 }
 
+#define __pud_alloc_one(mm,address,mask)		({ BUG(); ((pud_t *)2); })
 #define pud_alloc_one(mm,address)		({ BUG(); ((pud_t *)2); })
 #define pud_free(mm, x)				do { } while (0)
 
+#define __pmd_alloc_one(mm,address,mask)		({ BUG(); ((pmd_t *)2); })
 #define pmd_alloc_one(mm,address)		({ BUG(); ((pmd_t *)2); })
 #define pmd_free(mm, x)				do { } while (0)
 
@@ -88,22 +92,34 @@ static inline unsigned long pgd_entry_type(struct mm_struct *mm)
 int crst_table_upgrade(struct mm_struct *, unsigned long limit);
 void crst_table_downgrade(struct mm_struct *, unsigned long limit);
 
-static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address)
+static inline pud_t *
+__pud_alloc_one(struct mm_struct *mm, unsigned long address, gfp_t gfp_mask)
 {
-	unsigned long *table = crst_table_alloc(mm, mm->context.noexec);
+	unsigned long *table = __crst_table_alloc(mm, mm->context.noexec, gfp_mask);
 	if (table)
 		crst_table_init(table, _REGION3_ENTRY_EMPTY);
 	return (pud_t *) table;
 }
+
+static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address)
+{
+	return __pud_alloc_one(mm, address, GFP_KERNEL);
+}
 #define pud_free(mm, pud) crst_table_free(mm, (unsigned long *) pud)
 
-static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr)
+static inline pmd_t *
+__pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr, gfp_t gfp_mask)
 {
-	unsigned long *table = crst_table_alloc(mm, mm->context.noexec);
+	unsigned long *table = __crst_table_alloc(mm, mm->context.noexec, gfp_mask);
 	if (table)
 		crst_table_init(table, _SEGMENT_ENTRY_EMPTY);
 	return (pmd_t *) table;
 }
+
+static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr)
+{
+	return __pmd_alloc_one(mm, vmaddr, GFP_KERNEL);
+}
 #define pmd_free(mm, pmd) crst_table_free(mm, (unsigned long *) pmd)
 
 static inline void pgd_populate_kernel(struct mm_struct *mm,
@@ -172,7 +188,11 @@ static inline void pmd_populate(struct mm_struct *mm,
 /*
  * page table entry allocation/free routines.
  */
-#define pte_alloc_one_kernel(mm, vmaddr) ((pte_t *) page_table_alloc(mm))
+#define __pte_alloc_one_kernel(mm, vmaddr, mask) \
+	((pte_t *) __page_table_alloc((mm), (mask)))
+#define pte_alloc_one_kernel(mm, vmaddr) \
+	((pte_t *) __pte_alloc_one_kernel((mm), (vmaddr), GFP_KERNEL|__GFP_REPEAT)
+
 #define pte_alloc_one(mm, vmaddr) ((pte_t *) page_table_alloc(mm))
 
 #define pte_free_kernel(mm, pte) page_table_free(mm, (unsigned long *) pte)
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c
index e1850c2..624854a 100644
--- a/arch/s390/mm/pgtable.c
+++ b/arch/s390/mm/pgtable.c
@@ -125,15 +125,16 @@ static int __init parse_vmalloc(char *arg)
 }
 early_param("vmalloc", parse_vmalloc);
 
-unsigned long *crst_table_alloc(struct mm_struct *mm, int noexec)
+unsigned long *
+__crst_table_alloc(struct mm_struct *mm, int noexec, gfp_t gfp_mask)
 {
-	struct page *page = alloc_pages(GFP_KERNEL, ALLOC_ORDER);
+	struct page *page = alloc_pages(gfp_mask, ALLOC_ORDER);
 
 	if (!page)
 		return NULL;
 	page->index = 0;
 	if (noexec) {
-		struct page *shadow = alloc_pages(GFP_KERNEL, ALLOC_ORDER);
+		struct page *shadow = alloc_pages(gfp_mask, ALLOC_ORDER);
 		if (!shadow) {
 			__free_pages(page, ALLOC_ORDER);
 			return NULL;
@@ -146,6 +147,11 @@ unsigned long *crst_table_alloc(struct mm_struct *mm, int noexec)
 	return (unsigned long *) page_to_phys(page);
 }
 
+unsigned long *crst_table_alloc(struct mm_struct *mm, int noexec)
+{
+	return __crst_table_alloc(mm, noexec, GFP_KERNEL);
+}
+
 static void __crst_table_free(struct mm_struct *mm, unsigned long *table)
 {
 	unsigned long *shadow = get_shadow_table(table);
@@ -267,7 +273,7 @@ void crst_table_downgrade(struct mm_struct *mm, unsigned long limit)
 /*
  * page table entry allocation/free routines.
  */
-unsigned long *page_table_alloc(struct mm_struct *mm)
+unsigned long *__page_table_alloc(struct mm_struct *mm, gfp_t gfp_mask)
 {
 	struct page *page;
 	unsigned long *table;
@@ -284,7 +290,7 @@ unsigned long *page_table_alloc(struct mm_struct *mm)
 	}
 	if (!page) {
 		spin_unlock_bh(&mm->context.list_lock);
-		page = alloc_page(GFP_KERNEL|__GFP_REPEAT);
+		page = alloc_page(gfp_mask);
 		if (!page)
 			return NULL;
 		pgtable_page_ctor(page);
@@ -309,6 +315,12 @@ unsigned long *page_table_alloc(struct mm_struct *mm)
 	return table;
 }
 
+
+unsigned long *page_table_alloc(struct mm_struct *mm)
+{
+	return __page_table_alloc(mm, GFP_KERNEL | __GFP_REPEAT);
+}
+
 static void __page_table_free(struct mm_struct *mm, unsigned long *table)
 {
 	struct page *page;
-- 
1.7.0.4

  reply	other threads:[~2011-03-18 19:56 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-18 19:41 [RFC][PATCH v3 00/22] __vmalloc: Propagating GFP allocation flag inside __vmalloc() Prasad Joshi
2011-03-18 19:41 ` Prasad Joshi
2011-03-18 19:41 ` Prasad Joshi
2011-03-18 19:41 ` Prasad Joshi
2011-03-18 19:41 ` [RFC][PATCH v3 00/22] __vmalloc: Propagating GFP allocation flag Prasad Joshi
2011-03-18 19:41 ` [RFC][PATCH v3 00/22] __vmalloc: Propagating GFP allocation flag inside __vmalloc() Prasad Joshi
2011-03-18 19:43 ` [RFC][PATCH v3 01/22] mm: " Prasad Joshi
2011-03-18 19:43   ` Prasad Joshi
2011-03-18 19:46   ` [RFC][PATCH v3 02/22] mm, xtensa: add gfp flags variant of pte allocations Prasad Joshi
2011-03-18 19:47     ` [RFC][PATCH v3 03/22] mm, x86: add gfp flags variant of pud, pmd, and " Prasad Joshi
2011-03-18 19:49       ` [RFC][PATCH v3 04/22] mm, um: add gfp flags variant of pmd " Prasad Joshi
2011-03-18 19:50         ` [RFC][PATCH v3 05/22] mm, tile: " Prasad Joshi
2011-03-18 19:51           ` [RFC][PATCH v3 06/22] mm, sparc: add gfp flags variant of pmd Prasad Joshi
2011-03-18 19:51             ` [RFC][PATCH v3 06/22] mm, sparc: add gfp flags variant of pmd and pte allocations Prasad Joshi
2011-03-18 19:53             ` [RFC][PATCH v3 07/22] mm, sh: add gfp flags variant of pmd and Prasad Joshi
2011-03-18 19:53               ` [RFC][PATCH v3 07/22] mm, sh: add gfp flags variant of pmd and pte allocations Prasad Joshi
2011-03-18 19:55               ` [RFC][PATCH v3 08/22] mm, score: add gfp flags variant of " Prasad Joshi
2011-03-18 19:56                 ` Prasad Joshi [this message]
2011-03-18 19:57                   ` [RFC][PATCH v3 10/22] mm, powerpc: add gfp flags variant of pud, pte, and " Prasad Joshi
2011-03-18 19:59                     ` [RFC][PATCH v3 11/22] mm, parisc: add gfp flags variant of pmd " Prasad Joshi
2011-03-18 20:00                       ` [RFC][PATCH v3 12/22] mm, mn10300: add gfp flags variant of " Prasad Joshi
2011-03-18 20:01                         ` [RFC][PATCH v3 13/22] mm, mips: add gfp flags variant of pmd and " Prasad Joshi
2011-03-18 20:02                           ` [RFC][PATCH v3 14/22] mm, microblaze: " Prasad Joshi
2011-03-18 20:04                             ` [RFC][PATCH v3 15/22] mm, m68k: " Prasad Joshi
2011-03-18 20:04                               ` Prasad Joshi
2011-03-18 20:04                               ` [RFC][PATCH v3 16/22] mm, m32r: " Prasad Joshi
2011-03-18 20:05                                 ` [RFC][PATCH v3 17/22] mm, ia64: add gfp flags variant of pud, Prasad Joshi
2011-03-18 20:05                                   ` [RFC][PATCH v3 17/22] mm, ia64: add gfp flags variant of pud, pmd and pte allocations Prasad Joshi
2011-03-18 20:06                                   ` [RFC][PATCH v3 18/22] mm, frv: " Prasad Joshi
2011-03-18 20:07                                     ` [RFC][PATCH v3 19/22] mm, cris: add gfp flags variant of " Prasad Joshi
2011-03-18 20:08                                       ` [RFC][PATCH v3 20/22] mm, avr32: " Prasad Joshi
2011-03-18 20:09                                         ` [RFC][PATCH v3 21/22] mm, arm: add gfp flags variant of pmd and " Prasad Joshi
2011-03-18 20:09                                           ` Prasad Joshi
2011-03-18 20:10                                           ` [RFC][PATCH v3 22/22] mm, alpha: " Prasad Joshi
2011-03-21  8:34                   ` [RFC][PATCH v3 09/22] mm, s390: add gfp flags variant of pud, pte, " Martin Schwidefsky
2011-03-21 19:02                     ` Prasad Joshi
2011-03-22  7:56                       ` Martin Schwidefsky
2011-03-22 14:42               ` [RFC][PATCH v3 07/22] mm, sh: add gfp flags variant of pmd " Paul Mundt
2011-03-22 14:42                 ` Paul Mundt
     [not found]           ` <4D83B7F2.4000903@tilera.com>
2011-03-18 20:12             ` [RFC][PATCH v3 05/22] mm, tile: " Prasad Joshi
2011-03-18 22:17       ` [RFC][PATCH v3 03/22] mm, x86: add gfp flags variant of pud, pmd, " David Rientjes
2011-03-21 19:05         ` Prasad Joshi
2011-03-21 20:15           ` David Rientjes

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110318195643.GJ4746@prasad-kvm \
    --to=prasadjoshi124@gmail.com \
    --cc=heiko.carstens@de.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linux390@de.ibm.com \
    --cc=mitra@kqinfotech.com \
    --cc=schwidefsky@de.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.