[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <BANLkTikyjzQ-VZMn2_ZobEmHMLRafki9YQ@mail.gmail.com>
Date: Tue, 21 Jun 2011 11:08:28 -0700
From: Deep Debroy <ddebroy@...il.com>
To: linux-kernel@...r.kernel.org, kraxel@...hat.com
Subject: Re: code sections beyond .text skipped from alternatives_smp_module_add
On Tue, Jun 21, 2011 at 1:10 AM, Deep Debroy <ddebroy@...il.com> wrote:
> In x86-64, I am running into a scenario with certain kernel modules
> where the patching of lock prefix instructions in sections other than
> .text (e.g. .exit.text) is not occurring even though the .smp_locks
> relocations in the .ko file specify instructions in sections other
> than .text for patching. For example (down in the bottom), in
> net/bluetooth/rfcomm.ko, we have a couple of entries in .exit.text for
> patching. However, when I look in the memory page containing the
> .exit.text section in a uni processor system, it doesn't appear the
> lock prefix instructions in .exit.text were patched with NOPs the same
> way other instructions from the .text section in the same page
> underwent patching. This creates a subtle inconsistency where a page
> contains the end of the .text section along with the .exit.text
> section - lock prefixes in instructions from the former section gets
> patched per .smp_locks entries while that doesn't happen for the
> latter within the same page.
>
> Looking at the code, in module_finalize for x86, only .text seems to
> be getting picked for the patching of lock prefixes while other
> sections such as .exit.text or .init.text are not. Is there a reason
> we skip the other *.text code sections from the lock patches? Would
> making the application of the patching of lock prefixes generic across
> all code sections (rather than just .text) make sense?
>
> Thanks,
> Deep
>
> for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) {
> if (!strcmp(".text", secstrings + s->sh_name))
> text = s;
> ...
> if (!strcmp(".smp_locks", secstrings + s->sh_name))
> locks = s;
> ...
> }
>
> if (locks && text) {
> void *lseg = (void *)locks->sh_addr;
> void *tseg = (void *)text->sh_addr;
> alternatives_smp_module_add(me, me->name,
> lseg, lseg + locks->sh_size,
> tseg, tseg + text->sh_size);
> }
>
>
>
>> objdump -r kernel/net/bluetooth/rfcomm/rfcomm.ko
>
> RELOCATION RECORDS FOR [.smp_locks]:
> OFFSET TYPE VALUE
> 0000000000000000 R_X86_64_64 .text+0x00000000000000ac
> 0000000000000008 R_X86_64_64 .exit.text+0x0000000000000023
> 0000000000000010 R_X86_64_64 .exit.text+0x0000000000000034
> 0000000000000018 R_X86_64_64 .text+0x0000000000000619
> 0000000000000020 R_X86_64_64 .text+0x000000000000061d
>
+ Gerd Hoffmann who introduced the SMP patching code below back in Jan
2006 as part of 2.6.15.
Any comments on why patching of smp_lock prefixes should be restricted
to .text and not other *.text code sections?
Thanks,
Deep
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists