X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lnet%2Flnet%2Fmodule.c;h=a8f39b36f9904e30fb241d8e6ef94013fff24f4e;hp=4795a99fb204e8c4ac5f8afb8a330934800aa4f1;hb=f1a2e6107c124d010d89973cfd716fbd17b689f0;hpb=d016a086b68ca4af2dcbfefc3917b9291efd8d62 diff --git a/lnet/lnet/module.c b/lnet/lnet/module.c index 4795a99..a8f39b3 100644 --- a/lnet/lnet/module.c +++ b/lnet/lnet/module.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -28,172 +26,192 @@ /* * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2012, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ * Lustre is a trademark of Sun Microsystems, Inc. */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_LNET #include +#include static int config_on_load = 0; CFS_MODULE_PARM(config_on_load, "i", int, 0444, "configure network at module load"); -static cfs_mutex_t lnet_config_mutex; +static struct mutex lnet_config_mutex; -int -lnet_configure (void *arg) +static int +lnet_configure(void *arg) { - /* 'arg' only there so I can be passed to cfs_create_thread() */ - int rc = 0; + /* 'arg' only there so I can be passed to cfs_create_thread() */ + int rc = 0; + + LNET_MUTEX_LOCK(&lnet_config_mutex); - LNET_MUTEX_LOCK(&lnet_config_mutex); + if (!the_lnet.ln_niinit_self) { + rc = try_module_get(THIS_MODULE); - if (!the_lnet.ln_niinit_self) { - rc = LNetNIInit(LUSTRE_SRV_LNET_PID); - if (rc >= 0) { - the_lnet.ln_niinit_self = 1; - rc = 0; - } - } + if (rc != 1) + goto out; - LNET_MUTEX_UNLOCK(&lnet_config_mutex); - return rc; + rc = LNetNIInit(LNET_PID_LUSTRE); + if (rc >= 0) { + the_lnet.ln_niinit_self = 1; + rc = 0; + } else { + module_put(THIS_MODULE); + } + } + +out: + LNET_MUTEX_UNLOCK(&lnet_config_mutex); + return rc; } -int +static int lnet_unconfigure (void) { - int refcount; - - LNET_MUTEX_LOCK(&lnet_config_mutex); + int refcount; + + LNET_MUTEX_LOCK(&lnet_config_mutex); + + if (the_lnet.ln_niinit_self) { + the_lnet.ln_niinit_self = 0; + LNetNIFini(); + module_put(THIS_MODULE); + } - if (the_lnet.ln_niinit_self) { - the_lnet.ln_niinit_self = 0; - LNetNIFini(); - } + LNET_MUTEX_LOCK(&the_lnet.ln_api_mutex); + refcount = the_lnet.ln_refcount; + LNET_MUTEX_UNLOCK(&the_lnet.ln_api_mutex); - LNET_MUTEX_LOCK(&the_lnet.ln_api_mutex); - refcount = the_lnet.ln_refcount; - LNET_MUTEX_UNLOCK(&the_lnet.ln_api_mutex); + LNET_MUTEX_UNLOCK(&lnet_config_mutex); - LNET_MUTEX_UNLOCK(&lnet_config_mutex); - return (refcount == 0) ? 0 : -EBUSY; + return (refcount == 0) ? 0 : -EBUSY; } -int -lnet_ioctl(unsigned int cmd, struct libcfs_ioctl_data *data) +static int +lnet_dyn_configure(struct libcfs_ioctl_hdr *hdr) { - int rc; - - switch (cmd) { - case IOC_LIBCFS_CONFIGURE: - return lnet_configure(NULL); - - case IOC_LIBCFS_UNCONFIGURE: - return lnet_unconfigure(); - - default: - /* Passing LNET_PID_ANY only gives me a ref if the net is up - * already; I'll need it to ensure the net can't go down while - * I'm called into it */ - rc = LNetNIInit(LNET_PID_ANY); - if (rc >= 0) { - rc = LNetCtl(cmd, data); - LNetNIFini(); - } - return rc; - } + struct lnet_ioctl_config_data *conf = + (struct lnet_ioctl_config_data *)hdr; + int rc; + + LNET_MUTEX_LOCK(&lnet_config_mutex); + if (the_lnet.ln_niinit_self) + rc = lnet_dyn_add_ni(LNET_PID_LUSTRE, + conf->cfg_config_u.cfg_net.net_intf, + conf->cfg_config_u.cfg_net. + net_peer_timeout, + conf->cfg_config_u.cfg_net. + net_peer_tx_credits, + conf->cfg_config_u.cfg_net. + net_peer_rtr_credits, + conf->cfg_config_u.cfg_net. + net_max_tx_credits); + else + rc = -EINVAL; + LNET_MUTEX_UNLOCK(&lnet_config_mutex); + return rc; +} + +static int +lnet_dyn_unconfigure(struct libcfs_ioctl_hdr *hdr) +{ + struct lnet_ioctl_config_data *conf = + (struct lnet_ioctl_config_data *) hdr; + int rc; + + LNET_MUTEX_LOCK(&lnet_config_mutex); + if (the_lnet.ln_niinit_self) + rc = lnet_dyn_del_ni(conf->cfg_net); + else + rc = -EINVAL; + LNET_MUTEX_UNLOCK(&lnet_config_mutex); + + return rc; +} + +static int +lnet_ioctl(unsigned int cmd, struct libcfs_ioctl_hdr *hdr) +{ + int rc; + + switch (cmd) { + case IOC_LIBCFS_CONFIGURE: { + struct libcfs_ioctl_data *data = + (struct libcfs_ioctl_data *)hdr; + the_lnet.ln_nis_from_mod_params = data->ioc_flags; + return lnet_configure(NULL); + } + + case IOC_LIBCFS_UNCONFIGURE: + return lnet_unconfigure(); + + case IOC_LIBCFS_ADD_NET: + return lnet_dyn_configure(hdr); + + case IOC_LIBCFS_DEL_NET: + return lnet_dyn_unconfigure(hdr); + + default: + /* Passing LNET_PID_ANY only gives me a ref if the net is up + * already; I'll need it to ensure the net can't go down while + * I'm called into it */ + rc = LNetNIInit(LNET_PID_ANY); + if (rc >= 0) { + rc = LNetCtl(cmd, hdr); + LNetNIFini(); + } + return rc; + } } DECLARE_IOCTL_HANDLER(lnet_ioctl_handler, lnet_ioctl); -int -init_lnet(void) +static int +lnet_module_init(void) { - int rc; - ENTRY; + int rc; + ENTRY; - cfs_mutex_init(&lnet_config_mutex); + mutex_init(&lnet_config_mutex); - rc = LNetInit(); - if (rc != 0) { - CERROR("LNetInit: error %d\n", rc); - RETURN(rc); - } + rc = lnet_init(); + if (rc != 0) { + CERROR("lnet_init: error %d\n", rc); + RETURN(rc); + } - rc = libcfs_register_ioctl(&lnet_ioctl_handler); - LASSERT (rc == 0); + rc = libcfs_register_ioctl(&lnet_ioctl_handler); + LASSERT(rc == 0); - if (config_on_load) { - /* Have to schedule a separate thread to avoid deadlocking - * in modload */ - (void) cfs_create_thread(lnet_configure, NULL, 0); - } + if (config_on_load) { + /* Have to schedule a separate thread to avoid deadlocking + * in modload */ + (void) kthread_run(lnet_configure, NULL, "lnet_initd"); + } - RETURN(0); + RETURN(0); } -void -fini_lnet(void) +static void +lnet_module_exit(void) { - int rc; + int rc; - rc = libcfs_deregister_ioctl(&lnet_ioctl_handler); - LASSERT (rc == 0); + rc = libcfs_deregister_ioctl(&lnet_ioctl_handler); + LASSERT(rc == 0); - LNetFini(); + lnet_fini(); } -EXPORT_SYMBOL(lnet_register_lnd); -EXPORT_SYMBOL(lnet_unregister_lnd); - -EXPORT_SYMBOL(LNetMEAttach); -EXPORT_SYMBOL(LNetMEInsert); -EXPORT_SYMBOL(LNetMEUnlink); -EXPORT_SYMBOL(LNetEQAlloc); -EXPORT_SYMBOL(LNetMDAttach); -EXPORT_SYMBOL(LNetMDUnlink); -EXPORT_SYMBOL(LNetNIInit); -EXPORT_SYMBOL(LNetNIFini); -EXPORT_SYMBOL(LNetInit); -EXPORT_SYMBOL(LNetFini); -EXPORT_SYMBOL(LNetSnprintHandle); -EXPORT_SYMBOL(LNetPut); -EXPORT_SYMBOL(LNetGet); -EXPORT_SYMBOL(LNetEQWait); -EXPORT_SYMBOL(LNetEQFree); -EXPORT_SYMBOL(LNetEQGet); -EXPORT_SYMBOL(LNetGetId); -EXPORT_SYMBOL(LNetMDBind); -EXPORT_SYMBOL(LNetDist); -EXPORT_SYMBOL(LNetSetAsync); -EXPORT_SYMBOL(LNetCtl); -EXPORT_SYMBOL(LNetSetLazyPortal); -EXPORT_SYMBOL(LNetClearLazyPortal); -EXPORT_SYMBOL(the_lnet); -EXPORT_SYMBOL(lnet_iov_nob); -EXPORT_SYMBOL(lnet_extract_iov); -EXPORT_SYMBOL(lnet_kiov_nob); -EXPORT_SYMBOL(lnet_extract_kiov); -EXPORT_SYMBOL(lnet_copy_iov2iov); -EXPORT_SYMBOL(lnet_copy_iov2kiov); -EXPORT_SYMBOL(lnet_copy_kiov2iov); -EXPORT_SYMBOL(lnet_copy_kiov2kiov); -EXPORT_SYMBOL(lnet_finalize); -EXPORT_SYMBOL(lnet_parse); -EXPORT_SYMBOL(lnet_create_reply_msg); -EXPORT_SYMBOL(lnet_set_reply_msg_len); -EXPORT_SYMBOL(lnet_msgtyp2str); -EXPORT_SYMBOL(lnet_net2ni_locked); - MODULE_AUTHOR("Peter J. Braam "); MODULE_DESCRIPTION("Portals v3.1"); MODULE_LICENSE("GPL"); -cfs_module(lnet, "1.0.0", init_lnet, fini_lnet); +cfs_module(lnet, "1.0.0", lnet_module_init, lnet_module_exit);