mcctrl: remove rus page cache
Change-Id: Ieed7a2a0077ffde3fec8a64d2051e56a53924a42
This commit is contained in:
committed by
Balazs Gerofi
parent
ebc702624b
commit
9b8424523a
@@ -44,8 +44,6 @@ extern void mcctrl_syscall_init(void);
|
|||||||
extern void procfs_init(int);
|
extern void procfs_init(int);
|
||||||
extern void procfs_exit(int);
|
extern void procfs_exit(int);
|
||||||
|
|
||||||
extern void rus_page_hash_init(void);
|
|
||||||
extern void rus_page_hash_put_pages(void);
|
|
||||||
extern void uti_attr_finalize(void);
|
extern void uti_attr_finalize(void);
|
||||||
extern void binfmt_mcexec_init(void);
|
extern void binfmt_mcexec_init(void);
|
||||||
extern void binfmt_mcexec_exit(void);
|
extern void binfmt_mcexec_exit(void);
|
||||||
@@ -186,9 +184,6 @@ int mcctrl_os_shutdown_notifier(int os_index)
|
|||||||
destroy_ikc_channels(os[os_index]);
|
destroy_ikc_channels(os[os_index]);
|
||||||
procfs_exit(os_index);
|
procfs_exit(os_index);
|
||||||
}
|
}
|
||||||
#ifdef POSTK_DEBUG_TEMP_FIX_35 /* in shutdown phase, rus_page_hash_put_pages() call added. */
|
|
||||||
rus_page_hash_put_pages();
|
|
||||||
#endif /* POSTK_DEBUG_TEMP_FIX_35 */
|
|
||||||
|
|
||||||
os[os_index] = NULL;
|
os[os_index] = NULL;
|
||||||
|
|
||||||
@@ -282,8 +277,6 @@ static int __init mcctrl_init(void)
|
|||||||
os[i] = NULL;
|
os[i] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rus_page_hash_init();
|
|
||||||
|
|
||||||
binfmt_mcexec_init();
|
binfmt_mcexec_init();
|
||||||
|
|
||||||
if ((ret = symbols_init()))
|
if ((ret = symbols_init()))
|
||||||
@@ -299,7 +292,6 @@ static int __init mcctrl_init(void)
|
|||||||
|
|
||||||
error:
|
error:
|
||||||
binfmt_mcexec_exit();
|
binfmt_mcexec_exit();
|
||||||
rus_page_hash_put_pages();
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -311,7 +303,6 @@ static void __exit mcctrl_exit(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
binfmt_mcexec_exit();
|
binfmt_mcexec_exit();
|
||||||
rus_page_hash_put_pages();
|
|
||||||
uti_attr_finalize();
|
uti_attr_finalize();
|
||||||
|
|
||||||
printk("mcctrl: unregistered.\n");
|
printk("mcctrl: unregistered.\n");
|
||||||
|
|||||||
@@ -633,111 +633,6 @@ out_put_ppd:
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define RUS_PAGE_HASH_SHIFT 8
|
|
||||||
#define RUS_PAGE_HASH_SIZE (1UL << RUS_PAGE_HASH_SHIFT)
|
|
||||||
#define RUS_PAGE_HASH_MASK (RUS_PAGE_HASH_SIZE - 1)
|
|
||||||
|
|
||||||
struct list_head rus_page_hash[RUS_PAGE_HASH_SIZE];
|
|
||||||
spinlock_t rus_page_hash_lock;
|
|
||||||
|
|
||||||
struct rus_page {
|
|
||||||
struct list_head hash;
|
|
||||||
struct page *page;
|
|
||||||
int refcount;
|
|
||||||
int put_page;
|
|
||||||
};
|
|
||||||
|
|
||||||
void rus_page_hash_init(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
spin_lock_init(&rus_page_hash_lock);
|
|
||||||
for (i = 0; i < RUS_PAGE_HASH_SIZE; ++i) {
|
|
||||||
INIT_LIST_HEAD(&rus_page_hash[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* rus_page_hash_lock must be held */
|
|
||||||
struct rus_page *_rus_page_hash_lookup(struct page *page)
|
|
||||||
{
|
|
||||||
struct rus_page *rp = NULL;
|
|
||||||
struct rus_page *rp_iter;
|
|
||||||
|
|
||||||
list_for_each_entry(rp_iter,
|
|
||||||
&rus_page_hash[page_to_pfn(page) & RUS_PAGE_HASH_MASK], hash) {
|
|
||||||
|
|
||||||
if (rp_iter->page != page)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
rp = rp_iter;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int rus_page_hash_insert(struct page *page)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
struct rus_page *rp;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&rus_page_hash_lock, flags);
|
|
||||||
|
|
||||||
rp = _rus_page_hash_lookup(page);
|
|
||||||
if (!rp) {
|
|
||||||
rp = kmalloc(sizeof(*rp), GFP_ATOMIC);
|
|
||||||
|
|
||||||
if (!rp) {
|
|
||||||
printk("rus_page_add_hash(): error allocating rp\n");
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
rp->page = page;
|
|
||||||
rp->put_page = 0;
|
|
||||||
|
|
||||||
get_page(page);
|
|
||||||
|
|
||||||
rp->refcount = 0; /* Will be increased below */
|
|
||||||
|
|
||||||
list_add_tail(&rp->hash,
|
|
||||||
&rus_page_hash[page_to_pfn(page) & RUS_PAGE_HASH_MASK]);
|
|
||||||
}
|
|
||||||
|
|
||||||
++rp->refcount;
|
|
||||||
|
|
||||||
|
|
||||||
out:
|
|
||||||
spin_unlock_irqrestore(&rus_page_hash_lock, flags);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void rus_page_hash_put_pages(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
struct rus_page *rp_iter;
|
|
||||||
struct rus_page *rp_iter_next;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&rus_page_hash_lock, flags);
|
|
||||||
|
|
||||||
for (i = 0; i < RUS_PAGE_HASH_SIZE; ++i) {
|
|
||||||
|
|
||||||
list_for_each_entry_safe(rp_iter, rp_iter_next,
|
|
||||||
&rus_page_hash[i], hash) {
|
|
||||||
list_del(&rp_iter->hash);
|
|
||||||
|
|
||||||
put_page(rp_iter->page);
|
|
||||||
kfree(rp_iter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&rus_page_hash_lock, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* By remap_pfn_range(), VM_PFN_AT_MMAP may be raised.
|
* By remap_pfn_range(), VM_PFN_AT_MMAP may be raised.
|
||||||
* VM_PFN_AT_MMAP cause the following problems.
|
* VM_PFN_AT_MMAP cause the following problems.
|
||||||
@@ -917,27 +812,6 @@ static int rus_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||||||
if (pfn_valid(pfn+pix)) {
|
if (pfn_valid(pfn+pix)) {
|
||||||
page = pfn_to_page(pfn+pix);
|
page = pfn_to_page(pfn+pix);
|
||||||
|
|
||||||
if ((error = rus_page_hash_insert(page)) < 0) {
|
|
||||||
#ifdef POSTK_DEBUG_ARCH_DEP_41 /* HOST-Linux version switch add */
|
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)
|
|
||||||
printk("%s: error adding page to RUS hash for 0x%#lx "
|
|
||||||
"(req: TID: %d, syscall: %lu)\n",
|
|
||||||
__FUNCTION__, vmf->address,
|
|
||||||
packet->req.rtid, packet->req.number);
|
|
||||||
#else /* LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0) */
|
|
||||||
printk("%s: error adding page to RUS hash for 0x%p "
|
|
||||||
"(req: TID: %d, syscall: %lu)\n",
|
|
||||||
__FUNCTION__, vmf->virtual_address,
|
|
||||||
packet->req.rtid, packet->req.number);
|
|
||||||
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0) */
|
|
||||||
#else /* POSTK_DEBUG_ARCH_DEP_41 */
|
|
||||||
printk("%s: error adding page to RUS hash for 0x%p "
|
|
||||||
"(req: TID: %d, syscall: %lu)\n",
|
|
||||||
__FUNCTION__, vmf->virtual_address,
|
|
||||||
packet->req.rtid, packet->req.number);
|
|
||||||
#endif /* POSTK_DEBUG_ARCH_DEP_41 */
|
|
||||||
}
|
|
||||||
|
|
||||||
error = vm_insert_page(vma, rva+(pix*PAGE_SIZE), page);
|
error = vm_insert_page(vma, rva+(pix*PAGE_SIZE), page);
|
||||||
if (error) {
|
if (error) {
|
||||||
#ifdef POSTK_DEBUG_ARCH_DEP_41 /* HOST-Linux version switch add */
|
#ifdef POSTK_DEBUG_ARCH_DEP_41 /* HOST-Linux version switch add */
|
||||||
@@ -1166,9 +1040,6 @@ void pager_remove_process(struct mcctrl_per_proc_data *ppd)
|
|||||||
kfree(pager);
|
kfree(pager);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Flush page hash as well */
|
|
||||||
rus_page_hash_put_pages();
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
up(&pager_sem);
|
up(&pager_sem);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user