本文共 906 字,大约阅读时间需要 3 分钟。
lock_page 可以占用这个页面,这样其他进程要使用这个页时只能在睡眠中等待static inline void lock_page(struct page *page){ #这里提示在使用lock_page这个函数时会等待 might_sleep(); #检查是否可以锁定这个page.如果没有其他进程用这个page,则直接设置flag来锁定这个page,否则调用__lock_page #来等待这个页面被释放 if (!trylock_page(page)) __lock_page(page);}这两个函数分别分析如下:static inline int trylock_page(struct page *page){ #检查是否是复合页,如果是复合页则返回第一个页面,如果是正常也,则还是返回page page = compound_head(page); #设置PG_locked 来锁定这个页面,如果原来flag中PG_locked 已经被置位,则返回1,取反后返回0 return (likely(!test_and_set_bit_lock(PG_locked, &page->flags)));}回到lock_page 中,如果trylock_page 返回零说明这个页面已经被其他进程占用,则调用__lock_page 等待void __lock_page(struct page *__page){ #检查是否是复合页,如果是复合页则返回第一个页面,如果是正常也,则还是返回page struct page *page = compound_head(__page); #看来每个page对应一个wait_queue_head_t wait_queue_head_t *q = page_waitqueue(page); #在这个bit PG_locked上sleep 等待,并将当前进程设置为TASK_UNINTERRUPTIBLE wait_on_page_bit_common(q, page, PG_locked, TASK_UNINTERRUPTIBLE, true);}
转载地址:http://rjnmi.baihongyu.com/