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

Commit a5e408be 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: fix race condition while getting rx fifo during ssr"

parents 562fee13 dced4592
Loading
Loading
Loading
Loading
+20 −4
Original line number Diff line number Diff line
@@ -948,6 +948,7 @@ static void __rx_worker(struct edge_info *einfo, bool atomic_ctx)
	char trash[FIFO_ALIGNMENT];
	struct deferred_cmd *d_cmd;
	void *cmd_data;
	bool ret = false;

	rcu_id = srcu_read_lock(&einfo->use_ref);

@@ -956,11 +957,18 @@ static void __rx_worker(struct edge_info *einfo, bool atomic_ctx)
		return;
	}

	spin_lock_irqsave(&einfo->rx_lock, flags);
	if (!einfo->rx_fifo) {
		if (!get_rx_fifo(einfo))
		ret = get_rx_fifo(einfo);
		if (!ret) {
			spin_unlock_irqrestore(&einfo->rx_lock, flags);
			srcu_read_unlock(&einfo->use_ref, rcu_id);
			return;
		einfo->xprt_if.glink_core_if_ptr->link_up(&einfo->xprt_if);
		}
	}
	spin_unlock_irqrestore(&einfo->rx_lock, flags);
	if (ret)
		einfo->xprt_if.glink_core_if_ptr->link_up(&einfo->xprt_if);

	if ((atomic_ctx) && ((einfo->tx_resume_needed)
	    || (einfo->tx_blocked_signal_sent)
@@ -1568,15 +1576,23 @@ static void tx_cmd_ch_remote_close_ack(struct glink_transport_if *if_ptr,
static void subsys_up(struct glink_transport_if *if_ptr)
{
	struct edge_info *einfo;
	unsigned long flags;
	bool ret = false;

	einfo = container_of(if_ptr, struct edge_info, xprt_if);
	einfo->in_ssr = false;
	spin_lock_irqsave(&einfo->rx_lock, flags);
	if (!einfo->rx_fifo) {
		if (!get_rx_fifo(einfo))
		ret = get_rx_fifo(einfo);
		if (!ret) {
			spin_unlock_irqrestore(&einfo->rx_lock, flags);
			return;
		einfo->xprt_if.glink_core_if_ptr->link_up(&einfo->xprt_if);
		}
	}
	spin_unlock_irqrestore(&einfo->rx_lock, flags);
	if (ret)
		einfo->xprt_if.glink_core_if_ptr->link_up(&einfo->xprt_if);
}

/**
 * ssr() - process a subsystem restart notification of a transport