📄 rthal-5g-2.4.22-yd2f.patch
字号:
+ }+//printk("rtai_callback_list %X\n", rtai_callback_list);+}+//+//+//+ NORET_TYPE void do_exit(long code) { struct task_struct *tsk = current;@@ -439,6 +504,18 @@ #ifdef CONFIG_BSD_PROCESS_ACCT acct_process(code); #endif++/*+ * PGGC added these lines to callback rtai when a task dies.+ * This assumes that a LXRT task should/will always set its+ * scheduling police to SCHED_FIFO or SCHED_RR.+ * We may want to enforce this in rt_task_init(...).+ * (For the moment it is not so, thus let's inform LXRT anyhow (Paolo))+ */+ if(tsk->this_rt_task[0]) {+ inform_rtai();+ }+ __exit_mm(tsk); lock_kernel();+ diff -u yd-linux-2.4.22-2f/kernel/fork.c.PRE_RTAI yd-linux-2.4.22-2f/kernel/fork.c--- yd-linux-2.4.22-2f/kernel/fork.c.PRE_RTAI 2003-08-25 13:44:44.000000000 +0200+++ yd-linux-2.4.22-2f/kernel/fork.c 2004-03-12 12:21:26.000000000 +0100@@ -233,7 +233,9 @@ atomic_set(&mm->mm_count, 1); init_rwsem(&mm->mmap_sem); mm->page_table_lock = SPIN_LOCK_UNLOCKED;+ lock_kernel(); mm->pgd = pgd_alloc(mm);+ unlock_kernel(); mm->def_flags = 0; if (mm->pgd) return mm;@@ -265,7 +267,9 @@ inline void __mmdrop(struct mm_struct *mm) { BUG_ON(mm == &init_mm);+ lock_kernel(); pgd_free(mm->pgd);+ unlock_kernel(); destroy_context(mm); free_mm(mm); }+ diff -u yd-linux-2.4.22-2f/kernel/ksyms.c.PRE_RTAI yd-linux-2.4.22-2f/kernel/ksyms.c--- yd-linux-2.4.22-2f/kernel/ksyms.c.PRE_RTAI 2003-11-09 21:57:53.000000000 +0100+++ yd-linux-2.4.22-2f/kernel/ksyms.c 2004-03-12 12:27:45.000000000 +0100@@ -603,3 +603,45 @@ /* To match ksyms with System.map */ extern const char _end[]; EXPORT_SYMBOL(_end);++/*** RTAI ***/+/*+ * used to inform rtai a task is about to die.+ */+extern int set_rtai_callback( void (*fun)(struct task_struct *tsk));+extern void remove_rtai_callback(void (*fun)(struct task_struct *tsk));+extern NORET_TYPE void do_exit(long code);+EXPORT_SYMBOL(set_rtai_callback);+EXPORT_SYMBOL(remove_rtai_callback);+EXPORT_SYMBOL(do_exit);++/*+ * used to inform RTAI LXRT a task should deal with a Linux signal, and for rt_lxrt_fork()+ */+extern int (*rtai_signal_handler)(struct task_struct *lnxt, int sig);+EXPORT_SYMBOL(rtai_signal_handler);+extern int do_fork(unsigned long clone_flags, unsigned long stack_start, struct pt_regs *regs, unsigned long stack_size);+EXPORT_SYMBOL(do_fork);++/*+ * used to provide async io support (aio) to RTAI LXRT.+ */+extern ssize_t sys_read(unsigned int fd, char * buf, size_t count);+extern ssize_t sys_write(unsigned int fd, const char * buf, size_t count);+extern ssize_t sys_pread(unsigned int fd, char * buf,+ size_t count, loff_t pos);+extern ssize_t sys_pwrite(unsigned int fd, const char * buf,+ size_t count, loff_t pos);+extern long sys_fsync(unsigned int fd);+extern long sys_fdatasync(unsigned int fd);+extern long sys_open(const char * filename, int flags, int mode);+extern long sys_close(unsigned int fd);++EXPORT_SYMBOL(sys_read);+EXPORT_SYMBOL(sys_write);+EXPORT_SYMBOL(sys_open);+/*EXPORT_SYMBOL(sys_close);*/+EXPORT_SYMBOL(sys_pread);+EXPORT_SYMBOL(sys_pwrite);+EXPORT_SYMBOL(sys_fsync);+EXPORT_SYMBOL(sys_fdatasync);+ diff -u yd-linux-2.4.22-2f/kernel/sched.c.PRE_RTAI yd-linux-2.4.22-2f/kernel/sched.c--- yd-linux-2.4.22-2f/kernel/sched.c.PRE_RTAI 2003-08-25 13:44:44.000000000 +0200+++ yd-linux-2.4.22-2f/kernel/sched.c 2004-03-12 12:21:26.000000000 +0100@@ -544,6 +544,75 @@ * tasks can run. It can not be killed, and it cannot sleep. The 'state' * information in task[0] is never used. */++int idle_weight = -1000;+#define MAX_MM 4096 // How large should it be?+static struct smm_t { int in, out; struct mm_struct *mm[MAX_MM]; } smm[NR_CPUS];+#define incpnd(x) do { x = (x + 1) & (MAX_MM - 1); } while(0)++#ifdef CONFIG_X86+static inline void pend_mm(struct mm_struct *mm, int cpu)+{+ if (rthal.lxrt_global_cli) {+ struct smm_t *p = smm + cpu;+ p->mm[p->in] = mm;+ incpnd(p->in);+ } else {+ mmdrop(mm);+ }+}++static inline void drop_mm(void)+{+ if (rthal.lxrt_global_cli) {+ struct smm_t *p = smm + smp_processor_id();+ while (p->out != p->in) {+ mmdrop(p->mm[p->out]);+ incpnd(p->out);+ }+ }+}++void switch_mem(struct task_struct *prevp, struct task_struct *nextp, int cpuid)+{+ if (cpuid < 0) {+ struct mm_struct *next = nextp->active_mm;+ if (prevp->active_mm != next || (cpuid & 0x40000000)) {+ if ((prevp->active_mm)->context.segments != next->context.segments) {+ load_LDT(next);+ }+ set_bit(cpuid & 0xFFFFFFF, &next->context.cpuvalid);+ asm volatile("movl %0,%%cr3": :"r" (__pa(next->pgd)));+ }+#ifdef CONFIG_SMP+ else if (!test_and_set_bit(cpuid & 0xFFFFFFF, &next->context.cpuvalid)) {+ load_LDT(next);+ }+#endif+ } else {+ struct mm_struct *oldmm = prevp->active_mm;+ if (nextp->mm) {+ switch_mm(oldmm, nextp->mm, nextp, cpuid);+ } else {+ nextp->active_mm = oldmm;+ atomic_inc(&oldmm->mm_count);+ enter_lazy_tlb(oldmm, nextp, cpuid);+ }+ if (!prevp->mm) {+ prevp->active_mm = NULL;+ pend_mm(oldmm, cpuid);+ }+ }+}+#else+static inline void pend_mm(struct mm_struct *mm, int cpu)+{+ mmdrop(mm);+}+static inline void drop_mm(void) {}+void switch_mem(struct task_struct *prevp, struct task_struct *nextp, int cpuid) {}+#endif+ asmlinkage void schedule(void) { struct schedule_data * sched_data;@@ -602,7 +671,7 @@ * Default process to select.. */ next = idle_task(this_cpu);- c = -1000;+ c = idle_weight; list_for_each(tmp, &runqueue_head) { p = list_entry(tmp, struct task_struct, run_list); if (can_schedule(p, this_cpu)) {@@ -684,7 +753,7 @@ if (!prev->mm) { prev->active_mm = NULL;- mmdrop(oldmm);+ pend_mm(oldmm, this_cpu); } } @@ -693,6 +762,7 @@ * stack. */ switch_to(prev, next, prev);+ drop_mm(); __schedule_tail(prev); same_process:+ diff -u yd-linux-2.4.22-2f/kernel/signal.c.PRE_RTAI yd-linux-2.4.22-2f/kernel/signal.c--- yd-linux-2.4.22-2f/kernel/signal.c.PRE_RTAI 2003-06-13 16:51:39.000000000 +0200+++ yd-linux-2.4.22-2f/kernel/signal.c 2004-03-12 12:21:26.000000000 +0100@@ -1010,9 +1010,30 @@ return ret; } +//+// Add this pointer to the RTAI signal handler.+//+int (*rtai_signal_handler)(struct task_struct *lnxt, int sig);+ asmlinkage long sys_kill(int pid, int sig) {+// Add this section to call the RTAI signal handler.+//+ {+ struct task_struct *p;+ int ret;++ if (rtai_signal_handler) {+ p = find_task_by_pid(pid);+ if(p && (p->policy == SCHED_FIFO || p->policy == SCHED_RR) && p->this_rt_task[0]) {+ ret = rtai_signal_handler(p, sig);+ if(!ret) return 0; //let Linux deal with it.+ }+ }+ }++ { struct siginfo info; info.si_signo = sig;@@ -1022,6 +1043,7 @@ info.si_uid = current->uid; return kill_something_info(sig, &info, pid);+ } } /*+ diff -u yd-linux-2.4.22-2f/Makefile.PRE_RTAI yd-linux-2.4.22-2f/Makefile--- yd-linux-2.4.22-2f/Makefile.PRE_RTAI 2003-11-09 23:16:24.000000000 +0100+++ yd-linux-2.4.22-2f/Makefile 2004-03-12 12:28:34.000000000 +0100@@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 22-EXTRAVERSION = -2fcustom+EXTRAVERSION = -2fcustom-rthal5 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -