On Tue, Jun 05, 2018 at 10:43:16PM +0100, Suzuki K Poulose wrote:
> The platform code parses the component connections and populates
> a platform-description of the output connections in arrays of fields
> (which is never freed). This is later copied in the coresight_register
> to a newly allocated area, represented by coresight_connection(s).
> 
> This patch cleans up the code dealing with connections by making
> use of the "coresight_connection" structure right at the platform
> code and lets the generic driver simply re-use information provided
> by the platform.
> 
> Thus making it reader friendly as well as avoiding the wastage of
> unused memory.
> 
> Cc: Mathieu Poirier <[email protected]>
> Signed-off-by: Suzuki K Poulose <[email protected]>
> ---
>  drivers/hwtracing/coresight/coresight.c    | 21 +-----------
>  drivers/hwtracing/coresight/of_coresight.c | 51 
> ++++++++++++------------------
>  include/linux/coresight.h                  |  9 ++----
>  3 files changed, 23 insertions(+), 58 deletions(-)
> 
> diff --git a/drivers/hwtracing/coresight/coresight.c 
> b/drivers/hwtracing/coresight/coresight.c
> index 2893cfe..69e9136 100644
> --- a/drivers/hwtracing/coresight/coresight.c
> +++ b/drivers/hwtracing/coresight/coresight.c
> @@ -953,13 +953,11 @@ postcore_initcall(coresight_init);
>  
>  struct coresight_device *coresight_register(struct coresight_desc *desc)
>  {
> -     int i;
>       int ret;
>       int link_subtype;
>       int nr_refcnts = 1;
>       atomic_t *refcnts = NULL;
>       struct coresight_device *csdev;
> -     struct coresight_connection *conns = NULL;
>  
>       csdev = kzalloc(sizeof(*csdev), GFP_KERNEL);
>       if (!csdev) {
> @@ -988,22 +986,7 @@ struct coresight_device *coresight_register(struct 
> coresight_desc *desc)
>       csdev->nr_inport = desc->pdata->nr_inport;
>       csdev->nr_outport = desc->pdata->nr_outport;
>  
> -     /* Initialise connections if there is at least one outport */
> -     if (csdev->nr_outport) {
> -             conns = kcalloc(csdev->nr_outport, sizeof(*conns), GFP_KERNEL);
> -             if (!conns) {
> -                     ret = -ENOMEM;
> -                     goto err_kzalloc_conns;
> -             }
> -
> -             for (i = 0; i < csdev->nr_outport; i++) {
> -                     conns[i].outport = desc->pdata->outports[i];
> -                     conns[i].child_name = desc->pdata->child_names[i];
> -                     conns[i].child_port = desc->pdata->child_ports[i];
> -             }
> -     }
> -
> -     csdev->conns = conns;
> +     csdev->conns = desc->pdata->conns;
>  
>       csdev->type = desc->type;
>       csdev->subtype = desc->subtype;
> @@ -1032,8 +1015,6 @@ struct coresight_device *coresight_register(struct 
> coresight_desc *desc)
>  
>       return csdev;
>  
> -err_kzalloc_conns:
> -     kfree(refcnts);
>  err_kzalloc_refcnts:
>       kfree(csdev);
>  err_kzalloc_csdev:
> diff --git a/drivers/hwtracing/coresight/of_coresight.c 
> b/drivers/hwtracing/coresight/of_coresight.c
> index ada4f07..d01a9ce 100644
> --- a/drivers/hwtracing/coresight/of_coresight.c
> +++ b/drivers/hwtracing/coresight/of_coresight.c
> @@ -70,26 +70,13 @@ static void of_coresight_get_ports(const struct 
> device_node *node,
>  static int of_coresight_alloc_memory(struct device *dev,
>                       struct coresight_platform_data *pdata)
>  {
> -     /* List of output port on this component */
> -     pdata->outports = devm_kzalloc(dev, pdata->nr_outport *
> -                                    sizeof(*pdata->outports),
> -                                    GFP_KERNEL);
> -     if (!pdata->outports)
> -             return -ENOMEM;
> -
> -     /* Children connected to this component via @outports */
> -     pdata->child_names = devm_kzalloc(dev, pdata->nr_outport *
> -                                       sizeof(*pdata->child_names),
> -                                       GFP_KERNEL);
> -     if (!pdata->child_names)
> -             return -ENOMEM;
> -
> -     /* Port number on the child this component is connected to */
> -     pdata->child_ports = devm_kzalloc(dev, pdata->nr_outport *
> -                                       sizeof(*pdata->child_ports),
> -                                       GFP_KERNEL);
> -     if (!pdata->child_ports)
> -             return -ENOMEM;
> +     if (pdata->nr_outport) {
> +             pdata->conns = devm_kzalloc(dev, pdata->nr_outport *
> +                                         sizeof(*pdata->conns),
> +                                         GFP_KERNEL);
> +             if (!pdata->conns)
> +                     return -ENOMEM;
> +     }
>  
>       return 0;
>  }
> @@ -113,24 +100,24 @@ EXPORT_SYMBOL_GPL(of_coresight_get_cpu);
>  
>  /*
>   * of_coresight_parse_endpoint : Parse the given output endpoint @ep
> - * and fill the connection information in @pdata[*@i].
> + * and fill the connection information in *@pconn.
>   *
>   * Parses the local port, remote device name and the remote port. Also
> - * updates *@i to point to the next index, when an entry is added.
> + * updates *@pconn to point to the next record, when an entry is added.
>   *
>   * Returns :
>   *    0      - If the parsing completed without any fatal errors.
>   *   -Errno  - Fatal error, abort the scanning.
>   */
>  static int of_coresight_parse_endpoint(struct device_node *ep,
> -                                    struct coresight_platform_data *pdata,
> -                                    int *i)
> +                                    struct coresight_connection **pconn)
>  {
>       int ret = 0;
>       struct of_endpoint endpoint, rendpoint;
>       struct device_node *rparent = NULL;
>       struct device_node *rep = NULL;
>       struct device *rdev = NULL;
> +     struct coresight_connection *conn = *pconn;
>  
>       do {
>               /*
> @@ -163,11 +150,11 @@ static int of_coresight_parse_endpoint(struct 
> device_node *ep,
>                       break;
>               }
>  
> -             pdata->outports[*i] = endpoint.port;
> -             pdata->child_names[*i] = dev_name(rdev);
> -             pdata->child_ports[*i] = rendpoint.port;
> -             /* Move the index */
> -             (*i)++;
> +             conn->outport = endpoint.port;
> +             conn->child_name = dev_name(rdev);
> +             conn->child_port = rendpoint.port;
> +             /* Move the connection record */
> +             (*pconn)++;
>       } while (0);
>  
>       if (rparent)
> @@ -182,8 +169,9 @@ struct coresight_platform_data *
>  of_get_coresight_platform_data(struct device *dev,
>                              const struct device_node *node)
>  {
> -     int i = 0, ret = 0;
> +     int ret = 0;
>       struct coresight_platform_data *pdata;
> +     struct coresight_connection *conn;
>       struct device_node *ep = NULL;
>  
>       pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
> @@ -205,13 +193,14 @@ of_get_coresight_platform_data(struct device *dev,
>       if (ret)
>               return ERR_PTR(ret);
>  
> +     conn = pdata->conns;
>       /* Iterate through each port to discover topology */
>       do {
>               /* Get a handle on a port */
>               ep = of_graph_get_next_endpoint(node, ep);
>               if (!ep)
>                       break;
> -             ret = of_coresight_parse_endpoint(ep, pdata, &i);
> +             ret = of_coresight_parse_endpoint(ep, &conn);
>               if (ret)
>                       return ERR_PTR(ret);
>       } while (ep);
> diff --git a/include/linux/coresight.h b/include/linux/coresight.h
> index 69a5c9f..2a75a15 100644
> --- a/include/linux/coresight.h
> +++ b/include/linux/coresight.h
> @@ -82,20 +82,15 @@ struct coresight_dev_subtype {
>   * @cpu:     the CPU a source belongs to. Only applicable for ETM/PTMs.
>   * @name:    name of the component as shown under sysfs.
>   * @nr_inport:       number of input ports for this component.
> - * @outports:        list of remote endpoint port number.
> - * @child_names:name of all child components connected to this device.
> - * @child_ports:child component port number the current component is
> -             connected  to.
>   * @nr_outport:      number of output ports for this component.
> + * @conns:   Array of nr_outport connections from this component
>   */
>  struct coresight_platform_data {
>       int cpu;
>       const char *name;
>       int nr_inport;
> -     int *outports;
> -     const char **child_names;
> -     int *child_ports;
>       int nr_outport;
> +     struct coresight_connection *conns;
>  };

Reviewed-by: Mathieu Poirier <[email protected]>

>  
>  /**
> -- 
> 2.7.4
> 

Reply via email to