Browse Source

dataipa: Mem Optimization Phase 2

Incorporate rmnet api for data allocation for temp buffers

Change-Id: I1cd9c4430a176a6e3c7a4fa8c98c4160a2276e37
Signed-off-by: Abhishek Raghuvanshi <[email protected]>
Abhishek Raghuvanshi 2 years ago
parent
commit
062880ada8
2 changed files with 41 additions and 5 deletions
  1. 1 0
      define_modules.bzl
  2. 40 5
      drivers/platform/msm/ipa/ipa_v3/ipa_dp.c

+ 1 - 0
define_modules.bzl

@@ -205,6 +205,7 @@ def define_modules(target, variant):
             ":ipa_clients",
             "//msm-kernel:all_headers",
             ":{}_gsim".format(kernel_build_variant),
+            "//vendor/qcom/opensource/datarmnet-ext/mem:{}_rmnet_mem".format(kernel_build_variant),
         ],
     )
     mod_list.append("{}_ipam".format(kernel_build_variant))

+ 40 - 5
drivers/platform/msm/ipa/ipa_v3/ipa_dp.c

@@ -27,6 +27,7 @@
 #include "ipahal.h"
 #include "ipahal_fltrt.h"
 #include "ipa_stats.h"
+#include <rmnet_mem.h>
 
 #define IPA_GSI_EVENT_RP_SIZE 8
 #define IPA_WAN_NAPI_MAX_FRAMES (NAPI_WEIGHT / IPA_WAN_AGGR_PKT_CNT)
@@ -2674,6 +2675,36 @@ static struct page *ipa3_alloc_page(
 	return page;
 }
 
+static struct page *ipa3_rmnet_alloc_page(
+	gfp_t flag, u32 *page_order, bool try_lower)
+{
+	struct page *page = NULL;
+	u32 p_order = *page_order;
+	int rc, porder;
+
+	while (true) {
+		page = rmnet_mem_get_pages_entry(
+			flag, p_order, &rc, &porder, IPA_ID);
+
+		if (unlikely(!page)) {
+			if (p_order > 0) {
+				p_order = p_order - 1;
+				continue;
+			}
+			break;
+		}
+
+		ipa3_ctx->stats.lower_order++;
+		break;
+	}
+
+	if (unlikely(!page))
+		IPAERR("rmnet page alloc fails\n");
+
+	*page_order = p_order;
+	return page;
+}
+
 
 static struct ipa3_rx_pkt_wrapper *ipa3_alloc_rx_pkt_page(
 	gfp_t flag, bool is_tmp_alloc, struct ipa3_sys_context *sys)
@@ -2688,12 +2719,16 @@ static struct ipa3_rx_pkt_wrapper *ipa3_alloc_rx_pkt_page(
 
 	rx_pkt->page_data.page_order = sys->page_order;
 	/* For temporary allocations, avoid triggering OOM Killer. */
-	if (is_tmp_alloc)
+	if (is_tmp_alloc) {
 		flag |= __GFP_RETRY_MAYFAIL | __GFP_NOWARN;
-	/* Try a lower order page for order 3 pages in case allocation fails. */
-	rx_pkt->page_data.page = ipa3_alloc_page(flag,
-				&rx_pkt->page_data.page_order,
-				(is_tmp_alloc && rx_pkt->page_data.page_order == 3));
+		rx_pkt->page_data.page = ipa3_rmnet_alloc_page(
+			flag, &rx_pkt->page_data.page_order, true);
+	} else {
+		/* Try a lower order page for order 3 pages in case allocation fails. */
+		rx_pkt->page_data.page = ipa3_alloc_page(flag,
+					&rx_pkt->page_data.page_order,
+					(is_tmp_alloc && rx_pkt->page_data.page_order == 3));
+	}
 
 	if (unlikely(!rx_pkt->page_data.page))
 		goto fail_page_alloc;