mcctrl: store per-process data in hash table
This commit is contained in:
@@ -82,7 +82,6 @@ static long mcexec_prepare_image(ihk_os_t os,
|
|||||||
void *args, *envs;
|
void *args, *envs;
|
||||||
long ret = 0;
|
long ret = 0;
|
||||||
struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os);
|
struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os);
|
||||||
unsigned long flags;
|
|
||||||
struct mcctrl_per_proc_data *ppd = NULL;
|
struct mcctrl_per_proc_data *ppd = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -168,9 +167,11 @@ static long mcexec_prepare_image(ihk_os_t os,
|
|||||||
rwlock_init(&ppd->per_thread_data_hash_lock[i]);
|
rwlock_init(&ppd->per_thread_data_hash_lock[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
flags = ihk_ikc_spinlock_lock(&usrdata->per_proc_list_lock);
|
if (mcctrl_add_per_proc_data(usrdata, ppd->pid, ppd) < 0) {
|
||||||
list_add_tail(&ppd->list, &usrdata->per_proc_list);
|
printk("%s: error adding per process data\n", __FUNCTION__);
|
||||||
ihk_ikc_spinlock_unlock(&usrdata->per_proc_list_lock, flags);
|
ret = -EINVAL;
|
||||||
|
goto free_out;
|
||||||
|
}
|
||||||
|
|
||||||
if (copy_to_user(udesc, pdesc, sizeof(struct program_load_desc) +
|
if (copy_to_user(udesc, pdesc, sizeof(struct program_load_desc) +
|
||||||
sizeof(struct program_image_section) * desc.num_sections)) {
|
sizeof(struct program_image_section) * desc.num_sections)) {
|
||||||
@@ -184,6 +185,10 @@ static long mcexec_prepare_image(ihk_os_t os,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
free_out:
|
free_out:
|
||||||
|
/* Only free ppd if error */
|
||||||
|
if (ret != 0 && ppd) {
|
||||||
|
kfree(ppd);
|
||||||
|
}
|
||||||
kfree(args);
|
kfree(args);
|
||||||
kfree(pdesc);
|
kfree(pdesc);
|
||||||
kfree(envs);
|
kfree(envs);
|
||||||
@@ -428,23 +433,75 @@ static long mcexec_get_cpu(ihk_os_t os)
|
|||||||
return info->n_cpus;
|
return info->n_cpus;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline struct mcctrl_per_proc_data *mcctrl_get_per_proc_data(
|
int mcctrl_add_per_proc_data(struct mcctrl_usrdata *ud, int pid,
|
||||||
struct mcctrl_usrdata *ud,
|
struct mcctrl_per_proc_data *ppd)
|
||||||
int pid)
|
|
||||||
{
|
{
|
||||||
struct mcctrl_per_proc_data *ppd = NULL, *ppd_iter;
|
struct mcctrl_per_proc_data *ppd_iter;
|
||||||
|
int hash = (pid & MCCTRL_PER_PROC_DATA_HASH_MASK);
|
||||||
|
int ret = 0;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/* Look up per-process structure */
|
/* Check if data for this thread exists and add if not */
|
||||||
flags = ihk_ikc_spinlock_lock(&ud->per_proc_list_lock);
|
write_lock_irqsave(&ud->per_proc_data_hash_lock[hash], flags);
|
||||||
list_for_each_entry(ppd_iter, &ud->per_proc_list, list) {
|
list_for_each_entry(ppd_iter, &ud->per_proc_data_hash[hash], hash) {
|
||||||
|
if (ppd_iter->pid == pid) {
|
||||||
|
ret = -EBUSY;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
list_add_tail(&ppd->hash, &ud->per_proc_data_hash[hash]);
|
||||||
|
|
||||||
|
out:
|
||||||
|
write_unlock_irqrestore(&ud->per_proc_data_hash_lock[hash], flags);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int mcctrl_delete_per_proc_data(struct mcctrl_usrdata *ud, int pid)
|
||||||
|
{
|
||||||
|
struct mcctrl_per_proc_data *ppd_iter, *ppd = NULL;
|
||||||
|
int hash = (pid & MCCTRL_PER_PROC_DATA_HASH_MASK);
|
||||||
|
int ret = 0;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
write_lock_irqsave(&ud->per_proc_data_hash_lock[hash], flags);
|
||||||
|
list_for_each_entry(ppd_iter, &ud->per_proc_data_hash[hash], hash) {
|
||||||
if (ppd_iter->pid == pid) {
|
if (ppd_iter->pid == pid) {
|
||||||
ppd = ppd_iter;
|
ppd = ppd_iter;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ihk_ikc_spinlock_unlock(&ud->per_proc_list_lock, flags);
|
|
||||||
|
|
||||||
|
if (!ppd) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
list_del(&ppd->hash);
|
||||||
|
|
||||||
|
out:
|
||||||
|
write_unlock_irqrestore(&ud->per_proc_data_hash_lock[hash], flags);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline struct mcctrl_per_proc_data *mcctrl_get_per_proc_data(
|
||||||
|
struct mcctrl_usrdata *ud, int pid)
|
||||||
|
{
|
||||||
|
struct mcctrl_per_proc_data *ppd_iter, *ppd = NULL;
|
||||||
|
int hash = (pid & MCCTRL_PER_PROC_DATA_HASH_MASK);
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
/* Check if data for this process exists and return it */
|
||||||
|
read_lock_irqsave(&ud->per_proc_data_hash_lock[hash], flags);
|
||||||
|
|
||||||
|
list_for_each_entry(ppd_iter, &ud->per_proc_data_hash[hash], hash) {
|
||||||
|
if (ppd_iter->pid == pid) {
|
||||||
|
ppd = ppd_iter;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
read_unlock_irqrestore(&ud->per_proc_data_hash_lock[hash], flags);
|
||||||
return ppd;
|
return ppd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -939,23 +996,14 @@ int mcexec_close_exec(ihk_os_t os)
|
|||||||
int found = 0;
|
int found = 0;
|
||||||
int os_ind = ihk_host_os_get_index(os);
|
int os_ind = ihk_host_os_get_index(os);
|
||||||
struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os);
|
struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os);
|
||||||
unsigned long flags;
|
struct mcctrl_per_proc_data *ppd = NULL;
|
||||||
struct mcctrl_per_proc_data *ppd = NULL, *ppd_iter;
|
|
||||||
|
|
||||||
ppd = NULL;
|
ppd = mcctrl_get_per_proc_data(usrdata, task_tgid_vnr(current));
|
||||||
flags = ihk_ikc_spinlock_lock(&usrdata->per_proc_list_lock);
|
|
||||||
|
|
||||||
list_for_each_entry(ppd_iter, &usrdata->per_proc_list, list) {
|
|
||||||
if (ppd_iter->pid == task_tgid_vnr(current)) {
|
|
||||||
ppd = ppd_iter;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ppd) {
|
if (ppd) {
|
||||||
list_del(&ppd->list);
|
mcctrl_delete_per_proc_data(usrdata, ppd->pid);
|
||||||
|
|
||||||
dprintk("pid: %d, tid: %d: rpgtable for %d (0x%lx) removed\n",
|
dprintk("pid: %d, tid: %d: rpgtable for %d (0x%lx) removed\n",
|
||||||
task_tgid_vnr(current), current->pid, ppd->pid, ppd->rpgtable);
|
task_tgid_vnr(current), current->pid, ppd->pid, ppd->rpgtable);
|
||||||
|
|
||||||
kfree(ppd);
|
kfree(ppd);
|
||||||
@@ -965,8 +1013,6 @@ int mcexec_close_exec(ihk_os_t os)
|
|||||||
task_tgid_vnr(current));
|
task_tgid_vnr(current));
|
||||||
}
|
}
|
||||||
|
|
||||||
ihk_ikc_spinlock_unlock(&usrdata->per_proc_list_lock, flags);
|
|
||||||
|
|
||||||
if (os_ind < 0) {
|
if (os_ind < 0) {
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -317,6 +317,7 @@ int prepare_ikc_channels(ihk_os_t os)
|
|||||||
{
|
{
|
||||||
struct ihk_cpu_info *info;
|
struct ihk_cpu_info *info;
|
||||||
struct mcctrl_usrdata *usrdata;
|
struct mcctrl_usrdata *usrdata;
|
||||||
|
int i;
|
||||||
|
|
||||||
usrdata = kzalloc(sizeof(struct mcctrl_usrdata), GFP_KERNEL);
|
usrdata = kzalloc(sizeof(struct mcctrl_usrdata), GFP_KERNEL);
|
||||||
usrdata->mcctrl_doorbell_va = (void *)__get_free_page(GFP_KERNEL);
|
usrdata->mcctrl_doorbell_va = (void *)__get_free_page(GFP_KERNEL);
|
||||||
@@ -348,8 +349,10 @@ int prepare_ikc_channels(ihk_os_t os)
|
|||||||
memcpy(&usrdata->listen_param2, &listen_param2, sizeof listen_param2);
|
memcpy(&usrdata->listen_param2, &listen_param2, sizeof listen_param2);
|
||||||
ihk_ikc_listen_port(os, &usrdata->listen_param2);
|
ihk_ikc_listen_port(os, &usrdata->listen_param2);
|
||||||
|
|
||||||
INIT_LIST_HEAD(&usrdata->per_proc_list);
|
for (i = 0; i < MCCTRL_PER_PROC_DATA_HASH_SIZE; ++i) {
|
||||||
spin_lock_init(&usrdata->per_proc_list_lock);
|
INIT_LIST_HEAD(&usrdata->per_proc_data_hash[i]);
|
||||||
|
rwlock_init(&usrdata->per_proc_data_hash_lock[i]);
|
||||||
|
}
|
||||||
|
|
||||||
INIT_LIST_HEAD(&usrdata->cpu_topology_list);
|
INIT_LIST_HEAD(&usrdata->cpu_topology_list);
|
||||||
INIT_LIST_HEAD(&usrdata->node_topology_list);
|
INIT_LIST_HEAD(&usrdata->node_topology_list);
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ struct mcctrl_per_thread_data {
|
|||||||
#define MCCTRL_PER_THREAD_DATA_HASH_MASK (MCCTRL_PER_THREAD_DATA_HASH_SIZE - 1)
|
#define MCCTRL_PER_THREAD_DATA_HASH_MASK (MCCTRL_PER_THREAD_DATA_HASH_SIZE - 1)
|
||||||
|
|
||||||
struct mcctrl_per_proc_data {
|
struct mcctrl_per_proc_data {
|
||||||
struct list_head list;
|
struct list_head hash;
|
||||||
int pid;
|
int pid;
|
||||||
unsigned long rpgtable; /* per process, not per OS */
|
unsigned long rpgtable; /* per process, not per OS */
|
||||||
|
|
||||||
@@ -251,6 +251,10 @@ struct node_topology {
|
|||||||
|
|
||||||
#define CPU_LONGS (((NR_CPUS) + (BITS_PER_LONG) - 1) / (BITS_PER_LONG))
|
#define CPU_LONGS (((NR_CPUS) + (BITS_PER_LONG) - 1) / (BITS_PER_LONG))
|
||||||
|
|
||||||
|
#define MCCTRL_PER_PROC_DATA_HASH_SHIFT 7
|
||||||
|
#define MCCTRL_PER_PROC_DATA_HASH_SIZE (1 << MCCTRL_PER_PROC_DATA_HASH_SHIFT)
|
||||||
|
#define MCCTRL_PER_PROC_DATA_HASH_MASK (MCCTRL_PER_PROC_DATA_HASH_SIZE - 1)
|
||||||
|
|
||||||
struct mcctrl_usrdata {
|
struct mcctrl_usrdata {
|
||||||
struct ihk_ikc_listen_param listen_param;
|
struct ihk_ikc_listen_param listen_param;
|
||||||
struct ihk_ikc_listen_param listen_param2;
|
struct ihk_ikc_listen_param listen_param2;
|
||||||
@@ -266,8 +270,9 @@ struct mcctrl_usrdata {
|
|||||||
unsigned long last_thread_exec;
|
unsigned long last_thread_exec;
|
||||||
wait_queue_head_t wq_prepare;
|
wait_queue_head_t wq_prepare;
|
||||||
|
|
||||||
struct list_head per_proc_list;
|
struct list_head per_proc_data_hash[MCCTRL_PER_PROC_DATA_HASH_SIZE];
|
||||||
ihk_spinlock_t per_proc_list_lock;
|
rwlock_t per_proc_data_hash_lock[MCCTRL_PER_PROC_DATA_HASH_SIZE];
|
||||||
|
|
||||||
void **keys;
|
void **keys;
|
||||||
struct sysfsm_data sysfsm_data;
|
struct sysfsm_data sysfsm_data;
|
||||||
unsigned long cpu_online[CPU_LONGS];
|
unsigned long cpu_online[CPU_LONGS];
|
||||||
@@ -295,15 +300,19 @@ ihk_os_t osnum_to_os(int n);
|
|||||||
|
|
||||||
/* syscall.c */
|
/* syscall.c */
|
||||||
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,
|
||||||
|
struct mcctrl_per_proc_data *ppd);
|
||||||
|
int mcctrl_delete_per_proc_data(struct mcctrl_usrdata *ud, int pid);
|
||||||
inline struct mcctrl_per_proc_data *mcctrl_get_per_proc_data(
|
inline struct mcctrl_per_proc_data *mcctrl_get_per_proc_data(
|
||||||
struct mcctrl_usrdata *ud,
|
struct mcctrl_usrdata *ud, int pid);
|
||||||
int pid);
|
|
||||||
int mcctrl_add_per_thread_data(struct mcctrl_per_proc_data* ppd,
|
int mcctrl_add_per_thread_data(struct mcctrl_per_proc_data* ppd,
|
||||||
struct task_struct *task, void *data);
|
struct task_struct *task, void *data);
|
||||||
int mcctrl_delete_per_thread_data(struct mcctrl_per_proc_data* ppd,
|
int mcctrl_delete_per_thread_data(struct mcctrl_per_proc_data* ppd,
|
||||||
struct task_struct *task);
|
struct task_struct *task);
|
||||||
struct mcctrl_per_thread_data *mcctrl_get_per_thread_data(
|
inline struct mcctrl_per_thread_data *mcctrl_get_per_thread_data(
|
||||||
struct mcctrl_per_proc_data *ppd, struct task_struct *task);
|
struct mcctrl_per_proc_data *ppd, struct task_struct *task);
|
||||||
|
|
||||||
void __return_syscall(ihk_os_t os, struct ikc_scd_packet *packet,
|
void __return_syscall(ihk_os_t os, struct ikc_scd_packet *packet,
|
||||||
int ret, int stid);
|
int ret, int stid);
|
||||||
|
|
||||||
|
|||||||
@@ -1510,7 +1510,6 @@ int __do_in_kernel_syscall(ihk_os_t os, struct ikc_scd_packet *packet)
|
|||||||
case __NR_munmap:
|
case __NR_munmap:
|
||||||
/* Set new remote page table if not zero */
|
/* Set new remote page table if not zero */
|
||||||
if (sc->args[2]) {
|
if (sc->args[2]) {
|
||||||
unsigned long flags;
|
|
||||||
struct mcctrl_per_proc_data *ppd = NULL;
|
struct mcctrl_per_proc_data *ppd = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -1533,9 +1532,12 @@ int __do_in_kernel_syscall(ihk_os_t os, struct ikc_scd_packet *packet)
|
|||||||
rwlock_init(&ppd->per_thread_data_hash_lock[i]);
|
rwlock_init(&ppd->per_thread_data_hash_lock[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
flags = ihk_ikc_spinlock_lock(&usrdata->per_proc_list_lock);
|
if (mcctrl_add_per_proc_data(usrdata, ppd->pid, ppd) < 0) {
|
||||||
list_add_tail(&ppd->list, &usrdata->per_proc_list);
|
printk("%s: error adding per process data\n", __FUNCTION__);
|
||||||
ihk_ikc_spinlock_unlock(&usrdata->per_proc_list_lock, flags);
|
error = -EBUSY;
|
||||||
|
kfree(ppd);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
dprintk("pid: %d, rpgtable: 0x%lx added\n",
|
dprintk("pid: %d, rpgtable: 0x%lx added\n",
|
||||||
ppd->pid, ppd->rpgtable);
|
ppd->pid, ppd->rpgtable);
|
||||||
|
|||||||
Reference in New Issue
Block a user