| 823 | volatile static rt_ubase_t _last_alloc; |
| 824 | |
| 825 | rt_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 | |
| 875 | rt_inline int _get_balanced_id(rt_uint32_t size_bits) |
| 876 | { |
no test coverage detected