From daca522d259c36f2285e3d45025ea10319bb3537 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Fri, 12 Aug 2016 10:14:16 +0900 Subject: [PATCH] mcctrl: move kmalloc/kfree of wait queue head out of fast path --- executer/kernel/mcctrl/control.c | 46 ++++++++++++++++---------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/executer/kernel/mcctrl/control.c b/executer/kernel/mcctrl/control.c index 0ec4db1d..c6e1f3ae 100644 --- a/executer/kernel/mcctrl/control.c +++ b/executer/kernel/mcctrl/control.c @@ -459,13 +459,6 @@ int mcexec_syscall(struct mcctrl_usrdata *ud, struct ikc_scd_packet *packet) unsigned long flags; struct mcctrl_per_proc_data *ppd; -retry_alloc: - wqhln_alloc = kmalloc(sizeof(*wqhln), GFP_KERNEL); - if (!wqhln_alloc) { - printk("WARNING: coudln't alloc wait queue head, retrying..\n"); - goto retry_alloc; - } - /* Look up per-process structure */ ppd = mcctrl_get_per_proc_data(ud, pid); @@ -514,15 +507,19 @@ retry_alloc: /* If no match found, add request */ if (!wqhln) { +retry_alloc: + wqhln_alloc = kmalloc(sizeof(*wqhln), GFP_ATOMIC); + if (!wqhln_alloc) { + printk("WARNING: coudln't alloc wait queue head, retrying..\n"); + goto retry_alloc; + } + wqhln = wqhln_alloc; wqhln->req = 0; wqhln->task = NULL; init_waitqueue_head(&wqhln->wq_syscall); list_add_tail(&wqhln->list, &ppd->wq_list); } - else { - kfree(wqhln_alloc); - } wqhln->packet = packet; wqhln->req = 1; @@ -539,7 +536,7 @@ int mcexec_wait_syscall(ihk_os_t os, struct syscall_wait_desc *__user req) { struct ikc_scd_packet *packet; struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os); - struct wait_queue_head_list_node *wqhln; + struct wait_queue_head_list_node *wqhln = NULL; struct wait_queue_head_list_node *wqhln_iter; int ret = 0; unsigned long irqflags; @@ -563,22 +560,10 @@ int mcexec_wait_syscall(ihk_os_t os, struct syscall_wait_desc *__user req) retry: /* Prepare per-thread wait queue head or find a valid request */ -retry_alloc: - wqhln = kmalloc(sizeof(*wqhln), GFP_KERNEL); - if (!wqhln) { - printk("WARNING: coudln't alloc wait queue head, retrying..\n"); - goto retry_alloc; - } - - wqhln->task = current; - wqhln->req = 0; - init_waitqueue_head(&wqhln->wq_syscall); - irqflags = ihk_ikc_spinlock_lock(&ppd->wq_list_lock); /* First see if there is a valid request already that is not yet taken */ list_for_each_entry(wqhln_iter, &ppd->wq_list, list) { if (wqhln_iter->task == NULL && wqhln_iter->req) { - kfree(wqhln); wqhln = wqhln_iter; wqhln->task = current; list_del(&wqhln->list); @@ -586,6 +571,19 @@ retry_alloc: } } + if (!wqhln) { +retry_alloc: + wqhln = kmalloc(sizeof(*wqhln), GFP_ATOMIC); + if (!wqhln) { + printk("WARNING: coudln't alloc wait queue head, retrying..\n"); + goto retry_alloc; + } + + wqhln->task = current; + wqhln->req = 0; + init_waitqueue_head(&wqhln->wq_syscall); + } + /* No valid request? Wait for one.. */ if (wqhln->req == 0) { list_add_tail(&wqhln->list, &ppd->wq_list); @@ -601,11 +599,13 @@ retry_alloc: if (ret && !wqhln->req) { kfree(wqhln); + wqhln = NULL; return -EINTR; } packet = wqhln->packet; kfree(wqhln); + wqhln = NULL; dprintk("%s: tid: %d request from CPU %d\n", __FUNCTION__, task_pid_vnr(current), packet->ref);