Преглед изворни кода

rmnet_mem: I58ed82d412f9b937a37995ee422055f9b4fc8f5d

Initial Commit v1

Change-Id: I58ed82d412f9b937a37995ee422055f9b4fc8f5d
Signed-off-by: Raul Martinez <[email protected]>
Raul Martinez пре 2 година
родитељ
комит
3a3640f75f

+ 4 - 0
datarmnet_ext_dlkm_vendor_board.mk

@@ -14,6 +14,7 @@ ifeq ($(TARGET_DATARMNET_EXT_ENABLE), true)
 	DATA_SHS_DLKM_BOARD_PLATFORMS_LIST := pineapple
 	DATA_APS_DLKM_BOARD_PLATFORMS_LIST := pineapple
 	DATA_WLAN_DLKM_BOARD_PLATFORMS_LIST := pineapple
+	DATA_MEM_DLKM_BOARD_PLATFORMS_LIST := pineapple
 
 	ifneq ($(TARGET_BOARD_AUTO),true)
 		ifeq ($(call is-board-platform-in-list,$(DATA_OFFLOAD_DLKM_BOARD_PLATFORMS_LIST)),true)
@@ -22,6 +23,9 @@ ifeq ($(TARGET_DATARMNET_EXT_ENABLE), true)
 			BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_perf.ko
 			BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_wlan.ko
 		endif
+		ifeq ($(call is-board-platform-in-list,$(DATA_MEM_DLKM_BOARD_PLATFORMS_LIST)),true)
+			BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_mem.ko
+		endif
 		ifeq ($(call is-board-platform-in-list,$(DATA_SHS_DLKM_BOARD_PLATFORMS_LIST)),true)
 			BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_shs.ko
 		endif

+ 1 - 0
datarmnet_ext_dlkm_vendor_product.mk

@@ -5,3 +5,4 @@ PRODUCT_PACKAGES += rmnet_perf_tether.ko
 PRODUCT_PACKAGES += rmnet_perf.ko
 PRODUCT_PACKAGES += rmnet_aps.ko
 PRODUCT_PACKAGES += rmnet_sch.ko
+PRODUCT_PACKAGES += rmnet_mem.ko

+ 20 - 0
mem/Android.mk

@@ -0,0 +1,20 @@
+ifneq ($(TARGET_BOARD_AUTO),true)
+ifneq ($(TARGET_BOARD_PLATFORM),qssi)
+
+RMNET_MEM_DLKM_PLATFORMS_LIST := pineapple
+ifeq ($(call is-board-platform-in-list, $(RMNET_MEM_DLKM_PLATFORMS_LIST)),true)
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT)
+LOCAL_CLANG :=true
+LOCAL_MODULE := rmnet_mem.ko
+LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/**/*) $(wildcard $(LOCAL_PATH)/*)
+
+DLKM_DIR := $(TOP)/device/qcom/common/dlkm
+
+include $(DLKM_DIR)/Build_external_kernelmodule.mk
+
+endif #End of check for target
+endif #End of Check for qssi target
+endif #End of check for AUTO Target

+ 7 - 0
mem/Kbuild

@@ -0,0 +1,7 @@
+obj-m += rmnet_mem.o
+
+ccflags-y := $(call cc-option,-Wno-misleading-indentation)
+        rmnet_mem-y := \
+        rmnet_mem_main.o \
+        rmnet_mem_nl.o \
+	rmnet_mem_pool.o

+ 9 - 0
mem/Kconfig

@@ -0,0 +1,9 @@
+#
+# RMNET_MEM driver
+#
+
+menuconfig RMNET_MEM
+    tristate "Rmnet MEM  support"
+    default m
+    ---help---
+        Memory module for RmNet driver

+ 16 - 0
mem/Makefile

@@ -0,0 +1,16 @@
+#By default build for CLD
+RMNET_MEM_SELECT := CONFIG_RMNET_MEM=m
+KBUILD_OPTIONS += $(RMNET_MEM_SELECT)
+KBUILD_OPTIONS += $(KBUILD_EXTRA) # Extra config if any
+
+M ?= $(shell pwd)
+
+all:
+		$(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS)
+
+modules_install:
+		$(MAKE) INSTALL_MOD_STRIP=1 -C $(KERNEL_SRC) M=$(M) modules_install
+
+clean:
+		$(MAKE) -C $(KERNEL_SRC) M=$(M) clean
+

+ 25 - 0
mem/rmnet_mem.h

@@ -0,0 +1,25 @@
+/* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: GPL-2.0-only
+ */
+
+#ifndef _RMNET_MEM_H_
+#define _RMNET_MEM_H_
+#include <linux/kernel.h>
+#include <linux/netdevice.h>
+#include <linux/module.h>
+#include <linux/mm.h>
+#define IPA_ID (0xd26+209-0xdf6)
+#define RMNET_CORE_ID (0xd1f+216-0xdf5)
+#define POOL_NOTIF (0xd18+223-0xdf4)
+#define RMNET_MEM_SUCCESS (0xd2d+202-0xdf7)
+#define RMNET_MEM_FAIL -(0xd26+209-0xdf6)
+#define RMNET_MEM_DOWNGRADE -(0xd1f+216-0xdf5)
+#define RMNET_MEM_UPGRADE -(0xd18+223-0xdf4)
+int rmnet_mem_unregister_notifier(struct notifier_block*nb);int 
+rmnet_mem_register_notifier(struct notifier_block*nb);extern struct 
+rmnet_mem_notif_s rmnet_mem_notifier;void rmnet_mem_put_page_entry(struct page*
+page);void rmnet_mem_page_ref_inc_entry(struct page*page,unsigned id);struct 
+page*rmnet_mem_get_pages_entry(gfp_t gfp_mask,unsigned int order,int*code,int*
+pageorder,unsigned id);
+#endif
+

+ 119 - 0
mem/rmnet_mem_main.c

@@ -0,0 +1,119 @@
+/* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+* SPDX-License-Identifier: GPL-2.0-only
+*/
+
+#include <linux/kernel.h>
+#include <linux/netdevice.h>
+#include <linux/module.h>
+#include <linux/mm.h>
+#include "rmnet_mem_nl.h"
+#include "rmnet_mem.h"
+#include "rmnet_mem_priv.h"
+MODULE_LICENSE("\x47\x50\x4c\x20\x76\x32");DEFINE_SPINLOCK(rmnet_mem_lock);int 
+max_pool_size[POOL_LEN]={(0xd2d+202-0xdf7),(0xd2d+202-0xdf7),MAX_POOL_O2,
+MAX_POOL_O3};module_param_array(max_pool_size,int,NULL,(0xdb7+6665-0x261c));
+MODULE_PARM_DESC(max_pool_size,
+"\x4d\x61\x78\x20\x50\x6f\x6f\x6c\x20\x73\x69\x7a\x65\x20\x70\x65\x72\x20\x6f\x72\x64\x65\x72"
+);int static_pool_size[POOL_LEN];module_param_array(static_pool_size,int,NULL,
+(0xcb7+5769-0x221c));MODULE_PARM_DESC(static_pool_size,
+"\x50\x6f\x6f\x6c\x20\x73\x69\x7a\x65\x20\x70\x65\x72\x20\x6f\x72\x64\x65\x72");
+int pool_unbound_feature[POOL_LEN]={(0xd2d+202-0xdf7),(0xd2d+202-0xdf7),
+(0xd26+209-0xdf6),(0xd26+209-0xdf6)};module_param_array(pool_unbound_feature,int
+,NULL,(0xdb7+6665-0x261c));MODULE_PARM_DESC(pool_unbound_featue,
+"\x50\x6f\x6f\x6c\x20\x62\x6f\x75\x6e\x64\x20\x67\x61\x74\x65");int 
+rmnet_mem_order_requests[POOL_LEN];module_param_array(rmnet_mem_order_requests,
+int,NULL,(0xcb7+5769-0x221c));MODULE_PARM_DESC(rmnet_mem_order_requests,
+"\x52\x65\x71\x75\x65\x73\x74\x20\x70\x65\x72\x20\x6f\x72\x64\x65\x72");int 
+rmnet_mem_id_req[POOL_LEN];module_param_array(rmnet_mem_id_req,int,NULL,
+(0xcb7+5769-0x221c));MODULE_PARM_DESC(rmnet_mem_id_req,
+"\x52\x65\x71\x75\x65\x73\x74\x20\x70\x65\x72\x20\x69\x64");int 
+rmnet_mem_id_recycled[POOL_LEN];module_param_array(rmnet_mem_id_recycled,int,
+NULL,(0xcb7+5769-0x221c));MODULE_PARM_DESC(rmnet_mem_id_recycled,
+"\x52\x65\x71\x75\x65\x73\x74\x20\x70\x65\x72\x20\x69\x64");struct 
+workqueue_struct*mem_wq;int target_static_pool_size[POOL_LEN];module_param_array
+(target_static_pool_size,int,NULL,(0xcb7+5769-0x221c));MODULE_PARM_DESC(
+target_static_pool_size,
+"\x50\x6f\x6f\x6c\x20\x73\x69\x7a\x65\x20\x70\x65\x72\x20\x6f\x72\x64\x65\x72");
+struct work_struct pool_adjust_work;struct list_head rmnet_mem_pool[POOL_LEN];
+struct mem_info{struct page*addr;struct list_head mem_head;u8 order;};void 
+rmnet_mem_page_ref_inc_entry(struct page*page,unsigned id){page_ref_inc(page);}
+EXPORT_SYMBOL(rmnet_mem_page_ref_inc_entry);struct rmnet_mem_notif_s{struct 
+raw_notifier_head chain;spinlock_t lock;};struct rmnet_mem_notif_s 
+rmnet_mem_notifier={.chain=RAW_NOTIFIER_INIT(rmnet_mem_notifier.chain),.lock=
+__SPIN_LOCK_UNLOCKED(rmnet_mem_notifier.lock),};EXPORT_SYMBOL(rmnet_mem_notifier
+);int rmnet_mem_mode_notify(unsigned pool_size){unsigned long flags;
+spin_lock_irqsave(&rmnet_mem_notifier.lock,flags);raw_notifier_call_chain(&
+rmnet_mem_notifier.chain,pool_size,NULL);spin_unlock_irqrestore(&
+rmnet_mem_notifier.lock,flags);return NOTIFY_OK;}int rmnet_mem_register_notifier
+(struct notifier_block*nb){unsigned long flags;int ret;spin_lock_irqsave(&
+rmnet_mem_notifier.lock,flags);ret=raw_notifier_chain_register(&
+rmnet_mem_notifier.chain,nb);spin_unlock_irqrestore(&rmnet_mem_notifier.lock,
+flags);return ret;}EXPORT_SYMBOL_GPL(rmnet_mem_register_notifier);int 
+rmnet_mem_unregister_notifier(struct notifier_block*nb){unsigned long flags;int 
+ret;spin_lock_irqsave(&rmnet_mem_notifier.lock,flags);ret=
+raw_notifier_chain_unregister(&rmnet_mem_notifier.chain,nb);
+spin_unlock_irqrestore(&rmnet_mem_notifier.lock,flags);return ret;}
+EXPORT_SYMBOL_GPL(rmnet_mem_unregister_notifier);struct mem_info*
+rmnet_mem_add_page(struct page*page,u8 pageorder){struct mem_info*mem_slot;
+mem_slot=(struct mem_info*)kzalloc(sizeof(*mem_slot),GFP_ATOMIC);if(!mem_slot)
+return NULL;static_pool_size[pageorder]++;mem_slot->order=pageorder;mem_slot->
+addr=(void*)page;INIT_LIST_HEAD(&mem_slot->mem_head);if(pageorder<POOL_LEN){
+list_add_rcu(&mem_slot->mem_head,&(rmnet_mem_pool[pageorder]));}return mem_slot;
+}void rmnet_mem_free_all(void){unsigned long flags;struct mem_info*mem_slot;
+struct list_head*ptr=NULL,*next=NULL;int i;spin_lock_irqsave(&rmnet_mem_lock,
+flags);for(i=(0xd2d+202-0xdf7);i<POOL_LEN;i++){list_for_each_safe(ptr,next,&
+rmnet_mem_pool[i]){mem_slot=list_entry(ptr,struct mem_info,mem_head);list_del(&
+mem_slot->mem_head);put_page(mem_slot->addr);static_pool_size[mem_slot->order]--
+;kfree(mem_slot);}}spin_unlock_irqrestore(&rmnet_mem_lock,flags);}struct page*
+rmnet_mem_get_pages_entry(gfp_t gfp_mask,unsigned int order,int*code,int*
+pageorder,unsigned id){unsigned long flags;struct mem_info*mem_page;struct page*
+page=NULL;int i=(0xd2d+202-0xdf7);int j=(0xd2d+202-0xdf7);spin_lock_irqsave(&
+rmnet_mem_lock,flags);rmnet_mem_id_req[id]++;rmnet_mem_order_requests[order]++;
+if(order<POOL_LEN){for(j=order;j>(0xd2d+202-0xdf7)&&j<POOL_LEN;j++){do{mem_page=
+list_first_entry_or_null(&rmnet_mem_pool[j],struct mem_info,mem_head);if(!
+mem_page){break;}if(page_ref_count(mem_page->addr)==(0xd26+209-0xdf6)){
+rmnet_mem_id_recycled[j]++;page=mem_page->addr;page_ref_inc(mem_page->addr);
+list_rotate_left(&rmnet_mem_pool[j]);break;}list_rotate_left(&rmnet_mem_pool[j])
+;i++;}while(i<=(0xd0a+237-0xdf2));if(page&&pageorder){*pageorder=j;break;}i=
+(0xd2d+202-0xdf7);}}if(!page){if(order<(0xd18+223-0xdf4)){page=__dev_alloc_pages
+(gfp_mask,order);if(page){if(static_pool_size[order]<max_pool_size[order]&&
+pool_unbound_feature[order]){rmnet_mem_add_page(page,order);page_ref_inc(page);}
+if(pageorder){*pageorder=order;}}}else{if(static_pool_size[order]<max_pool_size[
+order]&&pool_unbound_feature[order]){page=__dev_alloc_pages(gfp_mask,order);if(
+page){rmnet_mem_add_page(page,order);page_ref_inc(page);}if(pageorder){*
+pageorder=order;}}}}spin_unlock_irqrestore(&rmnet_mem_lock,flags);if(pageorder&&
+code&&page){if(*pageorder==order)*code=RMNET_MEM_SUCCESS;else if(*pageorder>
+order)*code=RMNET_MEM_UPGRADE;else if(*pageorder<order)*code=RMNET_MEM_DOWNGRADE
+;}else if(pageorder&&code){*code=RMNET_MEM_FAIL;*pageorder=(0xd2d+202-0xdf7);}
+return page;}EXPORT_SYMBOL(rmnet_mem_get_pages_entry);void 
+rmnet_mem_put_page_entry(struct page*page){put_page(page);}EXPORT_SYMBOL(
+rmnet_mem_put_page_entry);static void mem_update_pool_work(struct work_struct*
+work){int i;for(i=(0xd2d+202-0xdf7);i<POOL_LEN;i++){local_bh_disable();
+rmnet_mem_adjust(target_static_pool_size[i],i);if(i==POOL_NOTIF){
+rmnet_mem_mode_notify(target_static_pool_size[i]);}local_bh_enable();}}void 
+rmnet_mem_adjust(unsigned perm_size,u8 pageorder){struct list_head*entry,*next;
+struct mem_info*mem_slot;int i;struct page*newpage=NULL;int adjustment;unsigned 
+long flags;if(pageorder>=POOL_LEN||perm_size>MAX_STATIC_POOL)return;adjustment=
+perm_size-static_pool_size[pageorder];if(perm_size==static_pool_size[pageorder])
+return;spin_lock_irqsave(&rmnet_mem_lock,flags);if(perm_size>static_pool_size[
+pageorder]){for(i=(0xd2d+202-0xdf7);i<(adjustment);i++){newpage=
+__dev_alloc_pages(GFP_ATOMIC,pageorder);if(!newpage){continue;}
+rmnet_mem_add_page(newpage,pageorder);}}else{list_for_each_safe(entry,next,&(
+rmnet_mem_pool[pageorder])){mem_slot=list_entry(entry,struct mem_info,mem_head);
+list_del(&mem_slot->mem_head);put_page(mem_slot->addr);kfree(mem_slot);
+static_pool_size[pageorder]--;if(static_pool_size[pageorder]==perm_size)break;}}
+spin_unlock_irqrestore(&rmnet_mem_lock,flags);}int __init rmnet_mem_module_init(
+void){int rc=(0xd2d+202-0xdf7);int i=(0xd2d+202-0xdf7);pr_info(
+"\x25\x73\x28\x29\x3a\x20\x53\x74\x61\x72\x74\x69\x6e\x67\x20\x72\x6d\x6e\x65\x74\x20\x6d\x65\x6d\x20\x6d\x6f\x64\x75\x6c\x65" "\n"
+,__func__);for(i=(0xd2d+202-0xdf7);i<POOL_LEN;i++){INIT_LIST_HEAD(&(
+rmnet_mem_pool[i]));}mem_wq=alloc_workqueue("\x6d\x65\x6d\x5f\x77\x71",
+WQ_HIGHPRI,(0xd2d+202-0xdf7));if(!mem_wq){pr_err(
+"\x25\x73\x28\x29\x3a\x20\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x61\x6c\x6c\x6f\x63\x20\x77\x6f\x72\x6b\x71\x75\x65\x75\x65\x20" "\n"
+,__func__);return-ENOMEM;}INIT_WORK(&pool_adjust_work,mem_update_pool_work);rc=
+rmnet_mem_nl_register();if(rc){pr_err(
+"\x25\x73\x28\x29\x3a\x20\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x72\x65\x67\x69\x73\x74\x65\x72\x20\x67\x65\x6e\x65\x72\x69\x63\x20\x6e\x65\x74\x6c\x69\x6e\x6b\x20\x66\x61\x6d\x69\x6c\x79" "\n"
+,__func__);return-ENOMEM;}return(0xd2d+202-0xdf7);}void __exit 
+rmnet_mem_module_exit(void){rmnet_mem_nl_unregister();if(mem_wq){
+cancel_work_sync(&pool_adjust_work);drain_workqueue(mem_wq);destroy_workqueue(
+mem_wq);mem_wq=NULL;}rmnet_mem_free_all();}module_init(rmnet_mem_module_init);
+module_exit(rmnet_mem_module_exit);

+ 39 - 0
mem/rmnet_mem_nl.c

@@ -0,0 +1,39 @@
+/* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: GPL-2.0-only
+ */
+
+#include "rmnet_mem_nl.h"
+#include "rmnet_mem_priv.h"
+#define DATARMNETb005a78b72 "\x52\x4d\x4e\x45\x54\x5f\x4d\x45\x4d"
+#define DATARMNET39e021cd6f (0xd26+209-0xdf6)
+enum{DATARMNET5277047270,DATARMNET654ec9d727,DATARMNET579b73b6a1,
+DATARMNET99bbc5ae70,};
+#define DATARMNETb2539ccff0 (DATARMNETc820b7a9dc - (0xd26+209-0xdf6))
+uint32_t DATARMNET7c4038843f;static struct nla_policy DATARMNET93ad46699e[
+DATARMNETb2539ccff0+(0xd26+209-0xdf6)]={[DATARMNETe5184c7a76]=
+NLA_POLICY_EXACT_LEN(sizeof(struct DATARMNET5d6175c98d)),[DATARMNETb0428b7575]=
+NLA_POLICY_EXACT_LEN(sizeof(struct DATARMNET5d23779a8f)),};static const struct 
+genl_ops DATARMNETb68b0ed922[]={{.cmd=DATARMNET654ec9d727,.doit=
+DATARMNET291f036d31,},{.cmd=DATARMNET579b73b6a1,.doit=DATARMNET8e48a951e4,},};
+struct genl_family DATARMNET595b5c3a9e __ro_after_init={.hdrsize=
+(0xd2d+202-0xdf7),.name=DATARMNETb005a78b72,.version=DATARMNET39e021cd6f,.
+maxattr=DATARMNETb2539ccff0,.policy=DATARMNET93ad46699e,.ops=DATARMNETb68b0ed922
+,.n_ops=ARRAY_SIZE(DATARMNETb68b0ed922),};int DATARMNETe85d734d4f(int val,struct
+ genl_info*DATARMNET54338da2ff){struct sk_buff*skb;void*msg_head;int rc;skb=
+genlmsg_new(NLMSG_GOODSIZE,GFP_ATOMIC);if(skb==NULL)goto DATARMNETbf4095f79e;
+msg_head=genlmsg_put(skb,(0xd2d+202-0xdf7),(0xd2d+202-0xdf7),&
+DATARMNET595b5c3a9e,(0xd2d+202-0xdf7),DATARMNET654ec9d727);if(msg_head==NULL){rc
+=-ENOMEM;rm_err(
+"\x4d\x45\x4d\x5f\x47\x4e\x4c\x3a\x20\x46\x41\x49\x4c\x45\x44\x20\x74\x6f\x20\x6d\x73\x67\x5f\x68\x65\x61\x64\x20\x25\x64" "\n"
+,rc);kfree(skb);goto DATARMNETbf4095f79e;}rc=nla_put_u32(skb,DATARMNETbd57d2442f
+,val);if(rc!=(0xd2d+202-0xdf7)){rm_err(
+"\x4d\x45\x4d\x5f\x47\x4e\x4c\x3a\x20\x46\x41\x49\x4c\x45\x44\x20\x6e\x6c\x61\x5f\x70\x75\x74\x20\x25\x64" "\n"
+,rc);kfree(skb);goto DATARMNETbf4095f79e;}genlmsg_end(skb,msg_head);rc=
+genlmsg_reply(skb,DATARMNET54338da2ff);if(rc!=(0xd2d+202-0xdf7))goto 
+DATARMNETbf4095f79e;rm_err(
+"\x4d\x45\x4d\x5f\x47\x4e\x4c\x3a\x20\x53\x75\x63\x63\x65\x73\x73\x66\x75\x6c\x6c\x79\x20\x73\x65\x6e\x74\x20\x69\x6e\x74\x20\x25\x64" "\n"
+,val);return(0xd2d+202-0xdf7);DATARMNETbf4095f79e:rm_err(
+"\x4d\x45\x4d\x5f\x47\x4e\x4c\x3a\x20\x46\x41\x49\x4c\x45\x44\x20\x74\x6f\x20\x73\x65\x6e\x64\x20\x69\x6e\x74\x20\x25\x64" "\n"
+,val);return-(0xd26+209-0xdf6);}int rmnet_mem_nl_register(void){return 
+genl_register_family(&DATARMNET595b5c3a9e);}void rmnet_mem_nl_unregister(void){
+genl_unregister_family(&DATARMNET595b5c3a9e);}

+ 47 - 0
mem/rmnet_mem_nl.h

@@ -0,0 +1,47 @@
+/* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: GPL-2.0-only
+ */
+
+#ifndef _RMNET_MEM_NL_H_
+#define _RMNET_MEM_NL_H_
+
+#include <net/genetlink.h>
+
+enum {
+	RMNET_MEM_ATTR_UNSPEC,
+	RMNET_MEM_ATTR_MODE,
+	RMNET_MEM_ATTR_POOL_SIZE,
+	RMNET_MEM_ATTR_INT,
+	__RMNET_MEM_ATTR_MAX,
+};
+
+struct rmnet_memzone_req {
+        int zone;
+        int valid;
+};
+struct rmnet_pool_update_req {
+        unsigned poolsize[4];
+        unsigned valid_mask;
+};
+
+int rmnet_mem_nl_register(void);
+void rmnet_mem_nl_unregister(void);
+int rmnet_mem_nl_cmd_update_mode(struct sk_buff *skb, struct genl_info *info);
+int rmnet_mem_nl_cmd_update_pool_size(struct sk_buff *skb, struct genl_info *info);
+int rmnet_mem_genl_send_int_to_userspace_no_info(int val, struct genl_info *info);
+
+#endif /* _RMNET_MEM_GENL_H_ */
+
+#ifndef DATARMNET7b1420e7bf
+#define DATARMNET7b1420e7bf
+#include <net/genetlink.h>
+enum{DATARMNET2cc66aaa85,DATARMNETe5184c7a76,DATARMNETb0428b7575,
+DATARMNETbd57d2442f,DATARMNETc820b7a9dc,};struct DATARMNET5d6175c98d{int 
+DATARMNET3a4d9ad400;int valid;};struct DATARMNET5d23779a8f{unsigned 
+DATARMNETe87b937bb6[(0xd11+230-0xdf3)];unsigned DATARMNET855b934a37;};int 
+rmnet_mem_nl_register(void);void rmnet_mem_nl_unregister(void);int 
+DATARMNET291f036d31(struct sk_buff*skb,struct genl_info*DATARMNET54338da2ff);int
+ DATARMNET8e48a951e4(struct sk_buff*skb,struct genl_info*DATARMNET54338da2ff);
+int DATARMNETe85d734d4f(int val,struct genl_info*DATARMNET54338da2ff);
+#endif 
+

+ 35 - 0
mem/rmnet_mem_pool.c

@@ -0,0 +1,35 @@
+/* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: GPL-2.0-only
+ */
+
+#include "rmnet_mem_nl.h"
+#include "rmnet_mem_priv.h"
+#define DATARMNETc8aadbe769 (0xdf7+6169-0x241c)
+#define DATARMNET831d60a2b1 (0xd18+223-0xdf4)
+extern struct work_struct pool_adjust_work;extern struct workqueue_struct*mem_wq
+;int DATARMNET291f036d31(struct sk_buff*skb,struct genl_info*DATARMNET54338da2ff
+){u8 mode=(0xd2d+202-0xdf7);struct sk_buff*DATARMNETa13fcf9070;struct 
+DATARMNET5d6175c98d mem_info;struct nlattr*na;if(DATARMNET54338da2ff->attrs[
+DATARMNETe5184c7a76]){na=DATARMNET54338da2ff->attrs[DATARMNETe5184c7a76];if(
+nla_memcpy(&mem_info,na,sizeof(mem_info))>(0xd2d+202-0xdf7)){rm_err(
+"%s(): modeinfo %u\n",__func__,mem_info.DATARMNET3a4d9ad400);}}rm_err(
+"\x25\x73\x28\x29\x3a\x20\x6d\x6f\x64\x65\x20\x25\x75" "\n",__func__,mode);
+DATARMNETa13fcf9070=nlmsg_new(NLMSG_DEFAULT_SIZE,GFP_KERNEL);if(!
+DATARMNETa13fcf9070)return-ENOMEM;DATARMNETe85d734d4f((0xdb7+6677-0x263c),
+DATARMNET54338da2ff);return(0xd2d+202-0xdf7);}int DATARMNET8e48a951e4(struct 
+sk_buff*skb,struct genl_info*DATARMNET54338da2ff){struct sk_buff*
+DATARMNETa13fcf9070;struct DATARMNET5d23779a8f mem_info;struct nlattr*na;int i;
+u8 DATARMNET205e85dea0=(0xd2d+202-0xdf7);if(DATARMNET54338da2ff->attrs[
+DATARMNETb0428b7575]){na=DATARMNET54338da2ff->attrs[DATARMNETb0428b7575];if(
+nla_memcpy(&mem_info,na,sizeof(mem_info))>(0xd2d+202-0xdf7)){pr_err(
+"\x25\x73\x28\x29\x3a\x20\x6d\x6f\x64\x65\x69\x6e\x66\x6f\x20\x25\x75" "\n",
+__func__,mem_info.DATARMNET855b934a37);}}rm_err(
+"\x25\x73\x28\x29\x3a\x20\x70\x6f\x6f\x6c\x5f\x73\x69\x7a\x65\x20\x25\x75" "\n",
+__func__,mem_info.DATARMNETe87b937bb6[(0xd2d+202-0xdf7)]);for(i=
+(0xd2d+202-0xdf7);i<POOL_LEN;i++){if(mem_info.DATARMNET855b934a37&
+(0xd26+209-0xdf6)<<i&&mem_info.DATARMNETe87b937bb6[i]!=static_pool_size[i]){
+target_static_pool_size[i]=mem_info.DATARMNETe87b937bb6[i];DATARMNET205e85dea0=
+(0xd26+209-0xdf6);}}if(DATARMNET205e85dea0&&mem_wq)queue_work(mem_wq,&
+pool_adjust_work);DATARMNETa13fcf9070=nlmsg_new(NLMSG_DEFAULT_SIZE,GFP_KERNEL);
+if(!DATARMNETa13fcf9070)return-ENOMEM;DATARMNETe85d734d4f((0xdb7+6677-0x263c),
+DATARMNET54338da2ff);return(0xd2d+202-0xdf7);}

+ 26 - 0
mem/rmnet_mem_priv.h

@@ -0,0 +1,26 @@
+/* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: GPL-2.0-only
+ */
+
+#ifndef DATARMNET64d33b9eb9
+#define DATARMNET64d33b9eb9
+#include <linux/kernel.h>
+#include <linux/netdevice.h>
+#include <linux/module.h>
+#include <linux/mm.h>
+#define IPA_ID (0xd26+209-0xdf6)
+#define RMNET_CORE_ID (0xd1f+216-0xdf5)
+#define POOL_LEN (0xd11+230-0xdf3)
+#define MAX_STATIC_POOL (0xcc7+5761-0x221c)
+#define MAX_POOL_O3 (0xbb7+4453-0x1c3c)
+#define MAX_POOL_O2 (0xbb7+4453-0x1c3c)
+void rmnet_mem_adjust(unsigned perm_size,u8 order);
+#define rm_err(DATARMNET6c3cf5865b, ...)  \
+	do { if ((0xd2d+202-0xdf7)) pr_err(DATARMNET6c3cf5865b, __VA_ARGS__); } while (\
+(0xd2d+202-0xdf7))
+extern int max_pool_size[POOL_LEN];extern int static_pool_size[POOL_LEN];extern 
+int pool_unbound_feature[POOL_LEN];extern int rmnet_mem_order_requests[POOL_LEN]
+;extern int rmnet_mem_id_req[POOL_LEN];extern int rmnet_mem_id_recycled[POOL_LEN
+];extern int target_static_pool_size[POOL_LEN];
+#endif
+