All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
@ 2013-08-14  7:00 ` Cyrill Gorcunov
  0 siblings, 0 replies; 21+ messages in thread
From: Cyrill Gorcunov @ 2013-08-14  7:00 UTC (permalink / raw)
  To: Andrew Morton
  Cc: H. Peter Anvin, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

Use unified pte_bfop helper to manipulate bits in pte/pgoff bitfield.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Pavel Emelyanov <xemul@parallels.com>
Cc: Matt Mackall <mpm@selenic.com>
Cc: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@elte.hu>
---
 arch/x86/include/asm/pgtable-2level.h |   51 ++++++++++++++++++----------------
 1 file changed, 27 insertions(+), 24 deletions(-)

Index: linux-2.6.git/arch/x86/include/asm/pgtable-2level.h
===================================================================
--- linux-2.6.git.orig/arch/x86/include/asm/pgtable-2level.h
+++ linux-2.6.git/arch/x86/include/asm/pgtable-2level.h
@@ -55,8 +55,11 @@ static inline pmd_t native_pmdp_get_and_
 #define native_pmdp_get_and_clear(xp) native_local_pmdp_get_and_clear(xp)
 #endif
 
-#define _mfrob(v,r,m,l)		((((v) >> (r)) & (m)) << (l))
-#define __frob(v,r,l)		(((v) >> (r)) << (l))
+/*
+ * For readable bitfield manipulations.
+ */
+#define PTE_FILE_NOMASK		(-1U)
+#define pte_bfop(v,r,m,l)	((((v) >> (r)) & (m)) << (l))
 
 #ifdef CONFIG_MEM_SOFT_DIRTY
 
@@ -82,18 +85,18 @@ static inline pmd_t native_pmdp_get_and_
 #define PTE_FILE_LSHIFT3	(PTE_FILE_BITS1 + PTE_FILE_BITS2)
 #define PTE_FILE_LSHIFT4	(PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3)
 
-#define pte_to_pgoff(pte)							    \
-	(_mfrob((pte).pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0)		  + \
-	 _mfrob((pte).pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2) + \
-	 _mfrob((pte).pte_low, PTE_FILE_SHIFT3, PTE_FILE_MASK3, PTE_FILE_LSHIFT3) + \
-	 __frob((pte).pte_low, PTE_FILE_SHIFT4, PTE_FILE_LSHIFT4))
-
-#define pgoff_to_pte(off)							\
-	((pte_t) { .pte_low =							\
-	_mfrob(off,                0, PTE_FILE_MASK1, PTE_FILE_SHIFT1)	+	\
-	_mfrob(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2)	+	\
-	_mfrob(off, PTE_FILE_LSHIFT3, PTE_FILE_MASK3, PTE_FILE_SHIFT3)	+	\
-	__frob(off, PTE_FILE_LSHIFT4, PTE_FILE_SHIFT4)			+	\
+#define pte_to_pgoff(pte)								  \
+	(pte_bfop((pte).pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0)			+ \
+	 pte_bfop((pte).pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2)	+ \
+	 pte_bfop((pte).pte_low, PTE_FILE_SHIFT3, PTE_FILE_MASK3, PTE_FILE_LSHIFT3)	+ \
+	 pte_bfop((pte).pte_low, PTE_FILE_SHIFT4, PTE_FILE_NOMASK, PTE_FILE_LSHIFT4))
+
+#define pgoff_to_pte(off)							  \
+	((pte_t) { .pte_low =							  \
+	pte_bfop(off,                0, PTE_FILE_MASK1, PTE_FILE_SHIFT1)	+ \
+	pte_bfop(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2)	+ \
+	pte_bfop(off, PTE_FILE_LSHIFT3, PTE_FILE_MASK3, PTE_FILE_SHIFT3)	+ \
+	pte_bfop(off, PTE_FILE_LSHIFT4, PTE_FILE_NOMASK, PTE_FILE_SHIFT4)	+ \
 	_PAGE_FILE })
 
 #else /* CONFIG_MEM_SOFT_DIRTY */
@@ -120,16 +123,16 @@ static inline pmd_t native_pmdp_get_and_
 #define PTE_FILE_LSHIFT2	(PTE_FILE_BITS1)
 #define PTE_FILE_LSHIFT3	(PTE_FILE_BITS1 + PTE_FILE_BITS2)
 
-#define pte_to_pgoff(pte)							    \
-	(_mfrob((pte).pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0)		  + \
-	 _mfrob((pte).pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2) + \
-	 __frob((pte).pte_low, PTE_FILE_SHIFT3, PTE_FILE_LSHIFT3))
-
-#define pgoff_to_pte(off)							\
-	((pte_t) { .pte_low =							\
-	_mfrob(off,                0, PTE_FILE_MASK1, PTE_FILE_SHIFT1)	+	\
-	_mfrob(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2)	+	\
-	__frob(off, PTE_FILE_LSHIFT3, PTE_FILE_SHIFT3)			+	\
+#define pte_to_pgoff(pte)								  \
+	(pte_bfop((pte).pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0)			+ \
+	 pte_bfop((pte).pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2)	+ \
+	 pte_bfop((pte).pte_low, PTE_FILE_SHIFT3, PTE_FILE_NOMASK, PTE_FILE_LSHIFT3))
+
+#define pgoff_to_pte(off)							  \
+	((pte_t) { .pte_low =							  \
+	pte_bfop(off,                0, PTE_FILE_MASK1, PTE_FILE_SHIFT1)	+ \
+	pte_bfop(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2)	+ \
+	pte_bfop(off, PTE_FILE_LSHIFT3, PTE_FILE_NOMASK, PTE_FILE_SHIFT3)	+ \
 	_PAGE_FILE })
 
 #endif /* CONFIG_MEM_SOFT_DIRTY */

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
@ 2013-08-14  7:00 ` Cyrill Gorcunov
  0 siblings, 0 replies; 21+ messages in thread
From: Cyrill Gorcunov @ 2013-08-14  7:00 UTC (permalink / raw)
  To: Andrew Morton
  Cc: H. Peter Anvin, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

Use unified pte_bfop helper to manipulate bits in pte/pgoff bitfield.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Pavel Emelyanov <xemul@parallels.com>
Cc: Matt Mackall <mpm@selenic.com>
Cc: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@elte.hu>
---
 arch/x86/include/asm/pgtable-2level.h |   51 ++++++++++++++++++----------------
 1 file changed, 27 insertions(+), 24 deletions(-)

Index: linux-2.6.git/arch/x86/include/asm/pgtable-2level.h
===================================================================
--- linux-2.6.git.orig/arch/x86/include/asm/pgtable-2level.h
+++ linux-2.6.git/arch/x86/include/asm/pgtable-2level.h
@@ -55,8 +55,11 @@ static inline pmd_t native_pmdp_get_and_
 #define native_pmdp_get_and_clear(xp) native_local_pmdp_get_and_clear(xp)
 #endif
 
-#define _mfrob(v,r,m,l)		((((v) >> (r)) & (m)) << (l))
-#define __frob(v,r,l)		(((v) >> (r)) << (l))
+/*
+ * For readable bitfield manipulations.
+ */
+#define PTE_FILE_NOMASK		(-1U)
+#define pte_bfop(v,r,m,l)	((((v) >> (r)) & (m)) << (l))
 
 #ifdef CONFIG_MEM_SOFT_DIRTY
 
@@ -82,18 +85,18 @@ static inline pmd_t native_pmdp_get_and_
 #define PTE_FILE_LSHIFT3	(PTE_FILE_BITS1 + PTE_FILE_BITS2)
 #define PTE_FILE_LSHIFT4	(PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3)
 
-#define pte_to_pgoff(pte)							    \
-	(_mfrob((pte).pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0)		  + \
-	 _mfrob((pte).pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2) + \
-	 _mfrob((pte).pte_low, PTE_FILE_SHIFT3, PTE_FILE_MASK3, PTE_FILE_LSHIFT3) + \
-	 __frob((pte).pte_low, PTE_FILE_SHIFT4, PTE_FILE_LSHIFT4))
-
-#define pgoff_to_pte(off)							\
-	((pte_t) { .pte_low =							\
-	_mfrob(off,                0, PTE_FILE_MASK1, PTE_FILE_SHIFT1)	+	\
-	_mfrob(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2)	+	\
-	_mfrob(off, PTE_FILE_LSHIFT3, PTE_FILE_MASK3, PTE_FILE_SHIFT3)	+	\
-	__frob(off, PTE_FILE_LSHIFT4, PTE_FILE_SHIFT4)			+	\
+#define pte_to_pgoff(pte)								  \
+	(pte_bfop((pte).pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0)			+ \
+	 pte_bfop((pte).pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2)	+ \
+	 pte_bfop((pte).pte_low, PTE_FILE_SHIFT3, PTE_FILE_MASK3, PTE_FILE_LSHIFT3)	+ \
+	 pte_bfop((pte).pte_low, PTE_FILE_SHIFT4, PTE_FILE_NOMASK, PTE_FILE_LSHIFT4))
+
+#define pgoff_to_pte(off)							  \
+	((pte_t) { .pte_low =							  \
+	pte_bfop(off,                0, PTE_FILE_MASK1, PTE_FILE_SHIFT1)	+ \
+	pte_bfop(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2)	+ \
+	pte_bfop(off, PTE_FILE_LSHIFT3, PTE_FILE_MASK3, PTE_FILE_SHIFT3)	+ \
+	pte_bfop(off, PTE_FILE_LSHIFT4, PTE_FILE_NOMASK, PTE_FILE_SHIFT4)	+ \
 	_PAGE_FILE })
 
 #else /* CONFIG_MEM_SOFT_DIRTY */
@@ -120,16 +123,16 @@ static inline pmd_t native_pmdp_get_and_
 #define PTE_FILE_LSHIFT2	(PTE_FILE_BITS1)
 #define PTE_FILE_LSHIFT3	(PTE_FILE_BITS1 + PTE_FILE_BITS2)
 
-#define pte_to_pgoff(pte)							    \
-	(_mfrob((pte).pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0)		  + \
-	 _mfrob((pte).pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2) + \
-	 __frob((pte).pte_low, PTE_FILE_SHIFT3, PTE_FILE_LSHIFT3))
-
-#define pgoff_to_pte(off)							\
-	((pte_t) { .pte_low =							\
-	_mfrob(off,                0, PTE_FILE_MASK1, PTE_FILE_SHIFT1)	+	\
-	_mfrob(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2)	+	\
-	__frob(off, PTE_FILE_LSHIFT3, PTE_FILE_SHIFT3)			+	\
+#define pte_to_pgoff(pte)								  \
+	(pte_bfop((pte).pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0)			+ \
+	 pte_bfop((pte).pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2)	+ \
+	 pte_bfop((pte).pte_low, PTE_FILE_SHIFT3, PTE_FILE_NOMASK, PTE_FILE_LSHIFT3))
+
+#define pgoff_to_pte(off)							  \
+	((pte_t) { .pte_low =							  \
+	pte_bfop(off,                0, PTE_FILE_MASK1, PTE_FILE_SHIFT1)	+ \
+	pte_bfop(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2)	+ \
+	pte_bfop(off, PTE_FILE_LSHIFT3, PTE_FILE_NOMASK, PTE_FILE_SHIFT3)	+ \
 	_PAGE_FILE })
 
 #endif /* CONFIG_MEM_SOFT_DIRTY */

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
  2013-08-14  7:00 ` Cyrill Gorcunov
@ 2013-08-14  7:22   ` H. Peter Anvin
  -1 siblings, 0 replies; 21+ messages in thread
From: H. Peter Anvin @ 2013-08-14  7:22 UTC (permalink / raw)
  To: Cyrill Gorcunov
  Cc: Andrew Morton, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On 08/14/2013 12:00 AM, Cyrill Gorcunov wrote:
> +#define pte_bfop(v,r,m,l)	((((v) >> (r)) & (m)) << (l))

"bfop"?

	-hpa



^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
@ 2013-08-14  7:22   ` H. Peter Anvin
  0 siblings, 0 replies; 21+ messages in thread
From: H. Peter Anvin @ 2013-08-14  7:22 UTC (permalink / raw)
  To: Cyrill Gorcunov
  Cc: Andrew Morton, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On 08/14/2013 12:00 AM, Cyrill Gorcunov wrote:
> +#define pte_bfop(v,r,m,l)	((((v) >> (r)) & (m)) << (l))

"bfop"?

	-hpa


--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
  2013-08-14  7:22   ` H. Peter Anvin
@ 2013-08-14  7:24     ` Cyrill Gorcunov
  -1 siblings, 0 replies; 21+ messages in thread
From: Cyrill Gorcunov @ 2013-08-14  7:24 UTC (permalink / raw)
  To: H. Peter Anvin
  Cc: Andrew Morton, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On Wed, Aug 14, 2013 at 12:22:37AM -0700, H. Peter Anvin wrote:
> On 08/14/2013 12:00 AM, Cyrill Gorcunov wrote:
> > +#define pte_bfop(v,r,m,l)	((((v) >> (r)) & (m)) << (l))
> 
> "bfop"?

B_it_F_ield_OP_eration, Peter I don't mind to use any other
name, this was just short enough to type.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
@ 2013-08-14  7:24     ` Cyrill Gorcunov
  0 siblings, 0 replies; 21+ messages in thread
From: Cyrill Gorcunov @ 2013-08-14  7:24 UTC (permalink / raw)
  To: H. Peter Anvin
  Cc: Andrew Morton, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On Wed, Aug 14, 2013 at 12:22:37AM -0700, H. Peter Anvin wrote:
> On 08/14/2013 12:00 AM, Cyrill Gorcunov wrote:
> > +#define pte_bfop(v,r,m,l)	((((v) >> (r)) & (m)) << (l))
> 
> "bfop"?

B_it_F_ield_OP_eration, Peter I don't mind to use any other
name, this was just short enough to type.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
  2013-08-14  7:24     ` Cyrill Gorcunov
@ 2013-08-14  7:31       ` H. Peter Anvin
  -1 siblings, 0 replies; 21+ messages in thread
From: H. Peter Anvin @ 2013-08-14  7:31 UTC (permalink / raw)
  To: Cyrill Gorcunov
  Cc: Andrew Morton, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On 08/14/2013 12:24 AM, Cyrill Gorcunov wrote:
> On Wed, Aug 14, 2013 at 12:22:37AM -0700, H. Peter Anvin wrote:
>> On 08/14/2013 12:00 AM, Cyrill Gorcunov wrote:
>>> +#define pte_bfop(v,r,m,l)	((((v) >> (r)) & (m)) << (l))
>>
>> "bfop"?
> 
> B_it_F_ield_OP_eration, Peter I don't mind to use any other
> name, this was just short enough to type.
> 

I think it would be useful to have a comment what it means and what
v,r,m,l represent.

Perhaps m should be mask width rather than the actual mask?

	-hpa


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
@ 2013-08-14  7:31       ` H. Peter Anvin
  0 siblings, 0 replies; 21+ messages in thread
From: H. Peter Anvin @ 2013-08-14  7:31 UTC (permalink / raw)
  To: Cyrill Gorcunov
  Cc: Andrew Morton, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On 08/14/2013 12:24 AM, Cyrill Gorcunov wrote:
> On Wed, Aug 14, 2013 at 12:22:37AM -0700, H. Peter Anvin wrote:
>> On 08/14/2013 12:00 AM, Cyrill Gorcunov wrote:
>>> +#define pte_bfop(v,r,m,l)	((((v) >> (r)) & (m)) << (l))
>>
>> "bfop"?
> 
> B_it_F_ield_OP_eration, Peter I don't mind to use any other
> name, this was just short enough to type.
> 

I think it would be useful to have a comment what it means and what
v,r,m,l represent.

Perhaps m should be mask width rather than the actual mask?

	-hpa

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
  2013-08-14  7:31       ` H. Peter Anvin
@ 2013-08-14  7:33         ` Andrew Morton
  -1 siblings, 0 replies; 21+ messages in thread
From: Andrew Morton @ 2013-08-14  7:33 UTC (permalink / raw)
  To: H. Peter Anvin
  Cc: Cyrill Gorcunov, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On Wed, 14 Aug 2013 00:31:12 -0700 "H. Peter Anvin" <hpa@zytor.com> wrote:

> On 08/14/2013 12:24 AM, Cyrill Gorcunov wrote:
> > On Wed, Aug 14, 2013 at 12:22:37AM -0700, H. Peter Anvin wrote:
> >> On 08/14/2013 12:00 AM, Cyrill Gorcunov wrote:
> >>> +#define pte_bfop(v,r,m,l)	((((v) >> (r)) & (m)) << (l))
> >>
> >> "bfop"?
> > 
> > B_it_F_ield_OP_eration, Peter I don't mind to use any other
> > name, this was just short enough to type.
> > 
> 
> I think it would be useful to have a comment what it means and what
> v,r,m,l represent.

Can it be written in C with types and proper variable names and such
radical stuff?


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
@ 2013-08-14  7:33         ` Andrew Morton
  0 siblings, 0 replies; 21+ messages in thread
From: Andrew Morton @ 2013-08-14  7:33 UTC (permalink / raw)
  To: H. Peter Anvin
  Cc: Cyrill Gorcunov, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On Wed, 14 Aug 2013 00:31:12 -0700 "H. Peter Anvin" <hpa@zytor.com> wrote:

> On 08/14/2013 12:24 AM, Cyrill Gorcunov wrote:
> > On Wed, Aug 14, 2013 at 12:22:37AM -0700, H. Peter Anvin wrote:
> >> On 08/14/2013 12:00 AM, Cyrill Gorcunov wrote:
> >>> +#define pte_bfop(v,r,m,l)	((((v) >> (r)) & (m)) << (l))
> >>
> >> "bfop"?
> > 
> > B_it_F_ield_OP_eration, Peter I don't mind to use any other
> > name, this was just short enough to type.
> > 
> 
> I think it would be useful to have a comment what it means and what
> v,r,m,l represent.

Can it be written in C with types and proper variable names and such
radical stuff?

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
  2013-08-14  7:33         ` Andrew Morton
@ 2013-08-14  7:43           ` Cyrill Gorcunov
  -1 siblings, 0 replies; 21+ messages in thread
From: Cyrill Gorcunov @ 2013-08-14  7:43 UTC (permalink / raw)
  To: Andrew Morton
  Cc: H. Peter Anvin, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On Wed, Aug 14, 2013 at 12:33:36AM -0700, Andrew Morton wrote:
> > > B_it_F_ield_OP_eration, Peter I don't mind to use any other
> > > name, this was just short enough to type.
> > > 
> > 
> > I think it would be useful to have a comment what it means and what
> > v,r,m,l represent.

Sure, maybe simply better names as value, rshift, mask, lshift would
look more understandable. I'll try to use width for mask as well
(which reminds me BFEXT helpers Andrew mentioned in this thread).

> Can it be written in C with types and proper variable names and such
> radical stuff?

Could you elaborate? You mean inline helper or macro with type checks?

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
@ 2013-08-14  7:43           ` Cyrill Gorcunov
  0 siblings, 0 replies; 21+ messages in thread
From: Cyrill Gorcunov @ 2013-08-14  7:43 UTC (permalink / raw)
  To: Andrew Morton
  Cc: H. Peter Anvin, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On Wed, Aug 14, 2013 at 12:33:36AM -0700, Andrew Morton wrote:
> > > B_it_F_ield_OP_eration, Peter I don't mind to use any other
> > > name, this was just short enough to type.
> > > 
> > 
> > I think it would be useful to have a comment what it means and what
> > v,r,m,l represent.

Sure, maybe simply better names as value, rshift, mask, lshift would
look more understandable. I'll try to use width for mask as well
(which reminds me BFEXT helpers Andrew mentioned in this thread).

> Can it be written in C with types and proper variable names and such
> radical stuff?

Could you elaborate? You mean inline helper or macro with type checks?

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
  2013-08-14  7:43           ` Cyrill Gorcunov
@ 2013-08-14  8:08             ` Andrew Morton
  -1 siblings, 0 replies; 21+ messages in thread
From: Andrew Morton @ 2013-08-14  8:08 UTC (permalink / raw)
  To: Cyrill Gorcunov
  Cc: H. Peter Anvin, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On Wed, 14 Aug 2013 11:43:33 +0400 Cyrill Gorcunov <gorcunov@gmail.com> wrote:

> On Wed, Aug 14, 2013 at 12:33:36AM -0700, Andrew Morton wrote:
> > > > B_it_F_ield_OP_eration, Peter I don't mind to use any other
> > > > name, this was just short enough to type.
> > > > 
> > > 
> > > I think it would be useful to have a comment what it means and what
> > > v,r,m,l represent.
> 
> Sure, maybe simply better names as value, rshift, mask, lshift would
> look more understandable. I'll try to use width for mask as well
> (which reminds me BFEXT helpers Andrew mentioned in this thread).
> 
> > Can it be written in C with types and proper variable names and such
> > radical stuff?
> 
> Could you elaborate? You mean inline helper or macro with type checks?

/*
 * description goes here
 */
static inline pteval_t pte_bfop(pteval_t val, int rightshift, ...)
{
	...
}

So much better!  We really should only implement code in a macro if it
*has* to be done as a macro and I don't think that's the case here?


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
@ 2013-08-14  8:08             ` Andrew Morton
  0 siblings, 0 replies; 21+ messages in thread
From: Andrew Morton @ 2013-08-14  8:08 UTC (permalink / raw)
  To: Cyrill Gorcunov
  Cc: H. Peter Anvin, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On Wed, 14 Aug 2013 11:43:33 +0400 Cyrill Gorcunov <gorcunov@gmail.com> wrote:

> On Wed, Aug 14, 2013 at 12:33:36AM -0700, Andrew Morton wrote:
> > > > B_it_F_ield_OP_eration, Peter I don't mind to use any other
> > > > name, this was just short enough to type.
> > > > 
> > > 
> > > I think it would be useful to have a comment what it means and what
> > > v,r,m,l represent.
> 
> Sure, maybe simply better names as value, rshift, mask, lshift would
> look more understandable. I'll try to use width for mask as well
> (which reminds me BFEXT helpers Andrew mentioned in this thread).
> 
> > Can it be written in C with types and proper variable names and such
> > radical stuff?
> 
> Could you elaborate? You mean inline helper or macro with type checks?

/*
 * description goes here
 */
static inline pteval_t pte_bfop(pteval_t val, int rightshift, ...)
{
	...
}

So much better!  We really should only implement code in a macro if it
*has* to be done as a macro and I don't think that's the case here?

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
  2013-08-14  8:08             ` Andrew Morton
@ 2013-08-14  8:20               ` Cyrill Gorcunov
  -1 siblings, 0 replies; 21+ messages in thread
From: Cyrill Gorcunov @ 2013-08-14  8:20 UTC (permalink / raw)
  To: Andrew Morton
  Cc: H. Peter Anvin, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On Wed, Aug 14, 2013 at 01:08:56AM -0700, Andrew Morton wrote:
> > 
> > > Can it be written in C with types and proper variable names and such
> > > radical stuff?
> > 
> > Could you elaborate? You mean inline helper or macro with type checks?
> 
> /*
>  * description goes here
>  */
> static inline pteval_t pte_bfop(pteval_t val, int rightshift, ...)
> {
> 	...
> }
> 
> So much better!  We really should only implement code in a macro if it
> *has* to be done as a macro and I don't think that's the case here?

Well, I'll have to check if it really doesn't generate additional
instructions in generated code, since it's hotpath. I'll ping back
once things are done.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
@ 2013-08-14  8:20               ` Cyrill Gorcunov
  0 siblings, 0 replies; 21+ messages in thread
From: Cyrill Gorcunov @ 2013-08-14  8:20 UTC (permalink / raw)
  To: Andrew Morton
  Cc: H. Peter Anvin, Andy Lutomirski, Pavel Emelyanov, Matt Mackall,
	Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On Wed, Aug 14, 2013 at 01:08:56AM -0700, Andrew Morton wrote:
> > 
> > > Can it be written in C with types and proper variable names and such
> > > radical stuff?
> > 
> > Could you elaborate? You mean inline helper or macro with type checks?
> 
> /*
>  * description goes here
>  */
> static inline pteval_t pte_bfop(pteval_t val, int rightshift, ...)
> {
> 	...
> }
> 
> So much better!  We really should only implement code in a macro if it
> *has* to be done as a macro and I don't think that's the case here?

Well, I'll have to check if it really doesn't generate additional
instructions in generated code, since it's hotpath. I'll ping back
once things are done.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
  2013-08-14  8:20               ` Cyrill Gorcunov
@ 2013-08-14  9:50                 ` Ingo Molnar
  -1 siblings, 0 replies; 21+ messages in thread
From: Ingo Molnar @ 2013-08-14  9:50 UTC (permalink / raw)
  To: Cyrill Gorcunov
  Cc: Andrew Morton, H. Peter Anvin, Andy Lutomirski, Pavel Emelyanov,
	Matt Mackall, Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar


* Cyrill Gorcunov <gorcunov@gmail.com> wrote:

> On Wed, Aug 14, 2013 at 01:08:56AM -0700, Andrew Morton wrote:
> > > 
> > > > Can it be written in C with types and proper variable names and such
> > > > radical stuff?
> > > 
> > > Could you elaborate? You mean inline helper or macro with type checks?
> > 
> > /*
> >  * description goes here
> >  */
> > static inline pteval_t pte_bfop(pteval_t val, int rightshift, ...)
> > {
> > 	...
> > }
> > 
> > So much better!  We really should only implement code in a macro if it
> > *has* to be done as a macro and I don't think that's the case here?
> 
> Well, I'll have to check if it really doesn't generate additional 
> instructions in generated code, since it's hotpath. I'll ping back once 
> things are done.

An __always_inline should never do that.

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
@ 2013-08-14  9:50                 ` Ingo Molnar
  0 siblings, 0 replies; 21+ messages in thread
From: Ingo Molnar @ 2013-08-14  9:50 UTC (permalink / raw)
  To: Cyrill Gorcunov
  Cc: Andrew Morton, H. Peter Anvin, Andy Lutomirski, Pavel Emelyanov,
	Matt Mackall, Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar


* Cyrill Gorcunov <gorcunov@gmail.com> wrote:

> On Wed, Aug 14, 2013 at 01:08:56AM -0700, Andrew Morton wrote:
> > > 
> > > > Can it be written in C with types and proper variable names and such
> > > > radical stuff?
> > > 
> > > Could you elaborate? You mean inline helper or macro with type checks?
> > 
> > /*
> >  * description goes here
> >  */
> > static inline pteval_t pte_bfop(pteval_t val, int rightshift, ...)
> > {
> > 	...
> > }
> > 
> > So much better!  We really should only implement code in a macro if it
> > *has* to be done as a macro and I don't think that's the case here?
> 
> Well, I'll have to check if it really doesn't generate additional 
> instructions in generated code, since it's hotpath. I'll ping back once 
> things are done.

An __always_inline should never do that.

Thanks,

	Ingo

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
  2013-08-14  9:50                 ` Ingo Molnar
@ 2013-08-14 10:02                   ` Cyrill Gorcunov
  -1 siblings, 0 replies; 21+ messages in thread
From: Cyrill Gorcunov @ 2013-08-14 10:02 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Andrew Morton, H. Peter Anvin, Andy Lutomirski, Pavel Emelyanov,
	Matt Mackall, Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On Wed, Aug 14, 2013 at 11:50:14AM +0200, Ingo Molnar wrote:
> > 
> > Well, I'll have to check if it really doesn't generate additional 
> > instructions in generated code, since it's hotpath. I'll ping back once 
> > things are done.
> 
> An __always_inline should never do that.

Here is the final one, please ping me if something looks not as clean
as it wanted to be and i'll tune code up, thanks!

To hpa@: I had to use explicit @mask because it allows to pass -1ul
mask which is optimized off then by a compiler.
---
From: Cyrill Gorcunov <gorcunov@gmail.com>
Subject: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers

Use unified pte_bfop helper to manipulate bits in pte/pgoff bitfield,
and convert pte_to_pgoff/pgoff_to_pte to inlines.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Pavel Emelyanov <xemul@parallels.com>
Cc: Matt Mackall <mpm@selenic.com>
Cc: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/x86/include/asm/pgtable-2level.h |   70 +++++++++++++++++++++-------------
 1 file changed, 44 insertions(+), 26 deletions(-)

Index: linux-2.6.git/arch/x86/include/asm/pgtable-2level.h
===================================================================
--- linux-2.6.git.orig/arch/x86/include/asm/pgtable-2level.h
+++ linux-2.6.git/arch/x86/include/asm/pgtable-2level.h
@@ -55,8 +55,12 @@ static inline pmd_t native_pmdp_get_and_
 #define native_pmdp_get_and_clear(xp) native_local_pmdp_get_and_clear(xp)
 #endif
 
-#define _mfrob(v,r,m,l)		((((v) >> (r)) & (m)) << (l))
-#define __frob(v,r,l)		(((v) >> (r)) << (l))
+/* Bit manipulation helper on pte/pgoff entry */
+static inline unsigned long pte_bfop(unsigned long value, unsigned int rightshift,
+				     unsigned long mask, unsigned int leftshift)
+{
+	return ((value >> rightshift) & mask) << leftshift;
+}
 
 #ifdef CONFIG_MEM_SOFT_DIRTY
 
@@ -82,19 +86,26 @@ static inline pmd_t native_pmdp_get_and_
 #define PTE_FILE_LSHIFT3	(PTE_FILE_BITS1 + PTE_FILE_BITS2)
 #define PTE_FILE_LSHIFT4	(PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3)
 
-#define pte_to_pgoff(pte)							    \
-	(_mfrob((pte).pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0)		  + \
-	 _mfrob((pte).pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2) + \
-	 _mfrob((pte).pte_low, PTE_FILE_SHIFT3, PTE_FILE_MASK3, PTE_FILE_LSHIFT3) + \
-	 __frob((pte).pte_low, PTE_FILE_SHIFT4, PTE_FILE_LSHIFT4))
-
-#define pgoff_to_pte(off)							\
-	((pte_t) { .pte_low =							\
-	_mfrob(off,                0, PTE_FILE_MASK1, PTE_FILE_SHIFT1)	+	\
-	_mfrob(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2)	+	\
-	_mfrob(off, PTE_FILE_LSHIFT3, PTE_FILE_MASK3, PTE_FILE_SHIFT3)	+	\
-	__frob(off, PTE_FILE_LSHIFT4, PTE_FILE_SHIFT4)			+	\
-	_PAGE_FILE })
+static __always_inline pgoff_t pte_to_pgoff(pte_t pte)
+{
+	return (pgoff_t)
+		(pte_bfop(pte.pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1,  0)		   +
+		 pte_bfop(pte.pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2,  PTE_FILE_LSHIFT2) +
+		 pte_bfop(pte.pte_low, PTE_FILE_SHIFT3, PTE_FILE_MASK3,  PTE_FILE_LSHIFT3) +
+		 pte_bfop(pte.pte_low, PTE_FILE_SHIFT4,           -1UL,  PTE_FILE_LSHIFT4));
+}
+
+static __always_inline pte_t pgoff_to_pte(pgoff_t off)
+{
+	return (pte_t){
+		.pte_low =
+			pte_bfop(off,                0, PTE_FILE_MASK1,  PTE_FILE_SHIFT1) +
+			pte_bfop(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2,  PTE_FILE_SHIFT2) +
+			pte_bfop(off, PTE_FILE_LSHIFT3, PTE_FILE_MASK3,  PTE_FILE_SHIFT3) +
+			pte_bfop(off, PTE_FILE_LSHIFT4,           -1UL,  PTE_FILE_SHIFT4) +
+			_PAGE_FILE,
+	};
+}
 
 #else /* CONFIG_MEM_SOFT_DIRTY */
 
@@ -120,17 +131,24 @@ static inline pmd_t native_pmdp_get_and_
 #define PTE_FILE_LSHIFT2	(PTE_FILE_BITS1)
 #define PTE_FILE_LSHIFT3	(PTE_FILE_BITS1 + PTE_FILE_BITS2)
 
-#define pte_to_pgoff(pte)							    \
-	(_mfrob((pte).pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0)		  + \
-	 _mfrob((pte).pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2) + \
-	 __frob((pte).pte_low, PTE_FILE_SHIFT3, PTE_FILE_LSHIFT3))
-
-#define pgoff_to_pte(off)							\
-	((pte_t) { .pte_low =							\
-	_mfrob(off,                0, PTE_FILE_MASK1, PTE_FILE_SHIFT1)	+	\
-	_mfrob(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2)	+	\
-	__frob(off, PTE_FILE_LSHIFT3, PTE_FILE_SHIFT3)			+	\
-	_PAGE_FILE })
+static __always_inline pgoff_t pte_to_pgoff(pte_t pte)
+{
+	return (pgoff_t)
+		(pte_bfop(pte.pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1,  0)		   +
+		 pte_bfop(pte.pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2,  PTE_FILE_LSHIFT2) +
+		 pte_bfop(pte.pte_low, PTE_FILE_SHIFT3,           -1UL,  PTE_FILE_LSHIFT3));
+}
+
+static __always_inline pte_t pgoff_to_pte(pgoff_t off)
+{
+	return (pte_t){
+		.pte_low =
+			pte_bfop(off,                0, PTE_FILE_MASK1,  PTE_FILE_SHIFT1) +
+			pte_bfop(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2,  PTE_FILE_SHIFT2) +
+			pte_bfop(off, PTE_FILE_LSHIFT3,           -1UL,  PTE_FILE_SHIFT3) +
+			_PAGE_FILE,
+	};
+}
 
 #endif /* CONFIG_MEM_SOFT_DIRTY */
 

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
@ 2013-08-14 10:02                   ` Cyrill Gorcunov
  0 siblings, 0 replies; 21+ messages in thread
From: Cyrill Gorcunov @ 2013-08-14 10:02 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Andrew Morton, H. Peter Anvin, Andy Lutomirski, Pavel Emelyanov,
	Matt Mackall, Xiao Guangrong, Marcelo Tosatti, KOSAKI Motohiro,
	Stephen Rothwell, Peter Zijlstra, Aneesh Kumar K.V, linux-mm,
	linux-kernel, Thomas Gleixner, Ingo Molnar

On Wed, Aug 14, 2013 at 11:50:14AM +0200, Ingo Molnar wrote:
> > 
> > Well, I'll have to check if it really doesn't generate additional 
> > instructions in generated code, since it's hotpath. I'll ping back once 
> > things are done.
> 
> An __always_inline should never do that.

Here is the final one, please ping me if something looks not as clean
as it wanted to be and i'll tune code up, thanks!

To hpa@: I had to use explicit @mask because it allows to pass -1ul
mask which is optimized off then by a compiler.
---
From: Cyrill Gorcunov <gorcunov@gmail.com>
Subject: [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers

Use unified pte_bfop helper to manipulate bits in pte/pgoff bitfield,
and convert pte_to_pgoff/pgoff_to_pte to inlines.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Pavel Emelyanov <xemul@parallels.com>
Cc: Matt Mackall <mpm@selenic.com>
Cc: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/x86/include/asm/pgtable-2level.h |   70 +++++++++++++++++++++-------------
 1 file changed, 44 insertions(+), 26 deletions(-)

Index: linux-2.6.git/arch/x86/include/asm/pgtable-2level.h
===================================================================
--- linux-2.6.git.orig/arch/x86/include/asm/pgtable-2level.h
+++ linux-2.6.git/arch/x86/include/asm/pgtable-2level.h
@@ -55,8 +55,12 @@ static inline pmd_t native_pmdp_get_and_
 #define native_pmdp_get_and_clear(xp) native_local_pmdp_get_and_clear(xp)
 #endif
 
-#define _mfrob(v,r,m,l)		((((v) >> (r)) & (m)) << (l))
-#define __frob(v,r,l)		(((v) >> (r)) << (l))
+/* Bit manipulation helper on pte/pgoff entry */
+static inline unsigned long pte_bfop(unsigned long value, unsigned int rightshift,
+				     unsigned long mask, unsigned int leftshift)
+{
+	return ((value >> rightshift) & mask) << leftshift;
+}
 
 #ifdef CONFIG_MEM_SOFT_DIRTY
 
@@ -82,19 +86,26 @@ static inline pmd_t native_pmdp_get_and_
 #define PTE_FILE_LSHIFT3	(PTE_FILE_BITS1 + PTE_FILE_BITS2)
 #define PTE_FILE_LSHIFT4	(PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3)
 
-#define pte_to_pgoff(pte)							    \
-	(_mfrob((pte).pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0)		  + \
-	 _mfrob((pte).pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2) + \
-	 _mfrob((pte).pte_low, PTE_FILE_SHIFT3, PTE_FILE_MASK3, PTE_FILE_LSHIFT3) + \
-	 __frob((pte).pte_low, PTE_FILE_SHIFT4, PTE_FILE_LSHIFT4))
-
-#define pgoff_to_pte(off)							\
-	((pte_t) { .pte_low =							\
-	_mfrob(off,                0, PTE_FILE_MASK1, PTE_FILE_SHIFT1)	+	\
-	_mfrob(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2)	+	\
-	_mfrob(off, PTE_FILE_LSHIFT3, PTE_FILE_MASK3, PTE_FILE_SHIFT3)	+	\
-	__frob(off, PTE_FILE_LSHIFT4, PTE_FILE_SHIFT4)			+	\
-	_PAGE_FILE })
+static __always_inline pgoff_t pte_to_pgoff(pte_t pte)
+{
+	return (pgoff_t)
+		(pte_bfop(pte.pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1,  0)		   +
+		 pte_bfop(pte.pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2,  PTE_FILE_LSHIFT2) +
+		 pte_bfop(pte.pte_low, PTE_FILE_SHIFT3, PTE_FILE_MASK3,  PTE_FILE_LSHIFT3) +
+		 pte_bfop(pte.pte_low, PTE_FILE_SHIFT4,           -1UL,  PTE_FILE_LSHIFT4));
+}
+
+static __always_inline pte_t pgoff_to_pte(pgoff_t off)
+{
+	return (pte_t){
+		.pte_low =
+			pte_bfop(off,                0, PTE_FILE_MASK1,  PTE_FILE_SHIFT1) +
+			pte_bfop(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2,  PTE_FILE_SHIFT2) +
+			pte_bfop(off, PTE_FILE_LSHIFT3, PTE_FILE_MASK3,  PTE_FILE_SHIFT3) +
+			pte_bfop(off, PTE_FILE_LSHIFT4,           -1UL,  PTE_FILE_SHIFT4) +
+			_PAGE_FILE,
+	};
+}
 
 #else /* CONFIG_MEM_SOFT_DIRTY */
 
@@ -120,17 +131,24 @@ static inline pmd_t native_pmdp_get_and_
 #define PTE_FILE_LSHIFT2	(PTE_FILE_BITS1)
 #define PTE_FILE_LSHIFT3	(PTE_FILE_BITS1 + PTE_FILE_BITS2)
 
-#define pte_to_pgoff(pte)							    \
-	(_mfrob((pte).pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0)		  + \
-	 _mfrob((pte).pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2) + \
-	 __frob((pte).pte_low, PTE_FILE_SHIFT3, PTE_FILE_LSHIFT3))
-
-#define pgoff_to_pte(off)							\
-	((pte_t) { .pte_low =							\
-	_mfrob(off,                0, PTE_FILE_MASK1, PTE_FILE_SHIFT1)	+	\
-	_mfrob(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2)	+	\
-	__frob(off, PTE_FILE_LSHIFT3, PTE_FILE_SHIFT3)			+	\
-	_PAGE_FILE })
+static __always_inline pgoff_t pte_to_pgoff(pte_t pte)
+{
+	return (pgoff_t)
+		(pte_bfop(pte.pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1,  0)		   +
+		 pte_bfop(pte.pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2,  PTE_FILE_LSHIFT2) +
+		 pte_bfop(pte.pte_low, PTE_FILE_SHIFT3,           -1UL,  PTE_FILE_LSHIFT3));
+}
+
+static __always_inline pte_t pgoff_to_pte(pgoff_t off)
+{
+	return (pte_t){
+		.pte_low =
+			pte_bfop(off,                0, PTE_FILE_MASK1,  PTE_FILE_SHIFT1) +
+			pte_bfop(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2,  PTE_FILE_SHIFT2) +
+			pte_bfop(off, PTE_FILE_LSHIFT3,           -1UL,  PTE_FILE_SHIFT3) +
+			_PAGE_FILE,
+	};
+}
 
 #endif /* CONFIG_MEM_SOFT_DIRTY */
 

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers
@ 2013-09-14  6:31 Cyrill Gorcunov
  0 siblings, 0 replies; 21+ messages in thread
From: Cyrill Gorcunov @ 2013-09-14  6:31 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: H. Peter Anvin, akpm, mingo, tglx, Pavel Emelyanov,
	Andy Lutomirski, LKML

Use unified pte_bitop helper to manipulate bits in pte/pgoff bitfield,
and convert pte_to_pgoff/pgoff_to_pte to inlines.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Pavel Emelyanov <xemul@parallels.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
---
 arch/x86/include/asm/pgtable-2level.h |  100 ++++++++++++++++++++--------------
 1 file changed, 59 insertions(+), 41 deletions(-)

Index: linux-2.6.git/arch/x86/include/asm/pgtable-2level.h
===================================================================
--- linux-2.6.git.orig/arch/x86/include/asm/pgtable-2level.h
+++ linux-2.6.git/arch/x86/include/asm/pgtable-2level.h
@@ -55,6 +55,13 @@ static inline pmd_t native_pmdp_get_and_
 #define native_pmdp_get_and_clear(xp) native_local_pmdp_get_and_clear(xp)
 #endif
 
+/* Bit manipulation helper on pte/pgoff entry */
+static inline unsigned long pte_bitop(unsigned long value, unsigned int rightshift,
+				      unsigned long mask, unsigned int leftshift)
+{
+	return ((value >> rightshift) & mask) << leftshift;
+}
+
 #ifdef CONFIG_MEM_SOFT_DIRTY
 
 /*
@@ -71,31 +78,34 @@ static inline pmd_t native_pmdp_get_and_
 #define PTE_FILE_BITS2		(PTE_FILE_SHIFT3 - PTE_FILE_SHIFT2 - 1)
 #define PTE_FILE_BITS3		(PTE_FILE_SHIFT4 - PTE_FILE_SHIFT3 - 1)
 
-#define pte_to_pgoff(pte)						\
-	((((pte).pte_low >> (PTE_FILE_SHIFT1))				\
-	  & ((1U << PTE_FILE_BITS1) - 1)))				\
-	+ ((((pte).pte_low >> (PTE_FILE_SHIFT2))			\
-	    & ((1U << PTE_FILE_BITS2) - 1))				\
-	   << (PTE_FILE_BITS1))						\
-	+ ((((pte).pte_low >> (PTE_FILE_SHIFT3))			\
-	    & ((1U << PTE_FILE_BITS3) - 1))				\
-	   << (PTE_FILE_BITS1 + PTE_FILE_BITS2))			\
-	+ ((((pte).pte_low >> (PTE_FILE_SHIFT4)))			\
-	    << (PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3))
-
-#define pgoff_to_pte(off)						\
-	((pte_t) { .pte_low =						\
-	 ((((off)) & ((1U << PTE_FILE_BITS1) - 1)) << PTE_FILE_SHIFT1)	\
-	 + ((((off) >> PTE_FILE_BITS1)					\
-	     & ((1U << PTE_FILE_BITS2) - 1))				\
-	    << PTE_FILE_SHIFT2)						\
-	 + ((((off) >> (PTE_FILE_BITS1 + PTE_FILE_BITS2))		\
-	     & ((1U << PTE_FILE_BITS3) - 1))				\
-	    << PTE_FILE_SHIFT3)						\
-	 + ((((off) >>							\
-	      (PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3)))	\
-	    << PTE_FILE_SHIFT4)						\
-	 + _PAGE_FILE })
+#define PTE_FILE_MASK1		((1U << PTE_FILE_BITS1) - 1)
+#define PTE_FILE_MASK2		((1U << PTE_FILE_BITS2) - 1)
+#define PTE_FILE_MASK3		((1U << PTE_FILE_BITS3) - 1)
+
+#define PTE_FILE_LSHIFT2	(PTE_FILE_BITS1)
+#define PTE_FILE_LSHIFT3	(PTE_FILE_BITS1 + PTE_FILE_BITS2)
+#define PTE_FILE_LSHIFT4	(PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3)
+
+static __always_inline pgoff_t pte_to_pgoff(pte_t pte)
+{
+	return (pgoff_t)
+		(pte_bitop(pte.pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1,  0)		    +
+		 pte_bitop(pte.pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2,  PTE_FILE_LSHIFT2) +
+		 pte_bitop(pte.pte_low, PTE_FILE_SHIFT3, PTE_FILE_MASK3,  PTE_FILE_LSHIFT3) +
+		 pte_bitop(pte.pte_low, PTE_FILE_SHIFT4,           -1UL,  PTE_FILE_LSHIFT4));
+}
+
+static __always_inline pte_t pgoff_to_pte(pgoff_t off)
+{
+	return (pte_t){
+		.pte_low =
+			pte_bitop(off,                0, PTE_FILE_MASK1,  PTE_FILE_SHIFT1) +
+			pte_bitop(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2,  PTE_FILE_SHIFT2) +
+			pte_bitop(off, PTE_FILE_LSHIFT3, PTE_FILE_MASK3,  PTE_FILE_SHIFT3) +
+			pte_bitop(off, PTE_FILE_LSHIFT4,           -1UL,  PTE_FILE_SHIFT4) +
+			_PAGE_FILE,
+	};
+}
 
 #else /* CONFIG_MEM_SOFT_DIRTY */
 
@@ -115,22 +125,30 @@ static inline pmd_t native_pmdp_get_and_
 #define PTE_FILE_BITS1		(PTE_FILE_SHIFT2 - PTE_FILE_SHIFT1 - 1)
 #define PTE_FILE_BITS2		(PTE_FILE_SHIFT3 - PTE_FILE_SHIFT2 - 1)
 
-#define pte_to_pgoff(pte)						\
-	((((pte).pte_low >> PTE_FILE_SHIFT1)				\
-	  & ((1U << PTE_FILE_BITS1) - 1))				\
-	 + ((((pte).pte_low >> PTE_FILE_SHIFT2)				\
-	     & ((1U << PTE_FILE_BITS2) - 1)) << PTE_FILE_BITS1)		\
-	 + (((pte).pte_low >> PTE_FILE_SHIFT3)				\
-	    << (PTE_FILE_BITS1 + PTE_FILE_BITS2)))
-
-#define pgoff_to_pte(off)						\
-	((pte_t) { .pte_low =						\
-	 (((off) & ((1U << PTE_FILE_BITS1) - 1)) << PTE_FILE_SHIFT1)	\
-	 + ((((off) >> PTE_FILE_BITS1) & ((1U << PTE_FILE_BITS2) - 1))	\
-	    << PTE_FILE_SHIFT2)						\
-	 + (((off) >> (PTE_FILE_BITS1 + PTE_FILE_BITS2))		\
-	    << PTE_FILE_SHIFT3)						\
-	 + _PAGE_FILE })
+#define PTE_FILE_MASK1		((1U << PTE_FILE_BITS1) - 1)
+#define PTE_FILE_MASK2		((1U << PTE_FILE_BITS2) - 1)
+
+#define PTE_FILE_LSHIFT2	(PTE_FILE_BITS1)
+#define PTE_FILE_LSHIFT3	(PTE_FILE_BITS1 + PTE_FILE_BITS2)
+
+static __always_inline pgoff_t pte_to_pgoff(pte_t pte)
+{
+	return (pgoff_t)
+		(pte_bitop(pte.pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1,  0)		    +
+		 pte_bitop(pte.pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2,  PTE_FILE_LSHIFT2) +
+		 pte_bitop(pte.pte_low, PTE_FILE_SHIFT3,           -1UL,  PTE_FILE_LSHIFT3));
+}
+
+static __always_inline pte_t pgoff_to_pte(pgoff_t off)
+{
+	return (pte_t){
+		.pte_low =
+			pte_bitop(off,                0, PTE_FILE_MASK1,  PTE_FILE_SHIFT1) +
+			pte_bitop(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2,  PTE_FILE_SHIFT2) +
+			pte_bitop(off, PTE_FILE_LSHIFT3,           -1UL,  PTE_FILE_SHIFT3) +
+			_PAGE_FILE,
+	};
+}
 
 #endif /* CONFIG_MEM_SOFT_DIRTY */
 

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2013-09-14  6:31 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-08-14  7:00 [PATCH -mm] mm: Unify pte_to_pgoff and pgoff_to_pte helpers Cyrill Gorcunov
2013-08-14  7:00 ` Cyrill Gorcunov
2013-08-14  7:22 ` H. Peter Anvin
2013-08-14  7:22   ` H. Peter Anvin
2013-08-14  7:24   ` Cyrill Gorcunov
2013-08-14  7:24     ` Cyrill Gorcunov
2013-08-14  7:31     ` H. Peter Anvin
2013-08-14  7:31       ` H. Peter Anvin
2013-08-14  7:33       ` Andrew Morton
2013-08-14  7:33         ` Andrew Morton
2013-08-14  7:43         ` Cyrill Gorcunov
2013-08-14  7:43           ` Cyrill Gorcunov
2013-08-14  8:08           ` Andrew Morton
2013-08-14  8:08             ` Andrew Morton
2013-08-14  8:20             ` Cyrill Gorcunov
2013-08-14  8:20               ` Cyrill Gorcunov
2013-08-14  9:50               ` Ingo Molnar
2013-08-14  9:50                 ` Ingo Molnar
2013-08-14 10:02                 ` Cyrill Gorcunov
2013-08-14 10:02                   ` Cyrill Gorcunov
2013-09-14  6:31 Cyrill Gorcunov

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.