|
|
1.1 ! root 1: #ifndef __KERNEL_DEFER_H__ ! 2: #define __KERNEL_DEFER_H__ ! 3: ! 4: /* ! 5: *-IMPORTS: ! 6: * <common/ccompat.h> ! 7: * __EXTERN_C_BEGIN__ ! 8: * __EXTERN_C_END__ ! 9: * __PROTO () ! 10: * <common/_cpuid.h> ! 11: * processorid_t ! 12: */ ! 13: ! 14: #include <common/ccompat.h> ! 15: #include <kernel/_cpuid.h> ! 16: #include <kernel/_defer.h> ! 17: ! 18: /* ! 19: * An interesting facility is used in the Coherent kernel; called defer (), it ! 20: * requests that a function (with a single argument) be called before return ! 21: * to user level. It's a useful facility, but need some work to be useful for ! 22: * a multiprocessor system. At the same time, it seems like a good idea to ! 23: * alter it a litte; unfortunately, the facility suffers severe abuse from (a) ! 24: * being used to solve problems of poor design such as not having interrupts ! 25: * prioritized, and (b) being used as a global "solution" for synchronization ! 26: * issues by moving parts of interrupt code out into base level, where no ! 27: * thought need be given to synchronization. In this system, (a) has been ! 28: * dealt with properly, and (b) synchronization issues *must* be dealt with in ! 29: * a multiprocessor system properly. ! 30: * ! 31: * The version presented here has two aims; as a general mechanism for ! 32: * deferring activity for "return to user level" time to reduce interrupt ! 33: * latency, and as a mechanism for binding activities to specific processors. ! 34: * A benefit of using this approach is simplifying the complex set of "before ! 35: * we return to user level" features. ! 36: * ! 37: * Note that this version does not permit callback functions to take any ! 38: * parameters, thus avoiding type problems (see bufcall () for some of these ! 39: * that AT&T have foisted on us) and also discourages using it in fashion (b) ! 40: * above. This could be changed if we find a genuine reason. ! 41: */ ! 42: ! 43: ! 44: __EXTERN_C_BEGIN__ ! 45: ! 46: int defer_int_cpu __PROTO ((__deffuncp_t _funcp, ! 47: processorid_t _cpuid)); ! 48: int defer_int_any __PROTO ((__deffuncp_t _funcp)); ! 49: int defer_int_here __PROTO ((__deffuncp_t _funcp)); ! 50: ! 51: int defer_proc_cpu __PROTO ((__deffuncp_t _funcp, ! 52: processorid_t _cpuid)); ! 53: int defer_proc_any __PROTO ((__deffuncp_t _funcp)); ! 54: int defer_proc_here __PROTO ((__deffuncp_t _funcp)); ! 55: ! 56: __EXTERN_C_END__ ! 57: ! 58: ! 59: #endif /* ! defined (__KERNEL_DEFER_H__) */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.