[bug report] coresight: Dynamically add connections

Dan Carpenter dan.carpenter at linaro.org
Wed Apr 2 04:00:42 PDT 2025


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?

    271                 }
    272                 /* Connection record updated */
    273         } while (0);
    274 
    275         of_node_put(rparent);
    276         of_node_put(rep);
    277         put_device(rdev);
    278 
--> 279         return ret;
    280 }

regards,
dan carpenter



More information about the linux-arm-kernel mailing list