Module: xenomai-forge Branch: master Commit: 33b2db693294e6ccea864691779aa5135865c1d7 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=33b2db693294e6ccea864691779aa5135865c1d7
Author: Philippe Gerum <r...@xenomai.org> Date: Fri Aug 31 10:23:39 2012 +0200 cobalt/generic: fix up for kernel 3.5 series --- include/asm-generic/wrappers.h | 49 ++++++++++++----------------------- include/cobalt/nucleus/select.h | 53 ++++++++++++++++++++++++++++++++++++++- kernel/cobalt/nucleus/select.c | 50 ++++++++++++++++++------------------ kernel/cobalt/nucleus/shadow.c | 4 +-- kernel/cobalt/rtdm/drvlib.c | 6 +--- kernel/cobalt/syscall.c | 6 ++-- 6 files changed, 100 insertions(+), 68 deletions(-) diff --git a/include/asm-generic/wrappers.h b/include/asm-generic/wrappers.h index dad33b3..50401b0 100644 --- a/include/asm-generic/wrappers.h +++ b/include/asm-generic/wrappers.h @@ -57,42 +57,27 @@ static inline struct task_struct *wrap_find_task_by_pid(pid_t nr) #endif /* !pgprot_noncached */ #if LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0) -#include <asm/system.h> -#define cpu_online_mask (&cpu_online_map) -#else /* >= 3.4.0 */ -static inline void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) -{ - unsigned long __tmp = __fd / __NFDBITS; - unsigned long __rem = __fd % __NFDBITS; - __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); -} -static inline void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) -{ - unsigned long __tmp = __fd / __NFDBITS; - unsigned long __rem = __fd % __NFDBITS; - __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); -} +#define cpu_online_mask &(cpu_online_map) -static inline int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) -{ - unsigned long __tmp = __fd / __NFDBITS; - unsigned long __rem = __fd % __NFDBITS; - return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; -} +#include <linux/sched.h> +#include <linux/mm.h> -static inline void __FD_ZERO(__kernel_fd_set *__p) +static inline +unsigned long vm_mmap(struct file *file, unsigned long addr, + unsigned long len, unsigned long prot, + unsigned long flag, unsigned long offset) { - unsigned long *__tmp = __p->fds_bits; - int __i; - - __i = __FDSET_LONGS; - while (__i) { - __i--; - *__tmp = 0; - __tmp++; - } + struct mm_struct *mm = current->mm; + int ret; + + down_write(&mm->mmap_sem); + ret = do_mmap(file, addr, len, prot, flag, offset); + up_write(&mm->mmap_sem); + + return ret; } -#endif /* >= 3.4.0 */ + +#endif /* LINUX_VERSION_CODE < 3.4.0 */ #endif /* _XENO_ASM_GENERIC_WRAPPERS_H */ diff --git a/include/cobalt/nucleus/select.h b/include/cobalt/nucleus/select.h index 31c9cac..d9ee5cf 100644 --- a/include/cobalt/nucleus/select.h +++ b/include/cobalt/nucleus/select.h @@ -1,4 +1,4 @@ -/**\file +/*!\file nucleus/select.h * \brief file descriptors events multiplexing header. * \author Gilles Chanteperdrix * @@ -45,6 +45,47 @@ struct xnselector { xnqueue_t bindings; /* only used by xnselector_destroy */ }; +#define __NFDBITS__ (8 * sizeof(unsigned long)) +#define __FDSET_LONGS__ (__FD_SETSIZE/__NFDBITS__) +#define __FDELT__(d) ((d) / __NFDBITS__) +#define __FDMASK__(d) (1UL << ((d) % __NFDBITS__)) + +static inline void __FD_SET__(unsigned long __fd, __kernel_fd_set *__fdsetp) +{ + unsigned long __tmp = __fd / __NFDBITS__; + unsigned long __rem = __fd % __NFDBITS__; + __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); +} + +static inline void __FD_CLR__(unsigned long __fd, __kernel_fd_set *__fdsetp) +{ + unsigned long __tmp = __fd / __NFDBITS__; + unsigned long __rem = __fd % __NFDBITS__; + __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); +} + +static inline int __FD_ISSET__(unsigned long __fd, const __kernel_fd_set *__p) +{ + unsigned long __tmp = __fd / __NFDBITS__; + unsigned long __rem = __fd % __NFDBITS__; + return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; +} + +static inline void __FD_ZERO__(__kernel_fd_set *__p) +{ + unsigned long *__tmp = __p->fds_bits; + int __i; + + __i = __FDSET_LONGS__; + while (__i) { + __i--; + *__tmp = 0; + __tmp++; + } +} + +#ifdef CONFIG_XENO_OPT_SELECT + struct xnselect { xnqueue_t bindings; }; @@ -113,6 +154,16 @@ int xnselect_umount(void); } #endif /* __cplusplus */ +#else /* !CONFIG_XENO_OPT_SELECT */ +struct xnselector; +#define DECLARE_XNSELECT(name) +#define xnselect_init(block) +#define xnselect_bind(select_block,binding,selector,type,bit_index,state) \ + ({ -EBADF; }) +#define xnselect_signal(block, state) ({ int __ret = 0; __ret; }) +#define xnselect_destroy(block) +#endif /* !CONFIG_XENO_OPT_SELECT */ + /*@}*/ #endif /* XNSELECT_H */ diff --git a/kernel/cobalt/nucleus/select.c b/kernel/cobalt/nucleus/select.c index c2bd220..e25dd38 100644 --- a/kernel/cobalt/nucleus/select.c +++ b/kernel/cobalt/nucleus/select.c @@ -1,4 +1,4 @@ -/*!\file select.c +/*!\file nucleus/select.c * \brief file descriptors events multiplexing. * \author Gilles Chanteperdrix * @@ -126,13 +126,13 @@ int xnselect_bind(struct xnselect *select_block, appendq(&selector->bindings, &binding->slink); appendq(&select_block->bindings, &binding->link); - __FD_SET(index, &selector->fds[type].expected); + __FD_SET__(index, &selector->fds[type].expected); if (state) { - __FD_SET(index, &selector->fds[type].pending); + __FD_SET__(index, &selector->fds[type].pending); if (xnselect_wakeup(selector)) xnpod_schedule(); } else - __FD_CLR(index, &selector->fds[type].pending); + __FD_CLR__(index, &selector->fds[type].pending); return 0; } @@ -153,15 +153,15 @@ int __xnselect_signal(struct xnselect *select_block, unsigned state) selector = binding->selector; if (state) { - if (!__FD_ISSET(binding->bit_index, + if (!__FD_ISSET__(binding->bit_index, &selector->fds[binding->type].pending)) { - __FD_SET(binding->bit_index, + __FD_SET__(binding->bit_index, &selector->fds[binding->type].pending); if (xnselect_wakeup(selector)) resched = 1; } } else - __FD_CLR(binding->bit_index, + __FD_CLR__(binding->bit_index, &selector->fds[binding->type].pending); } @@ -190,11 +190,11 @@ void xnselect_destroy(struct xnselect *select_block) binding = link2binding(holder, link); selector = binding->selector; - __FD_CLR(binding->bit_index, + __FD_CLR__(binding->bit_index, &selector->fds[binding->type].expected); - if (!__FD_ISSET(binding->bit_index, + if (!__FD_ISSET__(binding->bit_index, &selector->fds[binding->type].pending)) { - __FD_SET(binding->bit_index, + __FD_SET__(binding->bit_index, &selector->fds[binding->type].pending); if (xnselect_wakeup(selector)) resched = 1; @@ -217,14 +217,14 @@ fd_set_andnot(fd_set *result, fd_set *first, fd_set *second, unsigned n) { unsigned i, not_empty = 0; - for (i = 0; i < __FDELT(n); i++) + for (i = 0; i < __FDELT__(n); i++) if((result->fds_bits[i] = first->fds_bits[i] & ~(second->fds_bits[i]))) not_empty = 1; - if (i < __FDSET_LONGS + if (i < __FDSET_LONGS__ && (result->fds_bits[i] = - first->fds_bits[i] & ~(second->fds_bits[i]) & (__FDMASK(n) - 1))) + first->fds_bits[i] & ~(second->fds_bits[i]) & (__FDMASK__(n) - 1))) not_empty = 1; return not_empty; @@ -235,14 +235,14 @@ fd_set_and(fd_set *result, fd_set *first, fd_set *second, unsigned n) { unsigned i, not_empty = 0; - for (i = 0; i < __FDELT(n); i++) + for (i = 0; i < __FDELT__(n); i++) if((result->fds_bits[i] = first->fds_bits[i] & second->fds_bits[i])) not_empty = 1; - if (i < __FDSET_LONGS + if (i < __FDSET_LONGS__ && (result->fds_bits[i] = - first->fds_bits[i] & second->fds_bits[i] & (__FDMASK(n) - 1))) + first->fds_bits[i] & second->fds_bits[i] & (__FDMASK__(n) - 1))) not_empty = 1; return not_empty; @@ -252,12 +252,12 @@ static void fd_set_zerofill(fd_set *set, unsigned n) { unsigned i; - i = __FDELT(n); + i = __FDELT__(n); - if (i < __FDSET_LONGS) - set->fds_bits[i] &= (__FDMASK(n) - 1); + if (i < __FDSET_LONGS__) + set->fds_bits[i] &= (__FDMASK__(n) - 1); - for(i++; i < __FDSET_LONGS; i++) + for(i++; i < __FDSET_LONGS__; i++) set->fds_bits[i] = 0; } @@ -265,12 +265,12 @@ static unsigned fd_set_popcount(fd_set *set, unsigned n) { unsigned count = 0, i; - for (i = 0; i < __FDELT(n); i++) + for (i = 0; i < __FDELT__(n); i++) if (set->fds_bits[i]) count += hweight_long(set->fds_bits[i]); - if (i < __FDSET_LONGS && (set->fds_bits[i] & (__FDMASK(n) - 1))) - count += hweight_long(set->fds_bits[i] & (__FDMASK(n) - 1)); + if (i < __FDSET_LONGS__ && (set->fds_bits[i] & (__FDMASK__(n) - 1))) + count += hweight_long(set->fds_bits[i] & (__FDMASK__(n) - 1)); return count; } @@ -288,8 +288,8 @@ int xnselector_init(struct xnselector *selector) xnsynch_init(&selector->synchbase, XNSYNCH_FIFO, NULL); for (i = 0; i < XNSELECT_MAX_TYPES; i++) { - __FD_ZERO(&selector->fds[i].expected); - __FD_ZERO(&selector->fds[i].pending); + __FD_ZERO__(&selector->fds[i].expected); + __FD_ZERO__(&selector->fds[i].pending); } initq(&selector->bindings); return 0; diff --git a/kernel/cobalt/nucleus/shadow.c b/kernel/cobalt/nucleus/shadow.c index 1d3d068..57f44e7 100644 --- a/kernel/cobalt/nucleus/shadow.c +++ b/kernel/cobalt/nucleus/shadow.c @@ -1183,9 +1183,7 @@ static unsigned long map_mayday_page(struct task_struct *p) old_fops = filp->f_op; filp->f_op = &mayday_fops; - down_write(&p->mm->mmap_sem); - u_addr = do_mmap(filp, 0, PAGE_SIZE, PROT_EXEC|PROT_READ, MAP_SHARED, 0); - up_write(&p->mm->mmap_sem); + u_addr = vm_mmap(filp, 0, PAGE_SIZE, PROT_EXEC|PROT_READ, MAP_SHARED, 0); filp->f_op = (typeof(filp->f_op))old_fops; filp_close(filp, p->files); diff --git a/kernel/cobalt/rtdm/drvlib.c b/kernel/cobalt/rtdm/drvlib.c index b763791..40182c3 100644 --- a/kernel/cobalt/rtdm/drvlib.c +++ b/kernel/cobalt/rtdm/drvlib.c @@ -1890,10 +1890,8 @@ static int rtdm_do_mmap(rtdm_user_info_t *user_info, old_priv_data = filp->private_data; filp->private_data = mmap_data; - down_write(&user_info->mm->mmap_sem); - u_addr = do_mmap(filp, (unsigned long)*pptr, len, prot, - MAP_SHARED, 0); - up_write(&user_info->mm->mmap_sem); + u_addr = vm_mmap(filp, (unsigned long)*pptr, len, prot, + MAP_SHARED, 0); filp->f_op = (typeof(filp->f_op))old_fops; filp->private_data = old_priv_data; diff --git a/kernel/cobalt/syscall.c b/kernel/cobalt/syscall.c index dcab4ac..0f066cc 100644 --- a/kernel/cobalt/syscall.c +++ b/kernel/cobalt/syscall.c @@ -41,7 +41,7 @@ int cobalt_muxid; static int fd_valid_p(int fd) { cobalt_queues_t *q; - const int rtdm_fd_start = FD_SETSIZE - RTDM_FD_MAX; + const int rtdm_fd_start = __FD_SETSIZE - RTDM_FD_MAX; if (fd >= rtdm_fd_start) { struct rtdm_dev_context *ctx; @@ -78,7 +78,7 @@ static int select_bind_one(struct xnselector *selector, unsigned type, int fd) { cobalt_assoc_t *assoc; cobalt_queues_t *q; - const int rtdm_fd_start = FD_SETSIZE - RTDM_FD_MAX; + const int rtdm_fd_start = __FD_SETSIZE - RTDM_FD_MAX; if (fd >= rtdm_fd_start) return rtdm_select_bind(fd - rtdm_fd_start, @@ -156,7 +156,7 @@ static int __select(int nfds, mode = XN_ABSOLUTE; } - fds_size = __FDELT(nfds + __NFDBITS - 1) * sizeof(long); + fds_size = __FDELT__(nfds + __NFDBITS - 1) * sizeof(long); for (i = 0; i < XNSELECT_MAX_TYPES; i++) if (ufd_sets[i]) { _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git