mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 11:26:12 +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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,9 +222,9 @@ static ssize_t pressure_write(FAR struct file *filep, FAR const char *buffer,
|
|||||||
|
|
||||||
/* We should trigger the first event immediately */
|
/* We should trigger the first event immediately */
|
||||||
|
|
||||||
priv->lasttick = CLOCK_MAX;
|
priv->lasttick = CLOCK_MAX;
|
||||||
priv->threshold = threshold;
|
priv->threshold = threshold;
|
||||||
priv->interval = interval;
|
priv->interval = interval;
|
||||||
spin_unlock_irqrestore(&g_pressure_lock, flags);
|
spin_unlock_irqrestore(&g_pressure_lock, flags);
|
||||||
return buflen;
|
return buflen;
|
||||||
}
|
}
|
||||||
@@ -365,7 +371,7 @@ static int pressure_rewinddir(FAR struct fs_dirent_s *dir)
|
|||||||
FAR struct procfs_dir_priv_s *level;
|
FAR struct procfs_dir_priv_s *level;
|
||||||
|
|
||||||
DEBUGASSERT(dir);
|
DEBUGASSERT(dir);
|
||||||
level = (FAR struct procfs_dir_priv_s *)dir;
|
level = (FAR struct procfs_dir_priv_s *)dir;
|
||||||
level->index = 0;
|
level->index = 0;
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
@@ -411,7 +417,7 @@ void mm_notify_pressure(size_t remaining)
|
|||||||
FAR dq_entry_t *tmp;
|
FAR dq_entry_t *tmp;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
|
||||||
flags = spin_lock_irqsave(&g_pressure_lock);
|
flags = spin_lock_irqsave(&g_pressure_lock);
|
||||||
g_remaining = remaining;
|
g_remaining = remaining;
|
||||||
dq_for_every_safe(&g_pressure_memory_queue, entry, tmp)
|
dq_for_every_safe(&g_pressure_memory_queue, entry, tmp)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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