X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Flnet%2Fmodule.c;h=d612fafc68d28e9dba9273b0df03562eada297d3;hb=e0ea97e4f9f835a7fc0bc3c22fd59a499c0460d1;hp=012d3d91083ae236a21cbebbff88083c129be0ad;hpb=57e6d88a8a8d858e2d74aeefba4c764ad08cf86d;p=fs%2Flustre-release.git diff --git a/lnet/lnet/module.c b/lnet/lnet/module.c index 012d3d9..d612faf 100644 --- a/lnet/lnet/module.c +++ b/lnet/lnet/module.c @@ -22,458 +22,163 @@ #ifndef EXPORT_SYMTAB # define EXPORT_SYMTAB #endif -#define DEBUG_SUBSYSTEM S_PORTALS +#define DEBUG_SUBSYSTEM S_LNET +#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +static int config_on_load = 0; +CFS_MODULE_PARM(config_on_load, "i", int, 0444, + "configure network at module load"); -#include -#include +static struct semaphore lnet_config_mutex; -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -extern void (kping_client)(struct portal_ioctl_data *); - -struct nal_cmd_handler { - nal_cmd_handler_t nch_handler; - void * nch_private; -}; - -static struct nal_cmd_handler nal_cmd[NAL_MAX_NR + 1]; -static DECLARE_MUTEX(nal_cmd_sem); - - -static int -kportal_add_route(int gateway_nalid, ptl_nid_t gateway_nid, - ptl_nid_t lo_nid, ptl_nid_t hi_nid) -{ - int rc; - kpr_control_interface_t *ci; - - ci = (kpr_control_interface_t *) PORTAL_SYMBOL_GET (kpr_control_interface); - if (ci == NULL) - return (-ENODEV); - - rc = ci->kprci_add_route (gateway_nalid, gateway_nid, lo_nid, hi_nid); - - PORTAL_SYMBOL_PUT(kpr_control_interface); - return (rc); -} - -static int -kportal_del_route(int gw_nalid, ptl_nid_t gw_nid, - ptl_nid_t lo, ptl_nid_t hi) -{ - int rc; - kpr_control_interface_t *ci; - - ci = (kpr_control_interface_t *)PORTAL_SYMBOL_GET(kpr_control_interface); - if (ci == NULL) - return (-ENODEV); - - rc = ci->kprci_del_route (gw_nalid, gw_nid, lo, hi); - - PORTAL_SYMBOL_PUT(kpr_control_interface); - return (rc); -} - -static int -kportal_notify_router (int gw_nalid, ptl_nid_t gw_nid, - int alive, time_t when) -{ - int rc; - kpr_control_interface_t *ci; - - /* No error if router not preset. Sysadmin is allowed to notify - * _everywhere_ when a NID boots or crashes, even if they know - * nothing of the peer. */ - ci = (kpr_control_interface_t *)PORTAL_SYMBOL_GET(kpr_control_interface); - if (ci == NULL) - return (0); - - rc = ci->kprci_notify (gw_nalid, gw_nid, alive, when); - - PORTAL_SYMBOL_PUT(kpr_control_interface); - return (rc); -} - -static int -kportal_get_route(int index, __u32 *gateway_nalidp, ptl_nid_t *gateway_nidp, - ptl_nid_t *lo_nidp, ptl_nid_t *hi_nidp, int *alivep) +int +lnet_configure (void *arg) { - int gateway_nalid; - ptl_nid_t gateway_nid; - ptl_nid_t lo_nid; - ptl_nid_t hi_nid; - int alive; - int rc; - kpr_control_interface_t *ci; - - ci = (kpr_control_interface_t *) PORTAL_SYMBOL_GET(kpr_control_interface); - if (ci == NULL) - return (-ENODEV); - - rc = ci->kprci_get_route(index, &gateway_nalid, &gateway_nid, - &lo_nid, &hi_nid, &alive); + /* 'arg' only there so I can be passed to cfs_kernel_thread() */ + int rc = 0; - if (rc == 0) { - CDEBUG(D_IOCTL, "got route [%d] %d "LPX64":"LPX64" - "LPX64", %s\n", - index, gateway_nalid, gateway_nid, lo_nid, hi_nid, - alive ? "up" : "down"); + LNET_MUTEX_DOWN(&lnet_config_mutex); - *gateway_nalidp = (__u32)gateway_nalid; - *gateway_nidp = gateway_nid; - *lo_nidp = lo_nid; - *hi_nidp = hi_nid; - *alivep = alive; + if (!the_lnet.ln_niinit_self) { + rc = LNetNIInit(LUSTRE_SRV_LNET_PID); + if (rc >= 0) { + the_lnet.ln_niinit_self = 1; + rc = 0; + } } - PORTAL_SYMBOL_PUT (kpr_control_interface); - return (rc); -} - -static int -kportal_router_cmd(struct portals_cfg *pcfg, void * private) -{ - int err = -EINVAL; - ENTRY; - - switch(pcfg->pcfg_command) { - default: - CDEBUG(D_IOCTL, "Inappropriate cmd: %d\n", pcfg->pcfg_command); - break; - - case NAL_CMD_ADD_ROUTE: - CDEBUG(D_IOCTL, "Adding route: [%d] "LPU64" : "LPU64" - "LPU64"\n", - pcfg->pcfg_nal, pcfg->pcfg_nid, - pcfg->pcfg_nid2, pcfg->pcfg_nid3); - err = kportal_add_route(pcfg->pcfg_gw_nal, pcfg->pcfg_nid, - pcfg->pcfg_nid2, pcfg->pcfg_nid3); - break; - - case NAL_CMD_DEL_ROUTE: - CDEBUG (D_IOCTL, "Removing routes via [%d] "LPU64" : "LPU64" - "LPU64"\n", - pcfg->pcfg_gw_nal, pcfg->pcfg_nid, - pcfg->pcfg_nid2, pcfg->pcfg_nid3); - err = kportal_del_route (pcfg->pcfg_gw_nal, pcfg->pcfg_nid, - pcfg->pcfg_nid2, pcfg->pcfg_nid3); - break; - - case NAL_CMD_NOTIFY_ROUTER: { - CDEBUG (D_IOCTL, "Notifying peer [%d] "LPU64" %s @ %ld\n", - pcfg->pcfg_gw_nal, pcfg->pcfg_nid, - pcfg->pcfg_flags ? "Enabling" : "Disabling", - (time_t)pcfg->pcfg_nid3); - - err = kportal_notify_router (pcfg->pcfg_gw_nal, pcfg->pcfg_nid, - pcfg->pcfg_flags, - (time_t)pcfg->pcfg_nid3); - break; - } - - case NAL_CMD_GET_ROUTE: - CDEBUG (D_IOCTL, "Getting route [%d]\n", pcfg->pcfg_count); - err = kportal_get_route(pcfg->pcfg_count, &pcfg->pcfg_gw_nal, - &pcfg->pcfg_nid, - &pcfg->pcfg_nid2, &pcfg->pcfg_nid3, - &pcfg->pcfg_flags); - break; - } - RETURN(err); + LNET_MUTEX_UP(&lnet_config_mutex); + return rc; } int -kportal_nal_cmd(struct portals_cfg *pcfg) +lnet_unconfigure (void) { - __u32 nal = pcfg->pcfg_nal; - int rc = -EINVAL; + int refcount; + + LNET_MUTEX_DOWN(&lnet_config_mutex); - ENTRY; - - down(&nal_cmd_sem); - if (nal > 0 && nal <= NAL_MAX_NR && nal_cmd[nal].nch_handler) { - CDEBUG(D_IOCTL, "calling handler nal: %d, cmd: %d\n", nal, - pcfg->pcfg_command); - rc = nal_cmd[nal].nch_handler(pcfg, nal_cmd[nal].nch_private); + if (the_lnet.ln_niinit_self) { + the_lnet.ln_niinit_self = 0; + LNetNIFini(); } - up(&nal_cmd_sem); - RETURN(rc); -} -ptl_handle_ni_t * -kportal_get_ni (int nal) -{ + LNET_MUTEX_DOWN(&the_lnet.ln_api_mutex); + refcount = the_lnet.ln_refcount; + LNET_MUTEX_UP(&the_lnet.ln_api_mutex); - switch (nal) - { - case QSWNAL: - return (PORTAL_SYMBOL_GET(kqswnal_ni)); - case SOCKNAL: - return (PORTAL_SYMBOL_GET(ksocknal_ni)); - case GMNAL: - return (PORTAL_SYMBOL_GET(kgmnal_ni)); - case IBNAL: - return (PORTAL_SYMBOL_GET(kibnal_ni)); - case TCPNAL: - /* userspace NAL */ - return (NULL); - case SCIMACNAL: - return (PORTAL_SYMBOL_GET(kscimacnal_ni)); - default: - /* A warning to a naive caller */ - CERROR ("unknown nal: %d\n", nal); - return (NULL); - } -} - -void -kportal_put_ni (int nal) -{ - - switch (nal) - { - case QSWNAL: - PORTAL_SYMBOL_PUT(kqswnal_ni); - break; - case SOCKNAL: - PORTAL_SYMBOL_PUT(ksocknal_ni); - break; - case GMNAL: - PORTAL_SYMBOL_PUT(kgmnal_ni); - break; - case IBNAL: - PORTAL_SYMBOL_PUT(kibnal_ni); - break; - case TCPNAL: - /* A lesson to a malicious caller */ - LBUG (); - case SCIMACNAL: - PORTAL_SYMBOL_PUT(kscimacnal_ni); - break; - default: - CERROR ("unknown nal: %d\n", nal); - } + LNET_MUTEX_UP(&lnet_config_mutex); + return (refcount == 0) ? 0 : -EBUSY; } int -kportal_nal_register(int nal, nal_cmd_handler_t handler, void * private) +lnet_ioctl(unsigned int cmd, struct libcfs_ioctl_data *data) { - int rc = 0; + int rc; - CDEBUG(D_IOCTL, "Register NAL %d, handler: %p\n", nal, handler); + switch (cmd) { + case IOC_LIBCFS_CONFIGURE: + return lnet_configure(NULL); - if (nal > 0 && nal <= NAL_MAX_NR) { - down(&nal_cmd_sem); - if (nal_cmd[nal].nch_handler != NULL) - rc = -EBUSY; - else { - nal_cmd[nal].nch_handler = handler; - nal_cmd[nal].nch_private = private; + 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(); } - up(&nal_cmd_sem); + return rc; } - return rc; } -int -kportal_nal_unregister(int nal) -{ - int rc = 0; +DECLARE_IOCTL_HANDLER(lnet_ioctl_handler, lnet_ioctl); - CDEBUG(D_IOCTL, "Unregister NAL %d\n", nal); - - if (nal > 0 && nal <= NAL_MAX_NR) { - down(&nal_cmd_sem); - nal_cmd[nal].nch_handler = NULL; - nal_cmd[nal].nch_private = NULL; - up(&nal_cmd_sem); - } - return rc; -} - -static int kportal_ioctl(struct portal_ioctl_data *data, - unsigned int cmd, unsigned long arg) +int +init_lnet(void) { - int err = 0; - char str[PTL_NALFMT_SIZE]; + int rc; ENTRY; - switch (cmd) { - case IOC_PORTAL_PING: { - void (*ping)(struct portal_ioctl_data *); - - CDEBUG(D_IOCTL, "doing %d pings to nid "LPX64" (%s)\n", - data->ioc_count, data->ioc_nid, - portals_nid2str(data->ioc_nal, data->ioc_nid, str)); - ping = PORTAL_SYMBOL_GET(kping_client); - if (!ping) - CERROR("PORTAL_SYMBOL_GET failed\n"); - else { - ping(data); - PORTAL_SYMBOL_PUT(kping_client); - } - RETURN(0); - } - - case IOC_PORTAL_GET_NID: { - const ptl_handle_ni_t *nip; - ptl_process_id_t pid; - - CDEBUG (D_IOCTL, "Getting nid for nal [%d]\n", data->ioc_nal); + init_mutex(&lnet_config_mutex); - nip = kportal_get_ni (data->ioc_nal); - if (nip == NULL) - RETURN (-EINVAL); - - err = PtlGetId (*nip, &pid); - LASSERT (err == PTL_OK); - kportal_put_ni (data->ioc_nal); - - data->ioc_nid = pid.nid; - if (copy_to_user ((char *)arg, data, sizeof (*data))) - err = -EFAULT; - break; - } - - case IOC_PORTAL_NAL_CMD: { - struct portals_cfg pcfg; - - LASSERT (data->ioc_plen1 == sizeof(pcfg)); - err = copy_from_user(&pcfg, (void *)data->ioc_pbuf1, - sizeof(pcfg)); - if ( err ) { - EXIT; - return err; - } - - CDEBUG (D_IOCTL, "nal command nal %d cmd %d\n", pcfg.pcfg_nal, - pcfg.pcfg_command); - err = kportal_nal_cmd(&pcfg); - if (err == 0) { - if (copy_to_user((char *)data->ioc_pbuf1, &pcfg, - sizeof (pcfg))) - err = -EFAULT; - if (copy_to_user((char *)arg, data, sizeof (*data))) - err = -EFAULT; - } - break; + rc = LNetInit(); + if (rc != 0) { + CERROR("LNetInit: error %d\n", rc); + RETURN(rc); } - case IOC_PORTAL_FAIL_NID: { - const ptl_handle_ni_t *nip; - - CDEBUG (D_IOCTL, "fail nid: [%d] "LPU64" count %d\n", - data->ioc_nal, data->ioc_nid, data->ioc_count); - nip = kportal_get_ni (data->ioc_nal); - if (nip == NULL) - return (-EINVAL); + rc = libcfs_register_ioctl(&lnet_ioctl_handler); + LASSERT (rc == 0); - err = PtlFailNid (*nip, data->ioc_nid, data->ioc_count); - kportal_put_ni (data->ioc_nal); - break; - } - default: - err = -EINVAL; - break; + if (config_on_load) { + /* Have to schedule a separate thread to avoid deadlocking + * in modload */ + (void) cfs_kernel_thread(lnet_configure, NULL, 0); } - RETURN(err); + RETURN(0); } -DECLARE_IOCTL_HANDLER(kportal_ioctl_handler, kportal_ioctl); - -static int init_kportals_module(void) +void +fini_lnet(void) { int rc; - ENTRY; - - rc = PtlInit(NULL); - if (rc) { - CERROR("PtlInit: error %d\n", rc); - RETURN(rc); - } - - rc = kportal_nal_register(ROUTER, kportal_router_cmd, NULL); - if (rc) { - PtlFini(); - CERROR("kportal_nal_registre: ROUTER error %d\n", rc); - } - - if (rc == 0) - libcfs_register_ioctl(&kportal_ioctl_handler); - RETURN(rc); -} + rc = libcfs_deregister_ioctl(&lnet_ioctl_handler); + LASSERT (rc == 0); -static void exit_kportals_module(void) -{ - libcfs_deregister_ioctl(&kportal_ioctl_handler); - kportal_nal_unregister(ROUTER); - PtlFini(); + LNetFini(); } -EXPORT_SYMBOL(kportal_nal_register); -EXPORT_SYMBOL(kportal_nal_unregister); -EXPORT_SYMBOL(kportal_get_ni); -EXPORT_SYMBOL(kportal_put_ni); -EXPORT_SYMBOL(kportal_nal_cmd); - -EXPORT_SYMBOL(ptl_err_str); -EXPORT_SYMBOL(lib_dispatch); -EXPORT_SYMBOL(PtlMEAttach); -EXPORT_SYMBOL(PtlMEInsert); -EXPORT_SYMBOL(PtlMEUnlink); -EXPORT_SYMBOL(PtlEQAlloc); -EXPORT_SYMBOL(PtlMDAttach); -EXPORT_SYMBOL(PtlMDUnlink); -EXPORT_SYMBOL(PtlNIInit); -EXPORT_SYMBOL(PtlNIFini); -EXPORT_SYMBOL(PtlNIDebug); -EXPORT_SYMBOL(PtlInit); -EXPORT_SYMBOL(PtlFini); -EXPORT_SYMBOL(PtlSnprintHandle); -EXPORT_SYMBOL(PtlPut); -EXPORT_SYMBOL(PtlGet); -EXPORT_SYMBOL(PtlEQWait); -EXPORT_SYMBOL(PtlEQFree); -EXPORT_SYMBOL(PtlEQGet); -EXPORT_SYMBOL(PtlGetId); -EXPORT_SYMBOL(PtlMDBind); -EXPORT_SYMBOL(lib_iov_nob); -EXPORT_SYMBOL(lib_copy_iov2buf); -EXPORT_SYMBOL(lib_copy_buf2iov); -EXPORT_SYMBOL(lib_extract_iov); -EXPORT_SYMBOL(lib_kiov_nob); -EXPORT_SYMBOL(lib_copy_kiov2buf); -EXPORT_SYMBOL(lib_copy_buf2kiov); -EXPORT_SYMBOL(lib_extract_kiov); -EXPORT_SYMBOL(lib_finalize); -EXPORT_SYMBOL(lib_parse); -EXPORT_SYMBOL(lib_create_reply_msg); -EXPORT_SYMBOL(lib_init); -EXPORT_SYMBOL(lib_fini); -EXPORT_SYMBOL(dispatch_name); +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"); -module_init(init_kportals_module); -module_exit(exit_kportals_module); + +cfs_module(lnet, "1.0.0", init_lnet, fini_lnet);