首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

缺页异常详解(11)

缺页异常详解(11)

    else
                   mem_cgroup_uncharge_page(new_page);
         if (new_page)
                   page_cache_release(new_page);
         if (old_page)
                   page_cache_release(old_page);
unlock:
         pte_unmap_unlock(page_table, ptl);
         if (dirty_page) {
                   /*
                    * Yes, Virginia, this is actually required to prevent a race
                    * with clear_page_dirty_for_io() from clearing the page dirty
                    * bit after it clear all dirty ptes, but before a racing
                    * do_wp_page installs a dirty pte.
                    *
                    * do_no_page is protected similarly.
                    */
                   if (!page_mkwrite) {
                            wait_on_page_locked(dirty_page);
                            set_page_dirty_balance(dirty_page, page_mkwrite);
                   }
                   put_page(dirty_page);
                   if (page_mkwrite) {
                            struct address_space *mapping = dirty_page->mapping;
                            set_page_dirty(dirty_page);
                            unlock_page(dirty_page);
                            page_cache_release(dirty_page);
                            if (mapping)      {
                                     /*
                                      * Some device drivers do not set page.mapping
                                      * but still dirty their pages
                                      */
                                     balance_dirty_pages_ratelimited(mapping);
                            }
                   }
                   /* file_update_time outside page_lock */
                   if (vma->vm_file)
                            file_update_time(vma->vm_file);
         }
         return ret;
oom_free_new:
         page_cache_release(new_page);
oom:
         if (old_page) {
                   if (page_mkwrite) {
                            unlock_page(old_page);
                            page_cache_release(old_page);
                   }
                   page_cache_release(old_page);
         }
         return VM_FAULT_OOM;
unwritable_page:
         page_cache_release(old_page);
         return ret;
}
一级一级返回,最终返回到函数__do_page_fault,会根据返回值fault累计task的相应异常类型次数(maj_fltmin_flt),并最终把fault返回给函数do_page_fault,释放信号量mmap_sem,正常情况下就返回0,缺页异常处理完毕
继承事业,薪火相传
返回列表