* [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers)
@ 2026-01-14 16:36 kernel test robot
2026-01-14 17:51 ` Ian Rogers
2026-01-15 19:28 ` Thomas Gleixner
0 siblings, 2 replies; 19+ messages in thread
From: kernel test robot @ 2026-01-14 16:36 UTC (permalink / raw)
To: Ian Rogers; +Cc: oe-kbuild-all, linux-kernel, x86, Thomas Gleixner
tree: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/vdso
head: 759a1f97373f25770cf438d9fb5f2bddf4d77a54
commit: e04a494143bab7ea804fe1ebe286701ee8288e4a [12/14] vdso: Switch get/put_unaligned() from packed struct to memcpy()
config: x86_64-randconfig-122-20260114 (https://download.01.org/0day-ci/archive/20260115/202601150001.sKSN644a-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
rustc: rustc 1.88.0 (6b00bc388 2025-06-23)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260115/202601150001.sKSN644a-lkp@intel.com/reproduce)
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@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601150001.sKSN644a-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
>> net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void * @@ got restricted __be64 const * @@
net/rds/ib_cm.c:96:35: sparse: expected void *
net/rds/ib_cm.c:96:35: sparse: got restricted __be64 const *
net/rds/ib_cm.c:103:27: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void * @@ got restricted __be64 const * @@
net/rds/ib_cm.c:103:27: sparse: expected void *
net/rds/ib_cm.c:103:27: sparse: got restricted __be64 const *
vim +96 net/rds/ib_cm.c
ec16227e14141e Andy Grover 2009-02-24 69
ec16227e14141e Andy Grover 2009-02-24 70 /*
ec16227e14141e Andy Grover 2009-02-24 71 * Connection established.
ec16227e14141e Andy Grover 2009-02-24 72 * We get here for both outgoing and incoming connection.
ec16227e14141e Andy Grover 2009-02-24 73 */
ec16227e14141e Andy Grover 2009-02-24 74 void rds_ib_cm_connect_complete(struct rds_connection *conn, struct rdma_cm_event *event)
ec16227e14141e Andy Grover 2009-02-24 75 {
ec16227e14141e Andy Grover 2009-02-24 76 struct rds_ib_connection *ic = conn->c_transport_data;
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 77 const union rds_ib_conn_priv *dp = NULL;
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 78 __be64 ack_seq = 0;
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 79 __be32 credit = 0;
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 80 u8 major = 0;
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 81 u8 minor = 0;
ec16227e14141e Andy Grover 2009-02-24 82 int err;
ec16227e14141e Andy Grover 2009-02-24 83
ec16227e14141e Andy Grover 2009-02-24 84 dp = event->param.conn.private_data;
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 85 if (conn->c_isv6) {
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 86 if (event->param.conn.private_data_len >=
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 87 sizeof(struct rds6_ib_connect_private)) {
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 88 major = dp->ricp_v6.dp_protocol_major;
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 89 minor = dp->ricp_v6.dp_protocol_minor;
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 90 credit = dp->ricp_v6.dp_credit;
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 91 /* dp structure start is not guaranteed to be 8 bytes
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 92 * aligned. Since dp_ack_seq is 64-bit extended load
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 93 * operations can be used so go through get_unaligned
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 94 * to avoid unaligned errors.
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 95 */
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 @96 ack_seq = get_unaligned(&dp->ricp_v6.dp_ack_seq);
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 97 }
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 98 } else if (event->param.conn.private_data_len >=
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 99 sizeof(struct rds_ib_connect_private)) {
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 100 major = dp->ricp_v4.dp_protocol_major;
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 101 minor = dp->ricp_v4.dp_protocol_minor;
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 102 credit = dp->ricp_v4.dp_credit;
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 103 ack_seq = get_unaligned(&dp->ricp_v4.dp_ack_seq);
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 104 }
ec16227e14141e Andy Grover 2009-02-24 105
02a6a2592e41d2 Andy Grover 2009-07-17 106 /* make sure it isn't empty data */
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 107 if (major) {
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 108 rds_ib_set_protocol(conn, RDS_PROTOCOL(major, minor));
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 109 rds_ib_set_flow_control(conn, be32_to_cpu(credit));
02a6a2592e41d2 Andy Grover 2009-07-17 110 }
ec16227e14141e Andy Grover 2009-02-24 111
cdc306a5c9cd36 Santosh Shilimkar 2018-10-13 112 if (conn->c_version < RDS_PROTOCOL_VERSION) {
cdc306a5c9cd36 Santosh Shilimkar 2018-10-13 113 if (conn->c_version != RDS_PROTOCOL_COMPAT_VERSION) {
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 114 pr_notice("RDS/IB: Connection <%pI6c,%pI6c> version %u.%u no longer supported\n",
ff3f19a2f608ee Santosh Shilimkar 2016-03-14 115 &conn->c_laddr, &conn->c_faddr,
f147dd9ecabf23 Andy Grover 2010-01-13 116 RDS_PROTOCOL_MAJOR(conn->c_version),
f147dd9ecabf23 Andy Grover 2010-01-13 117 RDS_PROTOCOL_MINOR(conn->c_version));
f147dd9ecabf23 Andy Grover 2010-01-13 118 rds_conn_destroy(conn);
f147dd9ecabf23 Andy Grover 2010-01-13 119 return;
cdc306a5c9cd36 Santosh Shilimkar 2018-10-13 120 }
cdc306a5c9cd36 Santosh Shilimkar 2018-10-13 121 }
cdc306a5c9cd36 Santosh Shilimkar 2018-10-13 122
fd261ce6a30e01 Santosh Shilimkar 2018-10-13 123 pr_notice("RDS/IB: %s conn connected <%pI6c,%pI6c,%d> version %u.%u%s\n",
581d53c91cbf7b Santosh Shilimkar 2016-07-09 124 ic->i_active_side ? "Active" : "Passive",
fd261ce6a30e01 Santosh Shilimkar 2018-10-13 125 &conn->c_laddr, &conn->c_faddr, conn->c_tos,
ec16227e14141e Andy Grover 2009-02-24 126 RDS_PROTOCOL_MAJOR(conn->c_version),
ec16227e14141e Andy Grover 2009-02-24 127 RDS_PROTOCOL_MINOR(conn->c_version),
ec16227e14141e Andy Grover 2009-02-24 128 ic->i_flowctl ? ", flow control" : "");
ec16227e14141e Andy Grover 2009-02-24 129
e0e6d062822529 Zhu Yanjun 2019-08-23 130 /* receive sl from the peer */
e0e6d062822529 Zhu Yanjun 2019-08-23 131 ic->i_sl = ic->i_cm_id->route.path_rec->sl;
e0e6d062822529 Zhu Yanjun 2019-08-23 132
cf657269d311d5 Santosh Shilimkar 2016-09-29 133 atomic_set(&ic->i_cq_quiesce, 0);
cf657269d311d5 Santosh Shilimkar 2016-09-29 134
581d53c91cbf7b Santosh Shilimkar 2016-07-09 135 /* Init rings and fill recv. this needs to wait until protocol
581d53c91cbf7b Santosh Shilimkar 2016-07-09 136 * negotiation is complete, since ring layout is different
581d53c91cbf7b Santosh Shilimkar 2016-07-09 137 * from 3.1 to 4.1.
e11d912a7dd4df Andy Grover 2009-07-17 138 */
e11d912a7dd4df Andy Grover 2009-07-17 139 rds_ib_send_init_ring(ic);
e11d912a7dd4df Andy Grover 2009-07-17 140 rds_ib_recv_init_ring(ic);
e11d912a7dd4df Andy Grover 2009-07-17 141 /* Post receive buffers - as a side effect, this will update
e11d912a7dd4df Andy Grover 2009-07-17 142 * the posted credit count. */
73ce4317bf9832 santosh.shilimkar@oracle.com 2015-08-22 143 rds_ib_recv_refill(conn, 1, GFP_KERNEL);
e11d912a7dd4df Andy Grover 2009-07-17 144
3e0249f9c05cb7 Zach Brown 2010-05-18 145 /* update ib_device with this local ipaddr */
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 146 err = rds_ib_update_ipaddr(ic->rds_ibdev, &conn->c_laddr);
ec16227e14141e Andy Grover 2009-02-24 147 if (err)
3e0249f9c05cb7 Zach Brown 2010-05-18 148 printk(KERN_ERR "rds_ib_update_ipaddr failed (%d)\n",
3e0249f9c05cb7 Zach Brown 2010-05-18 149 err);
ec16227e14141e Andy Grover 2009-02-24 150
ec16227e14141e Andy Grover 2009-02-24 151 /* If the peer gave us the last packet it saw, process this as if
ec16227e14141e Andy Grover 2009-02-24 152 * we had received a regular ACK. */
c0adf54a10903b shamir rabinovitch 2015-04-30 153 if (dp) {
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 154 if (ack_seq)
eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 155 rds_send_drop_acked(conn, be64_to_cpu(ack_seq),
c0adf54a10903b shamir rabinovitch 2015-04-30 156 NULL);
c0adf54a10903b shamir rabinovitch 2015-04-30 157 }
ec16227e14141e Andy Grover 2009-02-24 158
cdc306a5c9cd36 Santosh Shilimkar 2018-10-13 159 conn->c_proposed_version = conn->c_version;
ec16227e14141e Andy Grover 2009-02-24 160 rds_connect_complete(conn);
ec16227e14141e Andy Grover 2009-02-24 161 }
ec16227e14141e Andy Grover 2009-02-24 162
:::::: The code at line 96 was first introduced by commit
:::::: eee2fa6ab3225192d6d894c54a6fb02ac9efdff6 rds: Changing IP address internal representation to struct in6_addr
:::::: TO: Ka-Cheong Poon <ka-cheong.poon@oracle.com>
:::::: CC: David S. Miller <davem@davemloft.net>
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 19+ messages in thread* Re: [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) 2026-01-14 16:36 [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) kernel test robot @ 2026-01-14 17:51 ` Ian Rogers 2026-01-14 20:04 ` Thomas Gleixner 2026-01-15 19:28 ` Thomas Gleixner 1 sibling, 1 reply; 19+ messages in thread From: Ian Rogers @ 2026-01-14 17:51 UTC (permalink / raw) To: kernel test robot; +Cc: oe-kbuild-all, linux-kernel, x86, Thomas Gleixner On Wed, Jan 14, 2026 at 8:37 AM kernel test robot <lkp@intel.com> wrote: > > tree: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/vdso > head: 759a1f97373f25770cf438d9fb5f2bddf4d77a54 > commit: e04a494143bab7ea804fe1ebe286701ee8288e4a [12/14] vdso: Switch get/put_unaligned() from packed struct to memcpy() > config: x86_64-randconfig-122-20260114 (https://download.01.org/0day-ci/archive/20260115/202601150001.sKSN644a-lkp@intel.com/config) > compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261) > rustc: rustc 1.88.0 (6b00bc388 2025-06-23) > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260115/202601150001.sKSN644a-lkp@intel.com/reproduce) > > 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@intel.com> > | Closes: https://lore.kernel.org/oe-kbuild-all/202601150001.sKSN644a-lkp@intel.com/ > > sparse warnings: (new ones prefixed by >>) > >> net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void * @@ got restricted __be64 const * @@ > net/rds/ib_cm.c:96:35: sparse: expected void * > net/rds/ib_cm.c:96:35: sparse: got restricted __be64 const * > net/rds/ib_cm.c:103:27: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void * @@ got restricted __be64 const * @@ > net/rds/ib_cm.c:103:27: sparse: expected void * > net/rds/ib_cm.c:103:27: sparse: got restricted __be64 const * > > vim +96 net/rds/ib_cm.c > > ec16227e14141e Andy Grover 2009-02-24 69 > ec16227e14141e Andy Grover 2009-02-24 70 /* > ec16227e14141e Andy Grover 2009-02-24 71 * Connection established. > ec16227e14141e Andy Grover 2009-02-24 72 * We get here for both outgoing and incoming connection. > ec16227e14141e Andy Grover 2009-02-24 73 */ > ec16227e14141e Andy Grover 2009-02-24 74 void rds_ib_cm_connect_complete(struct rds_connection *conn, struct rdma_cm_event *event) > ec16227e14141e Andy Grover 2009-02-24 75 { > ec16227e14141e Andy Grover 2009-02-24 76 struct rds_ib_connection *ic = conn->c_transport_data; > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 77 const union rds_ib_conn_priv *dp = NULL; Here dp is a pointer to a constant value. > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 78 __be64 ack_seq = 0; > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 79 __be32 credit = 0; > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 80 u8 major = 0; > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 81 u8 minor = 0; > ec16227e14141e Andy Grover 2009-02-24 82 int err; > ec16227e14141e Andy Grover 2009-02-24 83 > ec16227e14141e Andy Grover 2009-02-24 84 dp = event->param.conn.private_data; > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 85 if (conn->c_isv6) { > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 86 if (event->param.conn.private_data_len >= > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 87 sizeof(struct rds6_ib_connect_private)) { > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 88 major = dp->ricp_v6.dp_protocol_major; > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 89 minor = dp->ricp_v6.dp_protocol_minor; > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 90 credit = dp->ricp_v6.dp_credit; > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 91 /* dp structure start is not guaranteed to be 8 bytes > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 92 * aligned. Since dp_ack_seq is 64-bit extended load > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 93 * operations can be used so go through get_unaligned > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 94 * to avoid unaligned errors. > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 95 */ > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 @96 ack_seq = get_unaligned(&dp->ricp_v6.dp_ack_seq); This is a warned about get_unaligned reported here. In my patch: +/** + * __get_unaligned_t - read an unaligned value from memory. + * @type: the type to load from the pointer. + * @ptr: the pointer to load from. + * + * Use memcpy to affect an unaligned type sized load avoiding undefined behavior + * from approaches like type punning that require -fno-strict-aliasing in order + * to be correct. As type may be const, use __unqual_scalar_typeof to map to a + * non-const type - you can't memcpy into a const type. The + * __get_unaligned_ctrl_type gives __unqual_scalar_typeof its required + * expression rather than type, a pointer is used to avoid warnings about mixing + * the use of 0 and NULL. The void* cast silences ubsan warnings. + */ +#define __get_unaligned_t(type, ptr) ({ \ + type *__get_unaligned_ctrl_type __always_unused = NULL; \ + __unqual_scalar_typeof(*__get_unaligned_ctrl_type) __get_unaligned_val; \ + __builtin_memcpy(&__get_unaligned_val, (void *)(ptr), \ + sizeof(__get_unaligned_val)); \ + __get_unaligned_val; \ }) in "__builtin_memcpy(&__get_unaligned_val, (void *)(ptr)" there is a void* cast and I believe this is what sparse is now warning about - I don't believe the warning was present at the time of the original series. I believe, although it is a distant memory, I tried making the cast a "(const void*)" cast rather than a "void*" cast but this caused different warnings/issues. My patch is going through a compiler warning, sparse, etc. wac-a-mole and the comment notes the cast is present to avoid warnings with ubsan (undefined behavior sanitizer). I think there are 2 options: 1) ignore the new sparse warning as tech debt for later clean up, 2) modify the cast to be "const void*" instead of "void *" and play more wac-a-mole. My preference would be 1 as I have a suspicion I played 2 and thought the non-const cast was best (hence it being in the patch) given other issues. Thanks, Ian > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 97 } > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 98 } else if (event->param.conn.private_data_len >= > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 99 sizeof(struct rds_ib_connect_private)) { > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 100 major = dp->ricp_v4.dp_protocol_major; > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 101 minor = dp->ricp_v4.dp_protocol_minor; > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 102 credit = dp->ricp_v4.dp_credit; > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 103 ack_seq = get_unaligned(&dp->ricp_v4.dp_ack_seq); > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 104 } > ec16227e14141e Andy Grover 2009-02-24 105 > 02a6a2592e41d2 Andy Grover 2009-07-17 106 /* make sure it isn't empty data */ > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 107 if (major) { > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 108 rds_ib_set_protocol(conn, RDS_PROTOCOL(major, minor)); > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 109 rds_ib_set_flow_control(conn, be32_to_cpu(credit)); > 02a6a2592e41d2 Andy Grover 2009-07-17 110 } > ec16227e14141e Andy Grover 2009-02-24 111 > cdc306a5c9cd36 Santosh Shilimkar 2018-10-13 112 if (conn->c_version < RDS_PROTOCOL_VERSION) { > cdc306a5c9cd36 Santosh Shilimkar 2018-10-13 113 if (conn->c_version != RDS_PROTOCOL_COMPAT_VERSION) { > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 114 pr_notice("RDS/IB: Connection <%pI6c,%pI6c> version %u.%u no longer supported\n", > ff3f19a2f608ee Santosh Shilimkar 2016-03-14 115 &conn->c_laddr, &conn->c_faddr, > f147dd9ecabf23 Andy Grover 2010-01-13 116 RDS_PROTOCOL_MAJOR(conn->c_version), > f147dd9ecabf23 Andy Grover 2010-01-13 117 RDS_PROTOCOL_MINOR(conn->c_version)); > f147dd9ecabf23 Andy Grover 2010-01-13 118 rds_conn_destroy(conn); > f147dd9ecabf23 Andy Grover 2010-01-13 119 return; > cdc306a5c9cd36 Santosh Shilimkar 2018-10-13 120 } > cdc306a5c9cd36 Santosh Shilimkar 2018-10-13 121 } > cdc306a5c9cd36 Santosh Shilimkar 2018-10-13 122 > fd261ce6a30e01 Santosh Shilimkar 2018-10-13 123 pr_notice("RDS/IB: %s conn connected <%pI6c,%pI6c,%d> version %u.%u%s\n", > 581d53c91cbf7b Santosh Shilimkar 2016-07-09 124 ic->i_active_side ? "Active" : "Passive", > fd261ce6a30e01 Santosh Shilimkar 2018-10-13 125 &conn->c_laddr, &conn->c_faddr, conn->c_tos, > ec16227e14141e Andy Grover 2009-02-24 126 RDS_PROTOCOL_MAJOR(conn->c_version), > ec16227e14141e Andy Grover 2009-02-24 127 RDS_PROTOCOL_MINOR(conn->c_version), > ec16227e14141e Andy Grover 2009-02-24 128 ic->i_flowctl ? ", flow control" : ""); > ec16227e14141e Andy Grover 2009-02-24 129 > e0e6d062822529 Zhu Yanjun 2019-08-23 130 /* receive sl from the peer */ > e0e6d062822529 Zhu Yanjun 2019-08-23 131 ic->i_sl = ic->i_cm_id->route.path_rec->sl; > e0e6d062822529 Zhu Yanjun 2019-08-23 132 > cf657269d311d5 Santosh Shilimkar 2016-09-29 133 atomic_set(&ic->i_cq_quiesce, 0); > cf657269d311d5 Santosh Shilimkar 2016-09-29 134 > 581d53c91cbf7b Santosh Shilimkar 2016-07-09 135 /* Init rings and fill recv. this needs to wait until protocol > 581d53c91cbf7b Santosh Shilimkar 2016-07-09 136 * negotiation is complete, since ring layout is different > 581d53c91cbf7b Santosh Shilimkar 2016-07-09 137 * from 3.1 to 4.1. > e11d912a7dd4df Andy Grover 2009-07-17 138 */ > e11d912a7dd4df Andy Grover 2009-07-17 139 rds_ib_send_init_ring(ic); > e11d912a7dd4df Andy Grover 2009-07-17 140 rds_ib_recv_init_ring(ic); > e11d912a7dd4df Andy Grover 2009-07-17 141 /* Post receive buffers - as a side effect, this will update > e11d912a7dd4df Andy Grover 2009-07-17 142 * the posted credit count. */ > 73ce4317bf9832 santosh.shilimkar@oracle.com 2015-08-22 143 rds_ib_recv_refill(conn, 1, GFP_KERNEL); > e11d912a7dd4df Andy Grover 2009-07-17 144 > 3e0249f9c05cb7 Zach Brown 2010-05-18 145 /* update ib_device with this local ipaddr */ > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 146 err = rds_ib_update_ipaddr(ic->rds_ibdev, &conn->c_laddr); > ec16227e14141e Andy Grover 2009-02-24 147 if (err) > 3e0249f9c05cb7 Zach Brown 2010-05-18 148 printk(KERN_ERR "rds_ib_update_ipaddr failed (%d)\n", > 3e0249f9c05cb7 Zach Brown 2010-05-18 149 err); > ec16227e14141e Andy Grover 2009-02-24 150 > ec16227e14141e Andy Grover 2009-02-24 151 /* If the peer gave us the last packet it saw, process this as if > ec16227e14141e Andy Grover 2009-02-24 152 * we had received a regular ACK. */ > c0adf54a10903b shamir rabinovitch 2015-04-30 153 if (dp) { > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 154 if (ack_seq) > eee2fa6ab32251 Ka-Cheong Poon 2018-07-23 155 rds_send_drop_acked(conn, be64_to_cpu(ack_seq), > c0adf54a10903b shamir rabinovitch 2015-04-30 156 NULL); > c0adf54a10903b shamir rabinovitch 2015-04-30 157 } > ec16227e14141e Andy Grover 2009-02-24 158 > cdc306a5c9cd36 Santosh Shilimkar 2018-10-13 159 conn->c_proposed_version = conn->c_version; > ec16227e14141e Andy Grover 2009-02-24 160 rds_connect_complete(conn); > ec16227e14141e Andy Grover 2009-02-24 161 } > ec16227e14141e Andy Grover 2009-02-24 162 > > :::::: The code at line 96 was first introduced by commit > :::::: eee2fa6ab3225192d6d894c54a6fb02ac9efdff6 rds: Changing IP address internal representation to struct in6_addr > > :::::: TO: Ka-Cheong Poon <ka-cheong.poon@oracle.com> > :::::: CC: David S. Miller <davem@davemloft.net> > > -- > 0-DAY CI Kernel Test Service > https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) 2026-01-14 17:51 ` Ian Rogers @ 2026-01-14 20:04 ` Thomas Gleixner 2026-01-14 21:03 ` Ian Rogers 0 siblings, 1 reply; 19+ messages in thread From: Thomas Gleixner @ 2026-01-14 20:04 UTC (permalink / raw) To: Ian Rogers, kernel test robot; +Cc: oe-kbuild-all, linux-kernel, x86 On Wed, Jan 14 2026 at 09:51, Ian Rogers wrote: > On Wed, Jan 14, 2026 at 8:37 AM kernel test robot <lkp@intel.com> wrote: > I think there are 2 options: > 1) ignore the new sparse warning as tech debt for later clean up, > 2) modify the cast to be "const void*" instead of "void *" and play > more wac-a-mole. Option #3: You might have tried the 'const void*' cast and figured out that sparse is still unhappy. I actually did, but I didn't try to figure out why as that's really not my duty. > My preference would be 1 as I have a suspicion I played 2 and thought > the non-const cast was best (hence it being in the patch) given other > issues. Preferences based on suspicions are not really usefull. Please go and figure out what's going on and either fix it in the kernel code or tell the sparse folks what they are missing. Leaving it unresolved and handwaved away is not an option. Thanks, tglx ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) 2026-01-14 20:04 ` Thomas Gleixner @ 2026-01-14 21:03 ` Ian Rogers 2026-01-14 21:27 ` Thomas Gleixner 0 siblings, 1 reply; 19+ messages in thread From: Ian Rogers @ 2026-01-14 21:03 UTC (permalink / raw) To: Thomas Gleixner; +Cc: kernel test robot, oe-kbuild-all, linux-kernel, x86 On Wed, Jan 14, 2026 at 12:04 PM Thomas Gleixner <tglx@kernel.org> wrote: > > On Wed, Jan 14 2026 at 09:51, Ian Rogers wrote: > > On Wed, Jan 14, 2026 at 8:37 AM kernel test robot <lkp@intel.com> wrote: > > I think there are 2 options: > > 1) ignore the new sparse warning as tech debt for later clean up, > > 2) modify the cast to be "const void*" instead of "void *" and play > > more wac-a-mole. > > Option #3: > > You might have tried the 'const void*' cast and figured out that sparse > is still unhappy. I actually did, but I didn't try to figure out why as > that's really not my duty. > > > My preference would be 1 as I have a suspicion I played 2 and thought > > the non-const cast was best (hence it being in the patch) given other > > issues. > > Preferences based on suspicions are not really usefull. Please go and > figure out what's going on and either fix it in the kernel code or tell > the sparse folks what they are missing. > > Leaving it unresolved and handwaved away is not an option. I'd like to call this option, play a bunch of wac-a-mole but then still don't really progress. I had tried out I believe all the options 6 months ago where the builds were clean. There's always 1 more tool that's going to raise its head and complain about types, my motivation remains clang and gcc for user space copies of this code so we don't need to propagate -fno-strict-aliasing into places like perf. Tbh, I'm not going to be able to look at this for a while so I'd suggest just dropping the patches. Thanks, Ian > Thanks, > > tglx ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) 2026-01-14 21:03 ` Ian Rogers @ 2026-01-14 21:27 ` Thomas Gleixner 2026-01-14 21:42 ` Ian Rogers 0 siblings, 1 reply; 19+ messages in thread From: Thomas Gleixner @ 2026-01-14 21:27 UTC (permalink / raw) To: Ian Rogers; +Cc: kernel test robot, oe-kbuild-all, linux-kernel, x86 On Wed, Jan 14 2026 at 13:03, Ian Rogers wrote: > On Wed, Jan 14, 2026 at 12:04 PM Thomas Gleixner <tglx@kernel.org> wrote: >> > My preference would be 1 as I have a suspicion I played 2 and thought >> > the non-const cast was best (hence it being in the patch) given other >> > issues. >> >> Preferences based on suspicions are not really usefull. Please go and >> figure out what's going on and either fix it in the kernel code or tell >> the sparse folks what they are missing. >> >> Leaving it unresolved and handwaved away is not an option. > > I'd like to call this option, play a bunch of wac-a-mole but then I'm not familiar enough with internet slang, but to my limited knowledge it's spelled 'Whack-a-mole'. That aside: "Whack-a-mole" without a real conclusive explanation is really a lame excuse, actually it's beyond lame. > still don't really progress. I had tried out I believe all the options > 6 months ago where the builds were clean. There's always 1 more tool > that's going to raise its head and complain about types, my motivation > remains clang and gcc for user space copies of this code so we don't > need to propagate -fno-strict-aliasing into places like perf. So because your motivation ends there and other tools which raise their ugly heads are not relevant to you ... > Tbh, I'm not going to be able to look at this for a while so I'd > suggest just dropping the patches. ... everything stays with the status quo, i.e. unresolved. That makes a lot of sense - NOT! Thanks for wasting my time to deal with your patches and welcome to my extremly short ignore list! Your's grumpy Thomas ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) 2026-01-14 21:27 ` Thomas Gleixner @ 2026-01-14 21:42 ` Ian Rogers 0 siblings, 0 replies; 19+ messages in thread From: Ian Rogers @ 2026-01-14 21:42 UTC (permalink / raw) To: Thomas Gleixner; +Cc: kernel test robot, oe-kbuild-all, linux-kernel, x86 On Wed, Jan 14, 2026 at 1:27 PM Thomas Gleixner <tglx@kernel.org> wrote: > > On Wed, Jan 14 2026 at 13:03, Ian Rogers wrote: > > On Wed, Jan 14, 2026 at 12:04 PM Thomas Gleixner <tglx@kernel.org> wrote: > >> > My preference would be 1 as I have a suspicion I played 2 and thought > >> > the non-const cast was best (hence it being in the patch) given other > >> > issues. > >> > >> Preferences based on suspicions are not really usefull. Please go and > >> figure out what's going on and either fix it in the kernel code or tell > >> the sparse folks what they are missing. > >> > >> Leaving it unresolved and handwaved away is not an option. > > > > I'd like to call this option, play a bunch of wac-a-mole but then > > I'm not familiar enough with internet slang, but to my limited knowledge > it's spelled 'Whack-a-mole'. That aside: > > "Whack-a-mole" without a real conclusive explanation is really a > lame excuse, actually it's beyond lame. > > > still don't really progress. I had tried out I believe all the options > > 6 months ago where the builds were clean. There's always 1 more tool > > that's going to raise its head and complain about types, my motivation > > remains clang and gcc for user space copies of this code so we don't > > need to propagate -fno-strict-aliasing into places like perf. > > So because your motivation ends there and other tools which raise their > ugly heads are not relevant to you ... > > > Tbh, I'm not going to be able to look at this for a while so I'd > > suggest just dropping the patches. > > ... everything stays with the status quo, i.e. unresolved. > > That makes a lot of sense - NOT! > > Thanks for wasting my time to deal with your patches and welcome to my > extremly short ignore list! The patches have been through 5 versions with considerable hurdles jumped, testing my ending, both kernel building and user space tool building and running with sanitizers, etc. My work commitments mean I can't just leap up and say I'm going to explore the ramifications of moving the (void*) to (const void*) in all these combinations again, but as a a const lover (even having published papers on it [1]) I doubt the choice of using "void*" rather than "const void*" is likely no accident. Even if I come up with a new series, waiting months for any kind of review, merging, feedback, .. I'm just left in limbo and I lose the context that I've built up and we end up here. In perf changes we often end up with good patches vs perfect patches and I don't believe with these patches we'll ever get perfect, hence saying we should move forward even with the sparse regression that may only be fixable with #ifdef DOING_A_SPARSE_BUILD... Given the bar seems to be perfect, I'm recommending just dropping the patches. Sorry to be on your ignore list, Ian [1] https://research.manchester.ac.uk/en/publications/constraint-based-optimization-of-stationary-fields/ > Your's grumpy > > Thomas > > > ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) 2026-01-14 16:36 [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) kernel test robot 2026-01-14 17:51 ` Ian Rogers @ 2026-01-15 19:28 ` Thomas Gleixner 2026-01-15 21:11 ` Peter Zijlstra 1 sibling, 1 reply; 19+ messages in thread From: Thomas Gleixner @ 2026-01-15 19:28 UTC (permalink / raw) To: kernel test robot, Ian Rogers Cc: oe-kbuild-all, linux-kernel, x86, sparse, linux-sparse, Peter Zijlstra, Marco Elver On Thu, Jan 15 2026 at 00:36, kernel test robot wrote: Cc+ sparse folks. > sparse warnings: (new ones prefixed by >>) >>> net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void * @@ got restricted __be64 const * @@ > net/rds/ib_cm.c:96:35: sparse: expected void * > net/rds/ib_cm.c:96:35: sparse: got restricted __be64 const * > net/rds/ib_cm.c:103:27: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void * @@ got restricted __be64 const * @@ > net/rds/ib_cm.c:103:27: sparse: expected void * > net/rds/ib_cm.c:103:27: sparse: got restricted __be64 const * After staring a while at it, it turns out that get_unaligned_t(), which uses __unqual_scalar_typeof() to get an unqualified type makes sparse unhappy when the data type is __be64 (or any other __beNN variant). __beNN is annotated with __attribute__((bitwise)) when sparse is invoked (#ifdef CHECKER). That allows sparse to detect incompatible math operations with __beNN variables. That annotation also causes the type comparison in the sparse _Generic() evaluation to fail so that it ends up with the default, i.e. the original qualified type of a 'const __beNN' pointer. That then ends up as the first pointer argument to builtin_memcpy(), which obviously causes the above sparse warnings. The easiest solution would be to force cast the pointer to void * when CHECKER is defined, but that reduces coverage. I've come up with the below, but it's clearly a hack... __CAST_SPARSE() is required as sparse otherwise complains about storing __u64 in __be64. Thanks, tglx --- include/linux/compiler_types.h | 10 ++++++++++ include/vdso/unaligned.h | 16 +++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) --- a/include/linux/compiler_types.h +++ b/include/linux/compiler_types.h @@ -577,6 +577,15 @@ struct ftrace_likely_data { unsigned type: (unsigned type)0, \ signed type: (signed type)0 +#ifdef __CHECKER__ +#define __be_types_expr_cases() \ + __be16: (__u16)0, \ + __be32: (__u32)0, \ + __be64: (__u64)0, +#else +#define __be_types_expr_cases() +#endif + #define __unqual_scalar_typeof(x) typeof( \ _Generic((x), \ char: (char)0, \ @@ -585,6 +594,7 @@ struct ftrace_likely_data { __scalar_type_to_expr_cases(int), \ __scalar_type_to_expr_cases(long), \ __scalar_type_to_expr_cases(long long), \ + __be_types_expr_cases() \ default: (x))) /* Is this type a native word size -- useful for atomic operations */ --- a/include/vdso/unaligned.h +++ b/include/vdso/unaligned.h @@ -4,6 +4,12 @@ #include <linux/compiler_types.h> +#ifdef __CHECKER__ +#define __CAST_SPARSE(type) (type __force) +#else +#define __CAST_SPARSE(type) +#endif + /** * __get_unaligned_t - read an unaligned value from memory. * @type: the type to load from the pointer. @@ -17,12 +23,12 @@ * expression rather than type, a pointer is used to avoid warnings about mixing * the use of 0 and NULL. The void* cast silences ubsan warnings. */ -#define __get_unaligned_t(type, ptr) ({ \ - type *__get_unaligned_ctrl_type __always_unused = NULL; \ +#define __get_unaligned_t(type, ptr) ({ \ + type *__get_unaligned_ctrl_type __always_unused = NULL; \ __unqual_scalar_typeof(*__get_unaligned_ctrl_type) __get_unaligned_val; \ - __builtin_memcpy(&__get_unaligned_val, (void *)(ptr), \ - sizeof(__get_unaligned_val)); \ - __get_unaligned_val; \ + __builtin_memcpy(&__get_unaligned_val, (void *)(ptr), \ + sizeof(__get_unaligned_val)); \ + __CAST_SPARSE(type) __get_unaligned_val; \ }) /** ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) 2026-01-15 19:28 ` Thomas Gleixner @ 2026-01-15 21:11 ` Peter Zijlstra 2026-01-15 21:19 ` Linus Torvalds 2026-01-15 23:01 ` Thomas Gleixner 0 siblings, 2 replies; 19+ messages in thread From: Peter Zijlstra @ 2026-01-15 21:11 UTC (permalink / raw) To: Thomas Gleixner Cc: kernel test robot, Ian Rogers, oe-kbuild-all, linux-kernel, x86, sparse, linux-sparse, Marco Elver On Thu, Jan 15, 2026 at 08:28:51PM +0100, Thomas Gleixner wrote: > On Thu, Jan 15 2026 at 00:36, kernel test robot wrote: > > Cc+ sparse folks. > > > sparse warnings: (new ones prefixed by >>) > >>> net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void * @@ got restricted __be64 const * @@ > > net/rds/ib_cm.c:96:35: sparse: expected void * > > net/rds/ib_cm.c:96:35: sparse: got restricted __be64 const * > > net/rds/ib_cm.c:103:27: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void * @@ got restricted __be64 const * @@ > > net/rds/ib_cm.c:103:27: sparse: expected void * > > net/rds/ib_cm.c:103:27: sparse: got restricted __be64 const * > > After staring a while at it, it turns out that get_unaligned_t(), which > uses __unqual_scalar_typeof() to get an unqualified type makes sparse > unhappy when the data type is __be64 (or any other __beNN variant). > > __beNN is annotated with __attribute__((bitwise)) when sparse is invoked > (#ifdef CHECKER). That allows sparse to detect incompatible math > operations with __beNN variables. > Per: https://git.kernel.org/pub/scm/devel/sparse/sparse-dev.git/commit/?id=dc9efe442b8949234a6599fdc94dc7221dd040e1 it seems Sparse now knows about __typeof_unqual__; and it looks like the implementation does what you want here (although I've not tested it). Something like so perhaps, which then mandates the very latest Sparse. --- diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 04487c9bd751..7e0583ceb49f 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -232,11 +232,8 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, /* * Use __typeof_unqual__() when available. - * - * XXX: Remove test for __CHECKER__ once - * sparse learns about __typeof_unqual__(). */ -#if CC_HAS_TYPEOF_UNQUAL && !defined(__CHECKER__) +#if CC_HAS_TYPEOF_UNQUAL || defined(__CHECKER__) # define USE_TYPEOF_UNQUAL 1 #endif diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h index d3318a3c2577..a37d832d99a8 100644 --- a/include/linux/compiler_types.h +++ b/include/linux/compiler_types.h @@ -569,6 +569,7 @@ struct ftrace_likely_data { * __unqual_scalar_typeof(x) - Declare an unqualified scalar type, leaving * non-scalar types unchanged. */ +#ifndef USE_TYPEOF_UNQUAL /* * Prefer C11 _Generic for better compile-times and simpler code. Note: 'char' * is not type-compatible with 'signed char', and we define a separate case. @@ -586,6 +587,9 @@ struct ftrace_likely_data { __scalar_type_to_expr_cases(long), \ __scalar_type_to_expr_cases(long long), \ default: (x))) +#else +#define __unqual_scalar_typeof(x) __typeof_unqual__(x) +#endif /* Is this type a native word size -- useful for atomic operations */ #define __native_word(t) \ ^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) 2026-01-15 21:11 ` Peter Zijlstra @ 2026-01-15 21:19 ` Linus Torvalds 2026-01-15 21:30 ` Peter Zijlstra 2026-01-15 23:01 ` Thomas Gleixner 1 sibling, 1 reply; 19+ messages in thread From: Linus Torvalds @ 2026-01-15 21:19 UTC (permalink / raw) To: Peter Zijlstra Cc: Thomas Gleixner, kernel test robot, Ian Rogers, oe-kbuild-all, linux-kernel, x86, sparse, linux-sparse, Marco Elver On Thu, 15 Jan 2026 at 13:13, Peter Zijlstra <peterz@infradead.org> wrote: > > Something like so perhaps, which then mandates the very latest Sparse. Ack. We want that compiler_tpes.h change for the real compilers that support __typeof_unqual__ anyway. Eventually we can just force that everywhere, but as Al pointed out in another thread, we're not quite there yet (ie we'd need clang-19.0.1 and gcc-8.4 to be able to just switch entirely over to __typeof_unqual__). For sparse users, I think we should have the policy that we just don't support older versions at all, since it just gets too painful. Linus ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) 2026-01-15 21:19 ` Linus Torvalds @ 2026-01-15 21:30 ` Peter Zijlstra 2026-01-15 23:03 ` Linus Torvalds 0 siblings, 1 reply; 19+ messages in thread From: Peter Zijlstra @ 2026-01-15 21:30 UTC (permalink / raw) To: Linus Torvalds Cc: Thomas Gleixner, kernel test robot, Ian Rogers, oe-kbuild-all, linux-kernel, x86, sparse, linux-sparse, Marco Elver On Thu, Jan 15, 2026 at 01:19:14PM -0800, Linus Torvalds wrote: > Eventually we can just force that everywhere, but as Al pointed out in > another thread, we're not quite there yet (ie we'd need clang-19.0.1 > and gcc-8.4 to be able to just switch entirely over to > __typeof_unqual__). GCC-14 :-/ The GCC-8.4 one was the function return value trick. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) 2026-01-15 21:30 ` Peter Zijlstra @ 2026-01-15 23:03 ` Linus Torvalds 2026-01-16 8:28 ` Peter Zijlstra 0 siblings, 1 reply; 19+ messages in thread From: Linus Torvalds @ 2026-01-15 23:03 UTC (permalink / raw) To: Peter Zijlstra Cc: Thomas Gleixner, kernel test robot, Ian Rogers, oe-kbuild-all, linux-kernel, x86, sparse, linux-sparse, Marco Elver On Thu, 15 Jan 2026 at 13:31, Peter Zijlstra <peterz@infradead.org> wrote: > > GCC-14 :-/ The GCC-8.4 one was the function return value trick. Right you are. And yeah, us moving on to gcc-14 as a minimum version is not imminent. Still, while we can't force it, lots of distros are on gcc-15, so while we'd have the _Generic() macro as a fallback for older versions, at least most developers would hopefully get the nice clean modern __typeof_unqual__ thing... Linus ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) 2026-01-15 23:03 ` Linus Torvalds @ 2026-01-16 8:28 ` Peter Zijlstra 0 siblings, 0 replies; 19+ messages in thread From: Peter Zijlstra @ 2026-01-16 8:28 UTC (permalink / raw) To: Linus Torvalds Cc: Thomas Gleixner, kernel test robot, Ian Rogers, oe-kbuild-all, linux-kernel, x86, sparse, linux-sparse, Marco Elver On Thu, Jan 15, 2026 at 03:03:52PM -0800, Linus Torvalds wrote: > On Thu, 15 Jan 2026 at 13:31, Peter Zijlstra <peterz@infradead.org> wrote: > > > > GCC-14 :-/ The GCC-8.4 one was the function return value trick. > > Right you are. And yeah, us moving on to gcc-14 as a minimum version > is not imminent. > > Still, while we can't force it, lots of distros are on gcc-15, so > while we'd have the _Generic() macro as a fallback for older versions, > at least most developers would hopefully get the nice clean modern > __typeof_unqual__ thing... Absolutely. I'll try and make it happen if tglx doesn't. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) 2026-01-15 21:11 ` Peter Zijlstra 2026-01-15 21:19 ` Linus Torvalds @ 2026-01-15 23:01 ` Thomas Gleixner 2026-01-16 11:25 ` Thomas Gleixner 1 sibling, 1 reply; 19+ messages in thread From: Thomas Gleixner @ 2026-01-15 23:01 UTC (permalink / raw) To: Peter Zijlstra Cc: kernel test robot, Ian Rogers, oe-kbuild-all, linux-kernel, x86, sparse, linux-sparse, Marco Elver On Thu, Jan 15 2026 at 22:11, Peter Zijlstra wrote: > On Thu, Jan 15, 2026 at 08:28:51PM +0100, Thomas Gleixner wrote: >> On Thu, Jan 15 2026 at 00:36, kernel test robot wrote: >> >> Cc+ sparse folks. >> >> > sparse warnings: (new ones prefixed by >>) >> >>> net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void * @@ got restricted __be64 const * @@ >> > net/rds/ib_cm.c:96:35: sparse: expected void * >> > net/rds/ib_cm.c:96:35: sparse: got restricted __be64 const * >> > net/rds/ib_cm.c:103:27: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void * @@ got restricted __be64 const * @@ >> > net/rds/ib_cm.c:103:27: sparse: expected void * >> > net/rds/ib_cm.c:103:27: sparse: got restricted __be64 const * >> >> After staring a while at it, it turns out that get_unaligned_t(), which >> uses __unqual_scalar_typeof() to get an unqualified type makes sparse >> unhappy when the data type is __be64 (or any other __beNN variant). >> >> __beNN is annotated with __attribute__((bitwise)) when sparse is invoked >> (#ifdef CHECKER). That allows sparse to detect incompatible math >> operations with __beNN variables. >> > > Per: > > https://git.kernel.org/pub/scm/devel/sparse/sparse-dev.git/commit/?id=dc9efe442b8949234a6599fdc94dc7221dd040e1 > > it seems Sparse now knows about __typeof_unqual__; and it looks like the > implementation does what you want here (although I've not tested it). > > Something like so perhaps, which then mandates the very latest Sparse. I tried that before and sparse is still upset: net/rds/ib_cm.c:96:35: warning: incorrect type in argument 1 (different modifiers) net/rds/ib_cm.c:96:35: expected void * net/rds/ib_cm.c:96:35: got restricted __be64 const * net/rds/ib_cm.c:103:27: warning: incorrect type in argument 1 (different modifiers) net/rds/ib_cm.c:103:27: expected void * net/rds/ib_cm.c:103:27: got restricted __be64 const * This time I looked deeper and it seems that USE_TYPEOF_UNQUAL is not set. If I force it to be set and use a proper compiler and top of tree sparse, everything seems to be happy. Figuring that out is something for tomorrow... Thanks, tglx ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) 2026-01-15 23:01 ` Thomas Gleixner @ 2026-01-16 11:25 ` Thomas Gleixner 2026-01-16 18:18 ` [PATCH] compiler: Use __typeof_unqual__() for __unqual_scalar_typeof() Thomas Gleixner 0 siblings, 1 reply; 19+ messages in thread From: Thomas Gleixner @ 2026-01-16 11:25 UTC (permalink / raw) To: Peter Zijlstra Cc: kernel test robot, Ian Rogers, oe-kbuild-all, linux-kernel, x86, sparse, linux-sparse, Marco Elver On Fri, Jan 16 2026 at 00:01, Thomas Gleixner wrote: > This time I looked deeper and it seems that USE_TYPEOF_UNQUAL is not > set. > > If I force it to be set and use a proper compiler and top of tree > sparse, everything seems to be happy. > > Figuring that out is something for tomorrow... USE_TYPEOF_UNQUAL is set _after_ the __unqual_scalar muck is processed... Updated fix below. Thanks, tglx --- include/linux/compiler.h | 10 ---------- include/linux/compiler_types.h | 11 +++++++++++ 2 files changed, 11 insertions(+), 10 deletions(-) --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -231,16 +231,6 @@ void ftrace_likely_update(struct ftrace_ "must be non-C-string (not NUL-terminated)") /* - * Use __typeof_unqual__() when available. - * - * XXX: Remove test for __CHECKER__ once - * sparse learns about __typeof_unqual__(). - */ -#if CC_HAS_TYPEOF_UNQUAL && !defined(__CHECKER__) -# define USE_TYPEOF_UNQUAL 1 -#endif - -/* * Define TYPEOF_UNQUAL() to use __typeof_unqual__() as typeof * operator when available, to return an unqualified type of the exp. */ --- a/include/linux/compiler_types.h +++ b/include/linux/compiler_types.h @@ -562,6 +562,13 @@ struct ftrace_likely_data { #define asm_inline asm #endif +/* + * Use __typeof_unqual__() when available. + */ +#if CC_HAS_TYPEOF_UNQUAL || defined(__CHECKER__) +# define USE_TYPEOF_UNQUAL 1 +#endif + /* Are two types/vars the same type (ignoring qualifiers)? */ #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) @@ -569,6 +576,7 @@ struct ftrace_likely_data { * __unqual_scalar_typeof(x) - Declare an unqualified scalar type, leaving * non-scalar types unchanged. */ +#ifndef USE_TYPEOF_UNQUAL /* * Prefer C11 _Generic for better compile-times and simpler code. Note: 'char' * is not type-compatible with 'signed char', and we define a separate case. @@ -586,6 +594,9 @@ struct ftrace_likely_data { __scalar_type_to_expr_cases(long), \ __scalar_type_to_expr_cases(long long), \ default: (x))) +#else +#define __unqual_scalar_typeof(x) __typeof_unqual__(x) +#endif /* Is this type a native word size -- useful for atomic operations */ #define __native_word(t) \ ^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH] compiler: Use __typeof_unqual__() for __unqual_scalar_typeof() 2026-01-16 11:25 ` Thomas Gleixner @ 2026-01-16 18:18 ` Thomas Gleixner 2026-01-17 5:25 ` Ian Rogers ` (3 more replies) 0 siblings, 4 replies; 19+ messages in thread From: Thomas Gleixner @ 2026-01-16 18:18 UTC (permalink / raw) To: Peter Zijlstra Cc: kernel test robot, Ian Rogers, oe-kbuild-all, linux-kernel, x86, sparse, linux-sparse, Marco Elver From: Peter Zijlstra <peterz@infradead.org> The recent changes to get_unaligned() resulted in a new sparse warning: net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void * @@ got restricted __be64 const * @@ net/rds/ib_cm.c:96:35: sparse: expected void * net/rds/ib_cm.c:96:35: sparse: got restricted __be64 const * The updated get_unaligned_t() uses __unqual_scalar_typeof() to get an unqualified type. This works correctly for the compilers, but fails for sparse when the data type is __be64 (or any other __beNN variant). On sparse runs (C=[12]) __beNN types are annotated with __attribute__((bitwise)). That annotation allows sparse to detect incompatible operations on __beNN variables, but it also prevents sparse from evaluating the _Generic() in __unqual_scalar_typeof() and map __beNN to a unqualified scalar type, so it ends up with the default, i.e. the original qualified type of a 'const __beNN' pointer. That then ends up as the first pointer argument to builtin_memcpy(), which obviously causes the above sparse warnings. The sparse git tree supports typeof_unqual() now, which allows to use it instead of the _Generic() based __unqual_scalar_typeof(). With that sparse correctly evaluates the unqualified type and keeps the __beNN logic intact. The downside is that this requires a top of tree sparse build and an old sparse version will emit a metric ton of incomprehensible error messages before it dies with a segfault. Therefore implement a sanity check which validates that the checker is available and capable of handling typeof_unqual(). Emit a warning if not so the user can take informed action. [ tglx: Move the evaluation of USE_TYPEOF_UNQUAL to compiler_types.h so it is set before use and implement the sanity checker ] Reported-by: kernel test robot <lkp@intel.com> Signed-off-by: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Thomas Gleixner <tglx@kernel.org> Closes: https://lore.kernel.org/oe-kbuild-all/202601150001.sKSN644a-lkp@intel.com/ --- Makefile | 8 ++++++++ include/linux/compiler.h | 10 ---------- include/linux/compiler_types.h | 11 +++++++++++ scripts/checker-valid.sh | 19 +++++++++++++++++++ 4 files changed, 38 insertions(+), 10 deletions(-) --- a/Makefile +++ b/Makefile @@ -1178,6 +1178,14 @@ ifdef CONFIG_CC_IS_CLANG KBUILD_USERLDFLAGS += --ld-path=$(LD) endif +# Validate the checker is available and functional +ifneq ($(KBUILD_CHECKSRC), 0) + ifneq ($(shell $(srctree)/scripts/checker-valid.sh $(CHECK)), 1) + $(warning C=$(KBUILD_CHECKSRC) specified, but $(CHECK) is not available or not up to date) + KBUILD_CHECKSRC = 0 + endif +endif + # make the checker run with the right architecture CHECKFLAGS += --arch=$(ARCH) --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -231,16 +231,6 @@ void ftrace_likely_update(struct ftrace_ "must be non-C-string (not NUL-terminated)") /* - * Use __typeof_unqual__() when available. - * - * XXX: Remove test for __CHECKER__ once - * sparse learns about __typeof_unqual__(). - */ -#if CC_HAS_TYPEOF_UNQUAL && !defined(__CHECKER__) -# define USE_TYPEOF_UNQUAL 1 -#endif - -/* * Define TYPEOF_UNQUAL() to use __typeof_unqual__() as typeof * operator when available, to return an unqualified type of the exp. */ --- a/include/linux/compiler_types.h +++ b/include/linux/compiler_types.h @@ -562,6 +562,13 @@ struct ftrace_likely_data { #define asm_inline asm #endif +/* + * Use __typeof_unqual__() when available. + */ +#if CC_HAS_TYPEOF_UNQUAL || defined(__CHECKER__) +# define USE_TYPEOF_UNQUAL 1 +#endif + /* Are two types/vars the same type (ignoring qualifiers)? */ #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) @@ -569,6 +576,7 @@ struct ftrace_likely_data { * __unqual_scalar_typeof(x) - Declare an unqualified scalar type, leaving * non-scalar types unchanged. */ +#ifndef USE_TYPEOF_UNQUAL /* * Prefer C11 _Generic for better compile-times and simpler code. Note: 'char' * is not type-compatible with 'signed char', and we define a separate case. @@ -586,6 +594,9 @@ struct ftrace_likely_data { __scalar_type_to_expr_cases(long), \ __scalar_type_to_expr_cases(long long), \ default: (x))) +#else +#define __unqual_scalar_typeof(x) __typeof_unqual__(x) +#endif /* Is this type a native word size -- useful for atomic operations */ #define __native_word(t) \ --- /dev/null +++ b/scripts/checker-valid.sh @@ -0,0 +1,19 @@ +#!/bin/sh -eu +# SPDX-License-Identifier: GPL-2.0 + +[ ! -x "$(command -v "$1")" ] && exit 1 + +tmp_file=$(mktemp) +trap "rm -f $tmp_file" EXIT + +cat << EOF >$tmp_file +static inline int u(const int *q) +{ + __typeof_unqual__(*q) v = *q; + return v; +} +EOF + +# sparse happily exits with 0 on error so validate +# there is none on stderr. Use awk as grep is a pain with sh -e +$1 $tmp_file 2>&1 | awk -v c=1 '/error/{c=0}END{print c}' ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH] compiler: Use __typeof_unqual__() for __unqual_scalar_typeof() 2026-01-16 18:18 ` [PATCH] compiler: Use __typeof_unqual__() for __unqual_scalar_typeof() Thomas Gleixner @ 2026-01-17 5:25 ` Ian Rogers 2026-01-17 21:25 ` [tip: timers/vdso] " tip-bot2 for Peter Zijlstra ` (2 subsequent siblings) 3 siblings, 0 replies; 19+ messages in thread From: Ian Rogers @ 2026-01-17 5:25 UTC (permalink / raw) To: Thomas Gleixner Cc: Peter Zijlstra, kernel test robot, oe-kbuild-all, linux-kernel, x86, sparse, linux-sparse, Marco Elver On Fri, Jan 16, 2026 at 10:18 AM Thomas Gleixner <tglx@kernel.org> wrote: > > From: Peter Zijlstra <peterz@infradead.org> > > The recent changes to get_unaligned() resulted in a new sparse warning: > > net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void * @@ got restricted __be64 const * @@ > net/rds/ib_cm.c:96:35: sparse: expected void * > net/rds/ib_cm.c:96:35: sparse: got restricted __be64 const * > > The updated get_unaligned_t() uses __unqual_scalar_typeof() to get an > unqualified type. This works correctly for the compilers, but fails for > sparse when the data type is __be64 (or any other __beNN variant). > > On sparse runs (C=[12]) __beNN types are annotated with > __attribute__((bitwise)). > > That annotation allows sparse to detect incompatible operations on __beNN > variables, but it also prevents sparse from evaluating the _Generic() in > __unqual_scalar_typeof() and map __beNN to a unqualified scalar type, so it > ends up with the default, i.e. the original qualified type of a 'const > __beNN' pointer. That then ends up as the first pointer argument to > builtin_memcpy(), which obviously causes the above sparse warnings. > > The sparse git tree supports typeof_unqual() now, which allows to use it > instead of the _Generic() based __unqual_scalar_typeof(). With that sparse > correctly evaluates the unqualified type and keeps the __beNN logic intact. Wow, that's painful. Congratulations on finding the root case. Acked-by: Ian Rogers <irogers@google.com> Thanks, Ian > The downside is that this requires a top of tree sparse build and an old > sparse version will emit a metric ton of incomprehensible error messages > before it dies with a segfault. > > Therefore implement a sanity check which validates that the checker is > available and capable of handling typeof_unqual(). Emit a warning if not so > the user can take informed action. > > [ tglx: Move the evaluation of USE_TYPEOF_UNQUAL to compiler_types.h so it is > set before use and implement the sanity checker ] > > Reported-by: kernel test robot <lkp@intel.com> > Signed-off-by: Peter Zijlstra <peterz@infradead.org> > Signed-off-by: Thomas Gleixner <tglx@kernel.org> > Closes: https://lore.kernel.org/oe-kbuild-all/202601150001.sKSN644a-lkp@intel.com/ > --- > Makefile | 8 ++++++++ > include/linux/compiler.h | 10 ---------- > include/linux/compiler_types.h | 11 +++++++++++ > scripts/checker-valid.sh | 19 +++++++++++++++++++ > 4 files changed, 38 insertions(+), 10 deletions(-) > > --- a/Makefile > +++ b/Makefile > @@ -1178,6 +1178,14 @@ ifdef CONFIG_CC_IS_CLANG > KBUILD_USERLDFLAGS += --ld-path=$(LD) > endif > > +# Validate the checker is available and functional > +ifneq ($(KBUILD_CHECKSRC), 0) > + ifneq ($(shell $(srctree)/scripts/checker-valid.sh $(CHECK)), 1) > + $(warning C=$(KBUILD_CHECKSRC) specified, but $(CHECK) is not available or not up to date) > + KBUILD_CHECKSRC = 0 > + endif > +endif > + > # make the checker run with the right architecture > CHECKFLAGS += --arch=$(ARCH) > > --- a/include/linux/compiler.h > +++ b/include/linux/compiler.h > @@ -231,16 +231,6 @@ void ftrace_likely_update(struct ftrace_ > "must be non-C-string (not NUL-terminated)") > > /* > - * Use __typeof_unqual__() when available. > - * > - * XXX: Remove test for __CHECKER__ once > - * sparse learns about __typeof_unqual__(). > - */ > -#if CC_HAS_TYPEOF_UNQUAL && !defined(__CHECKER__) > -# define USE_TYPEOF_UNQUAL 1 > -#endif > - > -/* > * Define TYPEOF_UNQUAL() to use __typeof_unqual__() as typeof > * operator when available, to return an unqualified type of the exp. > */ > --- a/include/linux/compiler_types.h > +++ b/include/linux/compiler_types.h > @@ -562,6 +562,13 @@ struct ftrace_likely_data { > #define asm_inline asm > #endif > > +/* > + * Use __typeof_unqual__() when available. > + */ > +#if CC_HAS_TYPEOF_UNQUAL || defined(__CHECKER__) > +# define USE_TYPEOF_UNQUAL 1 > +#endif > + > /* Are two types/vars the same type (ignoring qualifiers)? */ > #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) > > @@ -569,6 +576,7 @@ struct ftrace_likely_data { > * __unqual_scalar_typeof(x) - Declare an unqualified scalar type, leaving > * non-scalar types unchanged. > */ > +#ifndef USE_TYPEOF_UNQUAL > /* > * Prefer C11 _Generic for better compile-times and simpler code. Note: 'char' > * is not type-compatible with 'signed char', and we define a separate case. > @@ -586,6 +594,9 @@ struct ftrace_likely_data { > __scalar_type_to_expr_cases(long), \ > __scalar_type_to_expr_cases(long long), \ > default: (x))) > +#else > +#define __unqual_scalar_typeof(x) __typeof_unqual__(x) > +#endif > > /* Is this type a native word size -- useful for atomic operations */ > #define __native_word(t) \ > --- /dev/null > +++ b/scripts/checker-valid.sh > @@ -0,0 +1,19 @@ > +#!/bin/sh -eu > +# SPDX-License-Identifier: GPL-2.0 > + > +[ ! -x "$(command -v "$1")" ] && exit 1 > + > +tmp_file=$(mktemp) > +trap "rm -f $tmp_file" EXIT > + > +cat << EOF >$tmp_file > +static inline int u(const int *q) > +{ > + __typeof_unqual__(*q) v = *q; > + return v; > +} > +EOF > + > +# sparse happily exits with 0 on error so validate > +# there is none on stderr. Use awk as grep is a pain with sh -e > +$1 $tmp_file 2>&1 | awk -v c=1 '/error/{c=0}END{print c}' ^ permalink raw reply [flat|nested] 19+ messages in thread
* [tip: timers/vdso] compiler: Use __typeof_unqual__() for __unqual_scalar_typeof() 2026-01-16 18:18 ` [PATCH] compiler: Use __typeof_unqual__() for __unqual_scalar_typeof() Thomas Gleixner 2026-01-17 5:25 ` Ian Rogers @ 2026-01-17 21:25 ` tip-bot2 for Peter Zijlstra 2026-01-18 9:38 ` tip-bot2 for Peter Zijlstra 2026-02-25 8:15 ` [PATCH] " Dan Carpenter 3 siblings, 0 replies; 19+ messages in thread From: tip-bot2 for Peter Zijlstra @ 2026-01-17 21:25 UTC (permalink / raw) To: linux-tip-commits Cc: kernel test robot, Peter Zijlstra, Thomas Gleixner, Ian Rogers, x86, linux-kernel The following commit has been merged into the timers/vdso branch of tip: Commit-ID: adc00a0daf1bb08915bceee9ae73cca682e7d5bb Gitweb: https://git.kernel.org/tip/adc00a0daf1bb08915bceee9ae73cca682e7d5bb Author: Peter Zijlstra <peterz@infradead.org> AuthorDate: Fri, 16 Jan 2026 19:18:16 +01:00 Committer: Thomas Gleixner <tglx@kernel.org> CommitterDate: Sat, 17 Jan 2026 22:18:40 +01:00 compiler: Use __typeof_unqual__() for __unqual_scalar_typeof() The recent changes to get_unaligned() resulted in a new sparse warning: net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void * @@ got restricted __be64 const * @@ net/rds/ib_cm.c:96:35: sparse: expected void * net/rds/ib_cm.c:96:35: sparse: got restricted __be64 const * The updated get_unaligned_t() uses __unqual_scalar_typeof() to get an unqualified type. This works correctly for the compilers, but fails for sparse when the data type is __be64 (or any other __beNN variant). On sparse runs (C=[12]) __beNN types are annotated with __attribute__((bitwise)). That annotation allows sparse to detect incompatible operations on __beNN variables, but it also prevents sparse from evaluating the _Generic() in __unqual_scalar_typeof() and map __beNN to a unqualified scalar type, so it ends up with the default, i.e. the original qualified type of a 'const __beNN' pointer. That then ends up as the first pointer argument to builtin_memcpy(), which obviously causes the above sparse warnings. The sparse git tree supports typeof_unqual() now, which allows to use it instead of the _Generic() based __unqual_scalar_typeof(). With that sparse correctly evaluates the unqualified type and keeps the __beNN logic intact. The downside is that this requires a top of tree sparse build and an old sparse version will emit a metric ton of incomprehensible error messages before it dies with a segfault. Therefore implement a sanity check which validates that the checker is available and capable of handling typeof_unqual(). Emit a warning if not so the user can take informed action. [ tglx: Move the evaluation of USE_TYPEOF_UNQUAL to compiler_types.h so it is set before use and implement the sanity checker ] Reported-by: kernel test robot <lkp@intel.com> Signed-off-by: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Thomas Gleixner <tglx@kernel.org> Acked-by: Ian Rogers <irogers@google.com> Link: https://patch.msgid.link/87ecnp2zh3.ffs@tglx Closes: https://lore.kernel.org/oe-kbuild-all/202601150001.sKSN644a-lkp@intel.com/ --- Makefile | 8 ++++++++ include/linux/compiler.h | 10 ---------- include/linux/compiler_types.h | 11 +++++++++++ scripts/checker-valid.sh | 19 +++++++++++++++++++ 4 files changed, 38 insertions(+), 10 deletions(-) create mode 100755 scripts/checker-valid.sh diff --git a/Makefile b/Makefile index 9d38125..179c9d9 100644 --- a/Makefile +++ b/Makefile @@ -1187,6 +1187,14 @@ CHECKFLAGS += $(if $(CONFIG_CPU_BIG_ENDIAN),-mbig-endian,-mlittle-endian) # the checker needs the correct machine size CHECKFLAGS += $(if $(CONFIG_64BIT),-m64,-m32) +# Validate the checker is available and functional +ifneq ($(KBUILD_CHECKSRC), 0) + ifneq ($(shell $(srctree)/scripts/checker-valid.sh $(CHECK) $(CHECKFLAGS)), 1) + $(warning C=$(KBUILD_CHECKSRC) specified, but $(CHECK) is not available or not up to date) + KBUILD_CHECKSRC = 0 + endif +endif + # Default kernel image to build when no specific target is given. # KBUILD_IMAGE may be overruled on the command line or # set in the environment diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 04487c9..c601222 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -231,16 +231,6 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, "must be non-C-string (not NUL-terminated)") /* - * Use __typeof_unqual__() when available. - * - * XXX: Remove test for __CHECKER__ once - * sparse learns about __typeof_unqual__(). - */ -#if CC_HAS_TYPEOF_UNQUAL && !defined(__CHECKER__) -# define USE_TYPEOF_UNQUAL 1 -#endif - -/* * Define TYPEOF_UNQUAL() to use __typeof_unqual__() as typeof * operator when available, to return an unqualified type of the exp. */ diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h index d3318a3..9cf4dcf 100644 --- a/include/linux/compiler_types.h +++ b/include/linux/compiler_types.h @@ -562,6 +562,13 @@ struct ftrace_likely_data { #define asm_inline asm #endif +/* + * Use __typeof_unqual__() when available. + */ +#if CC_HAS_TYPEOF_UNQUAL || defined(__CHECKER__) +# define USE_TYPEOF_UNQUAL 1 +#endif + /* Are two types/vars the same type (ignoring qualifiers)? */ #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) @@ -569,6 +576,7 @@ struct ftrace_likely_data { * __unqual_scalar_typeof(x) - Declare an unqualified scalar type, leaving * non-scalar types unchanged. */ +#ifndef USE_TYPEOF_UNQUAL /* * Prefer C11 _Generic for better compile-times and simpler code. Note: 'char' * is not type-compatible with 'signed char', and we define a separate case. @@ -586,6 +594,9 @@ struct ftrace_likely_data { __scalar_type_to_expr_cases(long), \ __scalar_type_to_expr_cases(long long), \ default: (x))) +#else +#define __unqual_scalar_typeof(x) __typeof_unqual__(x) +#endif /* Is this type a native word size -- useful for atomic operations */ #define __native_word(t) \ diff --git a/scripts/checker-valid.sh b/scripts/checker-valid.sh new file mode 100755 index 0000000..625a789 --- /dev/null +++ b/scripts/checker-valid.sh @@ -0,0 +1,19 @@ +#!/bin/sh -eu +# SPDX-License-Identifier: GPL-2.0 + +[ ! -x "$(command -v "$1")" ] && exit 1 + +tmp_file=$(mktemp) +trap "rm -f $tmp_file" EXIT + +cat << EOF >$tmp_file +static inline int u(const int *q) +{ + __typeof_unqual__(*q) v = *q; + return v; +} +EOF + +# sparse happily exits with 0 on error so validate +# there is none on stderr. Use awk as grep is a pain with sh -e +$@ $tmp_file 2>&1 | awk -v c=1 '/error/{c=0}END{print c}' ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [tip: timers/vdso] compiler: Use __typeof_unqual__() for __unqual_scalar_typeof() 2026-01-16 18:18 ` [PATCH] compiler: Use __typeof_unqual__() for __unqual_scalar_typeof() Thomas Gleixner 2026-01-17 5:25 ` Ian Rogers 2026-01-17 21:25 ` [tip: timers/vdso] " tip-bot2 for Peter Zijlstra @ 2026-01-18 9:38 ` tip-bot2 for Peter Zijlstra 2026-02-25 8:15 ` [PATCH] " Dan Carpenter 3 siblings, 0 replies; 19+ messages in thread From: tip-bot2 for Peter Zijlstra @ 2026-01-18 9:38 UTC (permalink / raw) To: linux-tip-commits Cc: kernel test robot, Peter Zijlstra, Thomas Gleixner, Ian Rogers, x86, linux-kernel The following commit has been merged into the timers/vdso branch of tip: Commit-ID: fd69b2f7d5f4e1d89cea4cdfa6f15e7fa53d8358 Gitweb: https://git.kernel.org/tip/fd69b2f7d5f4e1d89cea4cdfa6f15e7fa53d8358 Author: Peter Zijlstra <peterz@infradead.org> AuthorDate: Fri, 16 Jan 2026 19:18:16 +01:00 Committer: Thomas Gleixner <tglx@kernel.org> CommitterDate: Sun, 18 Jan 2026 10:32:03 +01:00 compiler: Use __typeof_unqual__() for __unqual_scalar_typeof() The recent changes to get_unaligned() resulted in a new sparse warning: net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void * @@ got restricted __be64 const * @@ net/rds/ib_cm.c:96:35: sparse: expected void * net/rds/ib_cm.c:96:35: sparse: got restricted __be64 const * The updated get_unaligned_t() uses __unqual_scalar_typeof() to get an unqualified type. This works correctly for the compilers, but fails for sparse when the data type is __be64 (or any other __beNN variant). On sparse runs (C=[12]) __beNN types are annotated with __attribute__((bitwise)). That annotation allows sparse to detect incompatible operations on __beNN variables, but it also prevents sparse from evaluating the _Generic() in __unqual_scalar_typeof() and map __beNN to a unqualified scalar type, so it ends up with the default, i.e. the original qualified type of a 'const __beNN' pointer. That then ends up as the first pointer argument to builtin_memcpy(), which obviously causes the above sparse warnings. The sparse git tree supports typeof_unqual() now, which allows to use it instead of the _Generic() based __unqual_scalar_typeof(). With that sparse correctly evaluates the unqualified type and keeps the __beNN logic intact. The downside is that this requires a top of tree sparse build and an old sparse version will emit a metric ton of incomprehensible error messages before it dies with a segfault. Therefore implement a sanity check which validates that the checker is available and capable of handling typeof_unqual(). Emit a warning if not so the user can take informed action. [ tglx: Move the evaluation of USE_TYPEOF_UNQUAL to compiler_types.h so it is set before use and implement the sanity checker ] Reported-by: kernel test robot <lkp@intel.com> Signed-off-by: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Thomas Gleixner <tglx@kernel.org> Acked-by: Ian Rogers <irogers@google.com> Link: https://patch.msgid.link/87ecnp2zh3.ffs@tglx Closes: https://lore.kernel.org/oe-kbuild-all/202601150001.sKSN644a-lkp@intel.com/ --- Makefile | 8 ++++++++ include/linux/compiler.h | 10 ---------- include/linux/compiler_types.h | 13 +++++++++++++ scripts/checker-valid.sh | 19 +++++++++++++++++++ 4 files changed, 40 insertions(+), 10 deletions(-) create mode 100755 scripts/checker-valid.sh diff --git a/Makefile b/Makefile index 9d38125..179c9d9 100644 --- a/Makefile +++ b/Makefile @@ -1187,6 +1187,14 @@ CHECKFLAGS += $(if $(CONFIG_CPU_BIG_ENDIAN),-mbig-endian,-mlittle-endian) # the checker needs the correct machine size CHECKFLAGS += $(if $(CONFIG_64BIT),-m64,-m32) +# Validate the checker is available and functional +ifneq ($(KBUILD_CHECKSRC), 0) + ifneq ($(shell $(srctree)/scripts/checker-valid.sh $(CHECK) $(CHECKFLAGS)), 1) + $(warning C=$(KBUILD_CHECKSRC) specified, but $(CHECK) is not available or not up to date) + KBUILD_CHECKSRC = 0 + endif +endif + # Default kernel image to build when no specific target is given. # KBUILD_IMAGE may be overruled on the command line or # set in the environment diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 04487c9..c601222 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -231,16 +231,6 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, "must be non-C-string (not NUL-terminated)") /* - * Use __typeof_unqual__() when available. - * - * XXX: Remove test for __CHECKER__ once - * sparse learns about __typeof_unqual__(). - */ -#if CC_HAS_TYPEOF_UNQUAL && !defined(__CHECKER__) -# define USE_TYPEOF_UNQUAL 1 -#endif - -/* * Define TYPEOF_UNQUAL() to use __typeof_unqual__() as typeof * operator when available, to return an unqualified type of the exp. */ diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h index d3318a3..377df1e 100644 --- a/include/linux/compiler_types.h +++ b/include/linux/compiler_types.h @@ -562,6 +562,14 @@ struct ftrace_likely_data { #define asm_inline asm #endif +#ifndef __ASSEMBLY__ +/* + * Use __typeof_unqual__() when available. + */ +#if CC_HAS_TYPEOF_UNQUAL || defined(__CHECKER__) +# define USE_TYPEOF_UNQUAL 1 +#endif + /* Are two types/vars the same type (ignoring qualifiers)? */ #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) @@ -569,6 +577,7 @@ struct ftrace_likely_data { * __unqual_scalar_typeof(x) - Declare an unqualified scalar type, leaving * non-scalar types unchanged. */ +#ifndef USE_TYPEOF_UNQUAL /* * Prefer C11 _Generic for better compile-times and simpler code. Note: 'char' * is not type-compatible with 'signed char', and we define a separate case. @@ -586,6 +595,10 @@ struct ftrace_likely_data { __scalar_type_to_expr_cases(long), \ __scalar_type_to_expr_cases(long long), \ default: (x))) +#else +#define __unqual_scalar_typeof(x) __typeof_unqual__(x) +#endif +#endif /* !__ASSEMBLY__ */ /* Is this type a native word size -- useful for atomic operations */ #define __native_word(t) \ diff --git a/scripts/checker-valid.sh b/scripts/checker-valid.sh new file mode 100755 index 0000000..625a789 --- /dev/null +++ b/scripts/checker-valid.sh @@ -0,0 +1,19 @@ +#!/bin/sh -eu +# SPDX-License-Identifier: GPL-2.0 + +[ ! -x "$(command -v "$1")" ] && exit 1 + +tmp_file=$(mktemp) +trap "rm -f $tmp_file" EXIT + +cat << EOF >$tmp_file +static inline int u(const int *q) +{ + __typeof_unqual__(*q) v = *q; + return v; +} +EOF + +# sparse happily exits with 0 on error so validate +# there is none on stderr. Use awk as grep is a pain with sh -e +$@ $tmp_file 2>&1 | awk -v c=1 '/error/{c=0}END{print c}' ^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH] compiler: Use __typeof_unqual__() for __unqual_scalar_typeof() 2026-01-16 18:18 ` [PATCH] compiler: Use __typeof_unqual__() for __unqual_scalar_typeof() Thomas Gleixner ` (2 preceding siblings ...) 2026-01-18 9:38 ` tip-bot2 for Peter Zijlstra @ 2026-02-25 8:15 ` Dan Carpenter 3 siblings, 0 replies; 19+ messages in thread From: Dan Carpenter @ 2026-02-25 8:15 UTC (permalink / raw) To: Thomas Gleixner Cc: Peter Zijlstra, kernel test robot, Ian Rogers, oe-kbuild-all, linux-kernel, x86, sparse, linux-sparse, Marco Elver On Fri, Jan 16, 2026 at 07:18:16PM +0100, Thomas Gleixner wrote: > --- a/Makefile > +++ b/Makefile > @@ -1178,6 +1178,14 @@ ifdef CONFIG_CC_IS_CLANG > KBUILD_USERLDFLAGS += --ld-path=$(LD) > endif > > +# Validate the checker is available and functional > +ifneq ($(KBUILD_CHECKSRC), 0) > + ifneq ($(shell $(srctree)/scripts/checker-valid.sh $(CHECK)), 1) > + $(warning C=$(KBUILD_CHECKSRC) specified, but $(CHECK) is not available or not up to date) > + KBUILD_CHECKSRC = 0 > + endif > +endif > + This means we can't run "CHECK="valgrind smatch -p=kernel" because valgrind always prints output to stderr. So hopefully we can eventually remove this check. regards, dan carpenter ^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2026-02-25 8:15 UTC | newest] Thread overview: 19+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-01-14 16:36 [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse: incorrect type in argument 1 (different modifiers) kernel test robot 2026-01-14 17:51 ` Ian Rogers 2026-01-14 20:04 ` Thomas Gleixner 2026-01-14 21:03 ` Ian Rogers 2026-01-14 21:27 ` Thomas Gleixner 2026-01-14 21:42 ` Ian Rogers 2026-01-15 19:28 ` Thomas Gleixner 2026-01-15 21:11 ` Peter Zijlstra 2026-01-15 21:19 ` Linus Torvalds 2026-01-15 21:30 ` Peter Zijlstra 2026-01-15 23:03 ` Linus Torvalds 2026-01-16 8:28 ` Peter Zijlstra 2026-01-15 23:01 ` Thomas Gleixner 2026-01-16 11:25 ` Thomas Gleixner 2026-01-16 18:18 ` [PATCH] compiler: Use __typeof_unqual__() for __unqual_scalar_typeof() Thomas Gleixner 2026-01-17 5:25 ` Ian Rogers 2026-01-17 21:25 ` [tip: timers/vdso] " tip-bot2 for Peter Zijlstra 2026-01-18 9:38 ` tip-bot2 for Peter Zijlstra 2026-02-25 8:15 ` [PATCH] " Dan Carpenter
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox