mcctrl_ikc_send_wait: give possibility to use pre-allocated desc
Change-Id: I1afbabe792648bbf2c5a9a38ebbfba8ea9060d06
This commit is contained in:
@ -189,8 +189,8 @@ static long mcexec_prepare_image(ihk_os_t os,
|
|||||||
dprintk("# of sections: %d\n", pdesc->num_sections);
|
dprintk("# of sections: %d\n", pdesc->num_sections);
|
||||||
dprintk("%p (%lx)\n", pdesc, isp.arg);
|
dprintk("%p (%lx)\n", pdesc, isp.arg);
|
||||||
|
|
||||||
ret = mcctrl_ikc_send_wait(os, pdesc->cpu, &isp, 0, &free_ikc_pointers,
|
ret = mcctrl_ikc_send_wait(os, pdesc->cpu, &isp, 0, NULL,
|
||||||
3, pdesc, args, envs);
|
&free_ikc_pointers, 3, pdesc, args, envs);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
/* either send or remote prepare_process failed */
|
/* either send or remote prepare_process failed */
|
||||||
goto put_and_free_out;
|
goto put_and_free_out;
|
||||||
|
|||||||
@ -57,15 +57,6 @@ void mcctrl_os_read_write_cpu_response(ihk_os_t os,
|
|||||||
struct ikc_scd_packet *pisp);
|
struct ikc_scd_packet *pisp);
|
||||||
void mcctrl_eventfd(ihk_os_t os, struct ikc_scd_packet *pisp);
|
void mcctrl_eventfd(ihk_os_t os, struct ikc_scd_packet *pisp);
|
||||||
|
|
||||||
struct mcctrl_wakeup_desc {
|
|
||||||
int status;
|
|
||||||
int err;
|
|
||||||
wait_queue_head_t wq;
|
|
||||||
struct list_head chain;
|
|
||||||
int free_addrs_count;
|
|
||||||
void *free_addrs[];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Assumes usrdata->wakeup_descs_lock taken */
|
/* Assumes usrdata->wakeup_descs_lock taken */
|
||||||
static void mcctrl_wakeup_desc_cleanup(ihk_os_t os,
|
static void mcctrl_wakeup_desc_cleanup(ihk_os_t os,
|
||||||
struct mcctrl_wakeup_desc *desc)
|
struct mcctrl_wakeup_desc *desc)
|
||||||
@ -109,13 +100,15 @@ static void mcctrl_wakeup_cb(ihk_os_t os, struct ikc_scd_packet *packet)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int mcctrl_ikc_send_wait(ihk_os_t os, int cpu, struct ikc_scd_packet *pisp,
|
int mcctrl_ikc_send_wait(ihk_os_t os, int cpu, struct ikc_scd_packet *pisp,
|
||||||
long int timeout, int *do_frees, int free_addrs_count, ...)
|
long int timeout, struct mcctrl_wakeup_desc *desc,
|
||||||
|
int *do_frees, int free_addrs_count, ...)
|
||||||
{
|
{
|
||||||
int ret, i;
|
int ret, i;
|
||||||
|
int alloc_desc = (desc == NULL);
|
||||||
va_list ap;
|
va_list ap;
|
||||||
struct mcctrl_wakeup_desc *desc;
|
|
||||||
|
|
||||||
*do_frees = 1;
|
*do_frees = 1;
|
||||||
|
if (alloc_desc)
|
||||||
desc = kmalloc(sizeof(struct mcctrl_wakeup_desc) +
|
desc = kmalloc(sizeof(struct mcctrl_wakeup_desc) +
|
||||||
(free_addrs_count + 1) * sizeof(void *),
|
(free_addrs_count + 1) * sizeof(void *),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
@ -128,9 +121,10 @@ int mcctrl_ikc_send_wait(ihk_os_t os, int cpu, struct ikc_scd_packet *pisp,
|
|||||||
for (i = 0; i < free_addrs_count; i++) {
|
for (i = 0; i < free_addrs_count; i++) {
|
||||||
desc->free_addrs[i] = va_arg(ap, void*);
|
desc->free_addrs[i] = va_arg(ap, void*);
|
||||||
}
|
}
|
||||||
desc->free_addrs[free_addrs_count] = desc;
|
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
desc->free_addrs_count = free_addrs_count + 1;
|
if (alloc_desc)
|
||||||
|
desc->free_addrs[free_addrs_count++] = desc;
|
||||||
|
desc->free_addrs_count = free_addrs_count;
|
||||||
init_waitqueue_head(&desc->wq);
|
init_waitqueue_head(&desc->wq);
|
||||||
WRITE_ONCE(desc->err, 0);
|
WRITE_ONCE(desc->err, 0);
|
||||||
WRITE_ONCE(desc->status, 0);
|
WRITE_ONCE(desc->status, 0);
|
||||||
@ -165,6 +159,7 @@ int mcctrl_ikc_send_wait(ihk_os_t os, int cpu, struct ikc_scd_packet *pisp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ret = READ_ONCE(desc->err);
|
ret = READ_ONCE(desc->err);
|
||||||
|
if (alloc_desc)
|
||||||
kfree(desc);
|
kfree(desc);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -369,9 +369,33 @@ int mcctrl_ikc_send(ihk_os_t os, int cpu, struct ikc_scd_packet *pisp);
|
|||||||
int mcctrl_ikc_send_msg(ihk_os_t os, int cpu, int msg, int ref, unsigned long arg);
|
int mcctrl_ikc_send_msg(ihk_os_t os, int cpu, int msg, int ref, unsigned long arg);
|
||||||
int mcctrl_ikc_is_valid_thread(ihk_os_t os, int cpu);
|
int mcctrl_ikc_is_valid_thread(ihk_os_t os, int cpu);
|
||||||
|
|
||||||
/* ikc query-and-wait helper */
|
struct mcctrl_wakeup_desc {
|
||||||
|
int status;
|
||||||
|
int err;
|
||||||
|
wait_queue_head_t wq;
|
||||||
|
struct list_head chain;
|
||||||
|
int free_addrs_count;
|
||||||
|
void *free_addrs[];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ikc query-and-wait helper
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* - os, cpu and pisp as per mcctl_ikc_send()
|
||||||
|
* - timeout: time to wait for reply in ms
|
||||||
|
* - desc: if set, memory area to be used for desc.
|
||||||
|
* Care must be taken to leave room for variable-length array.
|
||||||
|
* - do_free: returns bool that specify if the caller should free
|
||||||
|
* its memory on error (e.g. if ikc_send failed in the first place,
|
||||||
|
* the reply has no chance of coming and memory should be free)
|
||||||
|
* Always true on success.
|
||||||
|
* - free_addrs_count & ...: addresses to kmalloc'd pointers that
|
||||||
|
* are referenced in the message and must be left intact if we
|
||||||
|
* abort to timeout/signal.
|
||||||
|
*/
|
||||||
int mcctrl_ikc_send_wait(ihk_os_t os, int cpu, struct ikc_scd_packet *pisp,
|
int mcctrl_ikc_send_wait(ihk_os_t os, int cpu, struct ikc_scd_packet *pisp,
|
||||||
long int timeout, int *do_frees, int free_addrs_count, ...);
|
long int timeout, struct mcctrl_wakeup_desc *desc,
|
||||||
|
int *do_frees, int free_addrs_count, ...);
|
||||||
|
|
||||||
ihk_os_t osnum_to_os(int n);
|
ihk_os_t osnum_to_os(int n);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user