xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: "H. Peter Anvin" <hpa@zytor.com>
To: "Luis R. Rodriguez" <mcgrof@suse.com>
Cc: "Luis R. Rodriguez" <mcgrof@do-not-panic.com>,
	tglx@linutronix.de, mingo@redhat.com, bp@alien8.de,
	konrad.wilk@oracle.com, rusty@rustcorp.com.au,
	luto@amacapital.net, boris.ostrovsky@oracle.com, mcb30@ipxe.org,
	jgross@suse.com, JBeulich@suse.com, joro@8bytes.org,
	ryabinin.a.a@gmail.com, andreyknvl@google.com,
	long.wanglong@huawei.com, qiuxishi@huawei.com,
	aryabinin@virtuozzo.com, mchehab@osg.samsung.com,
	valentinrothberg@gmail.com, peter.senna@gmail.com,
	x86@kernel.org, Michal Marek <mmarek@suse.com>,
	xen-devel@lists.xensource.com, Michael Matz <matz@suse.de>,
	linux-kernel@vger.kernel.org
Subject: Re: [RFC v1 0/8] x86/init: Linux linker tables
Date: Thu, 17 Dec 2015 20:25:19 -0800	[thread overview]
Message-ID: <56738AAF.2080601@zytor.com> (raw)
In-Reply-To: <20151217234625.GM20409@wotan.suse.de>

On 12/17/15 15:46, Luis R. Rodriguez wrote:
> 
> I explain why I do that there but the gist of it is that on Linux we may also
> want stronger semantics for specific linker table solutions, and solutions such
> as those devised on the IOMMU init stuff do memmove() for sorting depending on
> semantics defined (in the simplest case here so far dependency between init
> sequences), this makes each set of sequences very subsystem specific. An issue
> with *one* subsystem could make things really bad for others. I thought about
> this quite a bit and figured its best left to the subsystem maintainers to
> decide.
> 

A table that needs sorting or other runtime handling is just a
read-write table for the purpose of the linker table construct.  It
presents to C as an array of initialized data.

> Perhaps a new sections.h file (you tell me) which documents the different
> section components:
> 
> /* document this *really* well */
> #define SECTION_RODATA		".rodata"
> #define SECTION_INIT		".init"
> #define SECTION_INIT_RODATA	".init_rodata"
> #define SECTION_READ_MOSTLY	".read_mostly"
> 
> Then on tables.h we add the section components support:

Yes, something like that.  How to macroize it cleanly is another matter;
we may want to use slightly different conventions that iPXE to match our
own codebase.

> #define __table(component, type, name) (component, type, name) 
> 
> #define __table_component(table) __table_extract_component table                          
> #define __table_extract_component(component, type, name) component
> 
> #define __table_type(table) __table_extract_type table                          
> #define __table_extract_type(component, type, name) type
> 
> #define __table_name(table) __table_extract_name table                          
> #define __table_extract_name(component, type, name) name 
> 
> #define __table_str(x) #x 
> 
> #define __table_section(table, idx) \                                           
>         "." __table_component (table) ".tbl." __table_name (table) "." __table_str (idx)                      
> 
> #define __table_entry(table, idx)                                       \       
>         __attribute__ ((__section__(__table_section(table, idx)),       \       
>                         __aligned__(__table_alignment(table))))
> 
> A user could then be something as follows:
> 
> #define X86_INIT_FNS __table(SECTION_INIT, struct x86_init_fn, "x86_init_fns") 
> #define __x86_init_fn(order_level) __table_entry(X86_INIT_FNS, order_level)

Yes, but in particular the common case of function initialization tables
should be generic.

I'm kind of thinking a syntax like this:

DECLARE_LINKTABLE_RO(struct foo, tablename);
DEFINE_LINKTABLE_RO(struct foo, tablename);
LINKTABLE_RO(tablename,level) = /* contents */;
LINKTABLE_SIZE(tablename)

... which would turn into something like this once it goes through all
the preprocessing phases

/* DECLARE_LINKTABLE_RO */
extern const struct foo tablename[], tablename__end[];

/* DEFINE_LINKTABLE_RO */
DECLARE_LINKTABLE_RO(struct foo, tablename);

const struct
foo__attribute__((used,section(".rodata.tbl.tablename.0"))) tablename[0];

const struct
foo__attribute__((used,section(".rodata.tbl.tablename.999")))
tablename__end[0];

/* LINKTABLE_RO */
static const __typeof__(tablename)
__attribute__((used,section(".rodata.tbl.tablename.50")))
__tbl_tablename_12345

/* LINKTABLE_SIZE */
((tablename__end) - (tablename))

... and so on for all the possible sections where we may want tables.

Note: I used 0 and 999 above since they sort before and after all
possible 2-digit decimal numbers, but that's just cosmetic.

> If that's what you mean?
> 
> I'm a bit wary about having the linker sort any of the above SECTION_*'s, but
> if we're happy to do that perhaps a simple first step might be to see if 0-day
> but would be happy with just the sort without any consequences to any
> architecture. Thoughts?

I don't see what is dangerous about it.  The section names are such that
a lexographical sort will do the right thing, and we can simply use
SORT(.rodata.tbl.*) in the linker script, for example.

>> The other thing is to take a
>> clue from the implementation in iPXE, which uses priority levels 00 and
>> 99 (or we could use non-integers which sort appropriately instead of
>> using "real" levels) to contain the start and end symbols, which
>> eliminates any need for linker script modifications to add new tables.
> 
> This solution uses that as well. The only need for adding custom sections
> is when they have a requirement for a custom run time sort, and also to
> ensure they don't cause regressions on other subsystems if they have a buggy
> sort. The run time sorting is all subsystem specific and up to their own
> semantics.

Again, from a linker table POV this is nothing other than a read-write
table; there is a runtime function that then operates on that read-write
table.

	-hpa

  parent reply	other threads:[~2015-12-18  4:25 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-15 22:16 [RFC v1 0/8] x86/init: Linux linker tables Luis R. Rodriguez
2015-12-15 22:16 ` [RFC v1 1/8] paravirt: rename paravirt_enabled to paravirt_legacy Luis R. Rodriguez
2016-01-20 19:32   ` Konrad Rzeszutek Wilk
2016-02-04 22:50     ` Luis R. Rodriguez
2015-12-15 22:16 ` [RFC v1 2/8] tables.h: add linker table support Luis R. Rodriguez
2016-01-20 20:04   ` Konrad Rzeszutek Wilk
2016-01-20 23:15     ` Michael Brown
2016-01-20 23:24       ` H. Peter Anvin
2015-12-15 22:16 ` [RFC v1 3/8] x86/boot: add BIT() to boot/bitops.h Luis R. Rodriguez
2016-01-20 20:17   ` Konrad Rzeszutek Wilk
2016-01-20 20:33     ` Luis R. Rodriguez
2015-12-15 22:16 ` [RFC v1 4/8] x86/init: add linker table support Luis R. Rodriguez
2016-01-20 20:45   ` Konrad Rzeszutek Wilk
2016-01-20 21:00   ` Konrad Rzeszutek Wilk
2016-01-20 21:33     ` Luis R. Rodriguez
2016-01-20 21:41       ` H. Peter Anvin
2016-01-20 22:12         ` Luis R. Rodriguez
2016-01-20 22:20           ` H. Peter Anvin
2016-01-22  0:25             ` Luis R. Rodriguez
2016-01-22  0:42               ` H. Peter Anvin
2016-02-11 20:45                 ` Luis R. Rodriguez
2016-01-21  8:38       ` Roger Pau Monné
2016-01-21 13:45         ` Boris Ostrovsky
2016-01-21 19:25           ` H. Peter Anvin
2016-01-21 19:46             ` Luis R. Rodriguez
2016-01-21 19:50               ` H. Peter Anvin
2016-01-21 19:52                 ` H. Peter Anvin
2016-01-22  0:19                   ` Luis R. Rodriguez
2016-01-21 20:05                 ` Luis R. Rodriguez
2016-01-21 21:36                   ` H. Peter Anvin
2015-12-15 22:16 ` [RFC v1 5/8] x86/init: move ebda reservations into linker table Luis R. Rodriguez
2015-12-17 20:48   ` Andy Lutomirski
2015-12-17 20:55     ` H. Peter Anvin
2015-12-17 20:57       ` Andy Lutomirski
2015-12-17 23:40         ` Luis R. Rodriguez
2016-01-20 20:46   ` Konrad Rzeszutek Wilk
2015-12-15 22:16 ` [RFC v1 6/8] x86/init: use linker table for i386 early setup Luis R. Rodriguez
2016-01-20 21:14   ` Konrad Rzeszutek Wilk
2016-01-20 21:41     ` Luis R. Rodriguez
2016-02-11 19:55       ` Luis R. Rodriguez
2015-12-15 22:16 ` [RFC v1 7/8] x86/init: user linker table for ce4100 " Luis R. Rodriguez
2016-01-20 21:14   ` Konrad Rzeszutek Wilk
2015-12-15 22:16 ` [RFC v1 8/8] x86/init: use linker table for mid " Luis R. Rodriguez
2016-01-20 21:15   ` Konrad Rzeszutek Wilk
2015-12-15 22:59 ` [RFC v1 0/8] x86/init: Linux linker tables H. Peter Anvin
2015-12-17 20:38 ` H. Peter Anvin
2015-12-17 23:46   ` Luis R. Rodriguez
2015-12-17 23:58     ` Luis R. Rodriguez
2015-12-18  4:25     ` H. Peter Anvin [this message]
2015-12-18  4:40       ` H. Peter Anvin
2016-01-21 20:19         ` H. Peter Anvin
2016-01-21 20:33           ` Luis R. Rodriguez
2016-01-21 21:37             ` Konrad Rzeszutek Wilk
2016-01-21 22:25               ` [Xen-devel] " Luis R. Rodriguez
2016-01-21 23:56                 ` H. Peter Anvin
2016-01-22  0:28                   ` Luis R. Rodriguez
2016-01-22  8:15               ` Michael Brown
2016-01-22 13:44           ` Michael Matz
2016-01-22 19:06             ` H. Peter Anvin
2016-01-22 21:52               ` Luis R. Rodriguez
2016-02-03  0:22                 ` Luis R. Rodriguez
2016-02-03  0:25                   ` H. Peter Anvin
2016-02-03  0:28                     ` Luis R. Rodriguez
2016-02-03  0:48                       ` Luis R. Rodriguez
2016-02-02 23:48             ` H. Peter Anvin
2016-02-03  0:15               ` Luis R. Rodriguez
2015-12-18 18:50       ` Luis R. Rodriguez
2015-12-18 18:58         ` H. Peter Anvin
2016-01-20 21:16 ` Konrad Rzeszutek Wilk
2016-01-20 21:49   ` Luis R. Rodriguez

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=56738AAF.2080601@zytor.com \
    --to=hpa@zytor.com \
    --cc=JBeulich@suse.com \
    --cc=andreyknvl@google.com \
    --cc=aryabinin@virtuozzo.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=bp@alien8.de \
    --cc=jgross@suse.com \
    --cc=joro@8bytes.org \
    --cc=konrad.wilk@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=long.wanglong@huawei.com \
    --cc=luto@amacapital.net \
    --cc=matz@suse.de \
    --cc=mcb30@ipxe.org \
    --cc=mcgrof@do-not-panic.com \
    --cc=mcgrof@suse.com \
    --cc=mchehab@osg.samsung.com \
    --cc=mingo@redhat.com \
    --cc=mmarek@suse.com \
    --cc=peter.senna@gmail.com \
    --cc=qiuxishi@huawei.com \
    --cc=rusty@rustcorp.com.au \
    --cc=ryabinin.a.a@gmail.com \
    --cc=tglx@linutronix.de \
    --cc=valentinrothberg@gmail.com \
    --cc=x86@kernel.org \
    --cc=xen-devel@lists.xensource.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).