181 строка
4.8 KiB
C
181 строка
4.8 KiB
C
|
/* 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 <linux/module.h>
|
||
|
#include <linux/init.h>
|
||
|
#include <linux/sched.h>
|
||
|
#include <rxrpc/rxrpc.h>
|
||
|
#include <rxrpc/krxiod.h>
|
||
|
#include <rxrpc/krxsecd.h>
|
||
|
#include <rxrpc/krxtimod.h>
|
||
|
#include <rxrpc/transport.h>
|
||
|
#include <rxrpc/connection.h>
|
||
|
#include <rxrpc/call.h>
|
||
|
#include <rxrpc/message.h>
|
||
|
#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
|