[lustre-devel] [PATCH 11/34] LU-7734 lnet: configure local NI from DLC
James Simmons
jsimmons at infradead.org
Sat Sep 29 14:05:34 PDT 2018
> From: Amir Shehata <amir.shehata at intel.com>
>
> This patch adds the ability to configure multiple network interfaces
> on the same network. This can be done via the lnetctl CLI interface
> or through a YAML configuration. Refer to the multi-rail HLD for
> more details on the syntax.
>
> It also deprecates ip2nets kernel parsing. All string parsing and
> network maching now happens in the DLC userspace library.
>
> New IOCTLs are added for adding/deleting local NIs, to keep backwards
> compatibility with older version of the DLC and lnetctl.
>
> The changes also include parsing and matching ip2nets syntax at the
> user level and then passing down the network interfaces down to the
> kernel to be configured.
Nak. This patch introduces a regression in lnet_ioctl() found in
module.c
> Signed-off-by: Amir Shehata <amir.shehata at intel.com>
> Change-Id: I19ee7dc76514beb6f34de6517d19654d6468bcec
> Reviewed-on: http://review.whamcloud.com/18886
> Tested-by: Maloo <hpdd-maloo at intel.com>
> Signed-off-by: NeilBrown <neilb at suse.com>
> ---
> .../lustre/include/linux/libcfs/libcfs_string.h | 12 -
> .../staging/lustre/include/linux/lnet/lib-lnet.h | 13 -
> .../lustre/include/uapi/linux/lnet/libcfs_ioctl.h | 6
> .../lustre/include/uapi/linux/lnet/lnet-dlc.h | 57 ++
> .../staging/lustre/lnet/klnds/socklnd/socklnd.c | 3
> drivers/staging/lustre/lnet/lnet/api-ni.c | 479 +++++++++++++++++---
> drivers/staging/lustre/lnet/lnet/config.c | 107 +++-
> drivers/staging/lustre/lnet/lnet/module.c | 70 ++-
> drivers/staging/lustre/lnet/lnet/peer.c | 21 +
> drivers/staging/lustre/lustre/ptlrpc/ptlrpcd.c | 2
> drivers/staging/lustre/lustre/ptlrpc/service.c | 4
> 11 files changed, 650 insertions(+), 124 deletions(-)
.....
> diff --git a/drivers/staging/lustre/lnet/lnet/module.c b/drivers/staging/lustre/lnet/lnet/module.c
> index 9d06664f0c17..c82d27592391 100644
> --- a/drivers/staging/lustre/lnet/lnet/module.c
> +++ b/drivers/staging/lustre/lnet/lnet/module.c
> @@ -92,7 +92,7 @@ lnet_unconfigure(void)
> }
>
> static int
> -lnet_dyn_configure(struct libcfs_ioctl_hdr *hdr)
> +lnet_dyn_configure_net(struct libcfs_ioctl_hdr *hdr)
> {
> struct lnet_ioctl_config_data *conf =
> (struct lnet_ioctl_config_data *)hdr;
> @@ -102,19 +102,17 @@ lnet_dyn_configure(struct libcfs_ioctl_hdr *hdr)
> return -EINVAL;
>
> mutex_lock(&lnet_config_mutex);
> - if (!the_lnet.ln_niinit_self) {
> + if (the_lnet.ln_niinit_self)
> + rc = lnet_dyn_add_net(conf);
> + else
> rc = -EINVAL;
> - goto out_unlock;
> - }
> - rc = lnet_dyn_add_ni(LNET_PID_LUSTRE, conf);
> -out_unlock:
> mutex_unlock(&lnet_config_mutex);
>
> return rc;
> }
>
> static int
> -lnet_dyn_unconfigure(struct libcfs_ioctl_hdr *hdr)
> +lnet_dyn_unconfigure_net(struct libcfs_ioctl_hdr *hdr)
> {
> struct lnet_ioctl_config_data *conf =
> (struct lnet_ioctl_config_data *)hdr;
> @@ -124,12 +122,50 @@ lnet_dyn_unconfigure(struct libcfs_ioctl_hdr *hdr)
> return -EINVAL;
>
> mutex_lock(&lnet_config_mutex);
> - if (!the_lnet.ln_niinit_self) {
> + if (the_lnet.ln_niinit_self)
> + rc = lnet_dyn_del_net(conf->cfg_net);
> + else
> + rc = -EINVAL;
> + mutex_unlock(&lnet_config_mutex);
> +
> + return rc;
> +}
> +
> +static int
> +lnet_dyn_configure_ni(struct libcfs_ioctl_hdr *hdr)
> +{
> + struct lnet_ioctl_config_ni *conf =
> + (struct lnet_ioctl_config_ni *)hdr;
> + int rc;
> +
> + if (conf->lic_cfg_hdr.ioc_len < sizeof(*conf))
> + return -EINVAL;
> +
> + mutex_lock(&lnet_config_mutex);
> + if (the_lnet.ln_niinit_self)
> + rc = lnet_dyn_add_ni(conf);
> + else
> + rc = -EINVAL;
> + mutex_unlock(&lnet_config_mutex);
> +
> + return rc;
> +}
> +
> +static int
> +lnet_dyn_unconfigure_ni(struct libcfs_ioctl_hdr *hdr)
> +{
> + struct lnet_ioctl_config_ni *conf =
> + (struct lnet_ioctl_config_ni *)hdr;
> + int rc;
> +
> + if (conf->lic_cfg_hdr.ioc_len < sizeof(*conf))
> + return -EINVAL;
> +
> + mutex_lock(&lnet_config_mutex);
> + if (the_lnet.ln_niinit_self)
> + rc = lnet_dyn_del_ni(conf);
> + else
> rc = -EINVAL;
> - goto out_unlock;
> - }
> - rc = lnet_dyn_del_ni(conf->cfg_net);
> -out_unlock:
> mutex_unlock(&lnet_config_mutex);
>
> return rc;
> @@ -161,11 +197,17 @@ lnet_ioctl(struct notifier_block *nb,
> break;
>
> case IOC_LIBCFS_ADD_NET:
> - rc = lnet_dyn_configure(hdr);
> + rc = lnet_dyn_configure_net(hdr);
> break;
>
> case IOC_LIBCFS_DEL_NET:
> - rc = lnet_dyn_unconfigure(hdr);
> + rc = lnet_dyn_unconfigure_net(hdr);
> +
> + case IOC_LIBCFS_ADD_LOCAL_NI:
> + return lnet_dyn_configure_ni(hdr);
> +
> + case IOC_LIBCFS_DEL_LOCAL_NI:
> + return lnet_dyn_unconfigure_ni(hdr);
> break;
>
> default:
While the above is mostly correct for the OpenSFS branch that is
not the case for the linux client version. The above code assumes
we are using libc_register_ioctl() but that was replace by the
block_notifier handling for ioctls instead. What we want instead is
case IOC_LIBCFS_DEL_NET:
rc = lnet_dyn_unconfigure_net(hdr);
break;
case IOC_LIBCFS_ADD_LOCAL_NI:
rc = lnet_dyn_configure_ni(hdr);
break;
case IOC_LIBCFS_DEL_LOCAL_NI:
rc = lnet_dyn_unconfigure_ni(hdr);
break;
that way the return value is generated by notifier_from_ioctl_errno(rc).
This resolves the last bug in see in this patch set with my testing.
More information about the lustre-devel
mailing list