Module: xenomai-2.6 Branch: master Commit: a3bc2f1f5283c3979eac4ab25b69c6b4f12a9e85 URL: http://git.xenomai.org/?p=xenomai-2.6.git;a=commit;h=a3bc2f1f5283c3979eac4ab25b69c6b4f12a9e85
Author: Philippe Gerum <r...@xenomai.org> Date: Fri Aug 31 10:23:39 2012 +0200 nucleus, skins: fix up for kernel 3.5 series --- include/asm-generic/wrappers.h | 46 ++++++++++++------------------------- include/nucleus/select.h | 39 ++++++++++++++++++++++++++++++++ ksrc/nucleus/select.c | 48 ++++++++++++++++++++-------------------- ksrc/nucleus/shadow.c | 4 +-- ksrc/skins/posix/syscall.c | 6 ++-- ksrc/skins/rtdm/drvlib.c | 4 +-- 6 files changed, 83 insertions(+), 64 deletions(-) diff --git a/include/asm-generic/wrappers.h b/include/asm-generic/wrappers.h index be01c4f..7f95f0f 100644 --- a/include/asm-generic/wrappers.h +++ b/include/asm-generic/wrappers.h @@ -700,44 +700,28 @@ static inline void wrap_proc_dir_entry_owner(struct proc_dir_entry *entry) #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0) + #define cpu_online_mask &(cpu_online_map) -#endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(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); -} +#include <linux/sched.h> +#include <linux/mm.h> -static inline void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) +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 = __fd / __NFDBITS; - unsigned long __rem = __fd % __NFDBITS; - __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); -} + struct mm_struct *mm = current->mm; + int ret; -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; -} + down_write(&mm->mmap_sem); + ret = do_mmap(file, addr, len, prot, flag, offset); + up_write(&mm->mmap_sem); -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++; - } + return ret; } -#endif + +#endif /* LINUX_VERSION_CODE < 3.4.0 */ #ifdef CONFIG_IPIPE_CORE #if IPIPE_CORE_APIREV >= 2 diff --git a/include/nucleus/select.h b/include/nucleus/select.h index bda4cba..d9ee5cf 100644 --- a/include/nucleus/select.h +++ b/include/nucleus/select.h @@ -45,6 +45,45 @@ 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 { diff --git a/ksrc/nucleus/select.c b/ksrc/nucleus/select.c index 2dd38c5..e25dd38 100644 --- a/ksrc/nucleus/select.c +++ b/ksrc/nucleus/select.c @@ -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/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c index 16e570b..f6165bb 100644 --- a/ksrc/nucleus/shadow.c +++ b/ksrc/nucleus/shadow.c @@ -1633,9 +1633,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/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c index 9f5d315..34086b4 100644 --- a/ksrc/skins/posix/syscall.c +++ b/ksrc/skins/posix/syscall.c @@ -2326,7 +2326,7 @@ static int fd_valid_p(int fd) { pse51_queues_t *q; #if defined(CONFIG_XENO_SKIN_RTDM) || defined (CONFIG_XENO_SKIN_RTDM_MODULE) - 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; @@ -2365,7 +2365,7 @@ static int select_bind_one(struct xnselector *selector, unsigned type, int fd) pse51_assoc_t *assoc; pse51_queues_t *q; #if defined(CONFIG_XENO_SKIN_RTDM) || defined (CONFIG_XENO_SKIN_RTDM_MODULE) - 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, @@ -2443,7 +2443,7 @@ static int __select(struct pt_regs *regs) } nfds = __xn_reg_arg1(regs); - 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]) { diff --git a/ksrc/skins/rtdm/drvlib.c b/ksrc/skins/rtdm/drvlib.c index 06fa772..4b74042 100644 --- a/ksrc/skins/rtdm/drvlib.c +++ b/ksrc/skins/rtdm/drvlib.c @@ -1913,10 +1913,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, + u_addr = vm_mmap(filp, (unsigned long)*pptr, len, prot, MAP_SHARED, 0); - up_write(&user_info->mm->mmap_sem); filp->f_op = (typeof(filp->f_op))old_fops; filp->private_data = old_priv_data; _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git