From: Oleg D. <gr...@na...> - 2003-02-11 09:29:54
|
Hello! Here is the collection of patches I carry around and would be happy to get included into -Xum patches ;) Actually I do not want you to include sigprocmask stuff as there must be better way, but I include it here for completeness, so that when the patch is applied to 2.5.60, UML can rebuilt again (and you can even run it and it works ;) ). As you probably already seen, Linus said that he does not care for username namings, so he won't change sigprocmask() name in kernel. Separate patches are available in the bk tree at bk://namesys.com/bk/linux-2.5-uml (Note that I decided not to update this one on a timely manner as it turned out to be quite time consuming. So I will just recreate that from time to time. If you want stable linux-2.5 uml tree that builds and tracks Linus' tree closely, use our reiser4 tree, there is no poison in it ;) ) Here is list of patches, and combined patch is below. ChangeSet@1.1011, 2003-02-11 12:06:00+03:00, gr...@an... Sort out sigpending between kernel and glibc in UML (2.5.60 fix). This is just a hackish define of sigpending=__sigpending for user_objs. Note this change also preaks dynamic build. ChangeSet@1.1010, 2003-02-11 12:02:07+03:00, gr...@an... UML: Fix reporting of UML process in hosts argv[0] by pa...@uc... (Petr Baudis) ChangeSet@1.1009, 2003-02-11 11:59:12+03:00, gr...@an... UML: Add TIF_RESTART_BLOCK define ChangeSet@1.1008, 2003-02-11 11:57:03+03:00, gr...@an... UML: Include asm-generic/vmlinux.lds.h into dyn.lds.S to get definition of RODATA ChangeSet@1.1007, 2003-02-11 11:52:59+03:00, gr...@an... UML: Fix module loading by removng duplicate sections definition. By pa...@uc... (Petr Baudis) ChangeSet@1.1006, 2003-02-11 11:50:38+03:00, gr...@an... UML page.h/bug.h cleanups We do not need to include bug.h into page.h bring definition of panic() into bug.h ChangeSet@1.1005, 2003-02-11 11:47:12+03:00, gr...@an... UML: Exception table uses structure. Properly deal with that ChangeSet@1.1004, 2003-02-11 11:45:26+03:00, gr...@an... UML: Fix a race in tt mode when process gets a signal while it is not yet woken up. ChangeSet@1.1003, 2003-02-11 11:41:54+03:00, gr...@an... UML to 2.5.60 update: signal_kern.c: "current->sig" -> "current->sighand" conversion init_task.c: Add and initialise init_sighand structure. ChangeSet@1.1002, 2003-02-11 11:29:31+03:00, gr...@an... UML cleanups: Declare get_current() in asm-um/current.h. This declaration is expected to be here. include asm/tlbflush.h into arch/um/kernel/tt/tlb.c to to get some declaration ChangeSet@1.1001, 2003-02-11 11:25:50+03:00, gr...@an... UML: Never register ubd devices with same object name, sysfs does not like it. ChangeSet@1.1000, 2003-02-11 11:24:26+03:00, gr...@an... UML: SMP race fix where some UBD requests were processed twice. ChangeSet@1.999, 2003-02-11 11:22:54+03:00, gr...@an... This changeset allows to build this kernel for native x86 arch too. Added additional mm parameter to do_mmap_pgoff in arch/i386/kernel/sys_i386.c ChangeSet@1.998, 2003-02-11 11:18:12+03:00, gr...@an... make asm-um/module.h arch-dependent. # This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.997 -> 1.1011 # arch/um/kernel/tt/tlb.c 1.4 -> 1.5 # include/asm-um/current.h 1.3 -> 1.4 # include/asm-um/common.lds.S 1.2 -> 1.3 # include/asm-um/thread_info.h 1.3 -> 1.4 # include/asm-um/bug.h 1.1 -> 1.2 # arch/um/drivers/ubd_kern.c 1.26 -> 1.28 # arch/um/sys-i386/fault.c 1.2 -> 1.3 # arch/um/dyn.lds.S 1.3 -> 1.4 # arch/um/kernel/signal_kern.c 1.12 -> 1.13 # include/asm-um/page.h 1.4 -> 1.5 # arch/um/Makefile 1.25 -> 1.27 # include/asm-um/module.h 1.2 -> 1.3 include/asm-um/module-i386.h (moved) # arch/um/kernel/um_arch.c 1.11 -> 1.12 # arch/um/kernel/tt/process_kern.c 1.6 -> 1.7 # arch/i386/kernel/sys_i386.c 1.11 -> 1.12 # arch/um/kernel/init_task.c 1.3 -> 1.4 # (new) -> 1.1 include/asm-um/module-generic.h # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 03/02/11 gr...@an... 1.998 # make asm-um/module.h arch-dependent. # -------------------------------------------- # 03/02/11 gr...@an... 1.999 # This changeset allows to build this kernel for native x86 arch too. # Added additional mm parameter to do_mmap_pgoff in arch/i386/kernel/sys_i386.c # -------------------------------------------- # 03/02/11 gr...@an... 1.1000 # UML: SMP race fix where some UBD requests were processed twice. # -------------------------------------------- # 03/02/11 gr...@an... 1.1001 # UML: Never register ubd devices with same object name, sysfs does not like it. # -------------------------------------------- # 03/02/11 gr...@an... 1.1002 # UML cleanups: # Declare get_current() in asm-um/current.h. This declaration is expected to be here. # include asm/tlbflush.h into arch/um/kernel/tt/tlb.c to to get some declaration # -------------------------------------------- # 03/02/11 gr...@an... 1.1003 # UML to 2.5.60 update: # signal_kern.c: # "current->sig" -> "current->sighand" conversion # init_task.c: # Add and initialise init_sighand structure. # -------------------------------------------- # 03/02/11 gr...@an... 1.1004 # UML: Fix a race in tt mode when process gets a signal while it is not yet woken up. # -------------------------------------------- # 03/02/11 gr...@an... 1.1005 # UML: Exception table uses structure. Properly deal with that # -------------------------------------------- # 03/02/11 gr...@an... 1.1006 # UML page.h/bug.h cleanups # We do not need to include bug.h into page.h # bring definition of panic() into bug.h # -------------------------------------------- # 03/02/11 gr...@an... 1.1007 # UML: Fix module loading by removng duplicate sections definition. By pa...@uc... (Petr Baudis) # -------------------------------------------- # 03/02/11 gr...@an... 1.1008 # UML: Include asm-generic/vmlinux.lds.h into dyn.lds.S to get definition of RODATA # -------------------------------------------- # 03/02/11 gr...@an... 1.1009 # UML: Add TIF_RESTART_BLOCK define # -------------------------------------------- # 03/02/11 gr...@an... 1.1010 # UML: Fix reporting of UML process in hosts argv[0] by pa...@uc... (Petr Baudis) # -------------------------------------------- # 03/02/11 gr...@an... 1.1011 # Sort out sigpending between kernel and glibc in UML (2.5.60 fix). # This is just a hackish define of sigpending=__sigpending # for user_objs. Note this change also preaks dynamic build. # # -------------------------------------------- # diff -Nru a/arch/i386/kernel/sys_i386.c b/arch/i386/kernel/sys_i386.c --- a/arch/i386/kernel/sys_i386.c Tue Feb 11 12:26:26 2003 +++ b/arch/i386/kernel/sys_i386.c Tue Feb 11 12:26:26 2003 @@ -56,7 +56,7 @@ } down_write(¤t->mm->mmap_sem); - error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); + error = do_mmap_pgoff(current->mm, file, addr, len, prot, flags, pgoff); up_write(¤t->mm->mmap_sem); if (file) diff -Nru a/arch/um/Makefile b/arch/um/Makefile --- a/arch/um/Makefile Tue Feb 11 12:26:26 2003 +++ b/arch/um/Makefile Tue Feb 11 12:26:26 2003 @@ -26,7 +26,8 @@ # Have to precede the include because the included Makefiles reference them. SYMLINK_HEADERS = include/asm-um/archparam.h include/asm-um/system.h \ include/asm-um/sigcontext.h include/asm-um/processor.h \ - include/asm-um/ptrace.h include/asm-um/arch-signal.h + include/asm-um/ptrace.h include/asm-um/arch-signal.h \ + include/asm-um/module.h ARCH_SYMLINKS = include/asm-um/arch $(ARCH_DIR)/include/sysdep $(ARCH_DIR)/os \ $(SYMLINK_HEADERS) $(ARCH_DIR)/include/uml-config.h @@ -122,7 +123,7 @@ $(MODE_INCLUDE) # To get a definition of F_SETSIG -USER_CFLAGS += -D_GNU_SOURCE +USER_CFLAGS += -D_GNU_SOURCE -Dsigprocmask=__sigprocmask CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/uml.lds.s \ $(ARCH_DIR)/dyn_link.ld.s $(GEN_HEADERS) diff -Nru a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c --- a/arch/um/drivers/ubd_kern.c Tue Feb 11 12:26:26 2003 +++ b/arch/um/drivers/ubd_kern.c Tue Feb 11 12:26:26 2003 @@ -29,6 +29,7 @@ #include "linux/blkpg.h" #include "linux/genhd.h" #include "linux/spinlock.h" +#include "linux/bitops.h" #include "asm/segment.h" #include "asm/uaccess.h" #include "asm/irq.h" @@ -48,7 +49,10 @@ static spinlock_t ubd_io_lock = SPIN_LOCK_UNLOCKED; static spinlock_t ubd_lock = SPIN_LOCK_UNLOCKED; -static void (*do_ubd)(void); +/* We set this when we asked io thread to do some work, + by using this flag we can avoid do_ubd_request to schedule + io more then once for any given request. (race seen on SMP) */ +static long ubd_servicing; static int ubd_open(struct inode * inode, struct file * filp); static int ubd_release(struct inode * inode, struct file * file); @@ -378,7 +382,6 @@ struct request *rq = elv_next_request(&ubd_queue); int n; - do_ubd = NULL; intr_count++; n = read_ubd_fs(thread_fd, &req, sizeof(req)); if(n != sizeof(req)){ @@ -387,6 +390,7 @@ spin_lock(&ubd_io_lock); end_request(rq, 0); spin_unlock(&ubd_io_lock); + clear_bit(1, &ubd_servicing); return; } @@ -395,6 +399,7 @@ panic("I/O op mismatch"); ubd_finish(rq, req.error); + clear_bit(1, &ubd_servicing); reactivate_fd(thread_fd, UBD_IRQ); do_ubd_request(&ubd_queue); } @@ -500,8 +505,10 @@ disk->first_minor = minor; disk->fops = &ubd_blops; set_capacity(disk, size / 512); - /* needs to be ubd -> /dev/ubd/discX/disc */ - sprintf(disk->disk_name, "ubd"); + /* needs to be ubdN -> /dev/ubdN/discX/disc, + if we don't add N and we have more than one ubd device, sysfs + will hate us for duplicate device names. */ + sprintf(disk->disk_name, "ubd%d", unit); *disk_out = disk; /* /dev/ubd/N style names */ @@ -876,16 +883,21 @@ } } else { - if(do_ubd || list_empty(&q->queue_head)) return; + /* if there is no requests or if another thread already + already started async io - return */ + if(list_empty(&q->queue_head) || + test_and_set_bit(1, &ubd_servicing)) return; + req = elv_next_request(q); err = prepare_request(req, &io_req); if(!err){ - do_ubd = ubd_handler; n = write_ubd_fs(thread_fd, (char *) &io_req, sizeof(io_req)); if(n != sizeof(io_req)) printk("write to io thread failed, " "errno = %d\n", -n); + } else { + clear_bit(1, &ubd_servicing); } } } diff -Nru a/arch/um/dyn.lds.S b/arch/um/dyn.lds.S --- a/arch/um/dyn.lds.S Tue Feb 11 12:26:26 2003 +++ b/arch/um/dyn.lds.S Tue Feb 11 12:26:26 2003 @@ -1,3 +1,4 @@ +#include <asm-generic/vmlinux.lds.h> OUTPUT_FORMAT(ELF_FORMAT) OUTPUT_ARCH(ELF_ARCH) ENTRY(_start) diff -Nru a/arch/um/kernel/init_task.c b/arch/um/kernel/init_task.c --- a/arch/um/kernel/init_task.c Tue Feb 11 12:26:26 2003 +++ b/arch/um/kernel/init_task.c Tue Feb 11 12:26:26 2003 @@ -17,6 +17,7 @@ struct mm_struct init_mm = INIT_MM(init_mm); static struct files_struct init_files = INIT_FILES; static struct signal_struct init_signals = INIT_SIGNALS(init_signals); +static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); /* * Initial task structure. diff -Nru a/arch/um/kernel/signal_kern.c b/arch/um/kernel/signal_kern.c --- a/arch/um/kernel/signal_kern.c Tue Feb 11 12:26:26 2003 +++ b/arch/um/kernel/signal_kern.c Tue Feb 11 12:26:26 2003 @@ -35,7 +35,7 @@ if(sig == SIGSEGV){ struct k_sigaction *ka; - ka = ¤t->sig->action[SIGSEGV - 1]; + ka = ¤t->sighand->action[SIGSEGV - 1]; ka->sa.sa_handler = SIG_DFL; } force_sig(SIGSEGV, current); @@ -141,7 +141,7 @@ return(0); /* Whee! Actually deliver the signal. */ - ka = ¤t->sig->action[sig -1 ]; + ka = ¤t->sighand->action[sig -1 ]; err = handle_signal(regs, sig, ka, &info, oldset, error); if(!err) return(1); diff -Nru a/arch/um/kernel/tt/process_kern.c b/arch/um/kernel/tt/process_kern.c --- a/arch/um/kernel/tt/process_kern.c Tue Feb 11 12:26:26 2003 +++ b/arch/um/kernel/tt/process_kern.c Tue Feb 11 12:26:26 2003 @@ -122,9 +122,9 @@ fn = current->thread.request.u.thread.proc; arg = current->thread.request.u.thread.arg; UPT_SC(¤t->thread.regs.regs) = (void *) (&sig + 1); + block_signals(); suspend_new_thread(current->thread.mode.tt.switch_pipe[0]); - block_signals(); init_new_thread_signals(1); #ifdef CONFIG_SMP schedule_tail(current->thread.prev_sched); diff -Nru a/arch/um/kernel/tt/tlb.c b/arch/um/kernel/tt/tlb.c --- a/arch/um/kernel/tt/tlb.c Tue Feb 11 12:26:26 2003 +++ b/arch/um/kernel/tt/tlb.c Tue Feb 11 12:26:26 2003 @@ -10,6 +10,7 @@ #include "asm/page.h" #include "asm/pgtable.h" #include "asm/uaccess.h" +#include "asm/tlbflush.h" #include "user_util.h" #include "mem_user.h" #include "os.h" diff -Nru a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c --- a/arch/um/kernel/um_arch.c Tue Feb 11 12:26:26 2003 +++ b/arch/um/kernel/um_arch.c Tue Feb 11 12:26:26 2003 @@ -134,12 +134,12 @@ if(umid != NULL){ snprintf(argv1_begin, (argv1_end - argv1_begin) * sizeof(*ptr), - "(%s)", umid); + "(%s) ", umid); ptr = &argv1_begin[strlen(argv1_begin)]; } else ptr = argv1_begin; - snprintf(ptr, (argv1_end - ptr) * sizeof(*ptr), " [%s]", cmd); + snprintf(ptr, (argv1_end - ptr) * sizeof(*ptr), "[%s]", cmd); memset(argv1_begin + strlen(argv1_begin), '\0', argv1_end - argv1_begin - strlen(argv1_begin)); #endif diff -Nru a/arch/um/sys-i386/fault.c b/arch/um/sys-i386/fault.c --- a/arch/um/sys-i386/fault.c Tue Feb 11 12:26:26 2003 +++ b/arch/um/sys-i386/fault.c Tue Feb 11 12:26:26 2003 @@ -7,14 +7,24 @@ #include "sysdep/ptrace.h" #include "sysdep/sigcontext.h" -extern unsigned long search_exception_table(unsigned long addr); +struct exception_table_entry +{ + unsigned long insn; + unsigned long fixup; +}; +const struct exception_table_entry *search_exception_tables(unsigned long add); int arch_fixup(unsigned long address, void *sc_ptr) { struct sigcontext *sc = sc_ptr; - unsigned long fixup; + long fixup; + const struct exception_table_entry *ete; - fixup = search_exception_tables(address); + ete = search_exception_tables(address); + if (!ete) + return 0; + + fixup = ete->fixup; if(fixup != 0){ sc->eip = fixup; return(1); diff -Nru a/include/asm-um/bug.h b/include/asm-um/bug.h --- a/include/asm-um/bug.h Tue Feb 11 12:26:26 2003 +++ b/include/asm-um/bug.h Tue Feb 11 12:26:26 2003 @@ -2,6 +2,7 @@ #define __UM_BUG_H #ifndef __ASSEMBLY__ +#include "linux/kernel.h" #define BUG() do { \ panic("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \ diff -Nru a/include/asm-um/common.lds.S b/include/asm-um/common.lds.S --- a/include/asm-um/common.lds.S Tue Feb 11 12:26:26 2003 +++ b/include/asm-um/common.lds.S Tue Feb 11 12:26:26 2003 @@ -13,14 +13,6 @@ RODATA - __start___ksymtab = .; /* Kernel symbol table */ - __ksymtab : { *(__ksymtab) } - __stop___ksymtab = .; - - __start___gpl_ksymtab = .; /* Kernel symbol table: GPL-only symbols */ - __gpl_ksymtab : { *(__gpl_ksymtab) } - __stop___gpl_ksymtab = .; - __start___kallsyms = .; /* All kernel symbols */ __kallsyms : { *(__kallsyms) } __stop___kallsyms = .; diff -Nru a/include/asm-um/current.h b/include/asm-um/current.h --- a/include/asm-um/current.h Tue Feb 11 12:26:26 2003 +++ b/include/asm-um/current.h Tue Feb 11 12:26:26 2003 @@ -21,6 +21,8 @@ #endif /* __ASSEMBLY__ */ +extern void *get_current(void); + #endif /* diff -Nru a/include/asm-um/module-generic.h b/include/asm-um/module-generic.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/asm-um/module-generic.h Tue Feb 11 12:26:26 2003 @@ -0,0 +1,6 @@ +#ifndef __UM_MODULE_GENERIC_H +#define __UM_MODULE_GENERIC_H + +#include "asm/arch/module.h" + +#endif diff -Nru a/include/asm-um/module-i386.h b/include/asm-um/module-i386.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/asm-um/module-i386.h Tue Feb 11 12:26:26 2003 @@ -0,0 +1,13 @@ +#ifndef __UM_MODULE_H +#define __UM_MODULE_H + +/* UML is simple */ +struct mod_arch_specific +{ +}; + +#define Elf_Shdr Elf32_Shdr +#define Elf_Sym Elf32_Sym +#define Elf_Ehdr Elf32_Ehdr + +#endif diff -Nru a/include/asm-um/module.h b/include/asm-um/module.h --- a/include/asm-um/module.h Tue Feb 11 12:26:26 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,13 +0,0 @@ -#ifndef __UM_MODULE_H -#define __UM_MODULE_H - -/* UML is simple */ -struct mod_arch_specific -{ -}; - -#define Elf_Shdr Elf32_Shdr -#define Elf_Sym Elf32_Sym -#define Elf_Ehdr Elf32_Ehdr - -#endif diff -Nru a/include/asm-um/page.h b/include/asm-um/page.h --- a/include/asm-um/page.h Tue Feb 11 12:26:26 2003 +++ b/include/asm-um/page.h Tue Feb 11 12:26:26 2003 @@ -4,7 +4,6 @@ struct page; #include "asm/arch/page.h" -#include "asm/bug.h" #undef __pa #undef __va diff -Nru a/include/asm-um/thread_info.h b/include/asm-um/thread_info.h --- a/include/asm-um/thread_info.h Tue Feb 11 12:26:26 2003 +++ b/include/asm-um/thread_info.h Tue Feb 11 12:26:26 2003 @@ -65,11 +65,13 @@ #define TIF_POLLING_NRFLAG 3 /* true if poll_idle() is polling * TIF_NEED_RESCHED */ +#define TIF_RESTART_BLOCK 4 #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) +#define _TIF_RESTART_BLOCK (1 << TIF_RESTART_BLOCK) #endif |
From: Jon S. <jon...@ya...> - 2003-02-11 18:07:42
|
I have been running with Oleg's various patches for the last two months without any ill effects. I also like being able to use bk to grab the latest 2.5 already patched for UML. Thanks for the good work. On the other hand I am doing development work so I don't put any real stress on UML other that continually starting and stopping it and running a few test programs. BTW, once out of my 1,000s of starts of UML I got stuck in the tracing myself and can't get out problem for no apparent reason. I'm not sure what you were trying to do with the __sigpending change. Could this have been sorted out with the _user vs _kern build rules in the UML tree? ===== Jon Smirl jon...@ya... __________________________________________________ Do you Yahoo!? Yahoo! Shopping - Send Flowers for Valentine's Day http://shopping.yahoo.com |
From: Oleg D. <gr...@li...> - 2003-02-11 18:26:45
|
Jon Smirl <jon...@ya...> wrote: JS> I'm not sure what you were trying to do with the JS> __sigpending change. Could this have been sorted out JS> with the _user vs _kern build rules in the UML tree? I do use _kernel vs _user build rules already to define sigprocmask to become __sigprocmask in user objects. The problem is that Linux have created sigprocmask() function in kernel recently. Now all the UML code that uses sigprocmask was linked with wrong stuff even before it had a chance to link with libc. No wonder it started to crash very early (on first sigprocmask() call) ;) From my understanding of symbol wrapping feature in ld, it won't help much. And Linus refused to change the name. (my commit comment got the name wrong, it is sigprocmask that is the problem, not sigpending). Bye, Oleg |