博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
isolate_lru_pages
阅读量:4153 次
发布时间:2019-05-25

本文共 1655 字,大约阅读时间需要 5 分钟。

static unsigned long isolate_lru_pages(unsigned longnr_to_scan,

              struct lruvec *lruvec, struct list_head*dst,

              unsignedlong *nr_scanned, struct scan_control *sc,

              isolate_mode_tmode, enum lru_list lru)

{

       struct list_head *src = &lruvec->lists[lru];

       unsignedlong nr_taken = 0;

       unsignedlong scan;

 

       for (scan=0;scan<nr_to_scan&& nr_taken < nr_to_scan &&!list_empty(src); scan++) {

              structpage *page;

               page= lru_to_page(src);

              prefetchw_prev_lru_page(page,src, flags);

               VM_BUG_ON_PAGE(!PageLRU(page),page);

             switch(__isolate_lru_page(page, mode)) {

              case0:

                     nr_taken+= hpage_nr_pages(page);

                     list_move(&page->lru,dst);

                     break;

 

              case-EBUSY:

                     /*else it is being freed elsewhere */

                     list_move(&page->lru,src);

                     continue;

 

              default:

                     BUG();

              }

       }

 

       *nr_scanned = scan;

       trace_mm_vmscan_lru_isolate(sc->order,nr_to_scan, scan, nr_taken, mode, is_file_lru(lru));

       return nr_taken;

}

 

 

 

 

int __isolate_lru_page(struct page *page, isolate_mode_t mode)

{

       intret = -EINVAL;

        /*Only take pages on the LRU. */

       if (!PageLRU(page))

              returnret;

 

       /*Compaction should not handle unevictable pages but CMA can do so */

       if(PageUnevictable(page) && !(mode &ISOLATE_UNEVICTABLE))

              returnret;

        ret= -EBUSY;

        if(mode & (ISOLATE_CLEAN|ISOLATE_ASYNC_MIGRATE)) {

              /*All the caller can do on PageWriteback is block */

              if (PageWriteback(page))

                     returnret;

 

              if (PageDirty(page)) {

                     structaddress_space *mapping;

                      /*ISOLATE_CLEAN means only clean pages */

                     if (mode & ISOLATE_CLEAN)

                            returnret;

                      mapping = page_mapping(page);

                     if(mapping && !mapping->a_ops->migratepage)

                            returnret;

              }

       }

 

       if ((mode & ISOLATE_UNMAPPED) && page_mapped(page))

              returnret;

 

       if (likely(get_page_unless_zero(page))) {

              ClearPageLRU(page);

              ret= 0;

       }

 

       return ret;

}

转载地址:http://vxqti.baihongyu.com/

你可能感兴趣的文章
Git从入门到放弃
查看>>
java8采用stream对集合的常用操作
查看>>
EasySwift/YXJOnePixelLine 极其方便的画出真正的一个像素的线
查看>>
Ubuntu系统上安装Nginx服务器的简单方法
查看>>
Ubuntu Linux系统下apt-get命令详解
查看>>
ubuntu 16.04 下重置 MySQL 5.7 的密码(忘记密码)
查看>>
Ubuntu Navicat for MySQL安装以及破解方案
查看>>
HTTPS那些事 用java实现HTTPS工作原理
查看>>
oracle函数trunc的使用
查看>>
MySQL 存储过程或者函数中传参数实现where id in(1,2,3,...)IN条件拼接
查看>>
java反编译
查看>>
Class.forName( )你搞懂了吗?——转
查看>>
jarFile
查看>>
EJB与JAVA BEAN_J2EE的异步消息机制
查看>>
数学等于号是=那三个横杠是什么符
查看>>
HTTP协议详解
查看>>
java多线程中的join方法详解
查看>>
ECLIPSE远程调试出现如下问题 ECLIPSE中调试代码提示找不到源
查看>>
java abstract修饰符
查看>>
数组分为两部分,使得其和相差最小
查看>>