LKML Archive on
 help / color / Atom feed
From: Arnd Bergmann <>
Cc: Arnd Bergmann <>, Jens Axboe <>,
	Jian Cai <>, Guenter Roeck <>,
	Peter Zijlstra <>,
	"Huang, Ying" <>,
	Borislav Petkov <>,
	Eric Dumazet <>,
	Juergen Gross <>,
	Michael Ellerman <>,
	Thomas Gleixner <>
Subject: [PATCH] smp: fix smp_call_function_single_async prototype
Date: Thu, 29 Apr 2021 17:09:40 +0200
Message-ID: <> (raw)

From: Arnd Bergmann <>

As of commit 966a967116e6 ("smp: Avoid using two cache lines for struct
call_single_data"), the smp code prefers 32-byte aligned call_single_data
objects for performance reasons, but the block layer includes an instance
of this structure in the main 'struct request' that is more senstive
to size than to performance here, see 4ccafe032005 ("block: unalign
call_single_data in struct request").

The result is a violation of the calling conventions that clang correctly
points out:

block/blk-mq.c:630:39: warning: passing 8-byte aligned argument to 32-byte aligned parameter 2 of 'smp_call_function_single_async' may result in an unaligned pointer access [-Walign-mismatch]
                smp_call_function_single_async(cpu, &rq->csd);

It does seem that the usage of the call_single_data without cache line
alignment should still be allowed by the smp code, so just change the
function prototype so it accepts both, but leave the default alignment
unchanged for the other users. This seems better to me than adding
a local hack to shut up an otherwise correct warning in the caller.

Cc: Jens Axboe <>
Cc: Jian Cai <>
Cc: Guenter Roeck <>
Cc: Peter Zijlstra <>
Cc: "Huang, Ying" <>
Cc: Borislav Petkov <>
Cc: Eric Dumazet <>
Cc: Juergen Gross <>
Cc: Michael Ellerman <>
Cc: Thomas Gleixner <>
Signed-off-by: Arnd Bergmann <>
 include/linux/smp.h | 2 +-
 kernel/smp.c        | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/include/linux/smp.h b/include/linux/smp.h
index 669e35c03be2..510519e8a1eb 100644
--- a/include/linux/smp.h
+++ b/include/linux/smp.h
@@ -53,7 +53,7 @@ int smp_call_function_single(int cpuid, smp_call_func_t func, void *info,
 void on_each_cpu_cond_mask(smp_cond_func_t cond_func, smp_call_func_t func,
 			   void *info, bool wait, const struct cpumask *mask);
-int smp_call_function_single_async(int cpu, call_single_data_t *csd);
+int smp_call_function_single_async(int cpu, struct __call_single_data *csd);
  * Cpus stopping functions in panic. All have default weak definitions.
diff --git a/kernel/smp.c b/kernel/smp.c
index e21074900006..1ec771d9f91c 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -401,7 +401,7 @@ static void __csd_lock_wait(call_single_data_t *csd)
-static __always_inline void csd_lock_wait(call_single_data_t *csd)
+static __always_inline void csd_lock_wait(struct __call_single_data *csd)
 	if (static_branch_unlikely(&csdlock_debug_enabled)) {
@@ -501,7 +501,7 @@ void __smp_call_single_queue(int cpu, struct llist_node *node)
  * for execution on the given CPU. data must already have
  * ->func, ->info, and ->flags set.
-static int generic_exec_single(int cpu, call_single_data_t *csd)
+static int generic_exec_single(int cpu, struct __call_single_data *csd)
 	if (cpu == smp_processor_id()) {
 		smp_call_func_t func = csd->func;
@@ -784,7 +784,7 @@ EXPORT_SYMBOL(smp_call_function_single);
  * NOTE: Be careful, there is unfortunately no current debugging facility to
  * validate the correctness of this serialization.
-int smp_call_function_single_async(int cpu, call_single_data_t *csd)
+int smp_call_function_single_async(int cpu, struct __call_single_data *csd)
 	int err = 0;

             reply index

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-29 15:09 Arnd Bergmann [this message]
2021-04-29 15:54 ` Jens Axboe
2021-04-29 18:17 ` Nick Desaulniers
2021-04-29 18:24   ` Nick Desaulniers
2021-04-29 18:26     ` Arnd Bergmann
2021-04-29 18:39       ` Nick Desaulniers
2021-04-29 19:08 ` kernel test robot
2021-04-29 21:44 ` kernel test robot
2021-04-29 23:00   ` Jian Cai

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:

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \ \ \ \ \ \ \ \ \ \ \ \ \ \ \

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

LKML Archive on

Archives are clonable:
	git clone --mirror lkml/git/0.git
	git clone --mirror lkml/git/1.git
	git clone --mirror lkml/git/2.git
	git clone --mirror lkml/git/3.git
	git clone --mirror lkml/git/4.git
	git clone --mirror lkml/git/5.git
	git clone --mirror lkml/git/6.git
	git clone --mirror lkml/git/7.git
	git clone --mirror lkml/git/8.git
	git clone --mirror lkml/git/9.git
	git clone --mirror lkml/git/10.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 lkml lkml/ \
	public-inbox-index lkml

Example config snippet for mirrors

Newsgroup available over NNTP:

AGPL code for this site: git clone