diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx5/mr.c')
| -rw-r--r-- | drivers/infiniband/hw/mlx5/mr.c | 38 | 
1 files changed, 24 insertions, 14 deletions
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c index 763bb5b36144..2c40a2e989d2 100644 --- a/drivers/infiniband/hw/mlx5/mr.c +++ b/drivers/infiniband/hw/mlx5/mr.c @@ -582,6 +582,15 @@ static void clean_keys(struct mlx5_ib_dev *dev, int c)  	}  } +static void mlx5_mr_cache_debugfs_cleanup(struct mlx5_ib_dev *dev) +{ +	if (!mlx5_debugfs_root) +		return; + +	debugfs_remove_recursive(dev->cache.root); +	dev->cache.root = NULL; +} +  static int mlx5_mr_cache_debugfs_init(struct mlx5_ib_dev *dev)  {  	struct mlx5_mr_cache *cache = &dev->cache; @@ -600,38 +609,34 @@ static int mlx5_mr_cache_debugfs_init(struct mlx5_ib_dev *dev)  		sprintf(ent->name, "%d", ent->order);  		ent->dir = debugfs_create_dir(ent->name,  cache->root);  		if (!ent->dir) -			return -ENOMEM; +			goto err;  		ent->fsize = debugfs_create_file("size", 0600, ent->dir, ent,  						 &size_fops);  		if (!ent->fsize) -			return -ENOMEM; +			goto err;  		ent->flimit = debugfs_create_file("limit", 0600, ent->dir, ent,  						  &limit_fops);  		if (!ent->flimit) -			return -ENOMEM; +			goto err;  		ent->fcur = debugfs_create_u32("cur", 0400, ent->dir,  					       &ent->cur);  		if (!ent->fcur) -			return -ENOMEM; +			goto err;  		ent->fmiss = debugfs_create_u32("miss", 0600, ent->dir,  						&ent->miss);  		if (!ent->fmiss) -			return -ENOMEM; +			goto err;  	}  	return 0; -} - -static void mlx5_mr_cache_debugfs_cleanup(struct mlx5_ib_dev *dev) -{ -	if (!mlx5_debugfs_root) -		return; +err: +	mlx5_mr_cache_debugfs_cleanup(dev); -	debugfs_remove_recursive(dev->cache.root); +	return -ENOMEM;  }  static void delay_time_func(unsigned long ctx) @@ -692,6 +697,11 @@ int mlx5_mr_cache_init(struct mlx5_ib_dev *dev)  	if (err)  		mlx5_ib_warn(dev, "cache debugfs failure\n"); +	/* +	 * We don't want to fail driver if debugfs failed to initialize, +	 * so we are not forwarding error to the user. +	 */ +  	return 0;  } @@ -825,7 +835,7 @@ static int mr_umem_get(struct ib_pd *pd, u64 start, u64 length,  			    access_flags, 0);  	err = PTR_ERR_OR_ZERO(*umem);  	if (err < 0) { -		mlx5_ib_err(dev, "umem get failed (%ld)\n", PTR_ERR(umem)); +		mlx5_ib_err(dev, "umem get failed (%d)\n", err);  		return err;  	} @@ -1779,7 +1789,7 @@ mlx5_ib_sg_to_klms(struct mlx5_ib_mr *mr,  	mr->ndescs = sg_nents;  	for_each_sg(sgl, sg, sg_nents, i) { -		if (unlikely(i > mr->max_descs)) +		if (unlikely(i >= mr->max_descs))  			break;  		klms[i].va = cpu_to_be64(sg_dma_address(sg) + sg_offset);  		klms[i].bcount = cpu_to_be32(sg_dma_len(sg) - sg_offset);  |