mirror of
https://github.com/apache/nuttx.git
synced 2026-05-30 05:16:47 +08:00
mm: add memory pressure notification support
Add mm_heap_free interface to pass remaining memory to memory pressure Signed-off-by: yinshengkai <yinshengkai@xiaomi.com>
This commit is contained in:
@@ -611,6 +611,18 @@ void up_allocate_heap(void **heap_start, size_t *heap_size)
|
|||||||
*heap_size = 0;
|
*heap_size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: mm_heapfree
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Return the total free size (in bytes) in the heap
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
size_t mm_heapfree(struct mm_heap_s *heap)
|
||||||
|
{
|
||||||
|
return SIZE_MAX;
|
||||||
|
}
|
||||||
#else /* CONFIG_MM_CUSTOMIZE_MANAGER */
|
#else /* CONFIG_MM_CUSTOMIZE_MANAGER */
|
||||||
|
|
||||||
void up_allocate_heap(void **heap_start, size_t *heap_size)
|
void up_allocate_heap(void **heap_start, size_t *heap_size)
|
||||||
|
|||||||
@@ -159,19 +159,25 @@ static ssize_t pressure_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
{
|
{
|
||||||
char buf[128];
|
char buf[128];
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
size_t remain;
|
||||||
|
off_t offset;
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
|
|
||||||
flags = spin_lock_irqsave(&g_pressure_lock);
|
flags = spin_lock_irqsave(&g_pressure_lock);
|
||||||
ret = procfs_snprintf(buf, sizeof(buf), "remaining %zu\n",
|
remain = g_remaining;
|
||||||
g_remaining);
|
|
||||||
spin_unlock_irqrestore(&g_pressure_lock, flags);
|
spin_unlock_irqrestore(&g_pressure_lock, flags);
|
||||||
|
|
||||||
|
ret = procfs_snprintf(buf, sizeof(buf), "remaining %zu\n", remain);
|
||||||
|
|
||||||
if (ret > buflen)
|
if (ret > buflen)
|
||||||
{
|
{
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(buffer, buf, ret);
|
offset = filep->f_pos;
|
||||||
|
ret = procfs_memcpy(buf, ret, buffer, buflen, &offset);
|
||||||
|
|
||||||
|
filep->f_pos += ret;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -389,6 +389,8 @@ struct mallinfo mm_mallinfo(FAR struct mm_heap_s *heap);
|
|||||||
struct mallinfo_task mm_mallinfo_task(FAR struct mm_heap_s *heap,
|
struct mallinfo_task mm_mallinfo_task(FAR struct mm_heap_s *heap,
|
||||||
FAR const struct malltask *task);
|
FAR const struct malltask *task);
|
||||||
|
|
||||||
|
size_t mm_heapfree(FAR struct mm_heap_s *heap);
|
||||||
|
|
||||||
/* Functions contained in kmm_mallinfo.c ************************************/
|
/* Functions contained in kmm_mallinfo.c ************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_MM_KERNEL_HEAP
|
#ifdef CONFIG_MM_KERNEL_HEAP
|
||||||
|
|||||||
@@ -187,3 +187,16 @@ struct mallinfo_task mm_mallinfo_task(FAR struct mm_heap_s *heap,
|
|||||||
|
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: mm_heapfree
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Return the total free size (in bytes) in the heap
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
size_t mm_heapfree(FAR struct mm_heap_s *heap)
|
||||||
|
{
|
||||||
|
return heap->mm_heapsize - heap->mm_curused;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1463,3 +1463,16 @@ void mm_free_delaylist(FAR struct mm_heap_s *heap)
|
|||||||
free_delaylist(heap, true);
|
free_delaylist(heap, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: mm_heapfree
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Return the total free size (in bytes) in the heap
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
size_t mm_heapfree(FAR struct mm_heap_s *heap)
|
||||||
|
{
|
||||||
|
return heap->mm_heapsize - heap->mm_curused;
|
||||||
|
}
|
||||||
|
|||||||
@@ -70,6 +70,17 @@ FAR void *calloc(size_t n, size_t elem_size)
|
|||||||
#else
|
#else
|
||||||
/* Use mm_calloc() because it implements the clear */
|
/* Use mm_calloc() because it implements the clear */
|
||||||
|
|
||||||
return mm_calloc(USR_HEAP, n, elem_size);
|
FAR void *mem = mm_calloc(USR_HEAP, n, elem_size);
|
||||||
|
|
||||||
|
if (mem == NULL)
|
||||||
|
{
|
||||||
|
set_errno(ENOMEM);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mm_notify_pressure(mm_heapfree(USR_HEAP));
|
||||||
|
}
|
||||||
|
|
||||||
|
return mem;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,6 +66,10 @@ FAR void *malloc(size_t size)
|
|||||||
{
|
{
|
||||||
set_errno(ENOMEM);
|
set_errno(ENOMEM);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mm_notify_pressure(mm_heapfree(USR_HEAP));
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -93,6 +93,10 @@ FAR void *memalign(size_t alignment, size_t size)
|
|||||||
{
|
{
|
||||||
set_errno(ENOMEM);
|
set_errno(ENOMEM);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mm_notify_pressure(mm_heapfree(USR_HEAP));
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -95,6 +95,10 @@ FAR void *realloc(FAR void *oldmem, size_t size)
|
|||||||
{
|
{
|
||||||
set_errno(ENOMEM);
|
set_errno(ENOMEM);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mm_notify_pressure(mm_heapfree(USR_HEAP));
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -72,6 +72,10 @@ FAR void *zalloc(size_t size)
|
|||||||
{
|
{
|
||||||
set_errno(ENOMEM);
|
set_errno(ENOMEM);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mm_notify_pressure(mm_heapfree(USR_HEAP));
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user