MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / _do_pages_alloc

Function _do_pages_alloc

components/mm/mm_page.c:825–873  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

823volatile static rt_ubase_t _last_alloc;
824
825rt_inline void *_do_pages_alloc(rt_uint32_t size_bits, size_t flags, int affid)
826{
827 void *alloc_buf = RT_NULL;
828 struct rt_page *p;
829 rt_base_t level;
830 pgls_agr_t *page_list = _flag_to_page_list(flags);
831
832 level = rt_spin_lock_irqsave(&_pgmgr_lock);
833 p = pages_alloc_handler(page_list, size_bits, affid);
834 if (p)
835 {
836 _freed_nr -= 1 << size_bits;
837 }
838 rt_spin_unlock_irqrestore(&_pgmgr_lock, level);
839
840 if (!p && page_list != page_list_low)
841 {
842 /* fall back */
843 page_list = page_list_low;
844
845 level = rt_spin_lock_irqsave(&_pgmgr_lock);
846 p = pages_alloc_handler(page_list, size_bits, affid);
847 if (p)
848 {
849 _freed_nr -= 1 << size_bits;
850 _freed_nr_hi -= 1 << size_bits;
851 }
852 rt_spin_unlock_irqrestore(&_pgmgr_lock, level);
853 }
854
855 if (p)
856 {
857 alloc_buf = page_to_addr(p);
858 _last_alloc = (rt_ubase_t)alloc_buf;
859
860 #ifdef RT_DEBUGGING_PAGE_LEAK
861 level = rt_spin_lock_irqsave(&_spinlock);
862 TRACE_ALLOC(p, size_bits);
863 rt_spin_unlock_irqrestore(&_spinlock, level);
864 #endif
865
866#ifdef RT_DEBUGGING_PAGE_POISON
867 _unpoisoned_pages(alloc_buf, size_bits);
868#endif /* RT_DEBUGGING_PAGE_POISON */
869
870 }
871
872 return alloc_buf;
873}
874
875rt_inline int _get_balanced_id(rt_uint32_t size_bits)
876{

Callers 2

_do_pages_alloc_noaffFunction · 0.85
rt_pages_alloc_taggedFunction · 0.85

Calls 5

_flag_to_page_listFunction · 0.85
page_to_addrFunction · 0.85
_unpoisoned_pagesFunction · 0.85
rt_spin_lock_irqsaveFunction · 0.50

Tested by

no test coverage detected