|
ock(lock) \ do { \ _raw_spin_unlock(lock); \ ctx_sw_on(); \ 离开自旋锁时允许并完成内核抢占 } while (0) #define read_lock(lock) ({ctx_sw_off(); _raw_read_lock(lock);}) #define read_unlock(lock) ({_raw_read_unlock(lock); ctx_sw_on();}) #define write_lock(lock) ({ctx_sw_off(); _raw_write_lock(lock);}) #define write_unlock(lock) ({_raw_write_unlock(lock); ctx_sw_on();}) #define write_trylock(lock) ({ctx_sw_off(); _raw_write_trylock(lock) ? \ 1 : ({ctx_sw_on(); 0;});}) ... include/asm/softirq.h: #define cpu_bh_disable(cpu) do { ctx_sw_off(); local_bh_count(cpu)++; barrie r(); } while (0) #define cpu_bh_enable(cpu) do { barrier(); local_bh_count(cpu)--;ctx_sw_on() ; } while (0) kernel/schedule.c: #ifdef CONFIG_PREEMPT asmlinkage void preempt_schedule(void) { while (current->need_resched) { ctx_sw_off(); current->state |= TASK_PREEMPTED; schedule(); current->state &= ~TASK_PREEMPTED; ctx_sw_on_no_preempt(); } } #endif asmlinkage void schedule(void) { struct schedule_data * sched_data; struct task_struct *prev, *next, *p; struct list_head *tmp; int this_cpu, c; #ifdef CONFIG_PREEMPT ctx_sw_off(); #endif if (!current->active_mm) BUG(); need_resched_back: prev = current; this_cpu = prev->processor; if (in_interrupt()) goto scheduling_in_interrupt; release_kernel_lock(prev, this_cpu); /* Do "administrative" work here while we don't hold any locks */ if (softirq_active(this_cpu) & softirq_mask(this_cpu)) goto handle_softirq; handle_softirq_back: /* * 'sched_data' is protected by the fact that we can run * only one process per CPU. */ sched_data = & aligned_data[this_cpu].schedule_data; spin_lock_irq(&run上一页 [1] [2] [3] [4] [5] [6] 下一页 |
|
|
|
|
|
|
|