All of lore.kernel.org
 help / color / mirror / Atom feed
From: Horng-Shyang Liao <hs.liao@mediatek.com>
To: CK Hu <ck.hu@mediatek.com>
Cc: Rob Herring <robh+dt@kernel.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	Daniel Kurtz <djkurtz@chromium.org>,
	"Sascha Hauer" <s.hauer@pengutronix.de>,
	<devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>,
	<linux-mediatek@lists.infradead.org>,
	<srv_heupstream@mediatek.com>,
	"Sascha Hauer" <kernel@pengutronix.de>,
	Philipp Zabel <p.zabel@pengutronix.de>,
	Nicolas Boichat <drinkcat@chromium.org>,
	cawa cheng <cawa.cheng@mediatek.com>,
	Bibby Hsieh <bibby.hsieh@mediatek.com>,
	YT Shen <yt.shen@mediatek.com>,
	Daoyuan Huang <daoyuan.huang@mediatek.com>,
	"Damon Chu" <damon.chu@mediatek.com>,
	Josh-YC Liu <josh-yc.liu@mediatek.com>,
	"Glory Hung" <glory.hung@mediatek.com>,
	Jiaguang Zhang <jiaguang.zhang@mediatek.com>,
	Dennis-YC Hsieh <dennis-yc.hsieh@mediatek.com>
Subject: Re: [PATCH v8 2/3] CMDQ: Mediatek CMDQ driver
Date: Mon, 30 May 2016 17:38:03 +0800	[thread overview]
Message-ID: <1464601083.20071.12.camel@mtksdaap41> (raw)
In-Reply-To: <1464590942.20547.22.camel@mtksdaap41>

Hi CK,

Reply inline.

On Mon, 2016-05-30 at 14:49 +0800, CK Hu wrote:
> Hi, HS:
> 
> Some comments inline.
> 
> On Mon, 2016-05-30 at 11:19 +0800, HS Liao wrote:
...
> > +static void cmdq_thread_irq_handler(struct cmdq *cmdq, int tid)
> > +{
> > +	struct cmdq_thread *thread = &cmdq->thread[tid];
> > +	unsigned long flags = 0L;
> > +	u32 irq_flag;
> > +
> > +	spin_lock_irqsave(&cmdq->exec_lock, flags);
> > +
> > +	irq_flag = cmdq_thread_readl(thread, CMDQ_THR_IRQ_STATUS);
> > +	cmdq_thread_writel(thread, ~irq_flag, CMDQ_THR_IRQ_STATUS);
> > +
> > +	/*
> > +	 * Another CPU core could run "release task" right before we acquire
> > +	 * the spin lock, and thus reset / disable this GCE thread, so we
> > +	 * need to check the enable bit of this GCE thread.
> > +	 */
> > +	if (!(cmdq_thread_readl(thread, CMDQ_THR_ENABLE_TASK) &
> > +	      CMDQ_THR_ENABLED))
> > +		irq_flag = 0;
> 
> These three statement (clear irq flag and detect thread enable) can be
> moved into cmdq_handle_error_done() and the duplicated part in
> cmdq_task_handle_error_result() can be removed. Even though
> cmdq_task_handle_error_result() need not check thread enable, it would
> not influence the flow.

Will do.

> > +
> > +	cmdq_handle_error_done(cmdq, thread, irq_flag);
> > +	spin_unlock_irqrestore(&cmdq->exec_lock, flags);
> > +}
...
> > +static int cmdq_task_handle_error_result(struct cmdq_task *task)
> > +{
> > +	struct cmdq *cmdq = task->cmdq;
> > +	struct device *dev = cmdq->dev;
> > +	struct cmdq_thread *thread = task->thread;
> > +	struct cmdq_task *next_task, *prev_task;
> > +	u32 irq_flag;
> > +
> > +	/* suspend GCE thread to ensure consistency */
> > +	WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
> > +
> > +	/* ISR has handled this error task */
> > +	if (task->task_state == TASK_STATE_ERROR) {
> > +		next_task = list_first_entry_or_null(&thread->task_busy_list,
> > +				struct cmdq_task, list_entry);
> > +		if (next_task) /* move to next task */
> > +			cmdq_thread_writel(thread, next_task->pa_base,
> > +					   CMDQ_THR_CURR_ADDR);
> > +		cmdq_thread_resume(thread);
> > +		return -ECANCELED;
> > +	}
> > +
> > +	/*
> > +	 * Save next_task and prev_task in advance
> > +	 * since cmdq_handle_error_done will remove list_entry.
> > +	 */
> > +	next_task = prev_task = NULL;
> > +	if (task->list_entry.next != &thread->task_busy_list)
> > +		next_task = list_next_entry(task, list_entry);
> > +	if (task->list_entry.prev != &thread->task_busy_list)
> > +		prev_task = list_prev_entry(task, list_entry);
> 
> I think there is always no previous task because task order in
> thread->task_busy_list is the same as in cmdq->task_release_wq. So each
> task processed by release work should be the first item in
> thread->task_busy_list or be removed from thread->task_busy_list.

Will remove previous task.

> > +
> > +	/*
> > +	 * Although IRQ is disabled, GCE continues to execute.
> > +	 * It may have pending IRQ before GCE thread is suspended,
> > +	 * so check this condition again.
> > +	 */
> > +	irq_flag = cmdq_thread_readl(thread, CMDQ_THR_IRQ_STATUS);
> > +	cmdq_handle_error_done(cmdq, thread, irq_flag);
> > +	cmdq_thread_writel(thread, ~irq_flag, CMDQ_THR_IRQ_STATUS);
> > +
> > +	if (task->task_state == TASK_STATE_DONE) {
> > +		cmdq_thread_resume(thread);
> > +		return 0;
> > +	}
> > +
> > +	if (task->task_state == TASK_STATE_ERROR) {
> > +		dev_err(dev, "task 0x%p error\n", task);
> > +		if (next_task) /* move to next task */
> > +			cmdq_thread_writel(thread, next_task->pa_base,
> > +					   CMDQ_THR_CURR_ADDR);
> > +		cmdq_thread_resume(thread);
> > +		return -ECANCELED;
> > +	}
> > +
> > +	/* Task is running, so we force to remove it. */
> > +	dev_err(dev, "task 0x%p timeout or killed\n", task);
> 
> No 'kill' state.

>From CMDQ v8, there is no killed task.
I will rewrite output message.

> > +	task->task_state = TASK_STATE_ERROR;
> > +
> > +	if (prev_task) {
> > +		u64 *prev_va = prev_task->va_base;
> > +		u64 *curr_va = task->va_base;
> > +
> > +		/* copy JUMP instruction */
> > +		prev_va[prev_task->num_cmd - 1] = curr_va[task->num_cmd - 1];
> > +
> > +		cmdq_thread_invalidate_fetched_data(thread);
> > +	} else if (next_task) { /* move to next task */
> > +		cmdq_thread_writel(thread, next_task->pa_base,
> > +				   CMDQ_THR_CURR_ADDR);
> > +	}
> 
> Just one statement in 'else if' part. So remove the parentheses.

I think we should keep this parentheses.

Quote from CodingStyle document:

This does not apply if only one branch of a conditional statement is a
single
statement; in the latter case use braces in both branches:

if (condition) {
        do_this();
        do_that();
} else {
        otherwise();
}

> > +
> > +	list_del(&task->list_entry);
> > +	cmdq_thread_resume(thread);
> > +
> > +	/* call cb here to prevent lock */
> 
> I think these three statements should be place together and there should
> be no this comment.
> 
> 1. Change task state to DONE or ERROR.
> 2. Callback
> 3. Remove task from task_busy_list.

I will put these three statements together and wrap up them as a
function.

> > +	if (task->cb.cb) {
> > +		struct cmdq_cb_data cmdq_cb_data;
> > +
> > +		cmdq_cb_data.err = true;
> > +		cmdq_cb_data.data = task->cb.data;
> > +		task->cb.cb(cmdq_cb_data);
> > +	}
> > +
> > +	return -ECANCELED;
> > +}
...
> > +static int cmdq_suspend(struct device *dev)
> > +{
> > +	struct cmdq *cmdq = dev_get_drvdata(dev);
> > +	u32 exec_threads;
> > +
> > +	mutex_lock(&cmdq->task_mutex);
> > +	cmdq->suspended = true;
> > +	mutex_unlock(&cmdq->task_mutex);
> > +
> > +	exec_threads = readl(cmdq->base + CMDQ_CURR_LOADED_THR);
> > +	if ((exec_threads & CMDQ_THR_EXECUTING) && !cmdq_task_is_empty(cmdq)) {
> > +		dev_err(dev, "wait active tasks timeout.\n");
> > +		flush_workqueue(cmdq->task_release_wq);
> > +	}
> 
> Maybe it need not to check exec_threads, it may be written as:
> 
> 	if (!cmdq_task_is_empty(cmdq))
> 		dev_err(dev, "wait active tasks timeout.\n");
> 
> 	flush_workqueue(cmdq->task_release_wq);
> 
> Even though task_busy_list is empty, that does not mean every task in
> cmdq->task_release_wq is finished. So always do flush
> cmdq->task_release_wq.

Will do.

> > +	return 0;
> > +}
> > +
...
> 
> Regards,
> CK
> 

Thanks,
HS

WARNING: multiple messages have this Message-ID (diff)
From: Horng-Shyang Liao <hs.liao-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
To: CK Hu <ck.hu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
Cc: Rob Herring <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	Matthias Brugger
	<matthias.bgg-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Daniel Kurtz <djkurtz-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>,
	Sascha Hauer <s.hauer-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>,
	devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
	linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
	srv_heupstream-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org,
	Sascha Hauer <kernel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>,
	Philipp Zabel <p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>,
	Nicolas Boichat
	<drinkcat-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>,
	cawa cheng <cawa.cheng-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>,
	Bibby Hsieh <bibby.hsieh-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>,
	YT Shen <yt.shen-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>,
	Daoyuan Huang
	<daoyuan.huang-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>,
	Damon Chu <damon.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>,
	Josh-YC Liu <josh-yc.liu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>,
	Glory Hung <glory.hung-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>,
	Jiaguang Zhang
	<jiaguang.zhang-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>,
	Dennis-YC Hsieh
	<dennis-yc.hsieh-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
Subject: Re: [PATCH v8 2/3] CMDQ: Mediatek CMDQ driver
Date: Mon, 30 May 2016 17:38:03 +0800	[thread overview]
Message-ID: <1464601083.20071.12.camel@mtksdaap41> (raw)
In-Reply-To: <1464590942.20547.22.camel@mtksdaap41>

Hi CK,

Reply inline.

On Mon, 2016-05-30 at 14:49 +0800, CK Hu wrote:
> Hi, HS:
> 
> Some comments inline.
> 
> On Mon, 2016-05-30 at 11:19 +0800, HS Liao wrote:
...
> > +static void cmdq_thread_irq_handler(struct cmdq *cmdq, int tid)
> > +{
> > +	struct cmdq_thread *thread = &cmdq->thread[tid];
> > +	unsigned long flags = 0L;
> > +	u32 irq_flag;
> > +
> > +	spin_lock_irqsave(&cmdq->exec_lock, flags);
> > +
> > +	irq_flag = cmdq_thread_readl(thread, CMDQ_THR_IRQ_STATUS);
> > +	cmdq_thread_writel(thread, ~irq_flag, CMDQ_THR_IRQ_STATUS);
> > +
> > +	/*
> > +	 * Another CPU core could run "release task" right before we acquire
> > +	 * the spin lock, and thus reset / disable this GCE thread, so we
> > +	 * need to check the enable bit of this GCE thread.
> > +	 */
> > +	if (!(cmdq_thread_readl(thread, CMDQ_THR_ENABLE_TASK) &
> > +	      CMDQ_THR_ENABLED))
> > +		irq_flag = 0;
> 
> These three statement (clear irq flag and detect thread enable) can be
> moved into cmdq_handle_error_done() and the duplicated part in
> cmdq_task_handle_error_result() can be removed. Even though
> cmdq_task_handle_error_result() need not check thread enable, it would
> not influence the flow.

Will do.

> > +
> > +	cmdq_handle_error_done(cmdq, thread, irq_flag);
> > +	spin_unlock_irqrestore(&cmdq->exec_lock, flags);
> > +}
...
> > +static int cmdq_task_handle_error_result(struct cmdq_task *task)
> > +{
> > +	struct cmdq *cmdq = task->cmdq;
> > +	struct device *dev = cmdq->dev;
> > +	struct cmdq_thread *thread = task->thread;
> > +	struct cmdq_task *next_task, *prev_task;
> > +	u32 irq_flag;
> > +
> > +	/* suspend GCE thread to ensure consistency */
> > +	WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
> > +
> > +	/* ISR has handled this error task */
> > +	if (task->task_state == TASK_STATE_ERROR) {
> > +		next_task = list_first_entry_or_null(&thread->task_busy_list,
> > +				struct cmdq_task, list_entry);
> > +		if (next_task) /* move to next task */
> > +			cmdq_thread_writel(thread, next_task->pa_base,
> > +					   CMDQ_THR_CURR_ADDR);
> > +		cmdq_thread_resume(thread);
> > +		return -ECANCELED;
> > +	}
> > +
> > +	/*
> > +	 * Save next_task and prev_task in advance
> > +	 * since cmdq_handle_error_done will remove list_entry.
> > +	 */
> > +	next_task = prev_task = NULL;
> > +	if (task->list_entry.next != &thread->task_busy_list)
> > +		next_task = list_next_entry(task, list_entry);
> > +	if (task->list_entry.prev != &thread->task_busy_list)
> > +		prev_task = list_prev_entry(task, list_entry);
> 
> I think there is always no previous task because task order in
> thread->task_busy_list is the same as in cmdq->task_release_wq. So each
> task processed by release work should be the first item in
> thread->task_busy_list or be removed from thread->task_busy_list.

Will remove previous task.

> > +
> > +	/*
> > +	 * Although IRQ is disabled, GCE continues to execute.
> > +	 * It may have pending IRQ before GCE thread is suspended,
> > +	 * so check this condition again.
> > +	 */
> > +	irq_flag = cmdq_thread_readl(thread, CMDQ_THR_IRQ_STATUS);
> > +	cmdq_handle_error_done(cmdq, thread, irq_flag);
> > +	cmdq_thread_writel(thread, ~irq_flag, CMDQ_THR_IRQ_STATUS);
> > +
> > +	if (task->task_state == TASK_STATE_DONE) {
> > +		cmdq_thread_resume(thread);
> > +		return 0;
> > +	}
> > +
> > +	if (task->task_state == TASK_STATE_ERROR) {
> > +		dev_err(dev, "task 0x%p error\n", task);
> > +		if (next_task) /* move to next task */
> > +			cmdq_thread_writel(thread, next_task->pa_base,
> > +					   CMDQ_THR_CURR_ADDR);
> > +		cmdq_thread_resume(thread);
> > +		return -ECANCELED;
> > +	}
> > +
> > +	/* Task is running, so we force to remove it. */
> > +	dev_err(dev, "task 0x%p timeout or killed\n", task);
> 
> No 'kill' state.

>From CMDQ v8, there is no killed task.
I will rewrite output message.

> > +	task->task_state = TASK_STATE_ERROR;
> > +
> > +	if (prev_task) {
> > +		u64 *prev_va = prev_task->va_base;
> > +		u64 *curr_va = task->va_base;
> > +
> > +		/* copy JUMP instruction */
> > +		prev_va[prev_task->num_cmd - 1] = curr_va[task->num_cmd - 1];
> > +
> > +		cmdq_thread_invalidate_fetched_data(thread);
> > +	} else if (next_task) { /* move to next task */
> > +		cmdq_thread_writel(thread, next_task->pa_base,
> > +				   CMDQ_THR_CURR_ADDR);
> > +	}
> 
> Just one statement in 'else if' part. So remove the parentheses.

I think we should keep this parentheses.

Quote from CodingStyle document:

This does not apply if only one branch of a conditional statement is a
single
statement; in the latter case use braces in both branches:

if (condition) {
        do_this();
        do_that();
} else {
        otherwise();
}

> > +
> > +	list_del(&task->list_entry);
> > +	cmdq_thread_resume(thread);
> > +
> > +	/* call cb here to prevent lock */
> 
> I think these three statements should be place together and there should
> be no this comment.
> 
> 1. Change task state to DONE or ERROR.
> 2. Callback
> 3. Remove task from task_busy_list.

I will put these three statements together and wrap up them as a
function.

> > +	if (task->cb.cb) {
> > +		struct cmdq_cb_data cmdq_cb_data;
> > +
> > +		cmdq_cb_data.err = true;
> > +		cmdq_cb_data.data = task->cb.data;
> > +		task->cb.cb(cmdq_cb_data);
> > +	}
> > +
> > +	return -ECANCELED;
> > +}
...
> > +static int cmdq_suspend(struct device *dev)
> > +{
> > +	struct cmdq *cmdq = dev_get_drvdata(dev);
> > +	u32 exec_threads;
> > +
> > +	mutex_lock(&cmdq->task_mutex);
> > +	cmdq->suspended = true;
> > +	mutex_unlock(&cmdq->task_mutex);
> > +
> > +	exec_threads = readl(cmdq->base + CMDQ_CURR_LOADED_THR);
> > +	if ((exec_threads & CMDQ_THR_EXECUTING) && !cmdq_task_is_empty(cmdq)) {
> > +		dev_err(dev, "wait active tasks timeout.\n");
> > +		flush_workqueue(cmdq->task_release_wq);
> > +	}
> 
> Maybe it need not to check exec_threads, it may be written as:
> 
> 	if (!cmdq_task_is_empty(cmdq))
> 		dev_err(dev, "wait active tasks timeout.\n");
> 
> 	flush_workqueue(cmdq->task_release_wq);
> 
> Even though task_busy_list is empty, that does not mean every task in
> cmdq->task_release_wq is finished. So always do flush
> cmdq->task_release_wq.

Will do.

> > +	return 0;
> > +}
> > +
...
> 
> Regards,
> CK
> 

Thanks,
HS

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

WARNING: multiple messages have this Message-ID (diff)
From: hs.liao@mediatek.com (Horng-Shyang Liao)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v8 2/3] CMDQ: Mediatek CMDQ driver
Date: Mon, 30 May 2016 17:38:03 +0800	[thread overview]
Message-ID: <1464601083.20071.12.camel@mtksdaap41> (raw)
In-Reply-To: <1464590942.20547.22.camel@mtksdaap41>

Hi CK,

Reply inline.

On Mon, 2016-05-30 at 14:49 +0800, CK Hu wrote:
> Hi, HS:
> 
> Some comments inline.
> 
> On Mon, 2016-05-30 at 11:19 +0800, HS Liao wrote:
...
> > +static void cmdq_thread_irq_handler(struct cmdq *cmdq, int tid)
> > +{
> > +	struct cmdq_thread *thread = &cmdq->thread[tid];
> > +	unsigned long flags = 0L;
> > +	u32 irq_flag;
> > +
> > +	spin_lock_irqsave(&cmdq->exec_lock, flags);
> > +
> > +	irq_flag = cmdq_thread_readl(thread, CMDQ_THR_IRQ_STATUS);
> > +	cmdq_thread_writel(thread, ~irq_flag, CMDQ_THR_IRQ_STATUS);
> > +
> > +	/*
> > +	 * Another CPU core could run "release task" right before we acquire
> > +	 * the spin lock, and thus reset / disable this GCE thread, so we
> > +	 * need to check the enable bit of this GCE thread.
> > +	 */
> > +	if (!(cmdq_thread_readl(thread, CMDQ_THR_ENABLE_TASK) &
> > +	      CMDQ_THR_ENABLED))
> > +		irq_flag = 0;
> 
> These three statement (clear irq flag and detect thread enable) can be
> moved into cmdq_handle_error_done() and the duplicated part in
> cmdq_task_handle_error_result() can be removed. Even though
> cmdq_task_handle_error_result() need not check thread enable, it would
> not influence the flow.

Will do.

> > +
> > +	cmdq_handle_error_done(cmdq, thread, irq_flag);
> > +	spin_unlock_irqrestore(&cmdq->exec_lock, flags);
> > +}
...
> > +static int cmdq_task_handle_error_result(struct cmdq_task *task)
> > +{
> > +	struct cmdq *cmdq = task->cmdq;
> > +	struct device *dev = cmdq->dev;
> > +	struct cmdq_thread *thread = task->thread;
> > +	struct cmdq_task *next_task, *prev_task;
> > +	u32 irq_flag;
> > +
> > +	/* suspend GCE thread to ensure consistency */
> > +	WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
> > +
> > +	/* ISR has handled this error task */
> > +	if (task->task_state == TASK_STATE_ERROR) {
> > +		next_task = list_first_entry_or_null(&thread->task_busy_list,
> > +				struct cmdq_task, list_entry);
> > +		if (next_task) /* move to next task */
> > +			cmdq_thread_writel(thread, next_task->pa_base,
> > +					   CMDQ_THR_CURR_ADDR);
> > +		cmdq_thread_resume(thread);
> > +		return -ECANCELED;
> > +	}
> > +
> > +	/*
> > +	 * Save next_task and prev_task in advance
> > +	 * since cmdq_handle_error_done will remove list_entry.
> > +	 */
> > +	next_task = prev_task = NULL;
> > +	if (task->list_entry.next != &thread->task_busy_list)
> > +		next_task = list_next_entry(task, list_entry);
> > +	if (task->list_entry.prev != &thread->task_busy_list)
> > +		prev_task = list_prev_entry(task, list_entry);
> 
> I think there is always no previous task because task order in
> thread->task_busy_list is the same as in cmdq->task_release_wq. So each
> task processed by release work should be the first item in
> thread->task_busy_list or be removed from thread->task_busy_list.

Will remove previous task.

> > +
> > +	/*
> > +	 * Although IRQ is disabled, GCE continues to execute.
> > +	 * It may have pending IRQ before GCE thread is suspended,
> > +	 * so check this condition again.
> > +	 */
> > +	irq_flag = cmdq_thread_readl(thread, CMDQ_THR_IRQ_STATUS);
> > +	cmdq_handle_error_done(cmdq, thread, irq_flag);
> > +	cmdq_thread_writel(thread, ~irq_flag, CMDQ_THR_IRQ_STATUS);
> > +
> > +	if (task->task_state == TASK_STATE_DONE) {
> > +		cmdq_thread_resume(thread);
> > +		return 0;
> > +	}
> > +
> > +	if (task->task_state == TASK_STATE_ERROR) {
> > +		dev_err(dev, "task 0x%p error\n", task);
> > +		if (next_task) /* move to next task */
> > +			cmdq_thread_writel(thread, next_task->pa_base,
> > +					   CMDQ_THR_CURR_ADDR);
> > +		cmdq_thread_resume(thread);
> > +		return -ECANCELED;
> > +	}
> > +
> > +	/* Task is running, so we force to remove it. */
> > +	dev_err(dev, "task 0x%p timeout or killed\n", task);
> 
> No 'kill' state.

>From CMDQ v8, there is no killed task.
I will rewrite output message.

> > +	task->task_state = TASK_STATE_ERROR;
> > +
> > +	if (prev_task) {
> > +		u64 *prev_va = prev_task->va_base;
> > +		u64 *curr_va = task->va_base;
> > +
> > +		/* copy JUMP instruction */
> > +		prev_va[prev_task->num_cmd - 1] = curr_va[task->num_cmd - 1];
> > +
> > +		cmdq_thread_invalidate_fetched_data(thread);
> > +	} else if (next_task) { /* move to next task */
> > +		cmdq_thread_writel(thread, next_task->pa_base,
> > +				   CMDQ_THR_CURR_ADDR);
> > +	}
> 
> Just one statement in 'else if' part. So remove the parentheses.

I think we should keep this parentheses.

Quote from CodingStyle document:

This does not apply if only one branch of a conditional statement is a
single
statement; in the latter case use braces in both branches:

if (condition) {
        do_this();
        do_that();
} else {
        otherwise();
}

> > +
> > +	list_del(&task->list_entry);
> > +	cmdq_thread_resume(thread);
> > +
> > +	/* call cb here to prevent lock */
> 
> I think these three statements should be place together and there should
> be no this comment.
> 
> 1. Change task state to DONE or ERROR.
> 2. Callback
> 3. Remove task from task_busy_list.

I will put these three statements together and wrap up them as a
function.

> > +	if (task->cb.cb) {
> > +		struct cmdq_cb_data cmdq_cb_data;
> > +
> > +		cmdq_cb_data.err = true;
> > +		cmdq_cb_data.data = task->cb.data;
> > +		task->cb.cb(cmdq_cb_data);
> > +	}
> > +
> > +	return -ECANCELED;
> > +}
...
> > +static int cmdq_suspend(struct device *dev)
> > +{
> > +	struct cmdq *cmdq = dev_get_drvdata(dev);
> > +	u32 exec_threads;
> > +
> > +	mutex_lock(&cmdq->task_mutex);
> > +	cmdq->suspended = true;
> > +	mutex_unlock(&cmdq->task_mutex);
> > +
> > +	exec_threads = readl(cmdq->base + CMDQ_CURR_LOADED_THR);
> > +	if ((exec_threads & CMDQ_THR_EXECUTING) && !cmdq_task_is_empty(cmdq)) {
> > +		dev_err(dev, "wait active tasks timeout.\n");
> > +		flush_workqueue(cmdq->task_release_wq);
> > +	}
> 
> Maybe it need not to check exec_threads, it may be written as:
> 
> 	if (!cmdq_task_is_empty(cmdq))
> 		dev_err(dev, "wait active tasks timeout.\n");
> 
> 	flush_workqueue(cmdq->task_release_wq);
> 
> Even though task_busy_list is empty, that does not mean every task in
> cmdq->task_release_wq is finished. So always do flush
> cmdq->task_release_wq.

Will do.

> > +	return 0;
> > +}
> > +
...
> 
> Regards,
> CK
> 

Thanks,
HS

  reply	other threads:[~2016-05-30  9:38 UTC|newest]

Thread overview: 125+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-30  3:19 [PATCH v8 0/3] Mediatek MT8173 CMDQ support HS Liao
2016-05-30  3:19 ` HS Liao
2016-05-30  3:19 ` HS Liao
2016-05-30  3:19 ` [PATCH v8 1/3] dt-bindings: soc: Add documentation for the MediaTek GCE unit HS Liao
2016-05-30  3:19   ` HS Liao
2016-05-30  3:19   ` HS Liao
2016-05-30  3:19 ` [PATCH v8 2/3] CMDQ: Mediatek CMDQ driver HS Liao
2016-05-30  3:19   ` HS Liao
2016-05-30  3:19   ` HS Liao
2016-05-30  6:49   ` CK Hu
2016-05-30  6:49     ` CK Hu
2016-05-30  6:49     ` CK Hu
2016-05-30  9:38     ` Horng-Shyang Liao [this message]
2016-05-30  9:38       ` Horng-Shyang Liao
2016-05-30  9:38       ` Horng-Shyang Liao
2016-05-30 15:31   ` Matthias Brugger
2016-05-30 15:31     ` Matthias Brugger
2016-05-31  8:36     ` Horng-Shyang Liao
2016-05-31  8:36       ` Horng-Shyang Liao
2016-05-31  8:36       ` Horng-Shyang Liao
2016-05-31 20:04       ` Matthias Brugger
2016-05-31 20:04         ` Matthias Brugger
2016-06-01  9:57         ` Horng-Shyang Liao
2016-06-01  9:57           ` Horng-Shyang Liao
2016-06-01  9:57           ` Horng-Shyang Liao
2016-06-02  8:46           ` Matthias Brugger
2016-06-02  8:46             ` Matthias Brugger
2016-06-02  8:46             ` Matthias Brugger
2016-06-03  6:12             ` Horng-Shyang Liao
2016-06-03  6:12               ` Horng-Shyang Liao
2016-06-03  6:12               ` Horng-Shyang Liao
2016-06-03 11:18               ` Matthias Brugger
2016-06-03 11:18                 ` Matthias Brugger
2016-06-03 12:13                 ` Horng-Shyang Liao
2016-06-03 12:13                   ` Horng-Shyang Liao
2016-06-03 12:13                   ` Horng-Shyang Liao
2016-06-03 13:11                   ` Matthias Brugger
2016-06-03 13:11                     ` Matthias Brugger
2016-06-03 13:11                     ` Matthias Brugger
2016-06-07 16:59                     ` Matthias Brugger
2016-06-07 16:59                       ` Matthias Brugger
2016-06-08  5:40                       ` Horng-Shyang Liao
2016-06-08  5:40                         ` Horng-Shyang Liao
2016-06-08  5:40                         ` Horng-Shyang Liao
2016-06-08 10:45                         ` Matthias Brugger
2016-06-08 10:45                           ` Matthias Brugger
2016-06-08 10:45                           ` Matthias Brugger
2016-06-08 12:25                           ` Horng-Shyang Liao
2016-06-08 12:25                             ` Horng-Shyang Liao
2016-06-08 12:25                             ` Horng-Shyang Liao
2016-06-08 15:35                             ` Matthias Brugger
2016-06-08 15:35                               ` Matthias Brugger
2016-06-14  7:44                               ` Horng-Shyang Liao
2016-06-14  7:44                                 ` Horng-Shyang Liao
2016-06-14  7:44                                 ` Horng-Shyang Liao
2016-06-14 10:17                                 ` Matthias Brugger
2016-06-14 10:17                                   ` Matthias Brugger
2016-06-14 12:07                                   ` Horng-Shyang Liao
2016-06-14 12:07                                     ` Horng-Shyang Liao
2016-06-14 12:07                                     ` Horng-Shyang Liao
2016-06-17  8:28                                     ` Horng-Shyang Liao
2016-06-17  8:28                                       ` Horng-Shyang Liao
2016-06-17  8:28                                       ` Horng-Shyang Liao
2016-06-17 15:57                                       ` Matthias Brugger
2016-06-17 15:57                                         ` Matthias Brugger
2016-06-17 15:57                                         ` Matthias Brugger
2016-06-21  5:52                                         ` Horng-Shyang Liao
2016-06-21  5:52                                           ` Horng-Shyang Liao
2016-06-21  5:52                                           ` Horng-Shyang Liao
2016-06-21 13:41                                           ` Matthias Brugger
2016-06-21 13:41                                             ` Matthias Brugger
2016-06-21 13:41                                             ` Matthias Brugger
2016-06-22  5:43                                             ` Horng-Shyang Liao
2016-06-22  5:43                                               ` Horng-Shyang Liao
2016-06-22  5:43                                               ` Horng-Shyang Liao
2016-06-22  9:58                                               ` Matthias Brugger
2016-06-22  9:58                                                 ` Matthias Brugger
2016-06-22  9:58                                                 ` Matthias Brugger
2016-06-17 16:14                                     ` Matthias Brugger
2016-06-17 16:14                                       ` Matthias Brugger
2016-06-03 13:11                 ` Jassi Brar
2016-06-03 13:11                   ` Jassi Brar
2016-06-03 13:11                   ` Jassi Brar
2016-06-06  9:33                   ` Horng-Shyang Liao
2016-06-06  9:33                     ` Horng-Shyang Liao
2016-06-06  9:33                     ` Horng-Shyang Liao
2016-06-06 13:17                     ` Jassi Brar
2016-06-07  2:45                   ` Horng-Shyang Liao
2016-06-07  2:45                     ` Horng-Shyang Liao
2016-06-07  2:45                     ` Horng-Shyang Liao
2016-06-07 17:04   ` Matthias Brugger
2016-06-07 17:04     ` Matthias Brugger
2016-06-08  5:09     ` Horng-Shyang Liao
2016-06-08  5:09       ` Horng-Shyang Liao
2016-06-08  5:09       ` Horng-Shyang Liao
2016-06-20 10:41   ` CK Hu
2016-06-20 10:41     ` CK Hu
2016-06-20 10:41     ` CK Hu
2016-06-20 11:22     ` Horng-Shyang Liao
2016-06-20 11:22       ` Horng-Shyang Liao
2016-06-20 11:22       ` Horng-Shyang Liao
2016-06-21  2:03       ` CK Hu
2016-06-21  2:03         ` CK Hu
2016-06-21  2:03         ` CK Hu
2016-06-21  7:46         ` Horng-Shyang Liao
2016-06-21  7:46           ` Horng-Shyang Liao
2016-06-21  7:46           ` Horng-Shyang Liao
2016-06-24 11:39           ` Horng-Shyang Liao
2016-06-24 11:39             ` Horng-Shyang Liao
2016-06-24 11:39             ` Horng-Shyang Liao
2016-06-27  2:00             ` CK Hu
2016-06-27  2:00               ` CK Hu
2016-06-27  2:00               ` CK Hu
2016-06-23  6:03   ` CK Hu
2016-06-23  6:03     ` CK Hu
2016-06-23  6:03     ` CK Hu
2016-06-23  7:54     ` Horng-Shyang Liao
2016-06-23  7:54       ` Horng-Shyang Liao
2016-06-23  7:54       ` Horng-Shyang Liao
2016-06-23 11:44       ` CK Hu
2016-06-23 11:44         ` CK Hu
2016-06-23 11:44         ` CK Hu
2016-05-30  3:19 ` [PATCH v8 3/3] arm64: dts: mt8173: Add GCE node HS Liao
2016-05-30  3:19   ` HS Liao
2016-05-30  3:19   ` HS Liao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1464601083.20071.12.camel@mtksdaap41 \
    --to=hs.liao@mediatek.com \
    --cc=bibby.hsieh@mediatek.com \
    --cc=cawa.cheng@mediatek.com \
    --cc=ck.hu@mediatek.com \
    --cc=damon.chu@mediatek.com \
    --cc=daoyuan.huang@mediatek.com \
    --cc=dennis-yc.hsieh@mediatek.com \
    --cc=devicetree@vger.kernel.org \
    --cc=djkurtz@chromium.org \
    --cc=drinkcat@chromium.org \
    --cc=glory.hung@mediatek.com \
    --cc=jiaguang.zhang@mediatek.com \
    --cc=josh-yc.liu@mediatek.com \
    --cc=kernel@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=matthias.bgg@gmail.com \
    --cc=p.zabel@pengutronix.de \
    --cc=robh+dt@kernel.org \
    --cc=s.hauer@pengutronix.de \
    --cc=srv_heupstream@mediatek.com \
    --cc=yt.shen@mediatek.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.