[lustre-devel] [PATCH 31/34] lnet: lnet_dyn_add_ni: fix ping_info count

Doug Oucharek doucharek at cray.com
Tue Sep 11 21:48:32 PDT 2018


Reviewed-by: Doug Oucharek <dougso at me.com>

Doug

On 9/6/18, 5:55 PM, "NeilBrown" <neilb at suse.com> wrote:

    Use the correct count of interfaces when calling
       lnet_ping_info_setup()
    in lnet_dyn_add_ni()
    
    Signed-off-by: NeilBrown <neilb at suse.com>
    ---
     drivers/staging/lustre/lnet/lnet/api-ni.c |   27 ++++++++++++++++++++++++++-
     1 file changed, 26 insertions(+), 1 deletion(-)
    
    diff --git a/drivers/staging/lustre/lnet/lnet/api-ni.c b/drivers/staging/lustre/lnet/lnet/api-ni.c
    index cf0ffb8ac84b..2ce0a7212dc2 100644
    --- a/drivers/staging/lustre/lnet/lnet/api-ni.c
    +++ b/drivers/staging/lustre/lnet/lnet/api-ni.c
    @@ -871,6 +871,18 @@ lnet_ping_info_create(int num_ni)
     	return ping_info;
     }
     
    +static inline int
    +lnet_get_net_ni_count_locked(struct lnet_net *net)
    +{
    +	struct lnet_ni	*ni;
    +	int		count = 0;
    +
    +	list_for_each_entry(ni, &net->net_ni_list, ni_netlist)
    +		count++;
    +
    +	return count;
    +}
    +
     static inline int
     lnet_get_ni_count(void)
     {
    @@ -1977,6 +1989,7 @@ lnet_dyn_add_ni(lnet_pid_t requested_pid, struct lnet_ioctl_config_data *conf)
     	struct list_head net_head;
     	struct lnet_remotenet *rnet;
     	int rc;
    +	int			net_ni_count;
     	int			num_acceptor_nets;
     	__u32			net_type;
     	struct lnet_ioctl_config_lnd_tunables *lnd_tunables = NULL;
    @@ -2014,7 +2027,19 @@ lnet_dyn_add_ni(lnet_pid_t requested_pid, struct lnet_ioctl_config_data *conf)
     		goto failed0;
     	}
     
    -	rc = lnet_ping_info_setup(&pinfo, &md_handle, 1 + lnet_get_ni_count(),
    +	/*
    +	 * make sure you calculate the correct number of slots in the ping
    +	 * info. Since the ping info is a flattened list of all the NIs,
    +	 * we should allocate enough slots to accomodate the number of NIs
    +	 * which will be added.
    +	 *
    +	 * We can use lnet_get_net_ni_count_locked() since the net is not
    +	 * on a public list yet, so locking is not a problem
    +	 */
    +	net_ni_count = lnet_get_net_ni_count_locked(net);
    +
    +	rc = lnet_ping_info_setup(&pinfo, &md_handle,
    +				  net_ni_count + lnet_get_ni_count(),
     				  false);
     	if (rc)
     		goto failed0;
    
    
    



More information about the lustre-devel mailing list