diff -NurpP --minimal linux-2.6.11-rc1-vs1.9.4-rc1/Makefile linux-2.6.11-rc1-vs1.9.4-rc2/Makefile --- linux-2.6.11-rc1-vs1.9.4-rc1/Makefile 2005-01-15 15:58:53 +0100 +++ linux-2.6.11-rc1-vs1.9.4-rc2/Makefile 2005-01-15 20:18:16 +0100 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 11 -EXTRAVERSION =-rc1-vs1.9.4-rc1 +EXTRAVERSION = -rc1-vs1.9.4-rc2 NAME=Woozy Numbat # *DOCUMENTATION* Files linux-2.6.11-rc1-vs1.9.4-rc1/arch/i386/kernel/.smp.c.swp and linux-2.6.11-rc1-vs1.9.4-rc2/arch/i386/kernel/.smp.c.swp differ diff -NurpP --minimal linux-2.6.11-rc1-vs1.9.4-rc1/fs/binfmt_elf_fdpic.c linux-2.6.11-rc1-vs1.9.4-rc2/fs/binfmt_elf_fdpic.c --- linux-2.6.11-rc1-vs1.9.4-rc1/fs/binfmt_elf_fdpic.c 2005-01-14 12:35:55 +0100 +++ linux-2.6.11-rc1-vs1.9.4-rc2/fs/binfmt_elf_fdpic.c 2005-01-15 17:57:08 +0100 @@ -299,7 +299,8 @@ static int load_elf_fdpic_binary(struct /* do this so that we can load the interpreter, if need be * - we will change some of these later */ - current->mm->rss = 0; + // current->mm->rss = 0; + vx_rsspages_sub(current->mm, current->mm->rss); #ifdef CONFIG_MMU retval = setup_arg_pages(bprm, current->mm->start_stack, executable_stack); diff -NurpP --minimal linux-2.6.11-rc1-vs1.9.4-rc1/include/linux/vserver/debug.h linux-2.6.11-rc1-vs1.9.4-rc2/include/linux/vserver/debug.h --- linux-2.6.11-rc1-vs1.9.4-rc1/include/linux/vserver/debug.h 2005-01-15 11:27:52 +0100 +++ linux-2.6.11-rc1-vs1.9.4-rc2/include/linux/vserver/debug.h 2005-01-15 16:52:04 +0100 @@ -147,9 +147,12 @@ static inline void __vxh_copy_vxi(struct static inline void vxh_throw_oops(void) { - struct _vx_hist_entry *entry = vxh_advance(VXH_HERE()); + struct _vx_hist_entry *entry; + preempt_disable(); + entry = vxh_advance(VXH_HERE()); entry->type = VXH_THROW_OOPS; + preempt_enable(); /* prevent further acquisition */ vxh_active = 0; @@ -157,86 +160,116 @@ static inline void vxh_throw_oops(void) static inline void vxh_get_vx_info(struct vx_info *vxi) { - struct _vx_hist_entry *entry = vxh_advance(VXH_HERE()); + struct _vx_hist_entry *entry; + preempt_disable(); + entry = vxh_advance(VXH_HERE()); __vxh_copy_vxi(entry, vxi); entry->type = VXH_GET_VX_INFO; + preempt_enable(); } static inline void vxh_put_vx_info(struct vx_info *vxi) { - struct _vx_hist_entry *entry = vxh_advance(VXH_HERE()); + struct _vx_hist_entry *entry; + preempt_disable(); + entry = vxh_advance(VXH_HERE()); __vxh_copy_vxi(entry, vxi); entry->type = VXH_PUT_VX_INFO; + preempt_enable(); } static inline void vxh_set_vx_info(struct vx_info *vxi, void *data) { - struct _vx_hist_entry *entry = vxh_advance(VXH_HERE()); + struct _vx_hist_entry *entry; + preempt_disable(); + entry = vxh_advance(VXH_HERE()); __vxh_copy_vxi(entry, vxi); entry->sc.data = data; entry->type = VXH_SET_VX_INFO; + preempt_enable(); } static inline void vxh_clr_vx_info(struct vx_info *vxi, void *data) { - struct _vx_hist_entry *entry = vxh_advance(VXH_HERE()); + struct _vx_hist_entry *entry; + preempt_disable(); + entry = vxh_advance(VXH_HERE()); __vxh_copy_vxi(entry, vxi); entry->sc.data = data; entry->type = VXH_CLR_VX_INFO; + preempt_enable(); } static inline void vxh_alloc_vx_info(struct vx_info *vxi) { - struct _vx_hist_entry *entry = vxh_advance(VXH_HERE()); + struct _vx_hist_entry *entry; + preempt_disable(); + entry = vxh_advance(VXH_HERE()); __vxh_copy_vxi(entry, vxi); entry->type = VXH_ALLOC_VX_INFO; + preempt_enable(); } static inline void vxh_dealloc_vx_info(struct vx_info *vxi) { - struct _vx_hist_entry *entry = vxh_advance(VXH_HERE()); + struct _vx_hist_entry *entry; + preempt_disable(); + entry = vxh_advance(VXH_HERE()); __vxh_copy_vxi(entry, vxi); entry->type = VXH_DEALLOC_VX_INFO; + preempt_enable(); } static inline void vxh_hash_vx_info(struct vx_info *vxi) { - struct _vx_hist_entry *entry = vxh_advance(VXH_HERE()); + struct _vx_hist_entry *entry; + preempt_disable(); + entry = vxh_advance(VXH_HERE()); __vxh_copy_vxi(entry, vxi); entry->type = VXH_HASH_VX_INFO; + preempt_enable(); } static inline void vxh_unhash_vx_info(struct vx_info *vxi) { - struct _vx_hist_entry *entry = vxh_advance(VXH_HERE()); + struct _vx_hist_entry *entry; + preempt_disable(); + entry = vxh_advance(VXH_HERE()); __vxh_copy_vxi(entry, vxi); entry->type = VXH_UNHASH_VX_INFO; + preempt_enable(); } static inline void vxh_loc_vx_info(unsigned arg, struct vx_info *vxi) { - struct _vx_hist_entry *entry = vxh_advance(VXH_HERE()); + struct _vx_hist_entry *entry; + preempt_disable(); + entry = vxh_advance(VXH_HERE()); __vxh_copy_vxi(entry, vxi); entry->ll.arg = arg; entry->type = VXH_LOC_VX_INFO; + preempt_enable(); } static inline void vxh_lookup_vx_info(unsigned arg, struct vx_info *vxi) { - struct _vx_hist_entry *entry = vxh_advance(VXH_HERE()); + struct _vx_hist_entry *entry; + preempt_disable(); + entry = vxh_advance(VXH_HERE()); __vxh_copy_vxi(entry, vxi); entry->ll.arg = arg; entry->type = VXH_LOOKUP_VX_INFO; + preempt_enable(); } extern void vxh_dump_history(void); Files linux-2.6.11-rc1-vs1.9.4-rc1/init/.main.c.rej.swp and linux-2.6.11-rc1-vs1.9.4-rc2/init/.main.c.rej.swp differ diff -NurpP --minimal linux-2.6.11-rc1-vs1.9.4-rc1/kernel/vserver/history.c linux-2.6.11-rc1-vs1.9.4-rc2/kernel/vserver/history.c --- linux-2.6.11-rc1-vs1.9.4-rc1/kernel/vserver/history.c 2005-01-15 11:27:52 +0100 +++ linux-2.6.11-rc1-vs1.9.4-rc2/kernel/vserver/history.c 2005-01-15 16:43:49 +0100 @@ -7,6 +7,7 @@ * * V0.01 basic structure * V0.02 hash/unhash and trace + * V0.03 preemption fixes * */ @@ -43,6 +44,10 @@ unsigned volatile int vxh_active = 1; static atomic_t sequence = ATOMIC_INIT(0); +/* vxh_advance() + + * requires disabled preemption */ + struct _vx_hist_entry *vxh_advance(void *loc) { unsigned int cpu = smp_processor_id();