rpmsg: glink: Deny intent request if reusable intent fits

In high traffic scenarios a remote may request extra intents to send
data faster. If the work thread that handles these intent requests is
starved of cpu time, then these requests can build up. Some remote
procs may not be able to handle this burst of built up intent requests.

In order to prevent intent build up, deny intent requests that can be
fulfilled by default intents that are reusable.

Change-Id: I0932b458eb5694bdd5f92f1b4dc19b578da1e4da
Signed-off-by: Chris Lew <clew@codeaurora.org>
This commit is contained in:
Chris Lew 2018-10-10 13:13:08 -07:00
parent 7d366a6309
commit b980dc4ad6

View File

@ -818,9 +818,11 @@ static void qcom_glink_handle_rx_done(struct qcom_glink *glink,
static void qcom_glink_handle_intent_req(struct qcom_glink *glink,
u32 cid, size_t size)
{
struct glink_core_rx_intent *intent;
struct glink_core_rx_intent *intent = NULL;
struct glink_core_rx_intent *tmp;
struct glink_channel *channel;
unsigned long flags;
int iid;
spin_lock_irqsave(&glink->idr_lock, flags);
channel = idr_find(&glink->rcids, cid);
@ -831,6 +833,19 @@ static void qcom_glink_handle_intent_req(struct qcom_glink *glink,
return;
}
spin_lock_irqsave(&channel->intent_lock, flags);
idr_for_each_entry(&channel->liids, tmp, iid) {
if (tmp->size >= size && tmp->reuse) {
intent = tmp;
break;
}
}
spin_unlock_irqrestore(&channel->intent_lock, flags);
if (intent) {
qcom_glink_send_intent_req_ack(glink, channel, !!intent);
return;
}
intent = qcom_glink_alloc_intent(glink, channel, size, false);
if (intent)
qcom_glink_advertise_intent(glink, channel, intent);