All of lore.kernel.org
 help / color / mirror / Atom feed
From: mathieu.desnoyers@efficios.com (Mathieu Desnoyers)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC PATCH] create generic alignment api (v5)
Date: Sat, 1 May 2010 15:10:45 -0400	[thread overview]
Message-ID: <20100501191045.GA16710@Krystal> (raw)
In-Reply-To: <20100501183544.GC27062@shisha.kicks-ass.net>

* Alexander Shishkin (virtuoso at slind.org) wrote:
> On Sun, Mar 28, 2010 at 08:09:00 -0400, Mathieu Desnoyers wrote:
> > Rather than re-doing the "alignment on a type size" trick all over again at
> > different levels, import the "ltt_align" from LTTng into kernel.h and make this
> > available to everyone. Renaming to:
> > 
> > - object_align()
> > - object_align_floor()
> > - offset_align()
> > - offset_align_floor()
> 
> Do you plan to have this integrated to the mainline? I'd like to use one of
> these in my next version of the __xchg patch. So, do you need any help or
> feedback or whatnot with this one?

Given that no one seems to oppose to this patch, I think I'll just re-submit it
as-is for real this time.

Thanks,

Mathieu

> 
> > Changelog since v4:
> > - add missing ( ) around parameters within object_align() and
> >   object_align_floor().
> > - More coding style cleanups to ALIGN() (checkpatch.pl is happy now).
> > 
> > Changelog since v3:
> > - optimize object_align*() so fewer instructions are needed for alignment of
> >   addresses known dynamically. Use the (already existing) "ALIGN()", and create
> >   the "ALIGN_FLOOR()" macro.
> > - While we are there, let's clean up the ALIGN() macros wrt coding style. e.g.
> >   missing parenthesis around the first use of the "x" parameter in ALIGN().
> > 
> > Changelog since v2:
> > - Fix object_align*(): should use object size alignment, not pointer alignment.
> > 
> > Changelog since v1:
> > - Align on the object natural alignment
> >     (rather than min(arch word alignment, natural alignment))
> > 
> > The advantage of separating the API in "object alignment" and "offset alignment"
> > is that it gives more freedom to play with offset alignment. Very useful to
> > implement a tracer ring-buffer alignment. (hint hint)
> > 
> > Typical users will use "object alignment", but infrastructures like tracers
> > which need to perform alignment of statically known base+offsets will typically
> > use "offset alignment", because it allows to align with respect to a base rather
> > than to pass an absolute address.
> > 
> > We use "sizeof(object)" rather than "__alignof__()" object because alignof
> > returns "recommended" object alignment for the architecture, which can be
> > sub-optimal on some architectures. By ensuring alignment on the object size, we
> > are sure to make the right choice.
> > 
> > Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
> > CC: Russell King - ARM Linux <linux@arm.linux.org.uk>
> > Cc: Alexander Shishkin <virtuoso@slind.org>,
> > CC: linux-arm-kernel at lists.infradead.org
> > CC: Imre Deak <imre.deak@nokia.com>
> > CC: Jamie Lokier <jamie@shareable.org>
> > CC: rostedt at goodmis.org
> > CC: mingo at elte.hu
> 
> Acked-by: Alexander Shishkin <virtuoso@slind.org>
> 
> > ---
> >  include/linux/kernel.h |   45 +++++++++++++++++++++++++++++++++++++++++----
> >  1 file changed, 41 insertions(+), 4 deletions(-)
> > 
> > Index: linux-2.6-lttng/include/linux/kernel.h
> > ===================================================================
> > --- linux-2.6-lttng.orig/include/linux/kernel.h	2010-03-27 20:46:07.000000000 -0400
> > +++ linux-2.6-lttng/include/linux/kernel.h	2010-03-28 20:06:27.000000000 -0400
> > @@ -37,10 +37,47 @@ extern const char linux_proc_banner[];
> >  
> >  #define STACK_MAGIC	0xdeadbeef
> >  
> > -#define ALIGN(x,a)		__ALIGN_MASK(x,(typeof(x))(a)-1)
> > -#define __ALIGN_MASK(x,mask)	(((x)+(mask))&~(mask))
> > -#define PTR_ALIGN(p, a)		((typeof(p))ALIGN((unsigned long)(p), (a)))
> > -#define IS_ALIGNED(x, a)		(((x) & ((typeof(x))(a) - 1)) == 0)
> > +#define ALIGN(x, a)		__ALIGN_MASK((x), (typeof(x)) (a) - 1)
> > +#define __ALIGN_MASK(x, mask)	(((x) + (mask)) & ~(mask))
> > +#define PTR_ALIGN(p, a)		((typeof(p)) ALIGN((unsigned long) (p), (a)))
> > +#define ALIGN_FLOOR(x, a)	__ALIGN_FLOOR_MASK((x), (typeof(x)) (a) - 1)
> > +#define __ALIGN_FLOOR_MASK(x, mask)	((x) & ~(mask))
> > +#define PTR_ALIGN_FLOOR(p, a) \
> > +			((typeof(p)) ALIGN_FLOOR((unsigned long) (p), (a)))
> > +#define IS_ALIGNED(x, a)	(((x) & ((typeof(x)) (a) - 1)) == 0)
> > +
> > +/*
> > + * Align pointer on natural object alignment. Object size must be power of two.
> > + */
> > +#define object_align(obj)	PTR_ALIGN((obj), sizeof(*(obj)))
> > +#define object_align_floor(obj)	PTR_ALIGN_FLOOR((obj), sizeof(*(obj)))
> > +
> > +/**
> > + * offset_align - Calculate the offset needed to align an object on its natural
> > + *                alignment towards higher addresses.
> > + * @align_drift:  object offset from an "alignment"-aligned address.
> > + * @alignment:    natural object alignment. Must be non-zero, power of 2.
> > + *
> > + * Returns the offset that must be added to align towards higher
> > + * addresses.
> > + */
> > +static inline size_t offset_align(size_t align_drift, size_t alignment)
> > +{
> > +	return (alignment - align_drift) & (alignment - 1);
> > +}
> > +
> > +/**
> > + * offset_align_floor - Calculate the offset needed to align an object
> > + *                      on its natural alignment towards lower addresses.
> > + * @align_drift:  object offset from an "alignment"-aligned address.
> > + * @alignment:    natural object alignment. Must be non-zero, power of 2.
> > + *
> > + * Returns the offset that must be substracted to align towards lower addresses.
> > + */
> > +static inline size_t offset_align_floor(size_t align_drift, size_t alignment)
> > +{
> > +	return (align_drift - alignment) & (alignment - 1);
> > +}
> >  
> >  #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
> >  
> > 
> > -- 
> > Mathieu Desnoyers
> > Operating System Efficiency R&D Consultant
> > EfficiOS Inc.
> > http://www.efficios.com

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com

WARNING: multiple messages have this Message-ID (diff)
From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Imre Deak <imre.deak@nokia.com>,
	Russell King - ARM Linux <linux@arm.linux.org.uk>,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>,
	Jamie Lokier <jamie@shareable.org>,
	"rostedt@goodmis.org" <rostedt@goodmis.org>,
	"mingo@elte.hu" <mingo@elte.hu>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [RFC PATCH] create generic alignment api (v5)
Date: Sat, 1 May 2010 15:10:45 -0400	[thread overview]
Message-ID: <20100501191045.GA16710@Krystal> (raw)
In-Reply-To: <20100501183544.GC27062@shisha.kicks-ass.net>

* Alexander Shishkin (virtuoso@slind.org) wrote:
> On Sun, Mar 28, 2010 at 08:09:00 -0400, Mathieu Desnoyers wrote:
> > Rather than re-doing the "alignment on a type size" trick all over again at
> > different levels, import the "ltt_align" from LTTng into kernel.h and make this
> > available to everyone. Renaming to:
> > 
> > - object_align()
> > - object_align_floor()
> > - offset_align()
> > - offset_align_floor()
> 
> Do you plan to have this integrated to the mainline? I'd like to use one of
> these in my next version of the __xchg patch. So, do you need any help or
> feedback or whatnot with this one?

Given that no one seems to oppose to this patch, I think I'll just re-submit it
as-is for real this time.

Thanks,

Mathieu

> 
> > Changelog since v4:
> > - add missing ( ) around parameters within object_align() and
> >   object_align_floor().
> > - More coding style cleanups to ALIGN() (checkpatch.pl is happy now).
> > 
> > Changelog since v3:
> > - optimize object_align*() so fewer instructions are needed for alignment of
> >   addresses known dynamically. Use the (already existing) "ALIGN()", and create
> >   the "ALIGN_FLOOR()" macro.
> > - While we are there, let's clean up the ALIGN() macros wrt coding style. e.g.
> >   missing parenthesis around the first use of the "x" parameter in ALIGN().
> > 
> > Changelog since v2:
> > - Fix object_align*(): should use object size alignment, not pointer alignment.
> > 
> > Changelog since v1:
> > - Align on the object natural alignment
> >     (rather than min(arch word alignment, natural alignment))
> > 
> > The advantage of separating the API in "object alignment" and "offset alignment"
> > is that it gives more freedom to play with offset alignment. Very useful to
> > implement a tracer ring-buffer alignment. (hint hint)
> > 
> > Typical users will use "object alignment", but infrastructures like tracers
> > which need to perform alignment of statically known base+offsets will typically
> > use "offset alignment", because it allows to align with respect to a base rather
> > than to pass an absolute address.
> > 
> > We use "sizeof(object)" rather than "__alignof__()" object because alignof
> > returns "recommended" object alignment for the architecture, which can be
> > sub-optimal on some architectures. By ensuring alignment on the object size, we
> > are sure to make the right choice.
> > 
> > Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
> > CC: Russell King - ARM Linux <linux@arm.linux.org.uk>
> > Cc: Alexander Shishkin <virtuoso@slind.org>,
> > CC: linux-arm-kernel@lists.infradead.org
> > CC: Imre Deak <imre.deak@nokia.com>
> > CC: Jamie Lokier <jamie@shareable.org>
> > CC: rostedt@goodmis.org
> > CC: mingo@elte.hu
> 
> Acked-by: Alexander Shishkin <virtuoso@slind.org>
> 
> > ---
> >  include/linux/kernel.h |   45 +++++++++++++++++++++++++++++++++++++++++----
> >  1 file changed, 41 insertions(+), 4 deletions(-)
> > 
> > Index: linux-2.6-lttng/include/linux/kernel.h
> > ===================================================================
> > --- linux-2.6-lttng.orig/include/linux/kernel.h	2010-03-27 20:46:07.000000000 -0400
> > +++ linux-2.6-lttng/include/linux/kernel.h	2010-03-28 20:06:27.000000000 -0400
> > @@ -37,10 +37,47 @@ extern const char linux_proc_banner[];
> >  
> >  #define STACK_MAGIC	0xdeadbeef
> >  
> > -#define ALIGN(x,a)		__ALIGN_MASK(x,(typeof(x))(a)-1)
> > -#define __ALIGN_MASK(x,mask)	(((x)+(mask))&~(mask))
> > -#define PTR_ALIGN(p, a)		((typeof(p))ALIGN((unsigned long)(p), (a)))
> > -#define IS_ALIGNED(x, a)		(((x) & ((typeof(x))(a) - 1)) == 0)
> > +#define ALIGN(x, a)		__ALIGN_MASK((x), (typeof(x)) (a) - 1)
> > +#define __ALIGN_MASK(x, mask)	(((x) + (mask)) & ~(mask))
> > +#define PTR_ALIGN(p, a)		((typeof(p)) ALIGN((unsigned long) (p), (a)))
> > +#define ALIGN_FLOOR(x, a)	__ALIGN_FLOOR_MASK((x), (typeof(x)) (a) - 1)
> > +#define __ALIGN_FLOOR_MASK(x, mask)	((x) & ~(mask))
> > +#define PTR_ALIGN_FLOOR(p, a) \
> > +			((typeof(p)) ALIGN_FLOOR((unsigned long) (p), (a)))
> > +#define IS_ALIGNED(x, a)	(((x) & ((typeof(x)) (a) - 1)) == 0)
> > +
> > +/*
> > + * Align pointer on natural object alignment. Object size must be power of two.
> > + */
> > +#define object_align(obj)	PTR_ALIGN((obj), sizeof(*(obj)))
> > +#define object_align_floor(obj)	PTR_ALIGN_FLOOR((obj), sizeof(*(obj)))
> > +
> > +/**
> > + * offset_align - Calculate the offset needed to align an object on its natural
> > + *                alignment towards higher addresses.
> > + * @align_drift:  object offset from an "alignment"-aligned address.
> > + * @alignment:    natural object alignment. Must be non-zero, power of 2.
> > + *
> > + * Returns the offset that must be added to align towards higher
> > + * addresses.
> > + */
> > +static inline size_t offset_align(size_t align_drift, size_t alignment)
> > +{
> > +	return (alignment - align_drift) & (alignment - 1);
> > +}
> > +
> > +/**
> > + * offset_align_floor - Calculate the offset needed to align an object
> > + *                      on its natural alignment towards lower addresses.
> > + * @align_drift:  object offset from an "alignment"-aligned address.
> > + * @alignment:    natural object alignment. Must be non-zero, power of 2.
> > + *
> > + * Returns the offset that must be substracted to align towards lower addresses.
> > + */
> > +static inline size_t offset_align_floor(size_t align_drift, size_t alignment)
> > +{
> > +	return (align_drift - alignment) & (alignment - 1);
> > +}
> >  
> >  #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
> >  
> > 
> > -- 
> > Mathieu Desnoyers
> > Operating System Efficiency R&D Consultant
> > EfficiOS Inc.
> > http://www.efficios.com

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com

  reply	other threads:[~2010-05-01 19:10 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-28  1:22 [RFC PATCH] create generic alignment api (v2) Mathieu Desnoyers
2010-03-28  1:22 ` Mathieu Desnoyers
2010-03-28 15:40 ` Imre Deak
2010-03-28 15:40   ` Imre Deak
2010-03-28 18:29   ` Mathieu Desnoyers
2010-03-28 18:29     ` Mathieu Desnoyers
2010-03-29  0:09   ` [RFC PATCH] create generic alignment api (v5) Mathieu Desnoyers
2010-03-29  0:09     ` Mathieu Desnoyers
2010-05-01 18:35     ` Alexander Shishkin
2010-05-01 19:10       ` Mathieu Desnoyers [this message]
2010-05-01 19:10         ` Mathieu Desnoyers
2010-05-01 19:29         ` Alexander Shishkin
2010-05-01 19:45           ` Mathieu Desnoyers
2010-05-01 19:45             ` Mathieu Desnoyers
2010-05-01 19:23     ` [PATCH 1/2] create generic alignment api (v6) Alexander Shishkin
2010-05-01 19:24       ` [PATCH 2/2] [RFCv3] arm: add half-word __xchg Alexander Shishkin
2010-05-03 17:27         ` Mathieu Desnoyers
     [not found]           ` <20100505080155.GF27062@shisha.kicks-ass.net>
2010-05-08 23:30             ` Mathieu Desnoyers
2010-05-06 18:12       ` [PATCH 1/2] create generic alignment api (v6) Mathieu Desnoyers

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=20100501191045.GA16710@Krystal \
    --to=mathieu.desnoyers@efficios.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /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.