diff -urNp --exclude CVS --exclude BitKeeper xxx/arch/ppc/kernel/misc.S aio/arch/ppc/kernel/misc.S --- xxx/arch/ppc/kernel/misc.S 2003-06-28 05:29:25.000000000 +0200 +++ aio/arch/ppc/kernel/misc.S 2003-06-28 05:29:46.000000000 +0200 @@ -1238,11 +1238,11 @@ _GLOBAL(sys_call_table) .long sys_ni_syscall /* reserved for sys_security */ .long sys_ni_syscall /* 225 reserved for Tux */ .long sys_ni_syscall /* reserved for sys_sendfile64 */ - .long sys_ni_syscall /* reserved for sys_io_setup */ - .long sys_ni_syscall /* reserved for sys_io_destroy */ - .long sys_ni_syscall /* reserved for sys_io_getevents */ - .long sys_ni_syscall /* 230 reserved for sys_io_submit */ - .long sys_ni_syscall /* reserved for sys_io_cancel */ + .long sys_io_setup + .long sys_io_destroy + .long sys_io_getevents + .long sys_io_submit /* 230 */ + .long sys_io_cancel .rept NR_syscalls-(.-sys_call_table)/4 .long sys_ni_syscall diff -urNp --exclude CVS --exclude BitKeeper xxx/arch/ppc/kernel/ppc_ksyms.c aio/arch/ppc/kernel/ppc_ksyms.c --- xxx/arch/ppc/kernel/ppc_ksyms.c 2003-06-13 22:07:24.000000000 +0200 +++ aio/arch/ppc/kernel/ppc_ksyms.c 2003-06-28 05:29:46.000000000 +0200 @@ -321,6 +321,7 @@ EXPORT_SYMBOL(xmon_printf); EXPORT_SYMBOL(__up); EXPORT_SYMBOL(__down); EXPORT_SYMBOL(__down_interruptible); +EXPORT_SYMBOL(__wtd_down); #if defined(CONFIG_KGDB) || defined(CONFIG_XMON) extern void (*debugger)(struct pt_regs *regs); diff -urNp --exclude CVS --exclude BitKeeper xxx/arch/ppc/kernel/semaphore.c aio/arch/ppc/kernel/semaphore.c --- xxx/arch/ppc/kernel/semaphore.c 2003-06-13 22:07:24.000000000 +0200 +++ aio/arch/ppc/kernel/semaphore.c 2003-06-28 05:29:46.000000000 +0200 @@ -15,6 +15,7 @@ */ #include +#include #include #include @@ -127,3 +128,40 @@ int __down_interruptible(struct semaphor wake_up(&sem->wait); return retval; } + +extern void __wtd_down(struct semaphore * sem, struct worktodo *wtd); + +static void __wtd_down_action(void *data) +{ + struct worktodo *wtd = data; + struct semaphore *sem; + + wtd_pop(wtd); + sem = wtd->data; + + __wtd_down(sem, wtd); +} + +static void __wtd_down_waiter(wait_queue_t *wait) +{ + struct worktodo *wtd = (struct worktodo *)wait; + struct semaphore *sem = wtd->data; + + __remove_wait_queue(&sem->wait, &wtd->wait); + wtd_push(wtd, __wtd_down_action, wtd); + wtd_queue(wtd); +} + +void __wtd_down(struct semaphore * sem, struct worktodo * wtd) +{ + int gotit; + + init_waitqueue_func_entry(&wtd->wait, __wtd_down_waiter); + wtd->data = sem; + + gotit = add_wait_queue_exclusive_cond(&sem->wait, &wtd->wait, __sem_update_count(sem, -1) <= 0); + if (gotit) { + wake_up(&sem->wait); + wtd_queue(wtd); + } +} diff -urNp --exclude CVS --exclude BitKeeper xxx/arch/ppc64/kernel/misc.S aio/arch/ppc64/kernel/misc.S --- xxx/arch/ppc64/kernel/misc.S 2003-06-28 03:54:35.000000000 +0200 +++ aio/arch/ppc64/kernel/misc.S 2003-06-28 05:29:59.000000000 +0200 @@ -803,7 +803,6 @@ _GLOBAL(sys_call_table32) .llong .sys_madvise /* 205 */ .llong .sys_mincore /* 206 */ .llong .sys_gettid /* 207 */ -#if 0 /* Reserved syscalls */ .llong .sys_tkill /* 208 */ .llong .sys_setxattr .llong .sys_lsetxattr /* 210 */ @@ -818,9 +817,18 @@ _GLOBAL(sys_call_table32) .llong .sys_lremovexattr .llong .sys_fremovexattr /* 220 */ .llong .sys_futex -#endif - .llong .sys_perfmonctl /* Put this here for now ... */ - .rept NR_syscalls-222 + .llong .sys32_sched_setaffinity + .llong .sys32_sched_getaffinity + .llong .sys_ni_syscall /* reserved for security */ + .llong .sys_ni_syscall /* 225 reserved for tux */ + .llong .sys_ni_syscall /* reserved for sys_sendfile64 */ + .llong .sys32_io_setup + .llong .sys_io_destroy + .llong .sys_io_getevents + .llong .sys_io_submit /* 230 */ + .llong .sys_io_cancel + .llong .sys_perfmonctl /* Put this here for now ... */ + .rept NR_syscalls-233 .llong .sys_ni_syscall .endr #endif @@ -1034,7 +1042,6 @@ _GLOBAL(sys_call_table) .llong .sys_madvise /* 205 */ .llong .sys_mincore /* 206 */ .llong .sys_gettid /* 207 */ -#if 0 /* Reserved syscalls */ .llong .sys_tkill /* 208 */ .llong .sys_setxattr .llong .sys_lsetxattr /* 210 */ @@ -1049,8 +1056,18 @@ _GLOBAL(sys_call_table) .llong .sys_lremovexattr .llong .sys_fremovexattr /* 220 */ .llong .sys_futex -#endif - .llong .sys_perfmonctl /* Put this here for now ... */ - .rept NR_syscalls-222 + .llong .sys_sched_setaffinity + .llong .sys_sched_getaffinity + .llong .sys_ni_syscall /* reserved for security */ + .llong .sys_ni_syscall /* 225 reserved for tux */ + .llong .sys_ni_syscall /* reserved for sys_sendfile64 */ + .llong .sys_io_setup + .llong .sys_io_destroy + .llong .sys_io_getevents + .llong .sys_io_submit /* 230 */ + .llong .sys_io_cancel + .llong .sys_perfmonctl /* Put this here for now ... */ + + .rept NR_syscalls-233 .llong .sys_ni_syscall .endr diff -urNp --exclude CVS --exclude BitKeeper xxx/arch/ppc64/kernel/ppc_ksyms.c aio/arch/ppc64/kernel/ppc_ksyms.c --- xxx/arch/ppc64/kernel/ppc_ksyms.c 2003-06-28 05:28:56.000000000 +0200 +++ aio/arch/ppc64/kernel/ppc_ksyms.c 2003-06-28 05:29:46.000000000 +0200 @@ -135,6 +135,7 @@ EXPORT_SYMBOL(__up); EXPORT_SYMBOL(naca); EXPORT_SYMBOL(systemcfg); EXPORT_SYMBOL(__down); +EXPORT_SYMBOL(__wtd_down); /* EXPORT_SYMBOL(csum_partial); already in net/netsyms.c */ EXPORT_SYMBOL(csum_partial_copy_generic); diff -urNp --exclude CVS --exclude BitKeeper xxx/arch/ppc64/kernel/semaphore.c aio/arch/ppc64/kernel/semaphore.c --- xxx/arch/ppc64/kernel/semaphore.c 2003-03-15 03:24:58.000000000 +0100 +++ aio/arch/ppc64/kernel/semaphore.c 2003-06-28 05:29:46.000000000 +0200 @@ -17,6 +17,7 @@ */ #include +#include #include #include #include @@ -129,3 +130,40 @@ int __down_interruptible(struct semaphor wake_up(&sem->wait); return retval; } + +extern void __wtd_down(struct semaphore * sem, struct worktodo *wtd); + +static void __wtd_down_action(void *data) +{ + struct worktodo *wtd = data; + struct semaphore *sem; + + wtd_pop(wtd); + sem = wtd->data; + + __wtd_down(sem, wtd); +} + +static void __wtd_down_waiter(wait_queue_t *wait) +{ + struct worktodo *wtd = (struct worktodo *)wait; + struct semaphore *sem = wtd->data; + + __remove_wait_queue(&sem->wait, &wtd->wait); + wtd_push(wtd, __wtd_down_action, wtd); + wtd_queue(wtd); +} + +void __wtd_down(struct semaphore * sem, struct worktodo * wtd) +{ + int gotit; + + init_waitqueue_func_entry(&wtd->wait, __wtd_down_waiter); + wtd->data = sem; + + gotit = add_wait_queue_exclusive_cond(&sem->wait, &wtd->wait, __sem_update_count(sem, -1) <= 0); + if (gotit) { + wake_up(&sem->wait); + wtd_queue(wtd); + } +} diff -urNp --exclude CVS --exclude BitKeeper xxx/arch/ppc64/kernel/sys_ppc32.c aio/arch/ppc64/kernel/sys_ppc32.c --- xxx/arch/ppc64/kernel/sys_ppc32.c 2003-06-28 05:28:56.000000000 +0200 +++ aio/arch/ppc64/kernel/sys_ppc32.c 2003-06-28 05:29:46.000000000 +0200 @@ -4768,3 +4768,67 @@ unsigned long sys32_mmap2(unsigned long /* This should remain 12 even if PAGE_SIZE changes */ return sys_mmap(addr, len, prot, flags, fd, pgoff << 12); } + +extern asmlinkage int sys_sched_setaffinity(pid_t pid, unsigned int len, + unsigned long *user_mask_ptr); + +asmlinkage int sys32_sched_setaffinity(__kernel_pid_t32 pid, unsigned int len, + u32 *user_mask_ptr) +{ + unsigned long kernel_mask; + mm_segment_t old_fs; + int ret; + + if (get_user(kernel_mask, user_mask_ptr)) + return -EFAULT; + + old_fs = get_fs(); + set_fs(KERNEL_DS); + ret = sys_sched_setaffinity(pid, + /* XXX Nice api... */ + sizeof(kernel_mask), + &kernel_mask); + set_fs(old_fs); + + return ret; +} + +extern asmlinkage int sys_sched_getaffinity(pid_t pid, unsigned int len, + unsigned long *user_mask_ptr); + +asmlinkage int sys32_sched_getaffinity(__kernel_pid_t32 pid, unsigned int len, + u32 *user_mask_ptr) +{ + unsigned long kernel_mask; + mm_segment_t old_fs; + int ret; + + old_fs = get_fs(); + set_fs(KERNEL_DS); + ret = sys_sched_getaffinity(pid, + /* XXX Nice api... */ + sizeof(kernel_mask), + &kernel_mask); + set_fs(old_fs); + + if (ret == 0) { + if (put_user(kernel_mask, user_mask_ptr)) + ret = -EFAULT; + } + + return ret; +} + +asmlinkage long sys32_io_setup(unsigned nr_reqs, u32 *ctx32p) +{ + long ret; + aio_context_t ctx64; + mm_segment_t oldfs = get_fs(); + set_fs(KERNEL_DS); + ret = sys_io_setup(nr_reqs, &ctx64); + set_fs(oldfs); + /* truncating is ok because it's a user address */ + if (!ret) + ret = put_user((u32)ctx64, ctx32p); + return ret; +} diff -urNp --exclude CVS --exclude BitKeeper xxx/include/asm-ppc/semaphore.h aio/include/asm-ppc/semaphore.h --- xxx/include/asm-ppc/semaphore.h 2003-06-13 22:07:41.000000000 +0200 +++ aio/include/asm-ppc/semaphore.h 2003-06-28 05:29:46.000000000 +0200 @@ -74,8 +74,10 @@ static inline void init_MUTEX_LOCKED (st sema_init(sem, 0); } +struct worktodo; extern void __down(struct semaphore * sem); extern int __down_interruptible(struct semaphore * sem); +extern void __wtd_down(struct semaphore * sem, struct worktodo * wtd); extern void __up(struct semaphore * sem); extern inline void down(struct semaphore * sem) @@ -135,6 +137,28 @@ static inline int sem_getcount(struct se return atomic_read(&sem->count); } +/* Returns 0 if we acquired the semaphore, 1 if it was queued. */ +static inline int wtd_down(struct worktodo *wtd, struct semaphore *sem) +{ + int ret = 0; + +#if WAITQUEUE_DEBUG + CHECK_MAGIC(sem->__magic); +#endif + + if (unlikely(atomic_dec_return(&sem->count) < 0)) { + __wtd_down(sem, wtd); + ret = 1; + } else + /* + * The reason they're not smp_mb() must be due + * some lowlevel arch detail or it's broken. + */ + smp_wmb(); + + return ret; +} + #endif /* __KERNEL__ */ #endif /* !(_PPC_SEMAPHORE_H) */ diff -urNp --exclude CVS --exclude BitKeeper xxx/include/asm-ppc64/semaphore.h aio/include/asm-ppc64/semaphore.h --- xxx/include/asm-ppc64/semaphore.h 2003-06-28 05:09:46.000000000 +0200 +++ aio/include/asm-ppc64/semaphore.h 2003-06-28 05:29:46.000000000 +0200 @@ -68,8 +68,10 @@ static inline void init_MUTEX_LOCKED (st sema_init(sem, 0); } +struct worktodo; extern void __down(struct semaphore * sem); extern int __down_interruptible(struct semaphore * sem); +extern void __wtd_down(struct semaphore * sem, struct worktodo * wtd); extern void __up(struct semaphore * sem); static inline void down(struct semaphore * sem) @@ -129,6 +131,28 @@ static inline int sem_getcount(struct se return atomic_read(&sem->count); } +/* Returns 0 if we acquired the semaphore, 1 if it was queued. */ +static inline int wtd_down(struct worktodo *wtd, struct semaphore *sem) +{ + int ret = 0; + +#if WAITQUEUE_DEBUG + CHECK_MAGIC(sem->__magic); +#endif + + if (unlikely(atomic_dec_return(&sem->count) < 0)) { + __wtd_down(sem, wtd); + ret = 1; + } else + /* + * The reason they're not smp_mb() must be due + * some lowlevel arch detail or it's broken. + */ + smp_wmb(); + + return ret; +} + #endif /* __KERNEL__ */ #endif /* !(_PPC64_SEMAPHORE_H) */