Re: [RFC rdma-next 1/1] IB/core: Protect against concurrent access to hardware stats

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Mar 18, 2018 at 01:33:32PM +0000, Mark Bloch wrote:
> Currently access to hardware stats buffer isn't protected, this can
> result in multiple writes and reads at the same time to the same
> memory location. This can lead to providing an incorrect value to
> the user. Add a mutex to protect against it.
>
> Signed-off-by: Mark Bloch <markb@xxxxxxxxxxxx>
> ---
>  drivers/infiniband/core/sysfs.c | 10 ++++++++--
>  include/rdma/ib_verbs.h         |  1 +
>  2 files changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c
> index 8ae1308e..b769d61 100644
> --- a/drivers/infiniband/core/sysfs.c
> +++ b/drivers/infiniband/core/sysfs.c
> @@ -810,10 +810,15 @@ static ssize_t show_hw_stats(struct kobject *kobj, struct attribute *attr,
>  		dev = port->ibdev;
>  		stats = port->hw_stats;
>  	}
> +	mutex_lock(&stats->lock);

Lock is not needed here, because every thread will get its own stats.

>  	ret = update_hw_stats(dev, stats, hsa->port_num, hsa->index);
>  	if (ret)
> -		return ret;
> -	return print_hw_stat(stats, hsa->index, buf);
> +		goto unlock;
> +	ret = print_hw_stat(stats, hsa->index, buf);
> +unlock:
> +	mutex_unlock(&stats->lock);
> +
> +	return ret;
>  }
>
>  static ssize_t show_stats_lifespan(struct kobject *kobj,
> @@ -951,6 +956,7 @@ static void setup_hw_stats(struct ib_device *device, struct ib_port *port,
>  		sysfs_attr_init(hsag->attrs[i]);
>  	}
>
> +	mutex_init(&stats->lock);
>  	/* treat an error here as non-fatal */
>  	hsag->attrs[i] = alloc_hsa_lifespan("lifespan", port_num);
>  	if (hsag->attrs[i])
> diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
> index 73b2387..33fbccb 100644
> --- a/include/rdma/ib_verbs.h
> +++ b/include/rdma/ib_verbs.h
> @@ -484,6 +484,7 @@ enum ib_port_speed {
>   *   filled in by the drivers get_stats routine
>   */
>  struct rdma_hw_stats {
> +	struct mutex lock;
>  	unsigned long	timestamp;
>  	unsigned long	lifespan;
>  	const char * const *names;
> --
> 1.8.4.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux