/* main.c: Rx RPC interface * * Copyright (C) 2002 Red Hat, Inc. All Rights Reserved. * Written by David Howells (dhowells@redhat.com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include "internal.h" MODULE_DESCRIPTION("Rx RPC implementation"); MODULE_AUTHOR("Red Hat, Inc."); MODULE_LICENSE("GPL"); __be32 rxrpc_epoch; /*****************************************************************************/ /* * initialise the Rx module */ static int __init rxrpc_initialise(void) { int ret; /* my epoch value */ rxrpc_epoch = htonl(xtime.tv_sec); /* register the /proc interface */ #ifdef CONFIG_PROC_FS ret = rxrpc_proc_init(); if (ret<0) return ret; #endif /* register the sysctl files */ #ifdef CONFIG_SYSCTL ret = rxrpc_sysctl_init(); if (ret<0) goto error_proc; #endif /* start the krxtimod daemon */ ret = rxrpc_krxtimod_start(); if (ret<0) goto error_sysctl; /* start the krxiod daemon */ ret = rxrpc_krxiod_init(); if (ret<0) goto error_krxtimod; /* start the krxsecd daemon */ ret = rxrpc_krxsecd_init(); if (ret<0) goto error_krxiod; kdebug("\n\n"); return 0; error_krxiod: rxrpc_krxiod_kill(); error_krxtimod: rxrpc_krxtimod_kill(); error_sysctl: #ifdef CONFIG_SYSCTL rxrpc_sysctl_cleanup(); #endif error_proc: #ifdef CONFIG_PROC_FS rxrpc_proc_cleanup(); #endif return ret; } /* end rxrpc_initialise() */ module_init(rxrpc_initialise); /*****************************************************************************/ /* * clean up the Rx module */ static void __exit rxrpc_cleanup(void) { kenter(""); __RXACCT(printk("Outstanding Messages : %d\n", atomic_read(&rxrpc_message_count))); __RXACCT(printk("Outstanding Calls : %d\n", atomic_read(&rxrpc_call_count))); __RXACCT(printk("Outstanding Connections: %d\n", atomic_read(&rxrpc_connection_count))); __RXACCT(printk("Outstanding Peers : %d\n", atomic_read(&rxrpc_peer_count))); __RXACCT(printk("Outstanding Transports : %d\n", atomic_read(&rxrpc_transport_count))); rxrpc_krxsecd_kill(); rxrpc_krxiod_kill(); rxrpc_krxtimod_kill(); #ifdef CONFIG_SYSCTL rxrpc_sysctl_cleanup(); #endif #ifdef CONFIG_PROC_FS rxrpc_proc_cleanup(); #endif __RXACCT(printk("Outstanding Messages : %d\n", atomic_read(&rxrpc_message_count))); __RXACCT(printk("Outstanding Calls : %d\n", atomic_read(&rxrpc_call_count))); __RXACCT(printk("Outstanding Connections: %d\n", atomic_read(&rxrpc_connection_count))); __RXACCT(printk("Outstanding Peers : %d\n", atomic_read(&rxrpc_peer_count))); __RXACCT(printk("Outstanding Transports : %d\n", atomic_read(&rxrpc_transport_count))); kleave(""); } /* end rxrpc_cleanup() */ module_exit(rxrpc_cleanup); /*****************************************************************************/ /* * clear the dead space between task_struct and kernel stack * - called by supplying -finstrument-functions to gcc */ #if 0 void __cyg_profile_func_enter (void *this_fn, void *call_site) __attribute__((no_instrument_function)); void __cyg_profile_func_enter (void *this_fn, void *call_site) { asm volatile(" movl %%esp,%%edi \n" " andl %0,%%edi \n" " addl %1,%%edi \n" " movl %%esp,%%ecx \n" " subl %%edi,%%ecx \n" " shrl $2,%%ecx \n" " movl $0xedededed,%%eax \n" " rep stosl \n" : : "i"(~(THREAD_SIZE-1)), "i"(sizeof(struct thread_info)) : "eax", "ecx", "edi", "memory", "cc" ); } void __cyg_profile_func_exit(void *this_fn, void *call_site) __attribute__((no_instrument_function)); void __cyg_profile_func_exit(void *this_fn, void *call_site) { asm volatile(" movl %%esp,%%edi \n" " andl %0,%%edi \n" " addl %1,%%edi \n" " movl %%esp,%%ecx \n" " subl %%edi,%%ecx \n" " shrl $2,%%ecx \n" " movl $0xdadadada,%%eax \n" " rep stosl \n" : : "i"(~(THREAD_SIZE-1)), "i"(sizeof(struct thread_info)) : "eax", "ecx", "edi", "memory", "cc" ); } #endif