Patchwork MARS: Workload queue api add set flag

login
register
mail settings
Submitter Yuji Mano
Date Sept. 11, 2008, 7:34 p.m.
Message ID <48C972E3.7040507@am.sony.com>
Download mbox | patch
Permalink /patch/242/
State New
Delegated to: Yuji Mano
Headers show

Comments

Yuji Mano - Sept. 11, 2008, 7:34 p.m.
This adds a new internal API workload_queue_exit that sets the exit flag inside
the workload queue header.

Previously this was done inside the workload_queue_finalize function, but since
the MARS context must first join all mpu context threads before finalizing the
workload queue, a separate function to set the exit flag for those threads is
required.

Signed-off-by: Yuji Mano <yuji.mano@am.sony.com>
Kazunori Asayama - Sept. 12, 2008, 8:36 a.m.
Yuji Mano wrote:
> This adds a new internal API workload_queue_exit that sets the exit flag inside
> the workload queue header.
> 
> Previously this was done inside the workload_queue_finalize function, but since
> the MARS context must first join all mpu context threads before finalizing the
> workload queue, a separate function to set the exit flag for those threads is
> required.
> 
> Signed-off-by: Yuji Mano <yuji.mano@am.sony.com>

Acked-by: Kazunori Asayama <asayama@sm.sony.co.jp>

> 
> ---
>  include/common/mars/mars_kernel_types.h   |    3 ---
>  include/common/mars/mars_workload_types.h |    6 +++++-
>  include/host/mars/mars_workload_queue.h   |    1 +
>  src/host/lib/mars_context.c               |   28 ++++++++++++++++------------
>  src/host/lib/mars_workload_queue.c        |   11 +++++++++--
>  src/mpu/kernel/mars_kernel_scheduler.c    |    2 +-
>  6 files changed, 32 insertions(+), 19 deletions(-)
>

Patch

--- a/include/common/mars/mars_kernel_types.h
+++ b/include/common/mars/mars_kernel_types.h
@@ -44,9 +44,6 @@  extern "C" {
 
 #include <stdint.h>
 
-#define MARS_FLAG_NONE			0x0
-#define MARS_FLAG_EXIT			0x1
-
 #define MARS_KERNEL_PARAMS_ALIGN	128
 
 /* mars kernel parameters */
--- a/include/common/mars/mars_workload_types.h
+++ b/include/common/mars/mars_workload_types.h
@@ -64,8 +64,8 @@  extern "C" {
 #define MARS_WORKLOAD_COUNTER_MIN		0x0000	/* minimum counter */
 #define MARS_WORKLOAD_COUNTER_MAX		0xffff	/* maximum counter */
 
-#define MARS_WORKLOAD_SIGNAL_ON			0x1	/* signal set on */
 #define MARS_WORKLOAD_SIGNAL_OFF		0x0	/* signal set off */
+#define MARS_WORKLOAD_SIGNAL_ON			0x1	/* signal set on */
 
 #define MARS_WORKLOAD_PER_BLOCK			15	/* wl/block */
 #define MARS_WORKLOAD_NUM_BLOCKS		100	/* total blocks */
@@ -73,10 +73,14 @@  extern "C" {
 
 #define MARS_WORKLOAD_CONTEXT_SIZE		128	/* size of 128 bytes */
 #define MARS_WORKLOAD_CONTEXT_ALIGN		128	/* align to 128 bytes */
+
 #define MARS_WORKLOAD_QUEUE_ALIGN		128	/* align to 128 bytes */
 #define MARS_WORKLOAD_QUEUE_HEADER_ALIGN	128	/* align to 128 bytes */
 #define MARS_WORKLOAD_QUEUE_BLOCK_ALIGN		128	/* align to 128 bytes */
 
+#define MARS_WORKLOAD_QUEUE_FLAG_NONE		0x0	/* no flag set */
+#define MARS_WORKLOAD_QUEUE_FLAG_EXIT		0x1	/* exit flag */
+
 /*
  * MARS workload queue block bits
  * ----------------------------------------------------------------------------
--- a/include/host/mars/mars_workload_queue.h
+++ b/include/host/mars/mars_workload_queue.h
@@ -46,6 +46,7 @@  extern "C" {
 
 int workload_queue_initialize(struct mars_workload_queue *queue);
 int workload_queue_finalize(struct mars_workload_queue *queue);
+int workload_queue_exit(struct mars_workload_queue *queue);
 
 int workload_queue_add_begin(struct mars_workload_queue *queue, uint16_t *id,
 				uint8_t type,
--- a/src/host/lib/mars_context.c
+++ b/src/host/lib/mars_context.c
@@ -116,6 +116,10 @@  static int destroy_mpu_contexts(struct m
 	void *p_ret;
 	unsigned int i;
 
+	/* shutdown the workload queue so mpu context threads exit */
+	ret = workload_queue_exit(mars->workload_queue);
+	MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+
 	/* join all mpu context threads */
 	for (i = 0; i < mars->mpu_context_count; i++) {
 		ret = pthread_join(mars->mpu_context_threads[i], &p_ret);
@@ -155,16 +159,16 @@  int mars_initialize(struct mars_context 
 	MARS_CHECK_CLEANUP_RET(mars->workload_queue, mars_finalize(mars),
 				MARS_ERROR_MEMORY);
 
-	/* initialize workload queue */
-	ret = workload_queue_initialize(mars->workload_queue);
-	MARS_CHECK_CLEANUP_RET(ret == MARS_SUCCESS, mars_finalize(mars), ret);
-
 	/* allocate mpu context thread array */
 	mars->mpu_context_threads = (pthread_t *)
 		malloc(sizeof(pthread_t) * num_mpus);
 	MARS_CHECK_CLEANUP_RET(mars->mpu_context_threads, mars_finalize(mars),
 				MARS_ERROR_MEMORY);
 
+	/* initialize workload queue */
+	ret = workload_queue_initialize(mars->workload_queue);
+	MARS_CHECK_CLEANUP_RET(ret == MARS_SUCCESS, mars_finalize(mars), ret);
+
 	/* create contexts */
 	ret = create_mpu_contexts(mars, num_mpus);
 	MARS_CHECK_CLEANUP_RET(ret == MARS_SUCCESS, mars_finalize(mars), ret);
@@ -178,22 +182,22 @@  int mars_finalize(struct mars_context *m
 
 	int ret;
 
-	/* finalize workload queue */
-	if (mars->workload_queue) {
-		ret = workload_queue_finalize(mars->workload_queue);
-		MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
-	}
-
 	/* destroy contexts */
 	if (mars->mpu_context_count) {
 		ret = destroy_mpu_contexts(mars);
 		MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
 	}
 
+	/* finalize workload queue */
+	if (mars->workload_queue) {
+		ret = workload_queue_finalize(mars->workload_queue);
+		MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+	}
+
 	/* free allocated memory */
-	free(mars->kernel_params);
-	free(mars->workload_queue);
 	free(mars->mpu_context_threads);
+	free(mars->workload_queue);
+	free(mars->kernel_params);
 
 	/* zero context */
 	memset(mars, 0, sizeof(struct mars_context));
--- a/src/host/lib/mars_workload_queue.c
+++ b/src/host/lib/mars_workload_queue.c
@@ -51,9 +51,9 @@  int workload_queue_initialize(struct mar
 	int block;
 	int index;
 
+	queue->header.flag = MARS_WORKLOAD_QUEUE_FLAG_NONE;
 	queue->header.queue_ea = (uint64_t)(uintptr_t)queue;
 	queue->header.context_ea = (uint64_t)(uintptr_t)&queue->context;
-	queue->header.flag = MARS_FLAG_NONE;
 
 	/* initialize workload queue blocks */
 	for (block = 0; block < MARS_WORKLOAD_NUM_BLOCKS; block++) {
@@ -109,7 +109,14 @@  int workload_queue_finalize(struct mars_
 	/* found some task left in workload queue */
 	MARS_CHECK_RET(id < MARS_WORKLOAD_MAX, MARS_ERROR_STATE);
 
-	queue->header.flag = MARS_FLAG_EXIT;
+	return MARS_SUCCESS;
+}
+
+int workload_queue_exit(struct mars_workload_queue *queue)
+{
+	MARS_CHECK_RET(queue, MARS_ERROR_NULL);
+
+	queue->header.flag = MARS_WORKLOAD_QUEUE_FLAG_EXIT;
 
 	return MARS_SUCCESS;
 }
--- a/src/mpu/kernel/mars_kernel_scheduler.c
+++ b/src/mpu/kernel/mars_kernel_scheduler.c
@@ -244,7 +244,7 @@  int scheduler(void)
 			MARS_DMA_TAG);
 
 	/* return exit status if exit flag is set from host */
-	if (queue_header.flag == MARS_FLAG_EXIT)
+	if (queue_header.flag == MARS_WORKLOAD_QUEUE_FLAG_EXIT)
 		return MARS_KERNEL_STATUS_EXIT;
 
 	/* reserve next workload to run or return idle status if none found */