Lines Matching refs:page

68 static void dfs_page_ref(struct dfs_page *page);
69 static int dfs_page_inactive(struct dfs_page *page);
70 static int dfs_page_remove(struct dfs_page *page);
71 static void dfs_page_release(struct dfs_page *page);
72 static int dfs_page_dirty(struct dfs_page *page);
107 struct dfs_page *page = RT_NULL; in dfs_aspace_gc() local
112 page = rt_list_entry(node, struct dfs_page, space_node); in dfs_aspace_gc()
114 if (dfs_page_remove(page) == 0) in dfs_aspace_gc()
123 page = rt_list_entry(node, struct dfs_page, space_node); in dfs_aspace_gc()
125 if (dfs_page_remove(page) == 0) in dfs_aspace_gc()
328 struct dfs_page *page = 0; in dfs_pcache_thread() local
334 page = 0; in dfs_pcache_thread()
343page = rt_list_entry(aspace->list_dirty.next, struct dfs_page, dirty_node); in dfs_pcache_thread()
344 dfs_page_ref(page); in dfs_pcache_thread()
350 page = RT_NULL; in dfs_pcache_thread()
357 if (page) in dfs_pcache_thread()
359 struct dfs_aspace *aspace = page->aspace; in dfs_pcache_thread()
362 if (page->is_dirty == 1 && aspace->vnode) in dfs_pcache_thread()
364 if (rt_tick_get_millisecond() - page->tick_ms >= 500) in dfs_pcache_thread()
366 if (aspace->vnode->size < page->fpos + page->size) in dfs_pcache_thread()
368 page->len = aspace->vnode->size - page->fpos; in dfs_pcache_thread()
372 page->len = page->size; in dfs_pcache_thread()
376 aspace->ops->write(page); in dfs_pcache_thread()
379 page->is_dirty = 0; in dfs_pcache_thread()
381 if (page->dirty_node.next != RT_NULL) in dfs_pcache_thread()
383 rt_list_remove(&page->dirty_node); in dfs_pcache_thread()
384 page->dirty_node.next = RT_NULL; in dfs_pcache_thread()
388 dfs_page_release(page); in dfs_pcache_thread()
842 struct dfs_page *page; in _dfs_aspace_dump() local
851 page = rt_list_entry(next, struct dfs_page, space_node); in _dfs_aspace_dump()
852 if (is_dirty && page->is_dirty) in _dfs_aspace_dump()
854 …ntf(" pages >> fpos: %d index :%d is_dirty: %d\n", page->fpos, page->fpos / ARCH_PAGE_SIZE, pag… in _dfs_aspace_dump()
858 …ntf(" pages >> fpos: %d index :%d is_dirty: %d\n", page->fpos, page->fpos / ARCH_PAGE_SIZE, pag… in _dfs_aspace_dump()
943 MSH_CMD_EXPORT_ALIAS(dfs_pcache_dump, dfs_cache, dump dfs page cache);
955 static int dfs_page_unmap(struct dfs_page *page) in dfs_page_unmap() argument
960 next = page->mmap_head.next; in dfs_page_unmap()
962 if (next != &page->mmap_head && page->fpos < page->aspace->vnode->size) in dfs_page_unmap()
964 dfs_page_dirty(page); in dfs_page_unmap()
967 while (next != &page->mmap_head) in dfs_page_unmap()
979 vaddr = dfs_aspace_vaddr(varea, page->fpos); in dfs_page_unmap()
987 rt_list_init(&page->mmap_head); in dfs_page_unmap()
1007 struct dfs_page *page = RT_NULL; in dfs_page_create() local
1010 page = rt_calloc(1, sizeof(struct dfs_page)); in dfs_page_create()
1011 if (page) in dfs_page_create()
1013 page->page = rt_pages_alloc_tagged(0, affid, PAGE_ANY_AVAILABLE); in dfs_page_create()
1014 if (page->page) in dfs_page_create()
1017 rt_list_init(&page->mmap_head); in dfs_page_create()
1018 rt_atomic_store(&(page->ref_count), 1); in dfs_page_create()
1023 rt_free(page); in dfs_page_create()
1024 page = RT_NULL; in dfs_page_create()
1028 return page; in dfs_page_create()
1039 static void dfs_page_ref(struct dfs_page *page) in dfs_page_ref() argument
1041 rt_atomic_add(&(page->ref_count), 1); in dfs_page_ref()
1055 static void dfs_page_release(struct dfs_page *page) in dfs_page_release() argument
1057 struct dfs_aspace *aspace = page->aspace; in dfs_page_release()
1061 rt_atomic_sub(&(page->ref_count), 1); in dfs_page_release()
1063 if (rt_atomic_load(&(page->ref_count)) == 0) in dfs_page_release()
1065 dfs_page_unmap(page); in dfs_page_release()
1067 if (page->is_dirty == 1 && aspace->vnode) in dfs_page_release()
1069 if (aspace->vnode->size < page->fpos + page->size) in dfs_page_release()
1071 page->len = aspace->vnode->size - page->fpos; in dfs_page_release()
1075 page->len = page->size; in dfs_page_release()
1079 aspace->ops->write(page); in dfs_page_release()
1081 page->is_dirty = 0; in dfs_page_release()
1083 RT_ASSERT(page->is_dirty == 0); in dfs_page_release()
1085 rt_pages_free(page->page, 0); in dfs_page_release()
1086 page->page = RT_NULL; in dfs_page_release()
1087 rt_free(page); in dfs_page_release()
1127 static int _dfs_page_insert(struct dfs_aspace *aspace, struct dfs_page *page) in _dfs_page_insert() argument
1139 if (page->fpos < tmp->fpos) in _dfs_page_insert()
1141 else if (page->fpos > tmp->fpos) in _dfs_page_insert()
1148 util_avl_link(&page->avl_node, current, next); in _dfs_page_insert()
1150 aspace->avl_page = page; in _dfs_page_insert()
1164 static void _dfs_page_remove(struct dfs_aspace *aspace, struct dfs_page *page) in _dfs_page_remove() argument
1166 if (aspace->avl_page && aspace->avl_page == page) in _dfs_page_remove()
1171 util_avl_remove(&page->avl_node, &aspace->avl_root); in _dfs_page_remove()
1216 static int dfs_page_insert(struct dfs_page *page) in dfs_page_insert() argument
1218 struct dfs_aspace *aspace = page->aspace; in dfs_page_insert()
1222 rt_list_insert_before(&aspace->list_inactive, &page->space_node); in dfs_page_insert()
1225 if (_dfs_page_insert(aspace, page)) in dfs_page_insert()
1258 static int dfs_page_remove(struct dfs_page *page) in dfs_page_remove() argument
1261 struct dfs_aspace *aspace = page->aspace; in dfs_page_remove()
1265 if (rt_atomic_load(&(page->ref_count)) == 1) in dfs_page_remove()
1267 if (page->space_node.next != RT_NULL) in dfs_page_remove()
1269 rt_list_remove(&page->space_node); in dfs_page_remove()
1270 page->space_node.next = RT_NULL; in dfs_page_remove()
1272 _dfs_page_remove(aspace, page); in dfs_page_remove()
1274 if (page->dirty_node.next != RT_NULL) in dfs_page_remove()
1276 rt_list_remove(&page->dirty_node); in dfs_page_remove()
1277 page->dirty_node.next = RT_NULL; in dfs_page_remove()
1282 dfs_page_release(page); in dfs_page_remove()
1300 static int dfs_page_active(struct dfs_page *page) in dfs_page_active() argument
1302 struct dfs_aspace *aspace = page->aspace; in dfs_page_active()
1305 if (page->space_node.next != RT_NULL) in dfs_page_active()
1307 rt_list_remove(&page->space_node); in dfs_page_active()
1308 rt_list_insert_before(&aspace->list_inactive, &page->space_node); in dfs_page_active()
1324 static int dfs_page_inactive(struct dfs_page *page) in dfs_page_inactive() argument
1326 struct dfs_aspace *aspace = page->aspace; in dfs_page_inactive()
1329 if (page->space_node.next != RT_NULL) in dfs_page_inactive()
1331 rt_list_remove(&page->space_node); in dfs_page_inactive()
1332 rt_list_insert_before(&aspace->list_active, &page->space_node); in dfs_page_inactive()
1348 static int dfs_page_dirty(struct dfs_page *page) in dfs_page_dirty() argument
1350 struct dfs_aspace *aspace = page->aspace; in dfs_page_dirty()
1354 if (page->dirty_node.next == RT_NULL && page->space_node.next != RT_NULL) in dfs_page_dirty()
1356 rt_list_insert_before(&aspace->list_dirty, &page->dirty_node); in dfs_page_dirty()
1359 page->is_dirty = 1; in dfs_page_dirty()
1360 page->tick_ms = rt_tick_get_millisecond(); in dfs_page_dirty()
1386 struct dfs_page *page; in dfs_page_search() local
1393 page = aspace->avl_page; in dfs_page_search()
1394 dfs_page_active(page); in dfs_page_search()
1395 dfs_page_ref(page); in dfs_page_search()
1397 return page; in dfs_page_search()
1403 page = rt_container_of(avl_node, struct dfs_page, avl_node); in dfs_page_search()
1404 cmp = dfs_page_compare(fpos, page->fpos); in dfs_page_search()
1416 aspace->avl_page = page; in dfs_page_search()
1417 dfs_page_active(page); in dfs_page_search()
1418 dfs_page_ref(page); in dfs_page_search()
1420 return page; in dfs_page_search()
1444 struct dfs_page *page = RT_NULL; in dfs_aspace_load_page() local
1451 page = dfs_page_create(pos); in dfs_aspace_load_page()
1452 if (page) in dfs_aspace_load_page()
1454 page->aspace = aspace; in dfs_aspace_load_page()
1455 page->size = ARCH_PAGE_SIZE; in dfs_aspace_load_page()
1456 page->fpos = RT_ALIGN_DOWN(pos, ARCH_PAGE_SIZE); in dfs_aspace_load_page()
1457 aspace->ops->read(file, page); in dfs_aspace_load_page()
1458 page->ref_count ++; in dfs_aspace_load_page()
1460 dfs_page_insert(page); in dfs_aspace_load_page()
1464 return page; in dfs_aspace_load_page()
1482 struct dfs_page *page = RT_NULL; in dfs_page_lookup() local
1486 page = dfs_page_search(aspace, pos); in dfs_page_lookup()
1487 if (!page) in dfs_page_lookup()
1495 page = dfs_aspace_load_page(file, fpos); in dfs_page_lookup()
1496 if (page) in dfs_page_lookup()
1500 tmp = page; in dfs_page_lookup()
1504 dfs_page_release(page); in dfs_page_lookup()
1513 page = dfs_page_search(aspace, fpos); in dfs_page_lookup()
1514 if (page) in dfs_page_lookup()
1516 dfs_page_release(page); in dfs_page_lookup()
1520 } while (count && page == RT_NULL); in dfs_page_lookup()
1522 page = tmp; in dfs_page_lookup()
1523 if (page) in dfs_page_lookup()
1536 return page; in dfs_page_lookup()
1541 return page; in dfs_page_lookup()
1569 struct dfs_page *page; in dfs_aspace_read() local
1576 page = dfs_page_lookup(file, *pos); in dfs_aspace_read()
1577 if (page) in dfs_aspace_read()
1582 if (aspace->vnode->size < page->fpos + ARCH_PAGE_SIZE) in dfs_aspace_read()
1588 len = page->fpos + ARCH_PAGE_SIZE - *pos; in dfs_aspace_read()
1594 rt_memcpy(ptr, page->page + *pos - page->fpos, len); in dfs_aspace_read()
1602 dfs_page_release(page); in dfs_aspace_read()
1606 dfs_page_release(page); in dfs_aspace_read()
1641 struct dfs_page *page; in dfs_aspace_write() local
1657 page = dfs_page_lookup(file, *pos); in dfs_aspace_write()
1658 if (page) in dfs_aspace_write()
1663 len = page->fpos + ARCH_PAGE_SIZE - *pos; in dfs_aspace_write()
1665 rt_memcpy(page->page + *pos - page->fpos, ptr, len); in dfs_aspace_write()
1678 if (aspace->vnode->size < page->fpos + page->size) in dfs_aspace_write()
1680 page->len = aspace->vnode->size - page->fpos; in dfs_aspace_write()
1684 page->len = page->size; in dfs_aspace_write()
1687 aspace->ops->write(page); in dfs_aspace_write()
1688 page->is_dirty = 0; in dfs_aspace_write()
1692 dfs_page_dirty(page); in dfs_aspace_write()
1695 dfs_page_release(page); in dfs_aspace_write()
1724 struct dfs_page *page; in dfs_aspace_flush() local
1732 page = rt_list_entry(next, struct dfs_page, dirty_node); in dfs_aspace_flush()
1733 if (page->is_dirty == 1 && aspace->vnode) in dfs_aspace_flush()
1735 if (aspace->vnode->size < page->fpos + page->size) in dfs_aspace_flush()
1737 page->len = aspace->vnode->size - page->fpos; in dfs_aspace_flush()
1741 page->len = page->size; in dfs_aspace_flush()
1746 aspace->ops->write(page); in dfs_aspace_flush()
1749 page->is_dirty = 0; in dfs_aspace_flush()
1751 RT_ASSERT(page->is_dirty == 0); in dfs_aspace_flush()
1780 struct dfs_page *page; in dfs_aspace_clean() local
1789 page = rt_list_entry(next, struct dfs_page, space_node); in dfs_aspace_clean()
1791 dfs_page_remove(page); in dfs_aspace_clean()
1821 struct dfs_page *page; in dfs_aspace_mmap() local
1825 page = dfs_page_lookup(file, dfs_aspace_fpos(varea, vaddr)); in dfs_aspace_mmap()
1826 if (page) in dfs_aspace_mmap()
1831 void *pg_vaddr = page->page; in dfs_aspace_mmap()
1833 int err = rt_varea_map_range(varea, vaddr, pg_paddr, page->size); in dfs_aspace_mmap()
1856 rt_list_insert_after(&page->mmap_head, &map->mmap_node); in dfs_aspace_mmap()
1857 dfs_page_release(page); in dfs_aspace_mmap()
1862 dfs_page_release(page); in dfs_aspace_mmap()
1868 dfs_page_release(page); in dfs_aspace_mmap()
1899 struct dfs_page *page; in dfs_aspace_unmap() local
1908 page = rt_list_entry(next, struct dfs_page, space_node); in dfs_aspace_unmap()
1909 if (page) in dfs_aspace_unmap()
1915 node = page->mmap_head.next; in dfs_aspace_unmap()
1917 while (node != &page->mmap_head) in dfs_aspace_unmap()
1941 page->fpos < page->aspace->vnode->size) in dfs_aspace_unmap()
1943 dfs_page_dirty(page); in dfs_aspace_unmap()
1974 struct dfs_page *page; in dfs_aspace_page_unmap() local
1981 page = dfs_page_search(aspace, dfs_aspace_fpos(varea, vaddr)); in dfs_aspace_page_unmap()
1982 if (page) in dfs_aspace_page_unmap()
1988 node = page->mmap_head.next; in dfs_aspace_page_unmap()
1990 while (node != &page->mmap_head) in dfs_aspace_page_unmap()
2000 dfs_page_dirty(page); in dfs_aspace_page_unmap()
2008 dfs_page_release(page); in dfs_aspace_page_unmap()
2031 struct dfs_page *page; in dfs_aspace_page_dirty() local
2038 page = dfs_page_search(aspace, dfs_aspace_fpos(varea, vaddr)); in dfs_aspace_page_dirty()
2039 if (page) in dfs_aspace_page_dirty()
2041 dfs_page_dirty(page); in dfs_aspace_page_dirty()
2042 dfs_page_release(page); in dfs_aspace_page_dirty()