Commit d0cfb9dc authored by Vivek Goyal's avatar Vivek Goyal Committed by Miklos Szeredi

virtiofs: maintain a list of busy elements

This list will be used selecting fuse_dax_mapping to free when number of
free mappings drops below a threshold.
Signed-off-by: default avatarVivek Goyal <vgoyal@redhat.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent 6ae330ca
...@@ -28,6 +28,9 @@ struct fuse_dax_mapping { ...@@ -28,6 +28,9 @@ struct fuse_dax_mapping {
/* For interval tree in file/inode */ /* For interval tree in file/inode */
struct interval_tree_node itn; struct interval_tree_node itn;
/* Will connect in fc->busy_ranges to keep track busy memory */
struct list_head busy_list;
/** Position in DAX window */ /** Position in DAX window */
u64 window_offset; u64 window_offset;
...@@ -55,6 +58,10 @@ struct fuse_conn_dax { ...@@ -55,6 +58,10 @@ struct fuse_conn_dax {
/* Lock protecting accessess to members of this structure */ /* Lock protecting accessess to members of this structure */
spinlock_t lock; spinlock_t lock;
/* List of memory ranges which are busy */
unsigned long nr_busy_ranges;
struct list_head busy_ranges;
/* DAX Window Free Ranges */ /* DAX Window Free Ranges */
long nr_free_ranges; long nr_free_ranges;
struct list_head free_ranges; struct list_head free_ranges;
...@@ -85,6 +92,15 @@ static struct fuse_dax_mapping *alloc_dax_mapping(struct fuse_conn_dax *fcd) ...@@ -85,6 +92,15 @@ static struct fuse_dax_mapping *alloc_dax_mapping(struct fuse_conn_dax *fcd)
return dmap; return dmap;
} }
/* This assumes fcd->lock is held */
static void __dmap_remove_busy_list(struct fuse_conn_dax *fcd,
struct fuse_dax_mapping *dmap)
{
list_del_init(&dmap->busy_list);
WARN_ON(fcd->nr_busy_ranges == 0);
fcd->nr_busy_ranges--;
}
/* This assumes fcd->lock is held */ /* This assumes fcd->lock is held */
static void __dmap_add_to_free_pool(struct fuse_conn_dax *fcd, static void __dmap_add_to_free_pool(struct fuse_conn_dax *fcd,
struct fuse_dax_mapping *dmap) struct fuse_dax_mapping *dmap)
...@@ -139,6 +155,10 @@ static int fuse_setup_one_mapping(struct inode *inode, unsigned long start_idx, ...@@ -139,6 +155,10 @@ static int fuse_setup_one_mapping(struct inode *inode, unsigned long start_idx,
/* Protected by fi->dax->sem */ /* Protected by fi->dax->sem */
interval_tree_insert(&dmap->itn, &fi->dax->tree); interval_tree_insert(&dmap->itn, &fi->dax->tree);
fi->dax->nr++; fi->dax->nr++;
spin_lock(&fcd->lock);
list_add_tail(&dmap->busy_list, &fcd->busy_ranges);
fcd->nr_busy_ranges++;
spin_unlock(&fcd->lock);
} }
return 0; return 0;
} }
...@@ -207,6 +227,7 @@ static void dmap_reinit_add_to_free_pool(struct fuse_conn_dax *fcd, ...@@ -207,6 +227,7 @@ static void dmap_reinit_add_to_free_pool(struct fuse_conn_dax *fcd,
pr_debug("fuse: freeing memory range start_idx=0x%lx end_idx=0x%lx window_offset=0x%llx length=0x%llx\n", pr_debug("fuse: freeing memory range start_idx=0x%lx end_idx=0x%lx window_offset=0x%llx length=0x%llx\n",
dmap->itn.start, dmap->itn.last, dmap->window_offset, dmap->itn.start, dmap->itn.last, dmap->window_offset,
dmap->length); dmap->length);
__dmap_remove_busy_list(fcd, dmap);
dmap->itn.start = dmap->itn.last = 0; dmap->itn.start = dmap->itn.last = 0;
__dmap_add_to_free_pool(fcd, dmap); __dmap_add_to_free_pool(fcd, dmap);
} }
...@@ -700,6 +721,8 @@ static void fuse_free_dax_mem_ranges(struct list_head *mem_list) ...@@ -700,6 +721,8 @@ static void fuse_free_dax_mem_ranges(struct list_head *mem_list)
/* Free All allocated elements */ /* Free All allocated elements */
list_for_each_entry_safe(range, temp, mem_list, list) { list_for_each_entry_safe(range, temp, mem_list, list) {
list_del(&range->list); list_del(&range->list);
if (!list_empty(&range->busy_list))
list_del(&range->busy_list);
kfree(range); kfree(range);
} }
} }
...@@ -723,6 +746,7 @@ static int fuse_dax_mem_range_init(struct fuse_conn_dax *fcd) ...@@ -723,6 +746,7 @@ static int fuse_dax_mem_range_init(struct fuse_conn_dax *fcd)
unsigned long i; unsigned long i;
INIT_LIST_HEAD(&fcd->free_ranges); INIT_LIST_HEAD(&fcd->free_ranges);
INIT_LIST_HEAD(&fcd->busy_ranges);
id = dax_read_lock(); id = dax_read_lock();
nr_pages = dax_direct_access(fcd->dev, 0, PHYS_PFN(dax_size), &kaddr, nr_pages = dax_direct_access(fcd->dev, 0, PHYS_PFN(dax_size), &kaddr,
&pfn); &pfn);
...@@ -748,6 +772,7 @@ static int fuse_dax_mem_range_init(struct fuse_conn_dax *fcd) ...@@ -748,6 +772,7 @@ static int fuse_dax_mem_range_init(struct fuse_conn_dax *fcd)
*/ */
range->window_offset = i * FUSE_DAX_SZ; range->window_offset = i * FUSE_DAX_SZ;
range->length = FUSE_DAX_SZ; range->length = FUSE_DAX_SZ;
INIT_LIST_HEAD(&range->busy_list);
list_add_tail(&range->list, &fcd->free_ranges); list_add_tail(&range->list, &fcd->free_ranges);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment