Lines Matching refs:aspace
74 static int dfs_aspace_release(struct dfs_aspace *aspace);
76 static int dfs_aspace_lock(struct dfs_aspace *aspace);
77 static int dfs_aspace_unlock(struct dfs_aspace *aspace);
97 static int dfs_aspace_gc(struct dfs_aspace *aspace, int count) in dfs_aspace_gc() argument
101 if (aspace) in dfs_aspace_gc()
103 dfs_aspace_lock(aspace); in dfs_aspace_gc()
105 if (aspace->pages_count > 0) in dfs_aspace_gc()
108 rt_list_t *node = aspace->list_inactive.next; in dfs_aspace_gc()
110 while (cnt && node != &aspace->list_active) in dfs_aspace_gc()
120 node = aspace->list_active.next; in dfs_aspace_gc()
121 while (cnt && node != &aspace->list_inactive) in dfs_aspace_gc()
132 dfs_aspace_unlock(aspace); in dfs_aspace_gc()
155 struct dfs_aspace *aspace = RT_NULL; in dfs_pcache_release() local
167 aspace = rt_list_entry(node, struct dfs_aspace, cache_node); in dfs_pcache_release()
169 if (aspace) in dfs_pcache_release()
171 count -= dfs_aspace_gc(aspace, count); in dfs_pcache_release()
172 dfs_aspace_release(aspace); in dfs_pcache_release()
179 aspace = rt_list_entry(node, struct dfs_aspace, cache_node); in dfs_pcache_release()
181 if (aspace) in dfs_pcache_release()
183 count -= dfs_aspace_gc(aspace, count); in dfs_pcache_release()
201 static void _pcache_clean(struct dfs_mnt *mnt, int (*cb)(struct dfs_aspace *aspace)) in _pcache_clean() argument
204 struct dfs_aspace *aspace = RT_NULL; in _pcache_clean() local
211 aspace = rt_list_entry(node, struct dfs_aspace, cache_node); in _pcache_clean()
213 if (aspace && aspace->mnt == mnt) in _pcache_clean()
215 dfs_aspace_clean(aspace); in _pcache_clean()
216 cb(aspace); in _pcache_clean()
223 aspace = rt_list_entry(node, struct dfs_aspace, cache_node); in _pcache_clean()
225 if (aspace && aspace->mnt == mnt) in _pcache_clean()
227 dfs_aspace_clean(aspace); in _pcache_clean()
228 cb(aspace); in _pcache_clean()
339 … struct dfs_aspace *aspace = rt_list_entry(node, struct dfs_aspace, cache_node); in dfs_pcache_thread() local
340 dfs_aspace_lock(aspace); in dfs_pcache_thread()
341 if (aspace->list_dirty.next != &aspace->list_dirty) in dfs_pcache_thread()
343 … page = rt_list_entry(aspace->list_dirty.next, struct dfs_page, dirty_node); in dfs_pcache_thread()
345 dfs_aspace_unlock(aspace); in dfs_pcache_thread()
352 dfs_aspace_unlock(aspace); in dfs_pcache_thread()
359 struct dfs_aspace *aspace = page->aspace; in dfs_pcache_thread() local
361 dfs_aspace_lock(aspace); in dfs_pcache_thread()
362 if (page->is_dirty == 1 && aspace->vnode) 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()
374 if (aspace->ops->write) in dfs_pcache_thread()
376 aspace->ops->write(page); in dfs_pcache_thread()
389 dfs_aspace_unlock(aspace); in dfs_pcache_thread()
548 struct dfs_aspace *aspace = RT_NULL; in dfs_aspace_hash_lookup() local
551 …rt_list_for_each_entry(aspace, &__pcache.head[dfs_aspace_hash(dentry->mnt, dentry->pathname)], has… in dfs_aspace_hash_lookup()
554 if (aspace->mnt == dentry->mnt in dfs_aspace_hash_lookup()
555 && aspace->ops == ops in dfs_aspace_hash_lookup()
556 && !strcmp(aspace->pathname, dentry->pathname)) in dfs_aspace_hash_lookup()
558 rt_atomic_add(&aspace->ref_count, 1); in dfs_aspace_hash_lookup()
560 return aspace; in dfs_aspace_hash_lookup()
577 static void dfs_aspace_insert(struct dfs_aspace *aspace) in dfs_aspace_insert() argument
581 val = dfs_aspace_hash(aspace->mnt, aspace->pathname); in dfs_aspace_insert()
584 rt_atomic_add(&aspace->ref_count, 1); in dfs_aspace_insert()
585 rt_list_insert_after(&__pcache.head[val], &aspace->hash_node); in dfs_aspace_insert()
586 rt_list_insert_before(&__pcache.list_inactive, &aspace->cache_node); in dfs_aspace_insert()
598 static void dfs_aspace_remove(struct dfs_aspace *aspace) in dfs_aspace_remove() argument
601 if (aspace->hash_node.next != RT_NULL) in dfs_aspace_remove()
603 rt_list_remove(&aspace->hash_node); in dfs_aspace_remove()
605 if (aspace->cache_node.next != RT_NULL) in dfs_aspace_remove()
607 rt_list_remove(&aspace->cache_node); in dfs_aspace_remove()
626 static void dfs_aspace_active(struct dfs_aspace *aspace) in dfs_aspace_active() argument
629 if (aspace->cache_node.next != RT_NULL) in dfs_aspace_active()
631 rt_list_remove(&aspace->cache_node); in dfs_aspace_active()
632 rt_list_insert_before(&__pcache.list_inactive, &aspace->cache_node); in dfs_aspace_active()
646 static void dfs_aspace_inactive(struct dfs_aspace *aspace) in dfs_aspace_inactive() argument
649 if (aspace->cache_node.next != RT_NULL) in dfs_aspace_inactive()
651 rt_list_remove(&aspace->cache_node); in dfs_aspace_inactive()
652 rt_list_insert_before(&__pcache.list_active, &aspace->cache_node); in dfs_aspace_inactive()
676 struct dfs_aspace *aspace; in _dfs_aspace_create() local
678 aspace = rt_calloc(1, sizeof(struct dfs_aspace)); in _dfs_aspace_create()
679 if (aspace) in _dfs_aspace_create()
681 rt_list_init(&aspace->list_active); in _dfs_aspace_create()
682 rt_list_init(&aspace->list_inactive); in _dfs_aspace_create()
683 rt_list_init(&aspace->list_dirty); in _dfs_aspace_create()
684 rt_list_insert_after(&aspace->list_active, &aspace->list_inactive); in _dfs_aspace_create()
686 aspace->avl_root.root_node = 0; in _dfs_aspace_create()
687 aspace->avl_page = 0; in _dfs_aspace_create()
689 rt_mutex_init(&aspace->lock, rt_thread_self()->parent.name, RT_IPC_FLAG_PRIO); in _dfs_aspace_create()
690 rt_atomic_store(&aspace->ref_count, 1); in _dfs_aspace_create()
692 aspace->pages_count = 0; in _dfs_aspace_create()
693 aspace->vnode = vnode; in _dfs_aspace_create()
694 aspace->ops = ops; in _dfs_aspace_create()
698 aspace->mnt = dentry->mnt; in _dfs_aspace_create()
699 aspace->fullpath = rt_strdup(dentry->mnt->fullpath); in _dfs_aspace_create()
700 aspace->pathname = rt_strdup(dentry->pathname); in _dfs_aspace_create()
703 dfs_aspace_insert(aspace); in _dfs_aspace_create()
706 return aspace; in _dfs_aspace_create()
726 struct dfs_aspace *aspace = RT_NULL; in dfs_aspace_create() local
732 aspace = dfs_aspace_hash_lookup(dentry, ops); in dfs_aspace_create()
735 if (!aspace) in dfs_aspace_create()
737 aspace = _dfs_aspace_create(dentry, vnode, ops); in dfs_aspace_create()
741 aspace->vnode = vnode; in dfs_aspace_create()
742 dfs_aspace_active(aspace); in dfs_aspace_create()
745 return aspace; in dfs_aspace_create()
758 int dfs_aspace_destroy(struct dfs_aspace *aspace) in dfs_aspace_destroy() argument
762 if (aspace) in dfs_aspace_destroy()
765 dfs_aspace_lock(aspace); in dfs_aspace_destroy()
766 rt_atomic_sub(&aspace->ref_count, 1); in dfs_aspace_destroy()
767 RT_ASSERT(rt_atomic_load(&aspace->ref_count) > 0); in dfs_aspace_destroy()
768 dfs_aspace_inactive(aspace); in dfs_aspace_destroy()
769 aspace->vnode = RT_NULL; in dfs_aspace_destroy()
770 if (dfs_aspace_release(aspace) != 0) in dfs_aspace_destroy()
772 dfs_aspace_unlock(aspace); in dfs_aspace_destroy()
792 static int dfs_aspace_release(struct dfs_aspace *aspace) in dfs_aspace_release() argument
796 if (aspace) in dfs_aspace_release()
799 dfs_aspace_lock(aspace); in dfs_aspace_release()
801 if (rt_atomic_load(&aspace->ref_count) == 1 && aspace->pages_count == 0) in dfs_aspace_release()
803 dfs_aspace_remove(aspace); in dfs_aspace_release()
804 if (aspace->fullpath) in dfs_aspace_release()
806 rt_free(aspace->fullpath); in dfs_aspace_release()
808 if (aspace->pathname) in dfs_aspace_release()
810 rt_free(aspace->pathname); in dfs_aspace_release()
812 rt_mutex_detach(&aspace->lock); in dfs_aspace_release()
813 rt_free(aspace); in dfs_aspace_release()
818 dfs_aspace_unlock(aspace); in dfs_aspace_release()
837 static int _dfs_aspace_dump(struct dfs_aspace *aspace, int is_dirty) in _dfs_aspace_dump() argument
839 if (aspace) in _dfs_aspace_dump()
844 dfs_aspace_lock(aspace); in _dfs_aspace_dump()
845 if (aspace->pages_count > 0) in _dfs_aspace_dump()
847 rt_list_for_each(next, &aspace->list_inactive) in _dfs_aspace_dump()
849 if (next != &aspace->list_active) in _dfs_aspace_dump()
867 dfs_aspace_unlock(aspace); in _dfs_aspace_dump()
891 struct dfs_aspace *aspace; in dfs_pcache_dump() local
921 aspace = rt_list_entry(node, struct dfs_aspace, cache_node); in dfs_pcache_dump()
923 if (aspace->mnt) in dfs_pcache_dump()
925 … rt_kprintf("file: %s%s pages: %d\n", aspace->fullpath, aspace->pathname, aspace->pages_count); in dfs_pcache_dump()
929 rt_kprintf("unknown type, pages: %d\n", aspace->pages_count); in dfs_pcache_dump()
934 _dfs_aspace_dump(aspace, dump == 2 ? 1 : 0); in dfs_pcache_dump()
962 if (next != &page->mmap_head && page->fpos < page->aspace->vnode->size) in dfs_page_unmap()
977 varea = rt_aspace_query(map->aspace, map->vaddr); in dfs_page_unmap()
1057 struct dfs_aspace *aspace = page->aspace; in dfs_page_release() local
1059 dfs_aspace_lock(aspace); 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()
1077 if (aspace->ops->write) in dfs_page_release()
1079 aspace->ops->write(page); in dfs_page_release()
1090 dfs_aspace_unlock(aspace); in dfs_page_release()
1127 static int _dfs_page_insert(struct dfs_aspace *aspace, struct dfs_page *page) in _dfs_page_insert() argument
1131 struct util_avl_struct **next = &(aspace->avl_root.root_node); in _dfs_page_insert()
1149 util_avl_rebalance(current, &aspace->avl_root); 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()
1168 aspace->avl_page = 0; in _dfs_page_remove()
1171 util_avl_remove(&page->avl_node, &aspace->avl_root); in _dfs_page_remove()
1184 static int dfs_aspace_lock(struct dfs_aspace *aspace) in dfs_aspace_lock() argument
1186 rt_mutex_take(&aspace->lock, RT_WAITING_FOREVER); in dfs_aspace_lock()
1200 static int dfs_aspace_unlock(struct dfs_aspace *aspace) in dfs_aspace_unlock() argument
1202 rt_mutex_release(&aspace->lock); in dfs_aspace_unlock()
1218 struct dfs_aspace *aspace = page->aspace; in dfs_page_insert() local
1220 dfs_aspace_lock(aspace); in dfs_page_insert()
1222 rt_list_insert_before(&aspace->list_inactive, &page->space_node); in dfs_page_insert()
1223 aspace->pages_count ++; in dfs_page_insert()
1225 if (_dfs_page_insert(aspace, page)) in dfs_page_insert()
1230 if (aspace->pages_count > RT_PAGECACHE_ASPACE_COUNT) in dfs_page_insert()
1232 rt_list_t *next = aspace->list_active.next; in dfs_page_insert()
1234 if (next != &aspace->list_inactive) in dfs_page_insert()
1243 dfs_aspace_unlock(aspace); in dfs_page_insert()
1261 struct dfs_aspace *aspace = page->aspace; in dfs_page_remove() local
1263 dfs_aspace_lock(aspace); in dfs_page_remove()
1271 aspace->pages_count--; in dfs_page_remove()
1272 _dfs_page_remove(aspace, page); in dfs_page_remove()
1286 dfs_aspace_unlock(aspace); in dfs_page_remove()
1302 struct dfs_aspace *aspace = page->aspace; in dfs_page_active() local
1304 dfs_aspace_lock(aspace); in dfs_page_active()
1308 rt_list_insert_before(&aspace->list_inactive, &page->space_node); in dfs_page_active()
1310 dfs_aspace_unlock(aspace); in dfs_page_active()
1326 struct dfs_aspace *aspace = page->aspace; in dfs_page_inactive() local
1328 dfs_aspace_lock(aspace); in dfs_page_inactive()
1332 rt_list_insert_before(&aspace->list_active, &page->space_node); in dfs_page_inactive()
1334 dfs_aspace_unlock(aspace); in dfs_page_inactive()
1350 struct dfs_aspace *aspace = page->aspace; in dfs_page_dirty() local
1352 dfs_aspace_lock(aspace); in dfs_page_dirty()
1356 rt_list_insert_before(&aspace->list_dirty, &page->dirty_node); in dfs_page_dirty()
1368 dfs_aspace_unlock(aspace); in dfs_page_dirty()
1383 static struct dfs_page *dfs_page_search(struct dfs_aspace *aspace, off_t fpos) in dfs_page_search() argument
1389 dfs_aspace_lock(aspace); in dfs_page_search()
1391 if (aspace->avl_page && dfs_page_compare(fpos, aspace->avl_page->fpos) == 0) in dfs_page_search()
1393 page = aspace->avl_page; in dfs_page_search()
1396 dfs_aspace_unlock(aspace); in dfs_page_search()
1400 avl_node = aspace->avl_root.root_node; in dfs_page_search()
1416 aspace->avl_page = page; in dfs_page_search()
1419 dfs_aspace_unlock(aspace); in dfs_page_search()
1424 dfs_aspace_unlock(aspace); in dfs_page_search()
1446 if (file && file->vnode && file->vnode->aspace) in dfs_aspace_load_page()
1449 struct dfs_aspace *aspace = vnode->aspace; in dfs_aspace_load_page() local
1454 page->aspace = aspace; in dfs_aspace_load_page()
1457 aspace->ops->read(file, page); in dfs_aspace_load_page()
1483 struct dfs_aspace *aspace = file->vnode->aspace; in dfs_page_lookup() local
1485 dfs_aspace_lock(aspace); in dfs_page_lookup()
1486 page = dfs_page_search(aspace, pos); in dfs_page_lookup()
1513 page = dfs_page_search(aspace, fpos); in dfs_page_lookup()
1525 dfs_aspace_unlock(aspace); in dfs_page_lookup()
1539 dfs_aspace_unlock(aspace); in dfs_page_lookup()
1562 if (file && file->vnode && file->vnode->aspace) in dfs_aspace_read()
1564 if (!(file->vnode->aspace->ops->read)) in dfs_aspace_read()
1567 struct dfs_aspace *aspace = vnode->aspace; in dfs_aspace_read() local
1581 dfs_aspace_lock(aspace); in dfs_aspace_read()
1582 if (aspace->vnode->size < page->fpos + ARCH_PAGE_SIZE) in dfs_aspace_read()
1584 len = aspace->vnode->size - *pos; in dfs_aspace_read()
1603 dfs_aspace_unlock(aspace); in dfs_aspace_read()
1607 dfs_aspace_unlock(aspace); in dfs_aspace_read()
1636 if (file && file->vnode && file->vnode->aspace) in dfs_aspace_write()
1639 struct dfs_aspace *aspace = vnode->aspace; in dfs_aspace_write() local
1644 if (!(aspace->ops->write)) in dfs_aspace_write()
1648 else if (aspace->mnt && (aspace->mnt->flags & MNT_RDONLY)) in dfs_aspace_write()
1662 dfs_aspace_lock(aspace); in dfs_aspace_write()
1671 if (*pos > aspace->vnode->size) in dfs_aspace_write()
1673 aspace->vnode->size = *pos; 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()
1687 aspace->ops->write(page); in dfs_aspace_write()
1696 dfs_aspace_unlock(aspace); in dfs_aspace_write()
1719 int dfs_aspace_flush(struct dfs_aspace *aspace) in dfs_aspace_flush() argument
1721 if (aspace) in dfs_aspace_flush()
1726 dfs_aspace_lock(aspace); in dfs_aspace_flush()
1728 if (aspace->pages_count > 0 && aspace->vnode) in dfs_aspace_flush()
1730 rt_list_for_each(next, &aspace->list_dirty) 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()
1744 if (aspace->ops->write) in dfs_aspace_flush()
1746 aspace->ops->write(page); in dfs_aspace_flush()
1755 dfs_aspace_unlock(aspace); in dfs_aspace_flush()
1771 int dfs_aspace_clean(struct dfs_aspace *aspace) in dfs_aspace_clean() argument
1773 if (aspace) in dfs_aspace_clean()
1775 dfs_aspace_lock(aspace); in dfs_aspace_clean()
1777 if (aspace->pages_count > 0) in dfs_aspace_clean()
1779 rt_list_t *next = aspace->list_active.next; in dfs_aspace_clean()
1782 while (next && next != &aspace->list_active) in dfs_aspace_clean()
1784 if (next == &aspace->list_inactive) in dfs_aspace_clean()
1795 dfs_aspace_unlock(aspace); in dfs_aspace_clean()
1822 struct dfs_aspace *aspace = file->vnode->aspace; in dfs_aspace_mmap() local
1823 rt_aspace_t target_aspace = varea->aspace; in dfs_aspace_mmap()
1853 map->aspace = target_aspace; in dfs_aspace_mmap()
1855 dfs_aspace_lock(aspace); in dfs_aspace_mmap()
1858 dfs_aspace_unlock(aspace); in dfs_aspace_mmap()
1892 struct dfs_aspace *aspace = vnode->aspace; in dfs_aspace_unmap() local
1896 if (aspace) in dfs_aspace_unmap()
1901 dfs_aspace_lock(aspace); in dfs_aspace_unmap()
1902 if (aspace->pages_count > 0) in dfs_aspace_unmap()
1904 rt_list_for_each(next, &aspace->list_active) in dfs_aspace_unmap()
1906 if (next != &aspace->list_inactive) in dfs_aspace_unmap()
1924 if (map && varea->aspace == map->aspace in dfs_aspace_unmap()
1928 map_aspace = map->aspace; in dfs_aspace_unmap()
1930 if (!map_varea || map_varea->aspace != map_aspace || in dfs_aspace_unmap()
1941 page->fpos < page->aspace->vnode->size) in dfs_aspace_unmap()
1954 dfs_aspace_unlock(aspace); in dfs_aspace_unmap()
1975 struct dfs_aspace *aspace = file->vnode->aspace; in dfs_aspace_page_unmap() local
1977 if (aspace) in dfs_aspace_page_unmap()
1979 dfs_aspace_lock(aspace); in dfs_aspace_page_unmap()
1981 page = dfs_page_search(aspace, dfs_aspace_fpos(varea, vaddr)); in dfs_aspace_page_unmap()
1996 if (map && varea->aspace == map->aspace && vaddr == map->vaddr) in dfs_aspace_page_unmap()
2011 dfs_aspace_unlock(aspace); in dfs_aspace_page_unmap()
2032 struct dfs_aspace *aspace = file->vnode->aspace; in dfs_aspace_page_dirty() local
2034 if (aspace) in dfs_aspace_page_dirty()
2036 dfs_aspace_lock(aspace); in dfs_aspace_page_dirty()
2038 page = dfs_page_search(aspace, dfs_aspace_fpos(varea, vaddr)); in dfs_aspace_page_dirty()
2045 dfs_aspace_unlock(aspace); in dfs_aspace_page_dirty()