Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 01cff86d authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "soc: qcom: glink: Move tx_wakeup_worker to rx tasklet"

parents 356730a4 f6c2b18d
Loading
Loading
Loading
Loading
+27 −41
Original line number Diff line number Diff line
@@ -215,7 +215,6 @@ struct edge_info {
	bool tx_blocked_signal_sent;
	struct kthread_work kwork;
	struct kthread_worker kworker;
	struct work_struct wakeup_work;
	struct task_struct *task;
	struct tasklet_struct tasklet;
	struct srcu_struct use_ref;
@@ -815,6 +814,32 @@ static bool get_rx_fifo(struct edge_info *einfo)
	return true;
}

/**
 * tx_wakeup_worker() - worker function to wakeup tx blocked thread
 * @work:	kwork associated with the edge to process commands on.
 */
static void tx_wakeup_worker(struct edge_info *einfo)
{
	bool trigger_wakeup = false;
	unsigned long flags;

	if (einfo->in_ssr)
		return;
	if (einfo->tx_resume_needed && fifo_write_avail(einfo)) {
		einfo->tx_resume_needed = false;
		einfo->xprt_if.glink_core_if_ptr->tx_resume(
						&einfo->xprt_if);
	}
	spin_lock_irqsave(&einfo->write_lock, flags);
	if (waitqueue_active(&einfo->tx_blocked_queue)) { /* tx waiting ?*/
		einfo->tx_blocked_signal_sent = false;
		trigger_wakeup = true;
	}
	spin_unlock_irqrestore(&einfo->write_lock, flags);
	if (trigger_wakeup)
		wake_up_all(&einfo->tx_blocked_queue);
}

/**
 * __rx_worker() - process received commands on a specific edge
 * @einfo:	Edge to process commands on.
@@ -865,7 +890,7 @@ static void __rx_worker(struct edge_info *einfo, bool atomic_ctx)

	if ((atomic_ctx) && ((einfo->tx_resume_needed) ||
		(waitqueue_active(&einfo->tx_blocked_queue)))) /* tx waiting ?*/
		schedule_work(&einfo->wakeup_work);
		tx_wakeup_worker(einfo);

	/*
	 * Access to the fifo needs to be synchronized, however only the calls
@@ -1172,39 +1197,6 @@ static void rx_worker_atomic(unsigned long param)
	__rx_worker(einfo, true);
}

/**
 * tx_wakeup_worker() - worker function to wakeup tx blocked thread
 * @work:	kwork associated with the edge to process commands on.
 */
static void tx_wakeup_worker(struct work_struct *work)
{
	struct edge_info *einfo;
	bool trigger_wakeup = false;
	unsigned long flags;
	int rcu_id;

	einfo = container_of(work, struct edge_info, wakeup_work);
	rcu_id = srcu_read_lock(&einfo->use_ref);
	if (einfo->in_ssr) {
		srcu_read_unlock(&einfo->use_ref, rcu_id);
		return;
	}
	if (einfo->tx_resume_needed && fifo_write_avail(einfo)) {
		einfo->tx_resume_needed = false;
		einfo->xprt_if.glink_core_if_ptr->tx_resume(
						&einfo->xprt_if);
	}
	spin_lock_irqsave(&einfo->write_lock, flags);
	if (waitqueue_active(&einfo->tx_blocked_queue)) { /* tx waiting ?*/
		einfo->tx_blocked_signal_sent = false;
		trigger_wakeup = true;
	}
	spin_unlock_irqrestore(&einfo->write_lock, flags);
	if (trigger_wakeup)
		wake_up_all(&einfo->tx_blocked_queue);
	srcu_read_unlock(&einfo->use_ref, rcu_id);
}

/**
 * rx_worker() - worker function to process received commands
 * @work:	kwork associated with the edge to process commands on.
@@ -2355,7 +2347,6 @@ static int glink_smem_native_probe(struct platform_device *pdev)
	init_waitqueue_head(&einfo->tx_blocked_queue);
	init_kthread_work(&einfo->kwork, rx_worker);
	init_kthread_worker(&einfo->kworker);
	INIT_WORK(&einfo->wakeup_work, tx_wakeup_worker);
	tasklet_init(&einfo->tasklet, rx_worker_atomic, (unsigned long)einfo);
	einfo->read_from_fifo = read_from_fifo;
	einfo->write_to_fifo = write_to_fifo;
@@ -2457,7 +2448,6 @@ request_irq_fail:
reg_xprt_fail:
smem_alloc_fail:
	flush_kthread_worker(&einfo->kworker);
	flush_work(&einfo->wakeup_work);
	kthread_stop(einfo->task);
	einfo->task = NULL;
	tasklet_kill(&einfo->tasklet);
@@ -2546,7 +2536,6 @@ static int glink_rpm_native_probe(struct platform_device *pdev)
	init_waitqueue_head(&einfo->tx_blocked_queue);
	init_kthread_work(&einfo->kwork, rx_worker);
	init_kthread_worker(&einfo->kworker);
	INIT_WORK(&einfo->wakeup_work, tx_wakeup_worker);
	tasklet_init(&einfo->tasklet, rx_worker_atomic, (unsigned long)einfo);
	einfo->intentless = true;
	einfo->read_from_fifo = memcpy32_fromio;
@@ -2707,7 +2696,6 @@ request_irq_fail:
reg_xprt_fail:
toc_init_fail:
	flush_kthread_worker(&einfo->kworker);
	flush_work(&einfo->wakeup_work);
	kthread_stop(einfo->task);
	einfo->task = NULL;
	tasklet_kill(&einfo->tasklet);
@@ -2839,7 +2827,6 @@ static int glink_mailbox_probe(struct platform_device *pdev)
	init_waitqueue_head(&einfo->tx_blocked_queue);
	init_kthread_work(&einfo->kwork, rx_worker);
	init_kthread_worker(&einfo->kworker);
	INIT_WORK(&einfo->wakeup_work, tx_wakeup_worker);
	tasklet_init(&einfo->tasklet, rx_worker_atomic, (unsigned long)einfo);
	einfo->read_from_fifo = read_from_fifo;
	einfo->write_to_fifo = write_to_fifo;
@@ -2960,7 +2947,6 @@ request_irq_fail:
reg_xprt_fail:
smem_alloc_fail:
	flush_kthread_worker(&einfo->kworker);
	flush_work(&einfo->wakeup_work);
	kthread_stop(einfo->task);
	einfo->task = NULL;
	tasklet_kill(&einfo->tasklet);