uti: Replace hand-made list of host_threads with Linux macro

Change-Id: Ib46cc9fcdd2854b7bbe21c2cc885beeb22d16dd2
This commit is contained in:
Masamichi Takagi
2018-09-04 18:29:56 +09:00
parent 062d7ecae3
commit c2f41ca9ad

View File

@ -288,11 +288,11 @@ struct mcos_handler_info {
}; };
struct mcos_handler_info; struct mcos_handler_info;
static struct host_thread *host_threads; static LIST_HEAD(host_threads); /* Used for FS switch */
DEFINE_RWLOCK(host_thread_lock); DEFINE_RWLOCK(host_thread_lock);
struct host_thread { struct host_thread {
struct host_thread *next; struct list_head list;
struct mcos_handler_info *handler; struct mcos_handler_info *handler;
int pid; int pid;
int tid; int tid;
@ -339,8 +339,9 @@ static void release_handler(ihk_os_t os, void *param)
unsigned long flags; unsigned long flags;
struct host_thread *thread; struct host_thread *thread;
/* Finalize FS switch for uti threads */
write_lock_irqsave(&host_thread_lock, flags); write_lock_irqsave(&host_thread_lock, flags);
for (thread = host_threads; thread; thread = thread->next) { list_for_each_entry(thread, &host_threads, list) {
if (thread->handler == info) { if (thread->handler == info) {
thread->handler = NULL; thread->handler = NULL;
} }
@ -2370,22 +2371,6 @@ mcexec_util_thread1(ihk_os_t os, unsigned long arg, struct file *file)
return rc; return rc;
} }
static inline struct host_thread *get_host_thread(void)
{
int pid = task_tgid_vnr(current);
int tid = task_pid_vnr(current);
unsigned long flags;
struct host_thread *thread;
read_lock_irqsave(&host_thread_lock, flags);
for (thread = host_threads; thread; thread = thread->next)
if(thread->pid == pid && thread->tid == tid)
break;
read_unlock_irqrestore(&host_thread_lock, flags);
return thread;
}
long long
mcexec_util_thread2(ihk_os_t os, unsigned long arg, struct file *file) mcexec_util_thread2(ihk_os_t os, unsigned long arg, struct file *file)
{ {
@ -2411,8 +2396,7 @@ mcexec_util_thread2(ihk_os_t os, unsigned long arg, struct file *file)
thread->handler = info; thread->handler = info;
write_lock_irqsave(&host_thread_lock, flags); write_lock_irqsave(&host_thread_lock, flags);
thread->next = host_threads; list_add_tail(&thread->list, &host_threads);
host_threads = thread;
write_unlock_irqrestore(&host_thread_lock, flags); write_unlock_irqrestore(&host_thread_lock, flags);
/* How ppd refcount reaches zero depends on how utility-thread exits: /* How ppd refcount reaches zero depends on how utility-thread exits:
@ -2442,9 +2426,11 @@ mcexec_sig_thread(ihk_os_t os, unsigned long arg, struct file *file)
struct host_thread *thread; struct host_thread *thread;
read_lock_irqsave(&host_thread_lock, flags); read_lock_irqsave(&host_thread_lock, flags);
for (thread = host_threads; thread; thread = thread->next) list_for_each_entry(thread, &host_threads, list) {
if(thread->pid == pid && thread->tid == tid) if(thread->pid == pid && thread->tid == tid) {
break; break;
}
}
read_unlock_irqrestore(&host_thread_lock, flags); read_unlock_irqrestore(&host_thread_lock, flags);
if (thread) { if (thread) {
if (arg) if (arg)
@ -2465,9 +2451,7 @@ mcexec_terminate_thread(ihk_os_t os, unsigned long *param, struct file *file)
int tid; int tid;
long sig; long sig;
struct task_struct *tsk; struct task_struct *tsk;
unsigned long flags;
struct host_thread *thread; struct host_thread *thread;
struct host_thread *prev;
struct ikc_scd_packet *packet; struct ikc_scd_packet *packet;
struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os); struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os);
struct mcctrl_per_proc_data *ppd; struct mcctrl_per_proc_data *ppd;
@ -2483,15 +2467,16 @@ mcexec_terminate_thread(ihk_os_t os, unsigned long *param, struct file *file)
//printk("%s: pid=%d,tid=%d,sig=%lx,task=%p\n", __FUNCTION__, pid, tid, sig, tsk); //printk("%s: pid=%d,tid=%d,sig=%lx,task=%p\n", __FUNCTION__, pid, tid, sig, tsk);
write_lock_irqsave(&host_thread_lock, flags); list_for_each_entry(thread, &host_threads, list) {
for (prev = NULL, thread = host_threads; thread; if(thread->pid == pid && thread->tid == tid) {
prev = thread, thread = thread->next) {
if(thread->tid == tid)
break; break;
}
} }
if (!thread) { if (!thread) {
printk("%s: thread not found in host_threads list\n", __FUNCTION__);
write_unlock_irqrestore(&host_thread_lock, flags); write_unlock_irqrestore(&host_thread_lock, flags);
return -EINVAL; return -ESRCH;
} }
ppd = mcctrl_get_per_proc_data(usrdata, pid); ppd = mcctrl_get_per_proc_data(usrdata, pid);
@ -2506,8 +2491,12 @@ mcexec_terminate_thread(ihk_os_t os, unsigned long *param, struct file *file)
__FUNCTION__, tid); __FUNCTION__, tid);
goto err; goto err;
} }
mcctrl_delete_per_thread_data(ppd, tsk);
printk("%s: calling __return_syscall, tid=%d, sig=%lx, ppd->refcount=%d\n", __FUNCTION__, tid, sig, atomic_read(&ppd->refcount)); if ((rc = mcctrl_delete_per_thread_data(ppd, tsk))) {
kprintf("%s: ERROR: mcctrl_delete_per_thread_data failed (%d)\n", __FUNCTION__, rc);
goto err;
}
__return_syscall(usrdata->os, packet, sig, tid); __return_syscall(usrdata->os, packet, sig, tid);
printk("%s: packet=%p,channels=%p,ref=%d,desc=%p\n", __FUNCTION__, packet, usrdata->channels, packet->ref, (usrdata->channels + packet->ref)->c); printk("%s: packet=%p,channels=%p,ref=%d,desc=%p\n", __FUNCTION__, packet, usrdata->channels, packet->ref, (usrdata->channels + packet->ref)->c);
@ -2525,12 +2514,9 @@ err:
if(ppd) if(ppd)
mcctrl_put_per_proc_data(ppd); mcctrl_put_per_proc_data(ppd);
if (prev) list_del(&thread->list);
prev->next = thread->next;
else
host_threads = thread->next;
write_unlock_irqrestore(&host_thread_lock, flags);
kfree(thread); kfree(thread);
return 0; return 0;
} }