struct plist_head chain;};static struct futex_hash_bucket futex_queues[1<<FUTEX_HASHBITS]; 1. 2. 3. 着重看futex_wait_setup和两个函数futex_wait_queue_me static int futex_wait_setup(u32 __user *uaddr, u32 val, int fshared, struct futex_q *q, struct futex_hash_bucket **hb){ u3...
futex_wait_queue_me(hb, &q, to); /* If we were woken (and unqueued), we succeeded, whatever. */ ret = 0; //如果unqueue_me成功,则说明是超时触发(因为futex_wake唤醒时,会将该进程移出等待队列,所以这里会失败) if (!unqueue_me(&q)) goto out_put_key; ret = -ETIMEDOUT; if (to ...
struct plist_head chain;};static struct futex_hash_bucket futex_queues[1<<FUTEX_HASHBITS]; 着重看futex_wait_setup和两个函数futex_wait_queue_me static int futex_wait_setup(u32 __user *uaddr, u32 val, int fshared, struct futex_q *q, struct futex_hash_bucket **hb){ u32 uval; int...
futex_wait_queue_me(hb, &q, to);/* If we were woken (and unqueued), we succeeded, whatever. */ret =0;//如果unqueue_me成功,则说明是超时触发(因为futex_wake唤醒时,会将该进程移出等待队列,所以这里会失败)if(!unqueue_me(&q))gotoout_put_key; ret = -ETIMEDOUT;if(to && !to->task)...
在futex_wait_setup方法中会加自旋锁;在futex_wait_queue_me中将状态设置为TASK_INTERRUPTIBLE,调用queue_me将当期线程插入到等待队列中,然后才释放自旋锁。也就是说检查uaddr的值的过程跟进程挂起的过程放在同一个临界区中。当释放自旋锁后,这时再更改addr地址的值已经没有关系了,因为当期进程已经加入到等待队列中,...
8 105 44 futex_wait_queue_me futex_wait do_futex SyS_futex system_call_fastpath 0x7f6365a167bc 1. 每一行前三个数字分别是后面代码执行的次数、总共执行延迟时间(单位是微秒)和最长执行延迟时间(单位是微秒)。后面则是代码完整的调用栈。 /proc/[pid]/maps ...
futex_wait_queue_me(...);// :2713 ... } // kernel/futex.c:2571 staticvoidfutex_wait_queue_me(...){ ... // 这里可以看到,调用 futex 的进程将变为睡眠状态,与我们的认知一致 set_current_state(TASK_INTERRUPTIBLE);// :2580 ... ...
// kernel/futex.c:2571 static void futex_wait_queue_me(...) { ... // 这里可以看到,调用 futex 的进程将变为睡眠状态,与我们的认知一致 set_current_state(TASK_INTERRUPTIBLE); // :2580 ... freezable_schedule(); // :2598 ...
271.440us | }/*schedule*/5) |_cond_resched() {5)0.267us |rcu_all_qs();5)0.834us |}5) !273.311us | }/*futex_wait_queue_me*/ 在这个图中,DURATION表示运行一个函数所花费的时间。注意 + 和 !符号。加号(+)表示函数耗时超过10微秒,而感叹号(!)表示耗时超过100微秒。在FUNCTION_CALLS下面,...
8 105 44 futex_wait_queue_me futex_wait do_futex SyS_futex system_call_fastpath 0x7f6365a167bc 每一行前三个数字分别是后面代码执行的次数、总共执行延迟时间(单位是微秒)和最长执行延迟时间(单位是微秒)。后面则是代码完整的调用栈。 /proc/[pid]/maps ...