public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* AMD-IOMMU and problem with __init(data)?
@ 2015-09-23 10:22 Alexander Holler
  2015-09-23 11:43 ` Joerg Roedel
  0 siblings, 1 reply; 7+ messages in thread
From: Alexander Holler @ 2015-09-23 10:22 UTC (permalink / raw)
  To: linux-kernel

Hello,

It looks like I have a problem with the AMD IOMMU and it's handling of 
__init or __initdata.

I'm working on something which stores some structs right after 
INIT_CALLS but before CON_INITCALL (see include/asm-generic/vmlinux.lds.h).

This structures will be accessed right after the initcalls from level fs 
(5, see init/main.c), have been called.

Here is how that structure is defined:
--
struct _annotated_initcall {
	initcall_t initcall;
	unsigned driver_id;
	unsigned *dependencies;
	struct device_driver *driver;
};
extern struct _annotated_initcall __annotated_initcall_start[],
				  __annotated_initcall_end[];
--

The code which uses that is
--
	struct _annotated_initcall *ac;

	ac = __annotated_initcall_start;
	for (; ac < __annotated_initcall_end; ++ac)
		pr_info("AHO: ac %p ic %p ID %u deps %p drv %p\n",
			ac, ac->initcall, ac->driver_id,
			ac->dependencies, ac->driver);
--

What now happens if I've enabled CONFIG_AMD_IOMMU is the following:

--
(...)
[    1.240362] io scheduler noop registered
[    1.395764] iommu: Adding device 0000:00:00.0 to group 0
[    1.401478] iommu: Adding device 0000:00:01.0 to group 1
[    1.406828] iommu: Adding device 0000:00:01.1 to group 1
[    1.412487] iommu: Adding device 0000:00:10.0 to group 2
[    1.417839] iommu: Adding device 0000:00:10.1 to group 2
[    1.423501] iommu: Adding device 0000:00:11.0 to group 3
[    1.429157] iommu: Adding device 0000:00:12.0 to group 4
[    1.434510] iommu: Adding device 0000:00:12.2 to group 4
[    1.440166] iommu: Adding device 0000:00:13.0 to group 5
[    1.445520] iommu: Adding device 0000:00:13.2 to group 5
[    1.451196] iommu: Adding device 0000:00:14.0 to group 6
[    1.456551] iommu: Adding device 0000:00:14.2 to group 6
[    1.461904] iommu: Adding device 0000:00:14.3 to group 6
[    1.467568] iommu: Adding device 0000:00:14.4 to group 7
[    1.473226] iommu: Adding device 0000:00:15.0 to group 8
[    1.480807] iommu: Adding device 0000:00:15.1 to group 8
[    1.486470] iommu: Adding device 0000:00:18.0 to group 9
[    1.491822] iommu: Adding device 0000:00:18.1 to group 9
[    1.497176] iommu: Adding device 0000:00:18.2 to group 9
[    1.502528] iommu: Adding device 0000:00:18.3 to group 9
[    1.507883] iommu: Adding device 0000:00:18.4 to group 9
[    1.513237] iommu: Adding device 0000:00:18.5 to group 9
[    1.518593] iommu: Adding device 0000:03:00.0 to group 8
[    1.523932] AMD-Vi: Found IOMMU at 0000:00:00.2 cap 0x40
[    1.529276] AMD-Vi:  Extended features:  PreF PPR GT IA
[    1.534776] AMD-Vi: Interrupt remapping enabled
[    1.539496] AMD-Vi: Lazy IO/TLB flushing enabled
[    1.545741] AHO: count_annotated 25
[    1.549259] AHO: build inventory
[    1.552517] AHO: ac ffffffff81d400d8 ic           (null) ID 
2177560225 deps 00000000000000b0 drv ffffffff81d25090
[    1.562801] BUG: unable to handle kernel paging request at 
00000000039c2af5
(...)
--

The bug happens because the field driver_id of the structure (and likely 
the other stuff) is wrong.

If I disable CONFIG_AMD_IOMMU it looks like it should and how it works 
on ARM and Intel systems:
--
(...)
[    1.151906] io scheduler noop registered
[    1.307088] PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
[    1.313563] software IO TLB [mem 0x894ca000-0x8d4ca000] (64MB) mapped 
at [ffff8800894ca000-ffff88008d4c9fff]
[    1.323411] AHO: count_annotated 25
[    1.326934] AHO: build inventory
[    1.330189] AHO: ac ffffffff81d3cea0 ic ffffffff81cadcb4 ID 176 deps 
ffffffff81d22090 drv           (null)
(...)
--

Does anyone have an idea what's going on?

Kernel is 4.2.1 (x86_64) and HW is an A10-5800K.

If it's necessary, I could try put together a small patch which kills a 
system (reproducible here).

Thanks in advance,

Alexander Holler

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

* Re: AMD-IOMMU and problem with __init(data)?
  2015-09-23 10:22 AMD-IOMMU and problem with __init(data)? Alexander Holler
@ 2015-09-23 11:43 ` Joerg Roedel
  2015-09-23 15:50   ` Alexander Holler
  0 siblings, 1 reply; 7+ messages in thread
From: Joerg Roedel @ 2015-09-23 11:43 UTC (permalink / raw)
  To: Alexander Holler; +Cc: linux-kernel

Hey Alexander,

On Wed, Sep 23, 2015 at 12:22:24PM +0200, Alexander Holler wrote:
> [    1.539496] AMD-Vi: Lazy IO/TLB flushing enabled
> [    1.545741] AHO: count_annotated 25
> [    1.549259] AHO: build inventory
> [    1.552517] AHO: ac ffffffff81d400d8 ic           (null) ID
> 2177560225 deps 00000000000000b0 drv ffffffff81d25090
> [    1.562801] BUG: unable to handle kernel paging request at
> 00000000039c2af5
> (...)

Do you possibly have the full BUG message including the stacktrace?

> If it's necessary, I could try put together a small patch which
> kills a system (reproducible here).

That would help too, please also send me your .config and I'll try to
reproduce the issue here.


	Joerg


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

* Re: AMD-IOMMU and problem with __init(data)?
  2015-09-23 11:43 ` Joerg Roedel
@ 2015-09-23 15:50   ` Alexander Holler
  2015-09-23 19:04     ` Alexander Holler
  0 siblings, 1 reply; 7+ messages in thread
From: Alexander Holler @ 2015-09-23 15:50 UTC (permalink / raw)
  To: Joerg Roedel; +Cc: linux-kernel

Am 23.09.2015 um 13:43 schrieb Joerg Roedel:
> Hey Alexander,
>
> On Wed, Sep 23, 2015 at 12:22:24PM +0200, Alexander Holler wrote:
>> [    1.539496] AMD-Vi: Lazy IO/TLB flushing enabled
>> [    1.545741] AHO: count_annotated 25
>> [    1.549259] AHO: build inventory
>> [    1.552517] AHO: ac ffffffff81d400d8 ic           (null) ID
>> 2177560225 deps 00000000000000b0 drv ffffffff81d25090
>> [    1.562801] BUG: unable to handle kernel paging request at
>> 00000000039c2af5
>> (...)
>
> Do you possibly have the full BUG message including the stacktrace?

The full msg is

---------
[    1.552517] AHO: ac ffffffff81d400d8 ic           (null) ID 
2177560225 deps 00000000000000b0 drv ffffffff81d25090
[    1.562801] BUG: unable to handle kernel paging request at 
00000000039c2af5
[    1.569889] IP: [<ffffffff81c9d7b4>] do_annotated_initcalls+0x6f/0x25b
[    1.576490] PGD 0
[    1.578587] Oops: 0002 [#1] SMP
[    1.581947] Modules linked in:
[    1.585085] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 
4.2.1-deps-00154-gb5f382c-dirty #768
[    1.593374] Hardware name: System manufacturer System Product 
Name/F2A85-M, BIOS 6508 07/11/2014
[    1.602184] task: ffff88042d508000 ti: ffff88042d510000 task.ti: 
ffff88042d510000
[    1.609693] RIP: 0010:[<ffffffff81c9d7b4>]  [<ffffffff81c9d7b4>] 
do_annotated_initcalls+0x6f/0x25b
[    1.618718] RSP: 0018:ffff88042d513f08  EFLAGS: 00010296
[    1.624056] RAX: 0000000081caeea1 RBX: ffffffff81d400d8 RCX: 
0000000000000000
[    1.631210] RDX: 0000000081caeea1 RSI: 0000000000000246 RDI: 
ffffffff81da7ae8
[    1.638365] RBP: 0000000000000001 R08: 0000000000000000 R09: 
0000000000000000
[    1.645519] R10: 00000000000001f9 R11: 0000000000000006 R12: 
0000000000000000
[    1.652676] R13: 0000000000000000 R14: 0000000000000000 R15: 
0000000000000000
[    1.659830] FS:  0000000000000000(0000) GS:ffff88043ec00000(0000) 
knlGS:0000000000000000
[    1.667940] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[    1.673707] CR2: 00000000039c2af5 CR3: 0000000001c0b000 CR4: 
00000000000406f0
[    1.680864] Stack:
[    1.682908]  0000000000000006 0000000000000001 0000000000000000 
ffffffff81c9ced8
[    1.690531]  0000000080000000 ffffffff8164b3d0 0000000000000000 
ffffffff8164b3d9
[    1.698153]  ffffffff81c25380 ffffffff81656f5f 0000000000000000 
0000000000000000
[    1.705777] Call Trace:
[    1.708255]  [<ffffffff81c9ced8>] ? kernel_init_freeable+0xda/0x16a
[    1.714544]  [<ffffffff8164b3d0>] ? rest_init+0x70/0x70
[    1.719793]  [<ffffffff8164b3d9>] ? kernel_init+0x9/0xe0
[    1.725129]  [<ffffffff81656f5f>] ? ret_from_fork+0x3f/0x70
[    1.730724]  [<ffffffff8164b3d0>] ? rest_init+0x70/0x70
[    1.735974] Code: d4 81 73 4d 8b 4b 08 85 c9 74 40 48 8b 13 4c 8b 4b 
18 48 89 de 4c 8b 43 10 48 c7 c7 e0 4e 9d 81 e8 1c fe 9a ff 8b 53 08 48 
89 d0 <c6> 82 54 3c d1 81 01 48 89 1c d5 40 f2 d0 81 8b 15 c7 63 07 00
[    1.758158] RIP  [<ffffffff81c9d7b4>] do_annotated_initcalls+0x6f/0x25b
[    1.764845]  RSP <ffff88042d513f08>
[    1.768361] CR2: 00000000039c2af5
[    1.771710] ---[ end trace 5a4348fb7eabd051 ]---
[    1.776363] ------------[ cut here ]------------
[    1.781010] WARNING: CPU: 0 PID: 1 at kernel/smp.c:292 
smp_call_function_single+0xe7/0x100()
[    1.789472] Modules linked in:
[    1.792610] CPU: 0 PID: 1 Comm: swapper/0 Tainted: G      D 
4.2.1-deps-00154-gb5f382c-dirty #768
[    1.802112] Hardware name: System manufacturer System Product 
Name/F2A85-M, BIOS 6508 07/11/2014
[    1.810921]  0000000000000000 ffffffff819d6fba ffffffff8164f11e 
0000000000000000
[    1.818542]  ffffffff81039647 0000000000000000 ffffffff810c87c0 
ffffffff81c22040
[    1.826166]  0000000000000000 00000000039c2af5 ffffffff8109bc97 
ffff88042d513cf8
[    1.833790] Call Trace:
[    1.836267]  [<ffffffff8164f11e>] ? dump_stack+0x40/0x50
[    1.841603]  [<ffffffff81039647>] ? warn_slowpath_common+0x87/0xd0
[    1.847806]  [<ffffffff810c87c0>] ? cpu_clock_event_start+0x30/0x30
[    1.854095]  [<ffffffff8109bc97>] ? smp_call_function_single+0xe7/0x100
[    1.860729]  [<ffffffff810c7962>] ? task_function_call+0x42/0x50
[    1.866760]  [<ffffffff810cc670>] ? perf_cgroup_switch+0x160/0x160
[    1.872963]  [<ffffffff810ac800>] ? cgroup_exit+0xb0/0x130
[    1.878470]  [<ffffffff8103b987>] ? do_exit+0x347/0x9a0
[    1.883720]  [<ffffffff8100693c>] ? oops_end+0x8c/0xd0
[    1.888882]  [<ffffffff8102cd83>] ? no_context+0x123/0x370
[    1.894392]  [<ffffffff81658132>] ? page_fault+0x22/0x30
[    1.899728]  [<ffffffff81c9d7b4>] ? do_annotated_initcalls+0x6f/0x25b
[    1.906190]  [<ffffffff81c9d7ae>] ? do_annotated_initcalls+0x69/0x25b
[    1.912653]  [<ffffffff81c9ced8>] ? kernel_init_freeable+0xda/0x16a
[    1.918941]  [<ffffffff8164b3d0>] ? rest_init+0x70/0x70
[    1.924190]  [<ffffffff8164b3d9>] ? kernel_init+0x9/0xe0
[    1.929526]  [<ffffffff81656f5f>] ? ret_from_fork+0x3f/0x70
[    1.935123]  [<ffffffff8164b3d0>] ? rest_init+0x70/0x70
[    1.940371] ---[ end trace 5a4348fb7eabd052 ]---
[    1.945023] Kernel panic - not syncing: Attempted to kill init! 
exitcode=0x00000009
[    1.945023]
[    1.954235] ---[ end Kernel panic - not syncing: Attempted to kill 
init! exitcode=0x00000009
---------

The bug happens because the code tried to uses foo[ID] and with an ID of 
2177560225 it wents clearly out of bounds. ;)

>
>> If it's necessary, I could try put together a small patch which
>> kills a system (reproducible here).
>
> That would help too, please also send me your .config and I'll try to
> reproduce the issue here.

Will do. Later.

Thanks,

Regards,

Alexander Holler


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

* Re: AMD-IOMMU and problem with __init(data)?
  2015-09-23 15:50   ` Alexander Holler
@ 2015-09-23 19:04     ` Alexander Holler
  2015-09-26  8:18       ` Alexander Holler
  2015-09-29 15:06       ` Joerg Roedel
  0 siblings, 2 replies; 7+ messages in thread
From: Alexander Holler @ 2015-09-23 19:04 UTC (permalink / raw)
  To: Joerg Roedel; +Cc: linux-kernel

[-- Attachment #1: Type: text/plain, Size: 779 bytes --]

Am 23.09.2015 um 17:50 schrieb Alexander Holler:
> Am 23.09.2015 um 13:43 schrieb Joerg Roedel:
>>> If it's necessary, I could try put together a small patch which
>>> kills a system (reproducible here).
>>
>> That would help too, please also send me your .config and I'll try to
>> reproduce the issue here.
>
> Will do. Later.

Done. Patch(es) and config attached. Note, while reducing the patch, 
I've noted that when I change


struct _annotated_initcall {
	initcall_t initcall;
	unsigned driver_id;
	unsigned *dependencies;
	struct device_driver *driver;
};

to

struct _annotated_initcall {
	initcall_t initcall;
	unsigned driver_id;
};

it does not crash. That's what the second patch does. So in order to 
crash a system, just use patch 0001.

Regards,

Alexander Holler

[-- Attachment #2: 0001-CRASH-on-AMD-with-CONFIG_AMD_IOMMU.patch --]
[-- Type: text/x-patch, Size: 2313 bytes --]

>From d94e5568925d7cb8a3fc628606e8fcf1374ea177 Mon Sep 17 00:00:00 2001
From: Alexander Holler <holler@ahsoftware.de>
Date: Wed, 23 Sep 2015 19:43:51 +0200
Subject: [PATCH 1/2] CRASH on AMD with CONFIG_AMD_IOMMU

---
 include/asm-generic/vmlinux.lds.h |  6 ++++++
 init/main.c                       | 30 +++++++++++++++++++++++++++++-
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 8bd374d..13f9189 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -660,6 +660,11 @@
 		INIT_CALLS_LEVEL(7)					\
 		VMLINUX_SYMBOL(__initcall_end) = .;
 
+#define ANNOTATED_INITCALLS						\
+		VMLINUX_SYMBOL(__annotated_initcall_start) = .;		\
+		*(.annotated_initcall.init)				\
+		VMLINUX_SYMBOL(__annotated_initcall_end) = .;
+
 #define CON_INITCALL							\
 		VMLINUX_SYMBOL(__con_initcall_start) = .;		\
 		*(.con_initcall.init)					\
@@ -816,6 +821,7 @@
 		INIT_DATA						\
 		INIT_SETUP(initsetup_align)				\
 		INIT_CALLS						\
+		ANNOTATED_INITCALLS					\
 		CON_INITCALL						\
 		SECURITY_INITCALL					\
 		INIT_RAM_FS						\
diff --git a/init/main.c b/init/main.c
index 5650655..1498f9b 100644
--- a/init/main.c
+++ b/init/main.c
@@ -859,12 +859,40 @@ static void __init do_initcall_level(int level)
 		do_one_initcall(*fn);
 }
 
+struct _annotated_initcall {
+	initcall_t initcall;
+	unsigned driver_id;
+	unsigned *dependencies;
+	struct device_driver *driver;
+};
+extern struct _annotated_initcall __annotated_initcall_start[];
+
+#define annotated_initcall(fn, id) \
+	static struct _annotated_initcall __annotated_initcall_##fn __used \
+	__attribute__((__section__(".annotated_initcall.init"))) = \
+							{ .initcall = fn, .driver_id = id }
+
+
+static int __init foo(void)
+{
+	return 0;
+}
+
+annotated_initcall(foo, 23);
+
 static void __init do_initcalls(void)
 {
 	int level;
+	struct _annotated_initcall *ac;
 
-	for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++)
+	for (level = 0; level < ARRAY_SIZE(initcall_levels) - 3; level++)
 		do_initcall_level(level);
+
+	ac = __annotated_initcall_start;
+	pr_info("ac %p ID %u\n", ac, ac->driver_id);
+	BUG_ON(ac->driver_id != 23);
+	do_initcall_level(level++);
+	do_initcall_level(level);
 }
 
 /*
-- 
2.1.0


[-- Attachment #3: 0002-NO-crash.patch --]
[-- Type: text/x-patch, Size: 632 bytes --]

>From 17c9b286710931947c63ef49bba69f679ecdc400 Mon Sep 17 00:00:00 2001
From: Alexander Holler <holler@ahsoftware.de>
Date: Wed, 23 Sep 2015 20:39:28 +0200
Subject: [PATCH 2/2] NO crash

---
 init/main.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/init/main.c b/init/main.c
index 1498f9b..4c1f041 100644
--- a/init/main.c
+++ b/init/main.c
@@ -862,8 +862,6 @@ static void __init do_initcall_level(int level)
 struct _annotated_initcall {
 	initcall_t initcall;
 	unsigned driver_id;
-	unsigned *dependencies;
-	struct device_driver *driver;
 };
 extern struct _annotated_initcall __annotated_initcall_start[];
 
-- 
2.1.0


[-- Attachment #4: crash_amd_iommu.config.bz2 --]
[-- Type: application/x-bzip, Size: 23799 bytes --]

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

* Re: AMD-IOMMU and problem with __init(data)?
  2015-09-23 19:04     ` Alexander Holler
@ 2015-09-26  8:18       ` Alexander Holler
  2015-09-29 15:06       ` Joerg Roedel
  1 sibling, 0 replies; 7+ messages in thread
From: Alexander Holler @ 2015-09-26  8:18 UTC (permalink / raw)
  To: Joerg Roedel; +Cc: linux-kernel

Am 23.09.2015 um 21:04 schrieb Alexander Holler:
> Am 23.09.2015 um 17:50 schrieb Alexander Holler:
>> Am 23.09.2015 um 13:43 schrieb Joerg Roedel:
>>>> If it's necessary, I could try put together a small patch which
>>>> kills a system (reproducible here).
>>>
>>> That would help too, please also send me your .config and I'll try to
>>> reproduce the issue here.
>>
>> Will do. Later.
>
> Done. Patch(es) and config attached. Note, while reducing the patch,
> I've noted that when I change

Just in case of, the command line I'm using is

ro root=/dev/sdb2 rootfstype=btrfs rootflags=compress=zlib enforcing=0 
selinux=0 cgroup_disable=memory swapaccount=0 
earlycon=uart8250,io,0x3f8,115200n8 console=ttyS0,115200n8 console=tty0 
memtest=3 LANG=de_DE.UTF-8 video=DVI-D-1:1920x1080-32@60

And memtest never failed (I'm always using that). So it's unlikely it's 
a problem with the memory.

But usually I don't have enabled the serial, that means normally I'm 
booting with

root=/dev/sdb2 rootfstype=btrfs rootflags=compress=zlib enforcing=0 
selinux=0 cgroup_disable=memory swapaccount=0 console=tty0 memtest=3 
LANG=de_DE.UTF-8 video=DVI-D-1:1920x1080-32@60

so maybe enabling the serial does something bad. Also I've enabled it 
before and haven't seen something bad. And because I assume the IOMMU is 
the problem, I don't use any cards, just the HW on mb.

Regards,

Alexander Holler

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

* Re: AMD-IOMMU and problem with __init(data)?
  2015-09-23 19:04     ` Alexander Holler
  2015-09-26  8:18       ` Alexander Holler
@ 2015-09-29 15:06       ` Joerg Roedel
  2015-09-29 17:17         ` Alexander Holler
  1 sibling, 1 reply; 7+ messages in thread
From: Joerg Roedel @ 2015-09-29 15:06 UTC (permalink / raw)
  To: Alexander Holler; +Cc: linux-kernel

As expected it is no bug in the AMD IOMMU driver, but in your code.

On Wed, Sep 23, 2015 at 09:04:31PM +0200, Alexander Holler wrote:
> struct _annotated_initcall {
> 	initcall_t initcall;
> 	unsigned driver_id;
> 	unsigned *dependencies;
> 	struct device_driver *driver;
> };

This struct gets aligned on a 32 bytes boundary.

> +#define ANNOTATED_INITCALLS						\
> +		VMLINUX_SYMBOL(__annotated_initcall_start) = .;		\
> +		*(.annotated_initcall.init)				\
> +		VMLINUX_SYMBOL(__annotated_initcall_end) = .;

But this section does not.

> +	ac = __annotated_initcall_start;
> +	pr_info("ac %p ID %u\n", ac, ac->driver_id);
> +	BUG_ON(ac->driver_id != 23);

So when you access __annotated_initcall_start here, you don't access the
first element of your array, but actually the zero padding before your
struct.

On my system the section was aligned on an 8 bytes boundary, which means
there were 24 bytes of padding before the symbol you try to access.



	Joerg


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

* Re: AMD-IOMMU and problem with __init(data)?
  2015-09-29 15:06       ` Joerg Roedel
@ 2015-09-29 17:17         ` Alexander Holler
  0 siblings, 0 replies; 7+ messages in thread
From: Alexander Holler @ 2015-09-29 17:17 UTC (permalink / raw)
  To: Joerg Roedel; +Cc: linux-kernel

Am 29.09.2015 um 17:06 schrieb Joerg Roedel:
> As expected it is no bug in the AMD IOMMU driver, but in your code.
>
> On Wed, Sep 23, 2015 at 09:04:31PM +0200, Alexander Holler wrote:
>> struct _annotated_initcall {
>> 	initcall_t initcall;
>> 	unsigned driver_id;
>> 	unsigned *dependencies;
>> 	struct device_driver *driver;
>> };
>
> This struct gets aligned on a 32 bytes boundary.
>
>> +#define ANNOTATED_INITCALLS						\
>> +		VMLINUX_SYMBOL(__annotated_initcall_start) = .;		\
>> +		*(.annotated_initcall.init)				\
>> +		VMLINUX_SYMBOL(__annotated_initcall_end) = .;
>
> But this section does not.
>
>> +	ac = __annotated_initcall_start;
>> +	pr_info("ac %p ID %u\n", ac, ac->driver_id);
>> +	BUG_ON(ac->driver_id != 23);
>
> So when you access __annotated_initcall_start here, you don't access the
> first element of your array, but actually the zero padding before your
> struct.
>
> On my system the section was aligned on an 8 bytes boundary, which means
> there were 24 bytes of padding before the symbol you try to access.

Hmm. Thanks a lot. Also I've checked the alignment (at least twice) and 
remember it was 32bit. But maybe I've checked something different or 
looked at some file for ARM or x86(_32) or was confused or similar. But 
now, when I look at ARM the initcall section seems to be aligned to 8 
too. So I wonder why the stuff works on ARM (v5 and v7) and on an Intel 
Atom (32bit). I think at least the armv5 box should have trapped (fatal) 
too, but maybe that changed.

Sorry for not having looked at the alignment at least once more. 
Alignment bugs are always hard to see and I've already assumed such, 
especially because any other kernel seems to work, but I was obviously 
unable to see it.

Again, thanks a lot.

Regards,

Alexander Holler

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

end of thread, other threads:[~2015-09-29 17:17 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-09-23 10:22 AMD-IOMMU and problem with __init(data)? Alexander Holler
2015-09-23 11:43 ` Joerg Roedel
2015-09-23 15:50   ` Alexander Holler
2015-09-23 19:04     ` Alexander Holler
2015-09-26  8:18       ` Alexander Holler
2015-09-29 15:06       ` Joerg Roedel
2015-09-29 17:17         ` Alexander Holler

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox