Re: include/linux/compiler_types.h:631:38: error: call to '__compiletime_assert_431' declared with attribute error: BUILD_BUG_ON failed: offsetof(struct qla_tgt_sess_op, atio) + sizeof(u->atio) != sizeof(*u)
From: Finn Thain
Date: Tue Mar 03 2026 - 01:48:05 EST
On Tue, 3 Mar 2026, kernel test robot wrote:
> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
> head: af4e9ef3d78420feb8fe58cd9a1ab80c501b3c08
> commit: e428b013d9dff30f7a65509e33047ba975cce8ba atomic: specify alignment for atomic_t and atomic64_t
> date: 5 weeks ago
> config: m68k-randconfig-r133-20260303 (https://download.01.org/0day-ci/archive/20260303/202603030747.VX0v4otS-lkp@xxxxxxxxx/config)
> compiler: m68k-linux-gcc (GCC) 8.5.0
> sparse: v0.6.5-rc1
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260303/202603030747.VX0v4otS-lkp@xxxxxxxxx/reproduce)
This config is an unlikely one (fibre channel storage with a coldfire
processor) which is probably why 'make randconfig' was needed in order to
expose the problem. It's essentially a theoretical bug but I will try to
patch it anyway.
What's happening here is that the patch that naturally aligned atomic_t
caused some new padding to appear at the end of this struct:
--- a/pahole.out
+++ b/pahole.out
@@ -1,16 +1,18 @@
struct qla_tgt_sess_op {
struct scsi_qla_host * vha; /* 0 4 */
uint32_t chip_reset; /* 4 4 */
- struct work_struct work; /* 8 16 */
+ struct work_struct work __attribute__((__aligned__(4))); /* 8 16 */
struct list_head cmd_list; /* 24 8 */
bool aborted; /* 32 1 */
/* XXX 1 byte hole, try to pack */
struct rsp_que * rsp; /* 34 4 */
struct atio_from_isp atio; /* 38 64 */
- /* size: 102, cachelines: 2, members: 7 */
+ /* size: 104, cachelines: 2, members: 7 */
/* sum members: 101, holes: 1, sum holes: 1 */
- /* last cacheline: 38 bytes */
-};
+ /* padding: 2 */
+ /* forced alignments: 1 */
+ /* last cacheline: 40 bytes */
+} __attribute__((__aligned__(4)));
The BUILD_BUG_ON assertion checks the size of the struct, which doesn't
seem right, because any padding at the end of the struct does not
interfere with the subsequent kzalloc() and memcpy() in
qlt_queue_unknown_atio().
I suppose the assertion could be motivated by some code elsewhere but I
haven't yet found it. So perhaps the assertion can simply be removed. An
alternative solution could be to increase the 1 byte hole to 3 bytes, and
prevent tail padding that way.
But padding should be irrelevant to the real requirement --
struct qla_tgt_sess_op {
struct scsi_qla_host *vha;
uint32_t chip_reset;
struct work_struct work;
struct list_head cmd_list;
bool aborted;
struct rsp_que *rsp;
struct atio_from_isp atio;
/* DO NOT ADD ANYTHING ELSE HERE - atio must be last member */
};
And yet, there's already a precedent in this driver for padding a struct
in order to satisfy a BUILD_BUG_ON --
struct atio7_fcp_cmnd {
uint64_t lun;
uint8_t cmnd_ref;
uint8_t task_attr:3;
uint8_t reserved:5;
uint8_t task_mgmt_flags;
#define FCP_CMND_TASK_MGMT_CLEAR_ACA 6
#define FCP_CMND_TASK_MGMT_TARGET_RESET 5
#define FCP_CMND_TASK_MGMT_LU_RESET 4
#define FCP_CMND_TASK_MGMT_CLEAR_TASK_SET 2
#define FCP_CMND_TASK_MGMT_ABORT_TASK_SET 1
uint8_t wrdata:1;
uint8_t rddata:1;
uint8_t add_cdb_len:6;
uint8_t cdb[16];
/*
* add_cdb is optional and can absent from struct atio7_fcp_cmnd. Size 4
* only to make sizeof(struct atio7_fcp_cmnd) be as expected by
* BUILD_BUG_ON in qlt_init().
*/
uint8_t add_cdb[4];
/* __le32 data_length; */
} __packed;
So I'm undecided. Any thoughts, Nilesh?
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@xxxxxxxxx>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202603030747.VX0v4otS-lkp@xxxxxxxxx/
>
> All errors (new ones prefixed by >>):
>
> In file included from <command-line>:
> In function 'qlt_queue_unknown_atio',
> inlined from 'qlt_24xx_atio_pkt_all_vps' at drivers/scsi/qla2xxx/qla_target.c:331:4,
> inlined from 'qlt_24xx_process_atio_queue' at drivers/scsi/qla2xxx/qla_target.c:7903:4:
> >> include/linux/compiler_types.h:631:38: error: call to '__compiletime_assert_431' declared with attribute error: BUILD_BUG_ON failed: offsetof(struct qla_tgt_sess_op, atio) + sizeof(u->atio) != sizeof(*u)
> _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
> ^
> include/linux/compiler_types.h:612:4: note: in definition of macro '__compiletime_assert'
> prefix ## suffix(); \
> ^~~~~~
> include/linux/compiler_types.h:631:2: note: in expansion of macro '_compiletime_assert'
> _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
> ^~~~~~~~~~~~~~~~~~~
> include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
> #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
> ^~~~~~~~~~~~~~~~~~
> include/linux/build_bug.h:50:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
> BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)
> ^~~~~~~~~~~~~~~~
> drivers/scsi/qla2xxx/qla_target.c:216:2: note: in expansion of macro 'BUILD_BUG_ON'
> BUILD_BUG_ON(offsetof(struct qla_tgt_sess_op, atio) + sizeof(u->atio) != sizeof(*u));
> ^~~~~~~~~~~~
>