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

Commit fab7b282 authored by Dhoat Harpal's avatar Dhoat Harpal
Browse files

soc: qcom: glink: Best Fit approach to find intent



Using first fit algorithm to select the remote rx intent from the
list is not optimal way.

Optimize the selection of intent from list using the best fit algorithm.

CRs-Fixed: 1058750
Change-Id: I7b2a70188975b75a0fbcd2a6cb26f28cc0258532
Signed-off-by: default avatarDhoat Harpal <hdhoat@codeaurora.org>
parent a19f5688
Loading
Loading
Loading
Loading
+22 −13
Original line number Diff line number Diff line
@@ -1146,6 +1146,7 @@ int ch_pop_remote_rx_intent(struct channel_ctx *ctx, size_t size,
{
	struct glink_core_rx_intent *intent;
	struct glink_core_rx_intent *intent_tmp;
	struct glink_core_rx_intent *best_intent = NULL;
	unsigned long flags;

	if (GLINK_MAX_PKT_SIZE < size) {
@@ -1168,20 +1169,28 @@ int ch_pop_remote_rx_intent(struct channel_ctx *ctx, size_t size,
	list_for_each_entry_safe(intent, intent_tmp, &ctx->rmt_rx_intent_list,
			list) {
		if (intent->intent_size >= size) {
			list_del(&intent->list);
			if (!best_intent)
				best_intent = intent;
			else if (best_intent->intent_size > intent->intent_size)
				best_intent = intent;
			if (best_intent->intent_size == size)
				break;
		}
	}
	if (best_intent) {
		list_del(&best_intent->list);
		GLINK_DBG_CH(ctx,
				"%s: R[%u]:%zu Removed remote intent\n",
				__func__,
					intent->id,
					intent->intent_size);
			*riid_ptr = intent->id;
			*intent_size = intent->intent_size;
			kfree(intent);
				best_intent->id,
				best_intent->intent_size);
		*riid_ptr = best_intent->id;
		*intent_size = best_intent->intent_size;
		kfree(best_intent);
		spin_unlock_irqrestore(
			&ctx->rmt_rx_intent_lst_lock_lhc2, flags);
		return 0;
	}
	}
	spin_unlock_irqrestore(&ctx->rmt_rx_intent_lst_lock_lhc2, flags);
	return -EAGAIN;
}
@@ -2824,7 +2833,7 @@ static int glink_tx_common(void *handle, void *pkt_priv,
		tracer_pkt_log_event(data, GLINK_CORE_TX);
	}

	/* find matching rx intent (first-fit algorithm for now) */
	/* find matching rx intent (best-fit algorithm for now) */
	if (ch_pop_remote_rx_intent(ctx, size, &riid, &intent_size)) {
		if (!(tx_flags & GLINK_TX_REQ_INTENT)) {
			/* no rx intent available */