[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAP-5=fUyAtf9PQqYvagByK+-=-mN-T1zuLmxuvsPFVVHT3qLXA@mail.gmail.com>
Date: Wed, 14 Jan 2026 09:51:14 -0800
From: Ian Rogers <irogers@...gle.com>
To: kernel test robot <lkp@...el.com>
Cc: oe-kbuild-all@...ts.linux.dev, linux-kernel@...r.kernel.org,
x86@...nel.org, Thomas Gleixner <tglx@...nel.org>
Subject: Re: [tip:timers/vdso 12/14] net/rds/ib_cm.c:96:35: sparse: sparse:
incorrect type in argument 1 (different modifiers)
On Wed, Jan 14, 2026 at 8:37 AM kernel test robot <lkp@...el.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@...el.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@...cle.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@...cle.com>
> :::::: CC: David S. Miller <davem@...emloft.net>
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki
Powered by blists - more mailing lists