int lwt_init () { int i; int j; for (i = 0; i < cfs_num_online_cpus(); i++) if (lwt_cpus[i].lwtc_current_page != NULL) return (-EALREADY); LASSERT (!lwt_enabled); /* NULL pointers, zero scalars */ memset (lwt_cpus, 0, sizeof (lwt_cpus)); lwt_pages_per_cpu = LWT_MEMORY / (cfs_num_online_cpus() * PAGE_CACHE_SIZE); for (i = 0; i < cfs_num_online_cpus(); i++) for (j = 0; j < lwt_pages_per_cpu; j++) { struct page *page = alloc_page(GFP_KERNEL); lwt_page_t *lwtp; if (page == NULL) { CERROR ("Can't allocate page\n"); lwt_fini (); return (-ENOMEM); } LIBCFS_ALLOC(lwtp, sizeof (*lwtp)); if (lwtp == NULL) { CERROR ("Can't allocate lwtp\n"); __free_page(page); lwt_fini (); return (-ENOMEM); } lwtp->lwtp_page = page; lwtp->lwtp_events = page_address(page); memset(lwtp->lwtp_events, 0, PAGE_CACHE_SIZE); if (j == 0) { CFS_INIT_LIST_HEAD (&lwtp->lwtp_list); lwt_cpus[i].lwtc_current_page = lwtp; } else { cfs_list_add (&lwtp->lwtp_list, &lwt_cpus[i].lwtc_current_page->lwtp_list); } } lwt_enabled = 1; cfs_mb(); LWT_EVENT(0,0,0,0); return (0); }
static void exit_libcfs_module(void) { int rc; remove_proc(); CDEBUG(D_MALLOC, "before Portals cleanup: kmem %d\n", cfs_atomic_read(&libcfs_kmemory)); cfs_wi_shutdown(); rc = cfs_psdev_deregister(&libcfs_dev); if (rc) CERROR("misc_deregister error %d\n", rc); #if LWT_SUPPORT lwt_fini(); #endif if (cfs_atomic_read(&libcfs_kmemory) != 0) CERROR("Portals memory leaked: %d bytes\n", cfs_atomic_read(&libcfs_kmemory)); rc = libcfs_debug_cleanup(); if (rc) printk(CFS_KERN_ERR "LustreError: libcfs_debug_cleanup: %d\n", rc); cfs_fini_rwsem(&ioctl_list_sem); cfs_fini_rwsem(&cfs_tracefile_sem); libcfs_arch_cleanup(); }
static int init_libcfs_module(void) { int rc; libcfs_arch_init(); libcfs_init_nidstrings(); cfs_init_rwsem(&cfs_tracefile_sem); cfs_init_mutex(&cfs_trace_thread_sem); cfs_init_rwsem(&ioctl_list_sem); CFS_INIT_LIST_HEAD(&ioctl_list); rc = libcfs_debug_init(5 * 1024 * 1024); if (rc < 0) { printk(CFS_KERN_ERR "LustreError: libcfs_debug_init: %d\n", rc); return (rc); } #if LWT_SUPPORT rc = lwt_init(); if (rc != 0) { CERROR("lwt_init: error %d\n", rc); goto cleanup_debug; } #endif rc = cfs_psdev_register(&libcfs_dev); if (rc) { CERROR("misc_register: error %d\n", rc); goto cleanup_lwt; } rc = cfs_wi_startup(); if (rc) { CERROR("startup workitem: error %d\n", rc); goto cleanup_deregister; } rc = insert_proc(); if (rc) { CERROR("insert_proc: error %d\n", rc); goto cleanup_wi; } CDEBUG (D_OTHER, "portals setup OK\n"); return (0); cleanup_wi: cfs_wi_shutdown(); cleanup_deregister: cfs_psdev_deregister(&libcfs_dev); cleanup_lwt: #if LWT_SUPPORT lwt_fini(); cleanup_debug: #endif libcfs_debug_cleanup(); return rc; }
static void exit_libcfs_module(void) { int rc; remove_proc(); CDEBUG(D_MALLOC, "before Portals cleanup: kmem %d\n", atomic_read(&libcfs_kmemory)); if (cfs_sched_rehash != NULL) { cfs_wi_sched_destroy(cfs_sched_rehash); cfs_sched_rehash = NULL; } cfs_crypto_unregister(); cfs_wi_shutdown(); rc = misc_deregister(&libcfs_dev); if (rc) CERROR("misc_deregister error %d\n", rc); #if LWT_SUPPORT lwt_fini(); #endif cfs_cpu_fini(); if (atomic_read(&libcfs_kmemory) != 0) CERROR("Portals memory leaked: %d bytes\n", atomic_read(&libcfs_kmemory)); rc = libcfs_debug_cleanup(); if (rc) printk(KERN_ERR "LustreError: libcfs_debug_cleanup: %d\n", rc); fini_rwsem(&ioctl_list_sem); fini_rwsem(&cfs_tracefile_sem); libcfs_arch_cleanup(); }
static int init_libcfs_module(void) { int rc; libcfs_arch_init(); libcfs_init_nidstrings(); init_rwsem(&cfs_tracefile_sem); mutex_init(&cfs_trace_thread_mutex); init_rwsem(&ioctl_list_sem); CFS_INIT_LIST_HEAD(&ioctl_list); init_waitqueue_head(&cfs_race_waitq); rc = libcfs_debug_init(5 * 1024 * 1024); if (rc < 0) { printk(KERN_ERR "LustreError: libcfs_debug_init: %d\n", rc); return (rc); } rc = cfs_cpu_init(); if (rc != 0) goto cleanup_debug; #if LWT_SUPPORT rc = lwt_init(); if (rc != 0) { CERROR("lwt_init: error %d\n", rc); goto cleanup_debug; } #endif rc = misc_register(&libcfs_dev); if (rc) { CERROR("misc_register: error %d\n", rc); goto cleanup_lwt; } rc = cfs_wi_startup(); if (rc) { CERROR("initialize workitem: error %d\n", rc); goto cleanup_deregister; } /* max to 4 threads, should be enough for rehash */ rc = min(cfs_cpt_weight(cfs_cpt_table, CFS_CPT_ANY), 4); rc = cfs_wi_sched_create("cfs_rh", cfs_cpt_table, CFS_CPT_ANY, rc, &cfs_sched_rehash); if (rc != 0) { CERROR("Startup workitem scheduler: error: %d\n", rc); goto cleanup_deregister; } rc = cfs_crypto_register(); if (rc) { CERROR("cfs_crypto_regster: error %d\n", rc); goto cleanup_wi; } rc = insert_proc(); if (rc) { CERROR("insert_proc: error %d\n", rc); goto cleanup_crypto; } CDEBUG (D_OTHER, "portals setup OK\n"); return 0; cleanup_crypto: cfs_crypto_unregister(); cleanup_wi: cfs_wi_shutdown(); cleanup_deregister: misc_deregister(&libcfs_dev); cleanup_lwt: #if LWT_SUPPORT lwt_fini(); #endif cleanup_debug: libcfs_debug_cleanup(); return rc; }