Forráskód Böngészése

Merge 4ecb61909f3633640417d441f2995d1d9839f18e on remote branch

Change-Id: I91105836dc3b4b63597b7f0e35cfd9afb4835859
Linux Build Service Account 2 éve
szülő
commit
4e33655073

+ 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_SHS_DLKM_BOARD_PLATFORMS_LIST := pineapple
 	DATA_APS_DLKM_BOARD_PLATFORMS_LIST := pineapple
 	DATA_APS_DLKM_BOARD_PLATFORMS_LIST := pineapple
 	DATA_WLAN_DLKM_BOARD_PLATFORMS_LIST := pineapple
 	DATA_WLAN_DLKM_BOARD_PLATFORMS_LIST := pineapple
+	DATA_MEM_DLKM_BOARD_PLATFORMS_LIST := pineapple
 
 
 	ifneq ($(TARGET_BOARD_AUTO),true)
 	ifneq ($(TARGET_BOARD_AUTO),true)
 		ifeq ($(call is-board-platform-in-list,$(DATA_OFFLOAD_DLKM_BOARD_PLATFORMS_LIST)),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_perf.ko
 			BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_wlan.ko
 			BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_wlan.ko
 		endif
 		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)
 		ifeq ($(call is-board-platform-in-list,$(DATA_SHS_DLKM_BOARD_PLATFORMS_LIST)),true)
 			BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_shs.ko
 			BOARD_VENDOR_KERNEL_MODULES += $(KERNEL_MODULES_OUT)/rmnet_shs.ko
 		endif
 		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_perf.ko
 PRODUCT_PACKAGES += rmnet_aps.ko
 PRODUCT_PACKAGES += rmnet_aps.ko
 PRODUCT_PACKAGES += rmnet_sch.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
+

+ 2 - 1
perf/rmnet_perf_main.c

@@ -19,6 +19,7 @@
 #include "rmnet_perf_tcp.h"
 #include "rmnet_perf_tcp.h"
 #include "rmnet_perf_udp.h"
 #include "rmnet_perf_udp.h"
 MODULE_LICENSE("\x47\x50\x4c\x20\x76\x32");static char*verinfo[]={
 MODULE_LICENSE("\x47\x50\x4c\x20\x76\x32");static char*verinfo[]={
+"\x63\x63\x39\x38\x66\x30\x38\x61","\x63\x65\x37\x39\x33\x32\x31\x63",
 "\x35\x64\x63\x64\x64\x34\x63\x30","\x34\x63\x39\x62\x35\x33\x33\x37",
 "\x35\x64\x63\x64\x64\x34\x63\x30","\x34\x63\x39\x62\x35\x33\x33\x37",
 "\x61\x33\x62\x61\x62\x64\x34\x30","\x37\x66\x30\x37\x38\x66\x39\x36",
 "\x61\x33\x62\x61\x62\x64\x34\x30","\x37\x66\x30\x37\x38\x66\x39\x36",
 "\x65\x35\x36\x63\x62\x35\x35\x64","\x65\x32\x31\x38\x66\x34\x35\x31",
 "\x65\x35\x36\x63\x62\x35\x35\x64","\x65\x32\x31\x38\x66\x34\x35\x31",
@@ -27,7 +28,7 @@ MODULE_LICENSE("\x47\x50\x4c\x20\x76\x32");static char*verinfo[]={
 module_param_array(verinfo,charp,NULL,(0xcb7+5769-0x221c));MODULE_PARM_DESC(
 module_param_array(verinfo,charp,NULL,(0xcb7+5769-0x221c));MODULE_PARM_DESC(
 verinfo,
 verinfo,
 "\x56\x65\x72\x73\x69\x6f\x6e\x20\x6f\x66\x20\x74\x68\x65\x20\x64\x72\x69\x76\x65\x72"
 "\x56\x65\x72\x73\x69\x6f\x6e\x20\x6f\x66\x20\x74\x68\x65\x20\x64\x72\x69\x76\x65\x72"
-);static bool DATARMNETc03b668e4c=true;module_param_named(rmnet_perf_knob0,
+);bool DATARMNETc03b668e4c=true;module_param_named(rmnet_perf_knob0,
 DATARMNETc03b668e4c,bool,(0xdb7+6665-0x261c));static bool DATARMNET21c7a3c377=
 DATARMNETc03b668e4c,bool,(0xdb7+6665-0x261c));static bool DATARMNET21c7a3c377=
 true;module_param_named(rmnet_perf_knob1,DATARMNET21c7a3c377,bool,
 true;module_param_named(rmnet_perf_knob1,DATARMNET21c7a3c377,bool,
 (0xdb7+6665-0x261c));extern void(*rmnet_perf_egress_hook1)(struct sk_buff*
 (0xdb7+6665-0x261c));extern void(*rmnet_perf_egress_hook1)(struct sk_buff*

+ 47 - 36
perf/rmnet_perf_tcp.c

@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0-only
 // SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2023,Qualcomm Innovation Center, Inc. All rights reserved.
+/* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  *
  * RMNET PERF TCP framework
  * RMNET PERF TCP framework
  *
  *
@@ -144,31 +144,39 @@ DATARMNET668416551c=tcp_hdr(DATARMNET543491eb0f);return DATARMNET543491eb0f->len
 DATARMNET63b1a086d5,struct sk_buff*DATARMNET543491eb0f,bool DATARMNETd147c14c0e)
 DATARMNET63b1a086d5,struct sk_buff*DATARMNET543491eb0f,bool DATARMNETd147c14c0e)
 __must_hold(RCU){struct rmnet_skb_cb*DATARMNET1ec4882bf7=RMNET_SKB_CB(
 __must_hold(RCU){struct rmnet_skb_cb*DATARMNET1ec4882bf7=RMNET_SKB_CB(
 DATARMNET543491eb0f);struct tcphdr*DATARMNET668416551c=tcp_hdr(
 DATARMNET543491eb0f);struct tcphdr*DATARMNET668416551c=tcp_hdr(
-DATARMNET543491eb0f);u32 DATARMNETb1b0ee1b2d=ntohl(DATARMNET668416551c->ack_seq)
-;u32 DATARMNETb6ff6d25f8=READ_ONCE(DATARMNET63b1a086d5->DATARMNETfef3675ce7);u32
- DATARMNET91c1d5c029=READ_ONCE(DATARMNET63b1a086d5->DATARMNET9076d335ab);u32 
-DATARMNET9445bc443c=READ_ONCE(DATARMNET63b1a086d5->DATARMNET9a57846b4e);
-DATARMNET63b1a086d5->DATARMNET763f2e5fac=jiffies;if(DATARMNET63b1a086d5->
-DATARMNET55056146f6){DATARMNET1ec4882bf7->tethered=true;return;}if(
-DATARMNETd147c14c0e){if(after(DATARMNETb1b0ee1b2d,DATARMNET91c1d5c029)){u32 
-DATARMNET4e557c82d6=DATARMNETb6ff6d25f8-DATARMNETb1b0ee1b2d;if(
-DATARMNET4e557c82d6>DATARMNET9445bc443c)DATARMNET31a7673e56(DATARMNET63b1a086d5,
-DATARMNET543491eb0f);WRITE_ONCE(DATARMNET63b1a086d5->DATARMNET9076d335ab,
-DATARMNETb1b0ee1b2d);}}}void DATARMNET9250714999(struct sk_buff*
-DATARMNET543491eb0f){struct DATARMNET4b40fe9cd4 DATARMNET3396919a68={};struct 
-DATARMNETddbc1e5435*DATARMNET63b1a086d5;struct tcphdr*DATARMNET668416551c;u32 
-DATARMNETd660a1a629;if(!skb_transport_header_was_set(DATARMNET543491eb0f)||
-DATARMNET543491eb0f->ip_summed==CHECKSUM_NONE)return;DATARMNET668416551c=tcp_hdr
-(DATARMNET543491eb0f);if(DATARMNET668416551c->syn)return;DATARMNETd660a1a629=
-DATARMNET62fb576113(DATARMNET543491eb0f);if(!DATARMNETd660a1a629&&
-DATARMNET668416551c->ack)return;DATARMNET3396919a68.DATARMNET08e913477e=
-DATARMNET668416551c->source;DATARMNET3396919a68.DATARMNETda7f7fa492=
-DATARMNET668416551c->dest;if(DATARMNET543491eb0f->protocol==htons(ETH_P_IP)){
-struct iphdr*DATARMNET86f1f2cdc9=ip_hdr(DATARMNET543491eb0f);DATARMNET3396919a68
-.DATARMNETdfe430c2d6=DATARMNET86f1f2cdc9->saddr;DATARMNET3396919a68.
-DATARMNET2cb607d686=DATARMNET86f1f2cdc9->daddr;DATARMNET3396919a68.
-DATARMNET0d956cc77a=(0xd11+230-0xdf3);}else{struct ipv6hdr*DATARMNETbf55123e5b=
-ipv6_hdr(DATARMNET543491eb0f);memcpy(&DATARMNET3396919a68.DATARMNET815cbb4bf5,&
+DATARMNET543491eb0f);u32 DATARMNET26945497d8=ntohl(DATARMNET668416551c->seq);u32
+ DATARMNETb1b0ee1b2d=ntohl(DATARMNET668416551c->ack_seq);u32 DATARMNETb6ff6d25f8
+=READ_ONCE(DATARMNET63b1a086d5->DATARMNETfef3675ce7);u32 DATARMNET91c1d5c029=
+READ_ONCE(DATARMNET63b1a086d5->DATARMNET9076d335ab);u32 DATARMNET9445bc443c=
+READ_ONCE(DATARMNET63b1a086d5->DATARMNET9a57846b4e);DATARMNET63b1a086d5->
+DATARMNET763f2e5fac=jiffies;if(DATARMNET63b1a086d5->DATARMNET55056146f6){
+DATARMNET1ec4882bf7->tethered=true;return;}if(DATARMNETd147c14c0e){if(after(
+DATARMNETb1b0ee1b2d,DATARMNET91c1d5c029)){u32 DATARMNET4e557c82d6=
+DATARMNETb6ff6d25f8-DATARMNETb1b0ee1b2d;if(DATARMNET4e557c82d6>
+DATARMNET9445bc443c)DATARMNET31a7673e56(DATARMNET63b1a086d5,DATARMNET543491eb0f)
+;WRITE_ONCE(DATARMNET63b1a086d5->DATARMNET9076d335ab,DATARMNETb1b0ee1b2d);}}else
+{u32 DATARMNET4e557c82d6=DATARMNETb6ff6d25f8-DATARMNET91c1d5c029;if(after(
+DATARMNET26945497d8,DATARMNETb6ff6d25f8)){DATARMNET4e557c82d6=
+DATARMNET26945497d8-DATARMNET91c1d5c029;DATARMNET4e557c82d6+=DATARMNET62fb576113
+(DATARMNET543491eb0f);WRITE_ONCE(DATARMNET63b1a086d5->DATARMNETfef3675ce7,
+DATARMNET26945497d8);}DATARMNET1ec4882bf7->bif=DATARMNET4e557c82d6;
+DATARMNET1ec4882bf7->ack_thresh=DATARMNET9445bc443c;DATARMNET1ec4882bf7->
+ack_forced=DATARMNET63b1a086d5->DATARMNETb8fc35ed64;}}void DATARMNET9250714999(
+struct sk_buff*DATARMNET543491eb0f){struct DATARMNET4b40fe9cd4 
+DATARMNET3396919a68={};struct DATARMNETddbc1e5435*DATARMNET63b1a086d5;struct 
+tcphdr*DATARMNET668416551c;u32 DATARMNETd660a1a629;if(!
+skb_transport_header_was_set(DATARMNET543491eb0f)||DATARMNET543491eb0f->
+ip_summed==CHECKSUM_NONE)return;DATARMNET668416551c=tcp_hdr(DATARMNET543491eb0f)
+;if(DATARMNET668416551c->syn)return;DATARMNETd660a1a629=DATARMNET62fb576113(
+DATARMNET543491eb0f);if(!DATARMNETd660a1a629&&DATARMNET668416551c->ack)return;
+DATARMNET3396919a68.DATARMNET08e913477e=DATARMNET668416551c->source;
+DATARMNET3396919a68.DATARMNETda7f7fa492=DATARMNET668416551c->dest;if(
+DATARMNET543491eb0f->protocol==htons(ETH_P_IP)){struct iphdr*DATARMNET86f1f2cdc9
+=ip_hdr(DATARMNET543491eb0f);DATARMNET3396919a68.DATARMNETdfe430c2d6=
+DATARMNET86f1f2cdc9->saddr;DATARMNET3396919a68.DATARMNET2cb607d686=
+DATARMNET86f1f2cdc9->daddr;DATARMNET3396919a68.DATARMNET0d956cc77a=
+(0xd11+230-0xdf3);}else{struct ipv6hdr*DATARMNETbf55123e5b=ipv6_hdr(
+DATARMNET543491eb0f);memcpy(&DATARMNET3396919a68.DATARMNET815cbb4bf5,&
 DATARMNETbf55123e5b->saddr,sizeof(DATARMNETbf55123e5b->saddr));memcpy(&
 DATARMNETbf55123e5b->saddr,sizeof(DATARMNETbf55123e5b->saddr));memcpy(&
 DATARMNET3396919a68.DATARMNETc3f31215b7,&DATARMNETbf55123e5b->daddr,sizeof(
 DATARMNET3396919a68.DATARMNETc3f31215b7,&DATARMNETbf55123e5b->daddr,sizeof(
 DATARMNETbf55123e5b->daddr));DATARMNET3396919a68.DATARMNET0d956cc77a=
 DATARMNETbf55123e5b->daddr));DATARMNET3396919a68.DATARMNET0d956cc77a=
@@ -199,13 +207,16 @@ DATARMNET63b1a086d5){if(likely(!DATARMNETd92eab34a9(DATARMNET63b1a086d5,jiffies)
 ))DATARMNET55fda9e01e(DATARMNET63b1a086d5,DATARMNET543491eb0f,true);}
 ))DATARMNET55fda9e01e(DATARMNET63b1a086d5,DATARMNET543491eb0f,true);}
 rcu_read_unlock();}void DATARMNET7fa1835595(u32 DATARMNET556bcfcf8f,u32 
 rcu_read_unlock();}void DATARMNET7fa1835595(u32 DATARMNET556bcfcf8f,u32 
 DATARMNET9445bc443c){struct DATARMNETddbc1e5435*DATARMNET63b1a086d5;int 
 DATARMNET9445bc443c){struct DATARMNETddbc1e5435*DATARMNET63b1a086d5;int 
-DATARMNET5c2fd31d7b;rcu_read_lock();hash_for_each_rcu(DATARMNET1fd012f255,
-DATARMNET5c2fd31d7b,DATARMNET63b1a086d5,hash){if(DATARMNET63b1a086d5->
-DATARMNET9c389f3b86==DATARMNET556bcfcf8f)WRITE_ONCE(DATARMNET63b1a086d5->
-DATARMNET9a57846b4e,DATARMNET9445bc443c);}rcu_read_unlock();}int 
-DATARMNET7e9995246e(void){INIT_DELAYED_WORK(&DATARMNETac6535da80.
-DATARMNET190b4452e8,DATARMNETfec9085d8e);return(0xd2d+202-0xdf7);}void 
-DATARMNET38bb6f2b7a(void){cancel_delayed_work_sync(&DATARMNETac6535da80.
-DATARMNET190b4452e8);DATARMNETac6535da80.DATARMNETcd94e0d3c7=true;
-schedule_delayed_work(&DATARMNETac6535da80.DATARMNET190b4452e8,(0xd2d+202-0xdf7)
-);cancel_delayed_work_sync(&DATARMNETac6535da80.DATARMNET190b4452e8);}
+DATARMNET5c2fd31d7b;if(DATARMNET556bcfcf8f==(0xd2d+202-0xdf7)){if(
+DATARMNET9445bc443c==(0xd2d+202-0xdf7)){DATARMNETc03b668e4c=false;}else if(
+DATARMNET9445bc443c==(0xd26+209-0xdf6)){DATARMNETc03b668e4c=true;}return;}
+rcu_read_lock();hash_for_each_rcu(DATARMNET1fd012f255,DATARMNET5c2fd31d7b,
+DATARMNET63b1a086d5,hash){if(DATARMNET63b1a086d5->DATARMNET9c389f3b86==
+DATARMNET556bcfcf8f)WRITE_ONCE(DATARMNET63b1a086d5->DATARMNET9a57846b4e,
+DATARMNET9445bc443c);}rcu_read_unlock();}int DATARMNET7e9995246e(void){
+INIT_DELAYED_WORK(&DATARMNETac6535da80.DATARMNET190b4452e8,DATARMNETfec9085d8e);
+return(0xd2d+202-0xdf7);}void DATARMNET38bb6f2b7a(void){cancel_delayed_work_sync
+(&DATARMNETac6535da80.DATARMNET190b4452e8);DATARMNETac6535da80.
+DATARMNETcd94e0d3c7=true;schedule_delayed_work(&DATARMNETac6535da80.
+DATARMNET190b4452e8,(0xd2d+202-0xdf7));cancel_delayed_work_sync(&
+DATARMNETac6535da80.DATARMNET190b4452e8);}

+ 4 - 4
perf/rmnet_perf_tcp.h

@@ -8,9 +8,9 @@
 #ifndef DATARMNET3a73abbc73
 #ifndef DATARMNET3a73abbc73
 #define DATARMNET3a73abbc73
 #define DATARMNET3a73abbc73
 #include <linux/skbuff.h>
 #include <linux/skbuff.h>
-void DATARMNET9250714999(struct sk_buff*DATARMNET543491eb0f);void 
-DATARMNET9d574e64b1(struct sk_buff*DATARMNET543491eb0f);void DATARMNET7fa1835595
-(u32 hash,u32 DATARMNET9445bc443c);int DATARMNET7e9995246e(void);void 
-DATARMNET38bb6f2b7a(void);
+extern bool DATARMNETc03b668e4c;void DATARMNET9250714999(struct sk_buff*
+DATARMNET543491eb0f);void DATARMNET9d574e64b1(struct sk_buff*DATARMNET543491eb0f
+);void DATARMNET7fa1835595(u32 hash,u32 DATARMNET9445bc443c);int 
+DATARMNET7e9995246e(void);void DATARMNET38bb6f2b7a(void);
 #endif
 #endif