mcctrl: clean up pagers for file objects to avoid memory leak
This commit is contained in:
@@ -970,6 +970,8 @@ void mcctrl_put_per_proc_data(struct mcctrl_per_proc_data *ppd)
|
|||||||
ihk_ikc_spinlock_unlock(&ppd->wq_list_lock, flags);
|
ihk_ikc_spinlock_unlock(&ppd->wq_list_lock, flags);
|
||||||
|
|
||||||
kfree(ppd);
|
kfree(ppd);
|
||||||
|
|
||||||
|
pager_remove_process();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1468,6 +1470,8 @@ int mcexec_create_per_process_data(ihk_os_t os)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pager_add_process();
|
||||||
|
|
||||||
dprintk("%s: PID: %d, counter: %d\n",
|
dprintk("%s: PID: %d, counter: %d\n",
|
||||||
__FUNCTION__, ppd->pid, atomic_read(&ppd->refcount));
|
__FUNCTION__, ppd->pid, atomic_read(&ppd->refcount));
|
||||||
|
|
||||||
|
|||||||
@@ -344,6 +344,9 @@ int mcctrl_ikc_is_valid_thread(ihk_os_t os, int cpu);
|
|||||||
ihk_os_t osnum_to_os(int n);
|
ihk_os_t osnum_to_os(int n);
|
||||||
|
|
||||||
/* syscall.c */
|
/* syscall.c */
|
||||||
|
void pager_add_process(void);
|
||||||
|
void pager_remove_process(void);
|
||||||
|
|
||||||
int __do_in_kernel_syscall(ihk_os_t os, struct ikc_scd_packet *packet);
|
int __do_in_kernel_syscall(ihk_os_t os, struct ikc_scd_packet *packet);
|
||||||
int mcctrl_add_per_proc_data(struct mcctrl_usrdata *ud, int pid,
|
int mcctrl_add_per_proc_data(struct mcctrl_usrdata *ud, int pid,
|
||||||
struct mcctrl_per_proc_data *ppd);
|
struct mcctrl_per_proc_data *ppd);
|
||||||
|
|||||||
@@ -760,6 +760,55 @@ struct pager {
|
|||||||
static DEFINE_SEMAPHORE(pager_sem);
|
static DEFINE_SEMAPHORE(pager_sem);
|
||||||
static struct list_head pager_list = LIST_HEAD_INIT(pager_list);
|
static struct list_head pager_list = LIST_HEAD_INIT(pager_list);
|
||||||
|
|
||||||
|
int pager_nr_processes = 0;
|
||||||
|
|
||||||
|
void pager_add_process(void)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
error = down_interruptible(&pager_sem);
|
||||||
|
if (error) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
++pager_nr_processes;
|
||||||
|
|
||||||
|
up(&pager_sem);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pager_remove_process(void)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
struct pager *pager_next, *pager;
|
||||||
|
error = down_interruptible(&pager_sem);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
--pager_nr_processes;
|
||||||
|
if (pager_nr_processes > 0) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
list_for_each_entry_safe(pager, pager_next, &pager_list, list) {
|
||||||
|
list_del(&pager->list);
|
||||||
|
|
||||||
|
if (pager->rofile) {
|
||||||
|
fput(pager->rofile);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pager->rwfile) {
|
||||||
|
fput(pager->rwfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
dprintk("%s: pager 0x%lx removed\n", __FUNCTION__, pager);
|
||||||
|
kfree(pager);
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
up(&pager_sem);
|
||||||
|
}
|
||||||
|
|
||||||
struct pager_create_result {
|
struct pager_create_result {
|
||||||
uintptr_t handle;
|
uintptr_t handle;
|
||||||
int maxprot;
|
int maxprot;
|
||||||
|
|||||||
Reference in New Issue
Block a user