Module: xenomai-forge Branch: next Commit: af73840304681802ce09e9551cf7dfc423354068 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=af73840304681802ce09e9551cf7dfc423354068
Author: Philippe Gerum <r...@xenomai.org> Date: Sat Jun 14 11:33:23 2014 +0200 doc: introduce dual kernel service tags --- doc/doxygen/manual-common.conf.in | 4 +- include/cobalt/kernel/timer.h | 2 +- kernel/cobalt/apc.c | 4 +- kernel/cobalt/bufd.c | 32 ++++++-------- kernel/cobalt/clock.c | 8 ++-- kernel/cobalt/heap.c | 21 +++------ kernel/cobalt/init.c | 34 ++++++++++++++- kernel/cobalt/intr.c | 18 +++----- kernel/cobalt/map.c | 16 +++---- kernel/cobalt/registry.c | 11 +++-- kernel/cobalt/sched.c | 4 +- kernel/cobalt/select.c | 12 +++--- kernel/cobalt/shadow.c | 18 ++++---- kernel/cobalt/synch.c | 86 +++++++++---------------------------- kernel/cobalt/thread.c | 31 +++++++------ kernel/cobalt/timer.c | 37 +++++++--------- kernel/cobalt/vfile.c | 27 ++++++------ 17 files changed, 161 insertions(+), 204 deletions(-) diff --git a/doc/doxygen/manual-common.conf.in b/doc/doxygen/manual-common.conf.in index 370d867..c99fb62 100644 --- a/doc/doxygen/manual-common.conf.in +++ b/doc/doxygen/manual-common.conf.in @@ -130,7 +130,8 @@ TAB_SIZE = 8 # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. -ALIASES = +ALIASES = \ + "coretags{1}=@par Tags\n@ref core-tags \"\1\"" # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. @@ -657,6 +658,7 @@ INCLUDE_FILE_PATTERNS = # omitted =1 is assumed. PREDEFINED = DOXYGEN_CPP \ + CONFIG_SMP \ "EXPORT_SYMBOL_GPL(symbol)=//" \ "COBALT_IMPL(T,I,A)=T I A" \ "COBALT_DECL(T,P)=T P" diff --git a/include/cobalt/kernel/timer.h b/include/cobalt/kernel/timer.h index 16e3d03..3e35960 100644 --- a/include/cobalt/kernel/timer.h +++ b/include/cobalt/kernel/timer.h @@ -392,7 +392,7 @@ void xntimer_destroy(struct xntimer *timer); * XN_INFINITE is returned if @a timer is currently disabled or * one shot. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted, atomic-entry} */ static inline xnticks_t xntimer_interval(struct xntimer *timer) { diff --git a/kernel/cobalt/apc.c b/kernel/cobalt/apc.c index 04816ef..c41853d 100644 --- a/kernel/cobalt/apc.c +++ b/kernel/cobalt/apc.c @@ -108,7 +108,7 @@ void apc_dispatch(unsigned int virq, void *arg) * * - -EBUSY is returned if no more APC slots are available. * - * @remark Tags: none. + * @coretags{unrestricted} */ int xnapc_alloc(const char *name, void (*handler)(void *cookie), void *cookie) @@ -148,7 +148,7 @@ EXPORT_SYMBOL_GPL(xnapc_alloc); * @param apc The APC id. to release, as returned by a successful call * to the xnapc_alloc() service. * - * @remark Tags: none. + * @coretags{unrestricted} */ void xnapc_free(int apc) { diff --git a/kernel/cobalt/bufd.c b/kernel/cobalt/bufd.c index 1a8b71f..d3a4f9b 100644 --- a/kernel/cobalt/bufd.c +++ b/kernel/cobalt/bufd.c @@ -162,7 +162,7 @@ * * @param len The length of the kernel buffer starting at @a ptr. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ /** @@ -180,9 +180,8 @@ * * @param len The length of the kernel buffer starting at @a ptr. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ - void xnbufd_map_kmem(struct xnbufd *bufd, void *ptr, size_t len) { bufd->b_ptr = ptr; @@ -210,7 +209,7 @@ EXPORT_SYMBOL_GPL(xnbufd_map_kmem); * * @param len The length of the user buffer starting at @a ptr. * - * @remark Tags: none. + * @coretags{task-unrestricted} */ /** @@ -230,7 +229,7 @@ EXPORT_SYMBOL_GPL(xnbufd_map_kmem); * * @param len The length of the user buffer starting at @a ptr. * - * @remark Tags: none. + * @coretags{task-unrestricted} */ void xnbufd_map_umem(struct xnbufd *bufd, void __user *ptr, size_t len) @@ -284,7 +283,7 @@ EXPORT_SYMBOL_GPL(xnbufd_map_umem); * an invalid context. This error is only returned when the debug * mode is disabled; otherwise a panic assertion is raised. * - * @remark Tags: none. + * @coretags{task-unrestricted} * * @note Calling this routine while holding the nklock and/or running * with interrupts disabled is invalid, and doing so will trigger a @@ -295,7 +294,6 @@ EXPORT_SYMBOL_GPL(xnbufd_map_umem); * xnbufd_copy_to_kmem() may only be called from a preemptible section * (Linux-wise). */ - ssize_t xnbufd_copy_to_kmem(void *to, struct xnbufd *bufd, size_t len) { caddr_t from; @@ -392,7 +390,7 @@ EXPORT_SYMBOL_GPL(xnbufd_copy_to_kmem); * - -ENOMEM is returned when no memory is available from the nucleus * heap to allocate the carry over buffer. * - * @remark Tags: none. + * @coretags{unrestricted} * * @note Calling this routine while holding the nklock and/or running * with interrupts disabled is invalid, and doing so will trigger a @@ -403,7 +401,6 @@ EXPORT_SYMBOL_GPL(xnbufd_copy_to_kmem); * xnbufd_copy_to_kmem() may only be called from a preemptible section * (Linux-wise). */ - ssize_t xnbufd_copy_from_kmem(struct xnbufd *bufd, void *from, size_t len) { caddr_t to; @@ -488,13 +485,12 @@ EXPORT_SYMBOL_GPL(xnbufd_copy_from_kmem); * @return The number of bytes read so far from the memory area * covered by @a ubufd. * - * @remark Tags: none. + * @coretags{task-unrestricted} * * @note Calling this routine while holding the nklock and/or running * with interrupts disabled is invalid, and doing so will trigger a * debug assertion. */ - ssize_t xnbufd_unmap_uread(struct xnbufd *bufd) { preemptible_only(); @@ -525,13 +521,12 @@ EXPORT_SYMBOL_GPL(xnbufd_unmap_uread); * @return The number of bytes written so far to the memory area * covered by @a ubufd. * - * @remark Tags: none. + * @coretags{task-unrestricted} * * @note Calling this routine while holding the nklock and/or running * with interrupts disabled is invalid, and doing so will trigger a * debug assertion. */ - ssize_t xnbufd_unmap_uwrite(struct xnbufd *bufd) { ssize_t ret = 0; @@ -574,7 +569,7 @@ EXPORT_SYMBOL_GPL(xnbufd_unmap_uwrite); * * @param bufd The address of the buffer descriptor to reset. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ /** @@ -595,9 +590,8 @@ EXPORT_SYMBOL_GPL(xnbufd_unmap_uwrite); * * @param bufd The address of the buffer descriptor to invalidate. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ - void xnbufd_invalidate(struct xnbufd *bufd) { #if XENO_DEBUG(NUCLEUS) @@ -624,9 +618,8 @@ EXPORT_SYMBOL_GPL(xnbufd_invalidate); * @return The number of bytes read so far from the memory area * covered by @a ubufd. * - * @remark Tags: isr-allowed. + * @coretags{task-unrestricted} */ - ssize_t xnbufd_unmap_kread(struct xnbufd *bufd) { #if XENO_DEBUG(NUCLEUS) @@ -648,9 +641,8 @@ EXPORT_SYMBOL_GPL(xnbufd_unmap_kread); * @return The number of bytes written so far to the memory area * covered by @a ubufd. * - * @remark Tags: isr-allowed. + * @coretags{task-unrestricted} */ - ssize_t xnbufd_unmap_kwrite(struct xnbufd *bufd) { #if XENO_DEBUG(NUCLEUS) diff --git a/kernel/cobalt/clock.c b/kernel/cobalt/clock.c index e0ea7d8..04faba2 100644 --- a/kernel/cobalt/clock.c +++ b/kernel/cobalt/clock.c @@ -298,7 +298,7 @@ static void adjust_clock_timers(struct xnclock *clock, xnsticks_t delta) * * @note This routine must be entered nklock locked, interrupts off. * - * @remark Tags: none. + * @coretags{task-unrestricted} * * @note Xenomai tracks the system time in @a nkclock, as a * monotonously increasing count of ticks since the epoch. The epoch @@ -475,7 +475,7 @@ static inline void cleanup_clock_proc(struct xnclock *clock) { } * * @param clock The new clock to register. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ int xnclock_register(struct xnclock *clock) { @@ -516,7 +516,7 @@ EXPORT_SYMBOL_GPL(xnclock_register); * * @param clock The clock to deregister. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ void xnclock_deregister(struct xnclock *clock) { @@ -546,7 +546,7 @@ EXPORT_SYMBOL_GPL(xnclock_deregister); * * @param clock The clock for which a new event was received. * - * @remark Tags: primary-only, isr-only, atomic-entry. + * @coretags{isr-only, atomic-entry} * * @note The current CPU must be part of the real-time affinity set, * otherwise weird things may happen. diff --git a/kernel/cobalt/heap.c b/kernel/cobalt/heap.c index ce6c596..9b104d3 100644 --- a/kernel/cobalt/heap.c +++ b/kernel/cobalt/heap.c @@ -256,9 +256,8 @@ static void init_extent(struct xnheap *heap, struct xnextent *extent) * * - -EINVAL is returned whenever a parameter is invalid. * - * @remark Tags: none. + * @coretags{task-unrestricted} */ - int xnheap_init(struct xnheap *heap, void *heapaddr, unsigned long heapsize, unsigned long pagesize) { @@ -355,9 +354,8 @@ EXPORT_SYMBOL_GPL(xnheap_init); * can be a format string, in which case succeeding parameters will be used * to resolve the final label. * - * @remark Tags: none. + * @coretags{task-unrestricted} */ - void xnheap_set_label(struct xnheap *heap, const char *label, ...) { va_list args; @@ -388,9 +386,8 @@ EXPORT_SYMBOL_GPL(xnheap_set_label); * @param cookie If @a flushfn is non-NULL, @a cookie is an opaque * pointer which will be passed unmodified to @a flushfn. * - * @remark Tags: none. + * @coretags{task-unrestricted} */ - void xnheap_destroy(struct xnheap *heap, void (*flushfn)(struct xnheap *heap, void *extaddr, @@ -545,9 +542,8 @@ splitpage: * @return The address of the allocated region upon success, or NULL * if no memory is available from the specified heap. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ - void *xnheap_alloc(struct xnheap *heap, unsigned long size) { unsigned long pagenum, bsize; @@ -675,9 +671,8 @@ EXPORT_SYMBOL_GPL(xnheap_alloc); * the block is not a valid region of the specified heap. Additional * return codes can also be defined locally by the @a ckfn routine. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ - int xnheap_test_and_free(struct xnheap *heap, void *block, int (*ckfn) (void *block)) { caddr_t freepage, lastpage, nextpage, tailpage, freeptr, *tailptr; @@ -878,9 +873,8 @@ EXPORT_SYMBOL_GPL(xnheap_test_and_free); * - -EINVAL is returned whenever the memory address does not * represent a valid block. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ - int xnheap_free(struct xnheap *heap, void *block) { return xnheap_test_and_free(heap, block, NULL); @@ -904,9 +898,8 @@ EXPORT_SYMBOL_GPL(xnheap_free); * @return 0 is returned upon success, or -EINVAL is returned if * @a extsize differs from the initial extent's size. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ - int xnheap_extend(struct xnheap *heap, void *extaddr, unsigned long extsize) { struct xnextent *extent = extaddr; diff --git a/kernel/cobalt/init.c b/kernel/cobalt/init.c index b4e60dd..a3b19e4 100644 --- a/kernel/cobalt/init.c +++ b/kernel/cobalt/init.c @@ -43,7 +43,6 @@ * such as handling interrupts, and scheduling real-time threads. The * nucleus has higher priority over all the native kernel activities. */ - MODULE_DESCRIPTION("Xenomai nucleus"); MODULE_AUTHOR("r...@xenomai.org"); MODULE_LICENSE("GPL"); @@ -467,3 +466,36 @@ fail: return ret; } device_initcall(xenomai_init); + +/** + * @ingroup core + * @page dual-kernel-core-tags Dual kernel service tags + * @anchor core-tags + * + * Xenomai core services in dual kernel configuration may be + * restricted to particular calling contexts, or entail specific + * side-effects. To describe this information, each service documented + * by this manual bears a set of tags when applicable. + * + * The table below matches the tags used throughout the documentation + * with the description of their meaning for the caller. + * + * @par + * <b>Context tags</b> + * <TABLE> + * <TR><TH>Tag</TH> <TH>Context on entry</TH></TR> + * <TR><TD>secondary-only</TD> <TD>Must be called from a regular Linux task</TD></TR> + * <TR><TD>primary-only</TD> <TD>Must be called from a hard real-time task</TD></TR> + * <TR><TD>isr-only</TD> <TD>Must be called from a hard real-time IRQ handler</TD></TR> + * <TR><TD>task-unrestricted</TD> <TD>May be called from a regular Linux or hard real-time task context indifferently</TD></TR> + * <TR><TD>unrestricted</TD> <TD>May be called from any context previously described</TD></TR> + * <TR><TD>atomic-entry</TD> <TD>Caller must currently hold the Xenomai nucleus big lock</TD></TR> + * </TABLE> + * + * @par + * <b>Possible side-effects</b> + * <TABLE> + * <TR><TH>Tag</TH> <TH>Description</TH></TR> + * <TR><TD>might-switch</TD> <TD>A thread context switch may happen in the Xenomai core</TD></TR> + * </TABLE> + */ diff --git a/kernel/cobalt/intr.c b/kernel/cobalt/intr.c index c8f34af..0118346 100644 --- a/kernel/cobalt/intr.c +++ b/kernel/cobalt/intr.c @@ -603,9 +603,8 @@ static void clear_irqstats(struct xnintr *intr) * @return 0 is returned on success. Otherwise, -EINVAL is returned if * @a irq is not a valid interrupt number. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ - int xnintr_init(struct xnintr *intr, const char *name, unsigned int irq, xnisr_t isr, xniack_t iack, int flags) @@ -644,7 +643,7 @@ EXPORT_SYMBOL_GPL(xnintr_init); * @param intr The descriptor address of the interrupt object to * destroy. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ void xnintr_destroy(struct xnintr *intr) { @@ -680,7 +679,7 @@ EXPORT_SYMBOL_GPL(xnintr_destroy); * @note The caller <b>must not</b> hold nklock when invoking this service, * this would cause deadlocks. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} * * @note Attaching an interrupt resets the tracked number of receipts * to zero. @@ -734,7 +733,7 @@ EXPORT_SYMBOL_GPL(xnintr_attach); * @note The caller <b>must not</b> hold nklock when invoking this * service, this would cause deadlocks. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ void xnintr_detach(struct xnintr *intr) { @@ -762,9 +761,8 @@ EXPORT_SYMBOL_GPL(xnintr_detach); * @param intr The descriptor address of the interrupt object to * enable. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ - void xnintr_enable(struct xnintr *intr) { secondary_mode_only(); @@ -784,9 +782,8 @@ EXPORT_SYMBOL_GPL(xnintr_enable); * @param intr The descriptor address of the interrupt object to * disable. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ - void xnintr_disable(struct xnintr *intr) { secondary_mode_only(); @@ -810,9 +807,8 @@ EXPORT_SYMBOL_GPL(xnintr_disable); * @note Depending on architectures, setting more than one bit in @a * cpumask could be meaningless. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ - void xnintr_affinity(struct xnintr *intr, cpumask_t cpumask) { secondary_mode_only(); diff --git a/kernel/cobalt/map.c b/kernel/cobalt/map.c index 95914a6..03a45dc 100644 --- a/kernel/cobalt/map.c +++ b/kernel/cobalt/map.c @@ -77,9 +77,8 @@ * @return the address of the new map is returned on success; * otherwise, NULL is returned if @a nkeys is invalid. * - * @remark Tags: none. + * @coretags{task-unrestricted} */ - struct xnmap *xnmap_create(int nkeys, int reserve, int offset) { struct xnmap *map; @@ -115,9 +114,8 @@ EXPORT_SYMBOL_GPL(xnmap_create); * * @param map The address of the map to delete. * - * @remark Tags: none. + * @coretags{task-unrestricted} */ - void xnmap_delete(struct xnmap *map) { xnfree(map); @@ -149,9 +147,8 @@ EXPORT_SYMBOL_GPL(xnmap_delete); * * - -ENOSPC when no more free key is available. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ - int xnmap_enter(struct xnmap *map, int key, void *objaddr) { int hi, lo, ofkey = key - map->offset; @@ -209,9 +206,8 @@ EXPORT_SYMBOL_GPL(xnmap_enter); * * - -ESRCH is returned if @a key is invalid. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ - int xnmap_remove(struct xnmap *map, int key) { int ofkey = key - map->offset, hi, lo; @@ -247,7 +243,7 @@ EXPORT_SYMBOL_GPL(xnmap_remove); * otherwise NULL is returned when @a key is invalid or no object is * currently indexed on it. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ /** @@ -265,7 +261,7 @@ EXPORT_SYMBOL_GPL(xnmap_remove); * otherwise NULL is returned when no object is currently indexed on * @a key. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ /** @} */ diff --git a/kernel/cobalt/registry.c b/kernel/cobalt/registry.c index acb9306..dc196dd 100644 --- a/kernel/cobalt/registry.c +++ b/kernel/cobalt/registry.c @@ -618,7 +618,7 @@ static inline int registry_wakeup_sleepers(const char *key) * * - -EEXIST is returned if the @a key is already in use. * - * @remark Tags: might-switch. + * @coretags{unrestricted, might-switch, atomic-entry} */ int xnregistry_enter(const char *key, void *objaddr, xnhandle_t *phandle, struct xnpnode *pnode) @@ -729,7 +729,7 @@ EXPORT_SYMBOL_GPL(xnregistry_enter); * - -ETIMEDOUT is returned if the object cannot be retrieved within * the specified amount of time. * - * @remark Tags: primary-only, might-switch. + * @coretags{primary-only, might-switch} */ int xnregistry_bind(const char *key, xnticks_t timeout, int timeout_mode, xnhandle_t *phandle) @@ -799,9 +799,8 @@ EXPORT_SYMBOL_GPL(xnregistry_bind); * - -ESRCH is returned if @a handle does not reference a registered * object. * - * @remark Tags: none. + * @coretags{unrestricted} */ - int xnregistry_remove(xnhandle_t handle) { struct xnobject *object; @@ -851,7 +850,7 @@ EXPORT_SYMBOL_GPL(xnregistry_remove); /** * Turn a named object into an anonymous object * - * @remark Tags: none. + * @coretags{unrestricted} */ int xnregistry_unlink(const char *key) { @@ -914,7 +913,7 @@ unlock_and_exit: * on success. Otherwise, NULL is returned if @a handle does not * reference a registered object. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ /** @} */ diff --git a/kernel/cobalt/sched.c b/kernel/cobalt/sched.c index b3c0935..d89e0e8 100644 --- a/kernel/cobalt/sched.c +++ b/kernel/cobalt/sched.c @@ -96,7 +96,7 @@ MODULE_PARM_DESC(watchdog_timeout, "Watchdog timeout (s)"); * software lockups. It kills any offending thread which is found to * monopolize the CPU so as to starve the Linux kernel for too long. * - * @remark Tags: primary-only, isr-only, atomic-entry. + * @coretags{isr-only, atomic-entry} */ static void watchdog_handler(struct xntimer *timer) { @@ -734,7 +734,7 @@ static inline void switch_context(struct xnsched *sched, * @return Non-zero is returned if a context switch actually happened, * otherwise zero if the current thread was left running. * - * @remark Tags: none. + * @coretags{unrestricted} */ static inline int test_resched(struct xnsched *sched) { diff --git a/kernel/cobalt/select.c b/kernel/cobalt/select.c index 9cce93c..036d25c 100644 --- a/kernel/cobalt/select.c +++ b/kernel/cobalt/select.c @@ -63,7 +63,7 @@ static int deletion_apc; * * @param select_block pointer to the xnselect structure to be initialized * - * @remark Tags: none. + * @coretags{task-unrestricted} */ void xnselect_init(struct xnselect *select_block) { @@ -105,7 +105,7 @@ static inline int xnselect_wakeup(struct xnselector *selector) * @retval -EINVAL if @a type or @a index is invalid; * @retval 0 otherwise. * - * @remark Tags: might-switch, atomic-entry. + * @coretags{task-unrestricted, might-switch, atomic-entry} */ int xnselect_bind(struct xnselect *select_block, struct xnselect_binding *binding, @@ -172,7 +172,7 @@ EXPORT_SYMBOL_GPL(__xnselect_signal); * @param select_block pointer to the @a xnselect structure associated * with a file descriptor * - * @remark Tags: might-switch. + * @coretags{task-unrestricted, might-switch} */ void xnselect_destroy(struct xnselect *select_block) { @@ -280,7 +280,7 @@ static unsigned fd_set_popcount(fd_set *set, unsigned n) * * @retval 0 * - * @remark Tags: none. + * @coretags{task-unrestricted} */ int xnselector_init(struct xnselector *selector) { @@ -320,7 +320,7 @@ EXPORT_SYMBOL_GPL(xnselector_init); * @retval 0 in case of timeout. * @retval the number of file descriptors having received an event. * - * @remark Tags: might-switch. + * @coretags{primary-only, might-switch} */ int xnselect(struct xnselector *selector, fd_set *out_fds[XNSELECT_MAX_TYPES], @@ -394,7 +394,7 @@ EXPORT_SYMBOL_GPL(xnselect); * * @param selector the selector block to be destroyed * - * @remark Tags: none. + * @coretags{task-unrestricted} */ void xnselector_destroy(struct xnselector *selector) { diff --git a/kernel/cobalt/shadow.c b/kernel/cobalt/shadow.c index 23c322b..e234924 100644 --- a/kernel/cobalt/shadow.c +++ b/kernel/cobalt/shadow.c @@ -449,7 +449,7 @@ void ipipe_migration_hook(struct task_struct *p) /* hw IRQs off */ * domain to Xenomai. The shadow will resume in the Xenomai domain as * returning from schedule(). * - * @remark Tags: secondary-only, might-switch. + * @coretags{secondary-only, might-switch} */ int xnshadow_harden(void) { @@ -522,7 +522,7 @@ EXPORT_SYMBOL_GPL(xnshadow_harden); * * @param reason The reason to report along with the SIGDEBUG signal. * - * @remark Tags: primary-only, might-switch. + * @coretags{primary-only, might-switch} * * @note "current" is valid here since the shadow runs with the * properties of the Linux task. @@ -878,7 +878,7 @@ static unsigned long mayday_unmapped_area(struct file *file, * - -EBUSY is returned if either the current Linux task or the * associated shadow thread is already involved in a shadow mapping. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ int xnshadow_map_user(struct xnthread *thread, unsigned long __user *u_window_offset) @@ -1020,7 +1020,7 @@ static inline void wakeup_parent(struct completion *done) * - -EBUSY is returned if either the current Linux task or the * associated shadow thread is already involved in a shadow mapping. * - * @remark Tags: secondary-only, might-switch. + * @coretags{secondary-only, might-switch} */ int xnshadow_map_kernel(struct xnthread *thread, struct completion *done) { @@ -1686,7 +1686,7 @@ EXPORT_SYMBOL_GPL(xnshadow_send_sig); * personality. This handler is passed a pointer to the per-process * data received earlier from the ops->attach_process() handler. * - * @remark Tags: none. + * @coretags{secondary-only} */ int xnshadow_register_personality(struct xnpersonality *personality) { @@ -1714,7 +1714,7 @@ EXPORT_SYMBOL_GPL(xnshadow_register_personality); /* * @brief Unregister an interface personality. * - * @remark Tags: none. + * @coretags{secondary-only} */ int xnshadow_unregister_personality(int muxid) { @@ -1753,7 +1753,7 @@ EXPORT_SYMBOL_GPL(xnshadow_unregister_personality); * @return the per-process data if the current context is a user-space * process; @return NULL otherwise. * - * @remark Tags: atomic-entry. + * @coretags{task-unrestricted, atomic-entry} */ void *xnshadow_get_context(unsigned int muxid) { @@ -1775,7 +1775,7 @@ EXPORT_SYMBOL_GPL(xnshadow_get_context); * save this handle for unstacking @a muxid when applicable via a call * to xnshadow_pop_personality(). * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ struct xnpersonality * xnshadow_push_personality(int muxid) @@ -1817,7 +1817,7 @@ EXPORT_SYMBOL_GPL(xnshadow_push_personality); * @param prev the previous personality which was returned by the * latest call to xnshadow_push_personality() for the current thread. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ void xnshadow_pop_personality(struct xnpersonality *prev) { diff --git a/kernel/cobalt/synch.c b/kernel/cobalt/synch.c index 565ffc6..eee10c7 100644 --- a/kernel/cobalt/synch.c +++ b/kernel/cobalt/synch.c @@ -75,7 +75,7 @@ * valid fast-lock address is required if XNSYNCH_OWNER is set in @a * flags. * - * @remark Tags: none. + * @coretags{task-unrestricted} */ void xnsynch_init(struct xnsynch *synch, int flags, atomic_long_t *fastlock) { @@ -129,7 +129,7 @@ EXPORT_SYMBOL_GPL(xnsynch_init); * caller, for detecting respectively: object deletion, timeout or * signal/unblock conditions which might have happened while waiting. * - * @remark Tags: might-switch. + * @coretags{primary-only, might-switch} */ int xnsynch_sleep_on(struct xnsynch *synch, xnticks_t timeout, xntmode_t timeout_mode) @@ -178,7 +178,7 @@ EXPORT_SYMBOL_GPL(xnsynch_sleep_on); * * @return The descriptor address of the unblocked thread. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ struct xnthread *xnsynch_wakeup_one_sleeper(struct xnsynch *synch) { @@ -254,7 +254,7 @@ EXPORT_SYMBOL_GPL(xnsynch_wakeup_many_sleepers); * @param sleeper The thread to unblock which MUST be currently linked * to the synchronization object's pending queue (i.e. synch->pendq). * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ void xnsynch_wakeup_this_sleeper(struct xnsynch *synch, struct xnthread *sleeper) { @@ -330,7 +330,7 @@ static void xnsynch_renice_thread(struct xnthread *thread, * caller, for detecting respectively: object deletion, timeout or * signal/unblock conditions which might have happened while waiting. * - * @remark Tags: might-switch. + * @coretags{primary-only, might-switch} */ int xnsynch_acquire(struct xnsynch *synch, xnticks_t timeout, xntmode_t timeout_mode) @@ -474,22 +474,6 @@ out: } EXPORT_SYMBOL_GPL(xnsynch_acquire); -/** - * @internal - * @fn void clear_boost(struct xnsynch *synch, struct xnthread *owner); - * @brief Clear the priority boost. - * - * This service is called internally whenever a synchronization object - * is not claimed anymore by sleepers to reset the object owner's - * priority to its initial level. - * - * @param synch The descriptor address of the synchronization object. - * - * @param owner The descriptor address of the thread which - * currently owns the synchronization object. - * - * @remark Tags: atomic-entry. - */ static void clear_boost(struct xnsynch *synch, struct xnthread *owner) { struct xnthread *target; @@ -586,7 +570,7 @@ static struct xnthread *transfer_ownership(struct xnsynch *synch, * - The synchronization object ownership is transfered to the * unblocked thread. * - * @remark Tags: none. + * @coretags{primary-only, might-switch} */ struct xnthread *xnsynch_release(struct xnsynch *synch, struct xnthread *thread) @@ -615,24 +599,15 @@ struct xnthread *xnsynch_release(struct xnsynch *synch, } EXPORT_SYMBOL_GPL(xnsynch_release); -/** - * @internal - * @fn void xnsynch_requeue_sleeper(struct xnthread *thread); - * @brief Change a sleeper's priority. - * - * This service is used by the PIP code to update the pending priority - * of a sleeping thread. - * - * @param thread The descriptor address of the affected thread. - * - * @remark Tags: atomic-entry. - */ - void xnsynch_requeue_sleeper(struct xnthread *thread) { struct xnsynch *synch = thread->wchan; struct xnthread *owner; + /* + * Update the position of a thread waiting for a lock w/ PIP + * enabled. + */ if ((synch->status & XNSYNCH_PRIO) == 0) return; @@ -687,7 +662,7 @@ EXPORT_SYMBOL_GPL(xnsynch_requeue_sleeper); * * @return The descriptor address of the unblocked thread. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ struct xnthread *xnsynch_peek_pendq(struct xnsynch *synch) { @@ -746,9 +721,8 @@ EXPORT_SYMBOL_GPL(xnsynch_peek_pendq); * * - The synchronization object is no more owned by any thread. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted} */ - int xnsynch_flush(struct xnsynch *synch, int reason) { struct xnthread *sleeper, *tmp; @@ -780,24 +754,15 @@ int xnsynch_flush(struct xnsynch *synch, int reason) } EXPORT_SYMBOL_GPL(xnsynch_flush); -/** - * @internal - * @fn void xnsynch_forget_sleeper(struct xnthread *thread); - * @brief Abort a wait for a resource. - * - * Performs all the necessary housekeeping chores to stop a thread - * from waiting on a given synchronization object. - * - * @param thread The descriptor address of the affected thread. - * - * @remark Tags: atomic-entry. - */ - void xnsynch_forget_sleeper(struct xnthread *thread) { struct xnsynch *synch = thread->wchan, *nsynch; struct xnthread *owner, *target; + /* + * Do all the necessary housekeeping chores to stop a thread + * from waiting on a given synchronization object. + */ trace_cobalt_synch_forget(synch); xnthread_clear_state(thread, XNPEND); @@ -836,24 +801,15 @@ void xnsynch_forget_sleeper(struct xnthread *thread) } EXPORT_SYMBOL_GPL(xnsynch_forget_sleeper); -/** - * @internal - * @fn void xnsynch_release_all_ownerships(struct xnthread *thread); - * @brief Release all ownerships. - * - * This call is used internally to release all the ownerships obtained - * by a thread on synchronization objects. This routine must be - * entered interrupts off. - * - * @param thread The descriptor address of the affected thread. - * - * @remark Tags: atomic-entry. - */ - void xnsynch_release_all_ownerships(struct xnthread *thread) { struct xnsynch *synch, *tmp; + /* + * Release all the ownerships obtained by a thread on + * synchronization objects. This routine must be entered + * interrupts off. + */ xnthread_for_each_claimed_safe(synch, tmp, thread) { xnsynch_release(synch, thread); if (synch->cleanup) diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c index e06f130..bd6d497 100644 --- a/kernel/cobalt/thread.c +++ b/kernel/cobalt/thread.c @@ -541,7 +541,7 @@ void __xnthread_cleanup(struct xnthread *curr) * - -EINVAL is returned if @a attr->flags has invalid bits set, or @a * attr->affinity is invalid (e.g. empty). * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ int xnthread_init(struct xnthread *thread, const struct xnthread_init_attr *attr, @@ -622,7 +622,7 @@ EXPORT_SYMBOL_GPL(xnthread_init); * * @retval -EBUSY if @a thread was not dormant or stopped ; * - * @remark Tags: might-switch. + * @coretags{task-unrestricted, might-switch} */ int xnthread_start(struct xnthread *thread, const struct xnthread_start_attr *attr) @@ -685,7 +685,7 @@ EXPORT_SYMBOL_GPL(xnthread_start); * temporarily for sleeping. If this mode bit is set, such thread * would return immediately with XNBREAK set from xnthread_suspend(). * - * @remark Tags: might-switch. + * @coretags{task-unrestricted, might-switch} * * @note Setting @a clrmask and @a setmask to zero leads to a nop, * only returning the previous mode if @a mode_r is a valid address. @@ -783,7 +783,7 @@ EXPORT_SYMBOL_GPL(xnthread_set_mode); * then this service immediately exits without suspending the thread, * but raises the XNBREAK condition in its information mask. * - * @remark Tags: isr-allowed, might-switch. + * @coretags{unrestricted, might-switch} */ void xnthread_suspend(struct xnthread *thread, int mask, xnticks_t timeout, xntmode_t timeout_mode, @@ -993,7 +993,7 @@ EXPORT_SYMBOL_GPL(xnthread_suspend); * - XNBREAK means that the wait has been forcibly broken by a call to * xnthread_unblock(). * - * @remark Tags: isr-allowed. + * @coretags{unrestricted, might-switch} */ void xnthread_resume(struct xnthread *thread, int mask) { @@ -1111,7 +1111,7 @@ EXPORT_SYMBOL_GPL(xnthread_resume); * @return non-zero is returned if the thread was actually unblocked * from a pending wait state, 0 otherwise. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted, might-switch} */ int xnthread_unblock(struct xnthread *thread) { @@ -1198,7 +1198,7 @@ EXPORT_SYMBOL_GPL(xnthread_unblock); * returned if @a timeout_mode is not compatible with @a idate, such * as XN_RELATIVE with @a idate different from XN_INFINITE. * - * @remark Tags: none. + * @coretags{task-unrestricted} */ int xnthread_set_periodic(struct xnthread *thread, xnticks_t idate, xntmode_t timeout_mode, xnticks_t period) @@ -1276,7 +1276,7 @@ EXPORT_SYMBOL_GPL(xnthread_set_periodic); * calling thread. If @a overruns_r is valid, the count of pending * overruns is copied to the pointed memory location. * - * @remark Tags: primary-only, might-sleep. + * @coretags{primary-only, might-switch} */ int xnthread_wait_period(unsigned long *overruns_r) { @@ -1350,7 +1350,7 @@ EXPORT_SYMBOL_GPL(xnthread_wait_period); * - @a quantum is smaller than the master clock gravity, which * denotes a spurious value. * - * @remark Tags: none. + * @coretags{task-unrestricted} */ int xnthread_set_slice(struct xnthread *thread, xnticks_t quantum) { @@ -1402,7 +1402,7 @@ EXPORT_SYMBOL_GPL(xnthread_set_slice); * * @param thread The descriptor address of the thread to terminate. * - * @remark Tags: might-switch. + * @coretags{task-unrestricted, might-switch} */ void xnthread_cancel(struct xnthread *thread) { @@ -1477,7 +1477,7 @@ EXPORT_SYMBOL_GPL(xnthread_cancel); * - -EBUSY indicates that another thread is already waiting for @a * thread to terminate. * - * @remark Tags: might-switch. + * @coretags{task-unrestricted, might-switch} */ int xnthread_join(struct xnthread *thread, bool uninterruptible) { @@ -1544,6 +1544,8 @@ out: } EXPORT_SYMBOL_GPL(xnthread_join); +#ifdef CONFIG_SMP + /** * @fn int xnthread_migrate(int cpu) * @brief Migrate the current thread. @@ -1560,11 +1562,8 @@ EXPORT_SYMBOL_GPL(xnthread_join); * @retval -EINVAL if the current thread affinity forbids this * migration. * - * @remark Tags: might-switch. + * @coretags{primary-only, might-switch} */ - -#ifdef CONFIG_SMP - int xnthread_migrate(int cpu) { struct xnthread *thread; @@ -1683,7 +1682,7 @@ void xnthread_migrate_passive(struct xnthread *thread, struct xnsched *sched) * or ready thread moves it to the end of the runnable queue, thus * causing a manual round-robin. * - * @remark Tags: none. + * @coretags{task-unregistred} * * @note The changes only apply to the Xenomai scheduling parameters * for @a thread. There is no propagation/translation of such changes diff --git a/kernel/cobalt/timer.c b/kernel/cobalt/timer.c index 4e0cbca..519ac8e 100644 --- a/kernel/cobalt/timer.c +++ b/kernel/cobalt/timer.c @@ -97,7 +97,7 @@ int xntimer_heading_p(struct xntimer *timer) * @return 0 is returned upon success, or -ETIMEDOUT if an absolute * date in the past has been given. * - * @remark Tags: atomic-entry. + * @coretags{unrestricted, atomic-entry} */ int xntimer_start(struct xntimer *timer, xnticks_t value, xnticks_t interval, @@ -170,7 +170,7 @@ EXPORT_SYMBOL_GPL(xntimer_start); * * @param timer The address of a valid timer descriptor. * - * @remark Tags: atomic-entry, isr-allowed. + * @coretags{unrestricted, atomic-entry} */ void __xntimer_stop(struct xntimer *timer) { @@ -208,7 +208,7 @@ EXPORT_SYMBOL_GPL(__xntimer_stop); * @return The expiration date in nanoseconds. The special value * XN_INFINITE is returned if @a timer is currently disabled. * - * @remark Tags: isr-allowed. + * @coretags{unrestricted, atomic-entry} */ xnticks_t xntimer_get_date(struct xntimer *timer) { @@ -236,7 +236,7 @@ EXPORT_SYMBOL_GPL(xntimer_get_date); * the associated handler has not been fired yet); in such a case, 1 * is returned. * - * @remark Tags: irqs-off, isr-allowed. + * @coretags{unrestricted, atomic-entry} */ xnticks_t xntimer_get_timeout(struct xntimer *timer) { @@ -284,7 +284,7 @@ EXPORT_SYMBOL_GPL(xntimer_get_timeout); * There is no limitation on the number of timers which can be * created/active concurrently. * - * @remark Tags: none. + * @coretags{unrestricted} */ #ifdef DOXYGEN_CPP void xntimer_init(struct xntimer *timer, struct xnclock *clock, @@ -371,7 +371,7 @@ EXPORT_SYMBOL_GPL(xntimer_switch_tracking); * * @param timer The address of a valid timer descriptor. * - * @remark Tags: none. + * @coretags{unrestricted} */ void xntimer_destroy(struct xntimer *timer) { @@ -396,16 +396,16 @@ EXPORT_SYMBOL_GPL(xntimer_destroy); /** * Migrate a timer. * - * This call migrates a timer to another cpu. In order to avoid pathological - * cases, it must be called from the CPU to which @a timer is currently - * attached. + * This call migrates a timer to another cpu. In order to avoid + * pathological cases, it must be called from the CPU to which @a + * timer is currently attached. * * @param timer The address of the timer object to be migrated. * * @param sched The address of the destination per-CPU scheduler * slot. * - * @remark Tags: atomic-entry. + * @coretags{unrestricted, atomic-entry} */ void __xntimer_migrate(struct xntimer *timer, struct xnsched *sched) { /* nklocked, IRQs off */ @@ -461,7 +461,7 @@ void xntimer_release_ipi(void) * * @return the number of overruns of @a timer at date @a now * - * @remark Tags: irqs-off, isr-allowed. + * @coretags{unrestricted, atomic-entry} */ unsigned long long xntimer_get_overruns(struct xntimer *timer, xnticks_t now) { @@ -531,14 +531,7 @@ EXPORT_SYMBOL_GPL(xntimer_format_time); * * @param cdev An pointer to the clock device which notifies us. * - * Environment: - * - * This routine is a callback invoked from the kernel's clock event - * handlers. - * - * @note GENERIC_CLOCKEVENTS is required from the host kernel. - * - * @remark Tags: none. + * @coretags{unrestricted} */ static int program_htick_shot(unsigned long delay, struct clock_event_device *cdev) @@ -580,7 +573,7 @@ static int program_htick_shot(unsigned long delay, * * @param cdev An opaque pointer to the clock device which notifies us. * - * @remark Tags: none. + * @coretags{unrestricted} * * @note GENERIC_CLOCKEVENTS is required from the host kernel. */ @@ -643,7 +636,7 @@ static void switch_htick_mode(enum clock_event_mode mode, * invalid calibration results; in such a case, such hardware is * unusable for any timing duties. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ int xntimer_grab_hardware(int cpu) { @@ -690,7 +683,7 @@ int xntimer_grab_hardware(int cpu) * * @param cpu The CPU number the timer was grabbed from. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ void xntimer_release_hardware(int cpu) { diff --git a/kernel/cobalt/vfile.c b/kernel/cobalt/vfile.c index 10966fc..2f7c6fb 100644 --- a/kernel/cobalt/vfile.c +++ b/kernel/cobalt/vfile.c @@ -378,12 +378,11 @@ static struct file_operations vfile_snapshot_fops = { * change to the data which may be part of the collected records, * should also invoke xnvfile_touch() on the associated tag. * - * - entry.lockops is a pointer to a @ref vfile_lockops "locking - * descriptor", defining the lock and unlock operations for the - * vfile. This pointer may be left to NULL, in which case the - * operations on the nucleus lock (i.e. nklock) will be used - * internally around calls to data collection handlers (see @ref - * snapshot_ops "operation descriptor"). + * - entry.lockops is a pointer to a @ref vfile_lockops "lock descriptor", + * defining the lock and unlock operations for the vfile. This pointer + * may be left to NULL, in which case the operations on the nucleus + * lock (i.e. nklock) will be used internally around calls to data + * collection handlers (see @ref snapshot_ops "operation descriptor"). * * - .ops is a pointer to an @ref snapshot_ops "operation descriptor". * @@ -397,7 +396,7 @@ static struct file_operations vfile_snapshot_fops = { * - -ENOMEM is returned if the virtual file entry cannot be created * in the /proc hierarchy. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ int xnvfile_init_snapshot(const char *name, struct xnvfile_snapshot *vfile, @@ -637,7 +636,7 @@ static struct file_operations vfile_regular_fops = { * - -ENOMEM is returned if the virtual file entry cannot be created * in the /proc hierarchy. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ int xnvfile_init_regular(const char *name, struct xnvfile_regular *vfile, @@ -681,7 +680,7 @@ EXPORT_SYMBOL_GPL(xnvfile_init_regular); * - -ENOMEM is returned if the virtual directory entry cannot be * created in the /proc hierarchy. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ int xnvfile_init_dir(const char *name, struct xnvfile_directory *vdir, @@ -728,7 +727,7 @@ EXPORT_SYMBOL_GPL(xnvfile_init_dir); * - -ENOMEM is returned if the virtual link entry cannot be created * in the /proc hierarchy. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ int xnvfile_init_link(const char *from, const char *to, @@ -760,7 +759,7 @@ EXPORT_SYMBOL_GPL(xnvfile_init_link); * @param vfile A pointer to the virtual file descriptor to * remove. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ void xnvfile_destroy(struct xnvfile *vfile) { @@ -793,7 +792,7 @@ EXPORT_SYMBOL_GPL(xnvfile_destroy); * * - -EFAULT indicates an invalid source buffer address. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ ssize_t xnvfile_get_blob(struct xnvfile_input *input, void *data, size_t size) @@ -837,7 +836,7 @@ EXPORT_SYMBOL_GPL(xnvfile_get_blob); * * - -EFAULT indicates an invalid source buffer address. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ ssize_t xnvfile_get_string(struct xnvfile_input *input, char *s, size_t maxlen) @@ -889,7 +888,7 @@ EXPORT_SYMBOL_GPL(xnvfile_get_string); * * - -EFAULT indicates an invalid source buffer address. * - * @remark Tags: secondary-only. + * @coretags{secondary-only} */ ssize_t xnvfile_get_integer(struct xnvfile_input *input, long *valp) { _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git