!360 增加清除文件系统缓存的维测接口

Merge pull request !360 from 野生毛霉君/master
This commit is contained in:
openharmony_ci 2021-06-24 07:34:45 +00:00 committed by Gitee
commit a28dcc38c9
5 changed files with 79 additions and 20 deletions

View File

@ -35,6 +35,11 @@
#include "los_vm_filemap.h" #include "los_vm_filemap.h"
#ifdef LOSCFG_DEBUG_VERSION #ifdef LOSCFG_DEBUG_VERSION
#define CLEAR_ALL_CACHE "clear all"
#define CLEAR_PATH_CACHE "clear pathcache"
#define CLEAR_PAGE_CACHE "clear pagecache"
static char* VnodeTypeToStr(enum VnodeType type) { static char* VnodeTypeToStr(enum VnodeType type) {
switch (type) { switch (type) {
case VNODE_TYPE_UNKNOWN: case VNODE_TYPE_UNKNOWN:
@ -93,40 +98,39 @@ static int PathCacheListProcess(struct SeqBuf *buf)
return count; return count;
} }
static void PageCacheEntryProcess(struct SeqBuf *buf, struct page_mapping *mapping) static int PageCacheEntryProcess(struct SeqBuf *buf, struct page_mapping *mapping)
{ {
int total = 0;
LosFilePage *fpage = NULL; LosFilePage *fpage = NULL;
if (mapping == NULL) { if (mapping == NULL) {
LosBufPrintf(buf, "null]\n"); LosBufPrintf(buf, "null]\n");
return; return total;
} }
LOS_DL_LIST_FOR_EACH_ENTRY(fpage, &mapping->page_list, LosFilePage, node) { LOS_DL_LIST_FOR_EACH_ENTRY(fpage, &mapping->page_list, LosFilePage, node) {
LosBufPrintf(buf, "%d,", fpage->pgoff); LosBufPrintf(buf, "%d,", fpage->pgoff);
total++;
} }
LosBufPrintf(buf, "]\n"); LosBufPrintf(buf, "]\n");
return; return total;
} }
static void PageCacheMapProcess(struct SeqBuf *buf) static int PageCacheMapProcess(struct SeqBuf *buf)
{ {
struct filelist *flist = &tg_filelist; struct file_map *mapList = GetFileMappingList();
struct file *filep = NULL; char *name = NULL;
struct file_map *curMap = NULL;
int total = 0;
(void)sem_wait(&flist->fl_sem); (VOID)LOS_MuxLock(&mapList->lock, LOS_WAIT_FOREVER);
for (int i = 3; i < CONFIG_NFILE_DESCRIPTORS; i++) { LOS_DL_LIST_FOR_EACH_ENTRY(curMap, &mapList->head, struct file_map, head) {
if (!get_bit(i)) { name = curMap->rename ? curMap->rename: curMap->owner;
continue; LosBufPrintf(buf, "%s:[", name);
total += PageCacheEntryProcess(buf, &curMap->mapping);
} }
filep = &flist->fl_files[i]; (VOID)LOS_MuxUnlock(&mapList->lock);
if (filep == NULL) { return total;
continue;
}
LosBufPrintf(buf, "[%d]%s:[", i, filep->f_path);
PageCacheEntryProcess(buf, filep->f_mapping);
}
(void)sem_post(&flist->fl_sem);
} }
static int FsCacheInfoFill(struct SeqBuf *buf, void *arg) static int FsCacheInfoFill(struct SeqBuf *buf, void *arg)
@ -140,6 +144,7 @@ static int FsCacheInfoFill(struct SeqBuf *buf, void *arg)
int pathCacheTotalTry = 0; int pathCacheTotalTry = 0;
int pathCacheTotalHit = 0; int pathCacheTotalHit = 0;
int pageCacheTotal = 0;
int pageCacheTotalTry = 0; int pageCacheTotalTry = 0;
int pageCacheTotalHit = 0; int pageCacheTotalHit = 0;
@ -159,19 +164,43 @@ static int FsCacheInfoFill(struct SeqBuf *buf, void *arg)
pathCacheTotal = PathCacheListProcess(buf); pathCacheTotal = PathCacheListProcess(buf);
LosBufPrintf(buf, "\n=================================================================\n"); LosBufPrintf(buf, "\n=================================================================\n");
PageCacheMapProcess(buf); pageCacheTotal = PageCacheMapProcess(buf);
LosBufPrintf(buf, "\n=================================================================\n"); LosBufPrintf(buf, "\n=================================================================\n");
LosBufPrintf(buf, "PathCache Total:%d Try:%d Hit:%d\n", LosBufPrintf(buf, "PathCache Total:%d Try:%d Hit:%d\n",
pathCacheTotal, pathCacheTotalTry, pathCacheTotalHit); pathCacheTotal, pathCacheTotalTry, pathCacheTotalHit);
LosBufPrintf(buf, "Vnode Total:%d Free:%d Virtual:%d Active:%d\n", LosBufPrintf(buf, "Vnode Total:%d Free:%d Virtual:%d Active:%d\n",
vnodeTotal, vnodeFree, vnodeVirtual, vnodeActive); vnodeTotal, vnodeFree, vnodeVirtual, vnodeActive);
LosBufPrintf(buf, "PageCache Try:%d Hit:%d\n", pageCacheTotalTry, pageCacheTotalHit); LosBufPrintf(buf, "PageCache total:%d Try:%d Hit:%d\n", pageCacheTotal, pageCacheTotalTry, pageCacheTotalHit);
VnodeDrop(); VnodeDrop();
return 0; return 0;
} }
static int FsCacheClear(struct ProcFile *pf, const char *buffer, size_t buflen, loff_t *ppos)
{
if (buffer == NULL || buflen < sizeof(CLEAR_ALL_CACHE)) {
return -EINVAL;
}
int vnodeCount = 0;
int pageCount = 0;
if (!strcmp(buffer, CLEAR_ALL_CACHE)) {
vnodeCount = VnodeClearCache();
pageCount = OsTryShrinkMemory(VM_FILEMAP_MAX_SCAN);
} else if (!strcmp(buffer, CLEAR_PAGE_CACHE)) {
pageCount = OsTryShrinkMemory(VM_FILEMAP_MAX_SCAN);
} else if (!strcmp(buffer, CLEAR_PATH_CACHE)) {
vnodeCount = VnodeClearCache();
} else {
return -EINVAL;
}
PRINTK("%d vnodes and related pathcaches cleared\n%d pages cleared\n", vnodeCount, pageCount);
return buflen;
}
static const struct ProcFileOperations FS_CACHE_PROC_FOPS = { static const struct ProcFileOperations FS_CACHE_PROC_FOPS = {
.read = FsCacheInfoFill, .read = FsCacheInfoFill,
.write = FsCacheClear,
}; };
void ProcFsCacheInit(void) void ProcFsCacheInit(void)

View File

@ -179,5 +179,6 @@ int VfsVnodePermissionCheck(const struct Vnode *node, int accMode);
LIST_HEAD* GetVnodeFreeList(void); LIST_HEAD* GetVnodeFreeList(void);
LIST_HEAD* GetVnodeActiveList(void); LIST_HEAD* GetVnodeActiveList(void);
LIST_HEAD* GetVnodeVirtualList(void); LIST_HEAD* GetVnodeVirtualList(void);
int VnodeClearCache(void);
#endif /* !_VNODE_H_ */ #endif /* !_VNODE_H_ */

View File

@ -293,4 +293,9 @@ out:
(void)sem_post(&f_list->fl_sem); (void)sem_post(&f_list->fl_sem);
return ret; return ret;
} }
struct file_map* GetFileMappingList()
{
return &g_file_mapping;
}
#endif #endif

View File

@ -640,3 +640,26 @@ LIST_HEAD* GetVnodeActiveList()
{ {
return &g_vnodeActiveList; return &g_vnodeActiveList;
} }
int VnodeClearCache()
{
struct Vnode *item = NULL;
struct Vnode *nextItem = NULL;
int count = 0;
VnodeHold();
LOS_DL_LIST_FOR_EACH_ENTRY_SAFE(item, nextItem, &g_vnodeActiveList, struct Vnode, actFreeEntry) {
if ((item->useCount > 0) ||
(item->flag & VNODE_FLAG_MOUNT_ORIGIN) ||
(item->flag & VNODE_FLAG_MOUNT_NEW)) {
continue;
}
if (VnodeFree(item) == LOS_OK) {
count++;
}
}
VnodeDrop();
return count;
}

View File

@ -208,6 +208,7 @@ typedef struct ProcessCB LosProcessCB;
VOID OsVmmFileRegionFree(struct file *filep, LosProcessCB *processCB); VOID OsVmmFileRegionFree(struct file *filep, LosProcessCB *processCB);
#ifdef LOSCFG_DEBUG_VERSION #ifdef LOSCFG_DEBUG_VERSION
VOID ResetPageCacheHitInfo(int *try, int *hit); VOID ResetPageCacheHitInfo(int *try, int *hit);
struct file_map* GetFileMappingList(void);
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus