diff mbox series

ipmi: avoid atomic_inc in exit function

Message ID 20190415155509.3565087-1-arnd@arndb.de
State Accepted
Commit 9a75bd18a85bec5d6d0006a3dba6ff78f65d8fe3
Headers show
Series ipmi: avoid atomic_inc in exit function | expand

Commit Message

Arnd Bergmann April 15, 2019, 3:55 p.m. UTC
This causes a link failure on ARM in certain configurations,
when we reference each atomic operation from .alt.smp.init in
order to patch out atomics on non-SMP systems:

`.exit.text' referenced in section `.alt.smp.init' of drivers/char/ipmi/ipmi_msghandler.o: defined in discarded section `.exit.text' of drivers/char/ipmi/ipmi_msghandler.o

In this case, we can trivially replace the atomic_inc() with
an atomic_set() that has the same effect and does not require
a fixup.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>

---
 drivers/char/ipmi/ipmi_msghandler.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

-- 
2.20.0

Comments

Christoph Hellwig April 15, 2019, 4:40 p.m. UTC | #1
On Mon, Apr 15, 2019 at 05:55:00PM +0200, Arnd Bergmann wrote:
> This causes a link failure on ARM in certain configurations,

> when we reference each atomic operation from .alt.smp.init in

> order to patch out atomics on non-SMP systems:

> 

> `.exit.text' referenced in section `.alt.smp.init' of drivers/char/ipmi/ipmi_msghandler.o: defined in discarded section `.exit.text' of drivers/char/ipmi/ipmi_msghandler.o

> 

> In this case, we can trivially replace the atomic_inc() with

> an atomic_set() that has the same effect and does not require

> a fixup.


I'd rather fіx the arm section management.  Using atomic in exit
routines is perfectly valid, and it would seem odd to forbid it.
Corey Minyard April 15, 2019, 5:39 p.m. UTC | #2
On Mon, Apr 15, 2019 at 09:40:22AM -0700, Christoph Hellwig wrote:
> On Mon, Apr 15, 2019 at 05:55:00PM +0200, Arnd Bergmann wrote:

> > This causes a link failure on ARM in certain configurations,

> > when we reference each atomic operation from .alt.smp.init in

> > order to patch out atomics on non-SMP systems:

> > 

> > `.exit.text' referenced in section `.alt.smp.init' of drivers/char/ipmi/ipmi_msghandler.o: defined in discarded section `.exit.text' of drivers/char/ipmi/ipmi_msghandler.o

> > 

> > In this case, we can trivially replace the atomic_inc() with

> > an atomic_set() that has the same effect and does not require

> > a fixup.

> 

> I'd rather fіx the arm section management.  Using atomic in exit

> routines is perfectly valid, and it would seem odd to forbid it.


That was my first thought, too.  It's kind of hard to believe that
the IPMI driver is the only thing that does an atomic_inc() in the
exit code.

-corey
Arnd Bergmann April 15, 2019, 7 p.m. UTC | #3
On Mon, Apr 15, 2019 at 7:39 PM Corey Minyard <minyard@acm.org> wrote:
>

> On Mon, Apr 15, 2019 at 09:40:22AM -0700, Christoph Hellwig wrote:

> > On Mon, Apr 15, 2019 at 05:55:00PM +0200, Arnd Bergmann wrote:

> > > This causes a link failure on ARM in certain configurations,

> > > when we reference each atomic operation from .alt.smp.init in

> > > order to patch out atomics on non-SMP systems:

> > >

> > > `.exit.text' referenced in section `.alt.smp.init' of drivers/char/ipmi/ipmi_msghandler.o: defined in discarded section `.exit.text' of drivers/char/ipmi/ipmi_msghandler.o

> > >

> > > In this case, we can trivially replace the atomic_inc() with

> > > an atomic_set() that has the same effect and does not require

> > > a fixup.

> >

> > I'd rather fіx the arm section management.  Using atomic in exit

> > routines is perfectly valid, and it would seem odd to forbid it.

>

> That was my first thought, too.  It's kind of hard to believe that

> the IPMI driver is the only thing that does an atomic_inc() in the

> exit code.


That's what I had thought as well at first, and I carried a patch
to work around this by not dropping the .text.exit section on ARM
when SMP patching is enabled for a few years. I never sent this
because that can waste a significant amount of kernel memory,
and I knew the warning is harmless.

When revisiting it now, I found that this one was the only instance
I ever hit. It seems to be that using atomics in module_exit() is
indeed odd, because the function is rarely concurrent with anything
else.

        Arnd
Corey Minyard April 16, 2019, 12:46 p.m. UTC | #4
On Mon, Apr 15, 2019 at 09:00:46PM +0200, Arnd Bergmann wrote:
> On Mon, Apr 15, 2019 at 7:39 PM Corey Minyard <minyard@acm.org> wrote:

> >

> > On Mon, Apr 15, 2019 at 09:40:22AM -0700, Christoph Hellwig wrote:

> > > On Mon, Apr 15, 2019 at 05:55:00PM +0200, Arnd Bergmann wrote:

> > > > This causes a link failure on ARM in certain configurations,

> > > > when we reference each atomic operation from .alt.smp.init in

> > > > order to patch out atomics on non-SMP systems:

> > > >

> > > > `.exit.text' referenced in section `.alt.smp.init' of drivers/char/ipmi/ipmi_msghandler.o: defined in discarded section `.exit.text' of drivers/char/ipmi/ipmi_msghandler.o

> > > >

> > > > In this case, we can trivially replace the atomic_inc() with

> > > > an atomic_set() that has the same effect and does not require

> > > > a fixup.

> > >

> > > I'd rather fіx the arm section management.  Using atomic in exit

> > > routines is perfectly valid, and it would seem odd to forbid it.

> >

> > That was my first thought, too.  It's kind of hard to believe that

> > the IPMI driver is the only thing that does an atomic_inc() in the

> > exit code.

> 

> That's what I had thought as well at first, and I carried a patch

> to work around this by not dropping the .text.exit section on ARM

> when SMP patching is enabled for a few years. I never sent this

> because that can waste a significant amount of kernel memory,

> and I knew the warning is harmless.

> 

> When revisiting it now, I found that this one was the only instance

> I ever hit. It seems to be that using atomics in module_exit() is

> indeed odd, because the function is rarely concurrent with anything

> else.


I've added the change to my tree; it actually makes a little more
sense, so I'm ok with it.

I guess it's up to you to deal with any new ones that happen in
the future ;-).

-corey
diff mbox series

Patch

diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
index e8ba67834746..c48198eef510 100644
--- a/drivers/char/ipmi/ipmi_msghandler.c
+++ b/drivers/char/ipmi/ipmi_msghandler.c
@@ -5164,7 +5164,7 @@  static void __exit cleanup_ipmi(void)
 		 * avoids problems with race conditions removing the timer
 		 * here.
 		 */
-		atomic_inc(&stop_operation);
+		atomic_set(&stop_operation, 1);
 		del_timer_sync(&ipmi_timer);
 
 		initialized = false;