Graeme Redman

Solution for memory leaks in MQX 4.1’s PPP_init() and PPP_release()

Discussion created by Graeme Redman on Feb 23, 2016
Latest reply on Feb 24, 2016 by David E Seymour

Note this also occurs in MQX 4.2.0.1

 

I would be grateful if a freescale member could validate the fixes I’ve applied to the rtcs files below.

 

Issue

Our product uses a GPRS modem to send UDP data. When the modem sends us a disconnect we close the connection to the modem and then attempt to re-connect again. Every time the IP connection to the modem was established the software grabbed another 944B. The spare RAM we had could quickly disappear it eventually lost GPRS connectivity.

 

I turned on kernel logging and found 2 memory free calls that failed due to MQX_NOT_RESOURCE_OWNER in the task that makes the PPP connection.

 

Using break points I tracked the memory leak down to the PPP_init() PPP_release() functions.

The following list is the difference in the memory blocks between having never called PPP_init() and calling PPP_init() & PPP_release() twice:

0x20008d50        0x260    608         0x10013

0x20008fd0         0x10       16           0x10013

0x20009000         0x20       32           0x10013

0x20009040         0xd0      208         0x10013

0x20009130         0x260    608         0x10013

0x200093f0         0xd0      208         0x10013

 

Stepping through the PPP_release() function I tracked the MQX_NOT_RESOURCE_OWNER errors down to the following calls (note that the call stack shows a different build to the Memory Block Summary shown above):

nxp1.png

nxp2.png

The above two blocks that couldn’t be freed (twice) are the 208B and 608B blocks. The _mem_free() reckons that the ModemDialupTask (0x10013) doesn’t own the blocks, but the Memory Block Summary clearly states they are owned by 0x10013 and it is currently in that same task!

The 16B and 30B blocks left are simply due to the fact the PPP_release didn’t free up a pointer that was allocated memory in PPP_init().

 

Solution

I could not work out why the _mem_free() kept failing with MQX_NOT_RESOURCE_OWNER as the current task did own the memory block, so I simply forced the memory allocation functions to use system memory instead and added the missing memory free in function PPP_release().

 

Code changes:

In “Freescale_MQX_4_1\rtcs\source\include\ppphdlc.h” I changed:

#define PPPHDLC_memalloc _mem_alloc_zero

to be

#define PPPHDLC_memalloc _mem_alloc_system_zero

 

In “\Freescale_MQX_4_1\rtcs\source\ppp\ppp.c” function PPP_init() I changed:

ppp_ptr = _mem_alloc_zero(sizeof(PPP_CFG));

to be

ppp_ptr = _mem_alloc_system_zero(sizeof(PPP_CFG));

and

ppp_ptr->DEVICE_NAME = _mem_alloc_zero(strlen(params->device)+1);

to be

ppp_ptr->DEVICE_NAME = _mem_alloc_system_zero(strlen(params->device)+1);

 

In “\Freescale_MQX_4_1\rtcs\source\ppp\ppp.c” function PPP_release() I added the following line just before “PPP_memfree(handle);”:

PPP_memfree(ppp_ptr->DEVICE_NAME);

 

These changes cured the memory leaks, but is changing private memory to system memory ok?

Outcomes