[bug report] coresight: Dynamically add connections
James Clark
james.clark at linaro.org
Wed Apr 2 05:14:09 PDT 2025
On 02/04/2025 12:00 pm, Dan Carpenter wrote:
> Hello James Clark,
>
> Commit 3d4ff657e454 ("coresight: Dynamically add connections") from
> Apr 25, 2023 (linux-next), leads to the following Smatch static
> checker warning:
>
> drivers/hwtracing/coresight/coresight-platform.c:279 of_coresight_parse_endpoint()
> warn: inconsistent refcounting 'rep->kobj.kref.refcount.refs.counter':
>
> drivers/hwtracing/coresight/coresight-platform.c
> 196 static int of_coresight_parse_endpoint(struct device *dev,
> 197 struct device_node *ep,
> 198 struct coresight_platform_data *pdata)
> 199 {
> 200 int ret = 0;
> 201 struct of_endpoint endpoint, rendpoint;
> 202 struct device_node *rparent = NULL;
> 203 struct device_node *rep = NULL;
> 204 struct device *rdev = NULL;
> 205 struct fwnode_handle *rdev_fwnode;
> 206 struct coresight_connection conn = {};
> 207 struct coresight_connection *new_conn;
> 208
> 209 do {
> 210 /* Parse the local port details */
> 211 if (of_graph_parse_endpoint(ep, &endpoint))
> 212 break;
> 213 /*
> 214 * Get a handle on the remote endpoint and the device it is
> 215 * attached to.
> 216 */
> 217 rep = of_graph_get_remote_endpoint(ep);
> 218 if (!rep)
> 219 break;
> 220 rparent = of_coresight_get_port_parent(rep);
> 221 if (!rparent)
> 222 break;
> 223 if (of_graph_parse_endpoint(rep, &rendpoint))
> 224 break;
> 225
> 226 rdev_fwnode = of_fwnode_handle(rparent);
> 227 /* If the remote device is not available, defer probing */
> 228 rdev = coresight_find_device_by_fwnode(rdev_fwnode);
> 229 if (!rdev) {
> 230 ret = -EPROBE_DEFER;
> 231 break;
> 232 }
> 233
> 234 conn.src_port = endpoint.port;
> 235 /*
> 236 * Hold the refcount to the target device. This could be
> 237 * released via:
> 238 * 1) coresight_release_platform_data() if the probe fails or
> 239 * this device is unregistered.
> 240 * 2) While removing the target device via
> 241 * coresight_remove_match()
> 242 */
> 243 conn.dest_fwnode = fwnode_handle_get(rdev_fwnode);
> 244 conn.dest_port = rendpoint.port;
> 245
> 246 /*
> 247 * Get the firmware node of the filter source through the
> 248 * reference. This could be used to filter the source in
> 249 * building path.
> 250 */
> 251 conn.filter_src_fwnode =
> 252 fwnode_find_reference(&ep->fwnode, "filter-source", 0);
> 253 if (IS_ERR(conn.filter_src_fwnode)) {
> 254 conn.filter_src_fwnode = NULL;
> 255 } else {
> 256 conn.filter_src_dev =
> 257 coresight_find_csdev_by_fwnode(conn.filter_src_fwnode);
> 258 if (conn.filter_src_dev &&
> 259 !coresight_is_device_source(conn.filter_src_dev)) {
> 260 dev_warn(dev, "port %d: Filter handle is not a trace source : %s\n",
> 261 conn.src_port, dev_name(&conn.filter_src_dev->dev));
> 262 conn.filter_src_dev = NULL;
> 263 conn.filter_src_fwnode = NULL;
> 264 }
> 265 }
> 266
> 267 new_conn = coresight_add_out_conn(dev, pdata, &conn);
> 268 if (IS_ERR_VALUE(new_conn)) {
> 269 fwnode_handle_put(conn.dest_fwnode);
> 270 return PTR_ERR(new_conn);
>
> Should this be a break statement instead of return statement?
>
Hi Dan,
Yes it probably should, I'll send a patch.
Thanks
James
More information about the linux-arm-kernel
mailing list