Changeset 91fb6e3 in rtems-libbsd


Ignore:
Timestamp:
Nov 21, 2016, 1:57:57 PM (3 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
5283630d2c9d40deb0183696d278e02644fe4326, bc2ba9a9cdc7381c2a4f2ae6ee303be636f31368
Children:
1e554b81
Parents:
7533adc
git-author:
Sebastian Huber <sebastian.huber@…> (11/21/16 13:57:57)
git-committer:
Sebastian Huber <sebastian.huber@…> (10/20/17 12:59:54)
Message:

rtems-kernel-page: Reclaim pages earlier

File:
1 edited

Legend:

Unmodified
Added
Removed
  • rtemsbsd/rtems/rtems-kernel-page.c

    r7533adc r91fb6e3  
    6262        struct mtx mtx;
    6363        rtems_rbheap_control heap;
    64         size_t used;
     64        size_t free;
     65        uint32_t reclaims;
    6566} page_alloc;
    6667
    6768void *
    68 rtems_bsd_page_alloc(uintptr_t size_in_bytes, int wait)
     69rtems_bsd_page_alloc(uintptr_t size_in_bytes, int flags)
    6970{
    7071        void *addr;
     
    7374
    7475        addr = rtems_rbheap_allocate(&page_alloc.heap, size_in_bytes);
    75         if (addr == NULL && wait) {
     76        if (addr == NULL && ((flags & M_WAITOK) != 0 ||
     77            page_alloc.free < 32)) {
    7678                int i;
    7779
    7880                for (i = 0; i < 8; i++) {
     81                        ++page_alloc.reclaims;
    7982                        mtx_unlock(&page_alloc.mtx);
    8083                        uma_reclaim();
     
    9093                }
    9194
    92                 if (i == 8) {
     95                if (addr == NULL && (flags & M_WAITOK) != 0) {
    9396                        panic("rtems_bsd_page_alloc: page starvation");
    9497                }
    9598        }
    9699
    97         page_alloc.used += (addr != NULL) ? 1 : 0;
     100        page_alloc.free -= (addr != NULL) ? 1 : 0;
    98101        mtx_unlock(&page_alloc.mtx);
    99102
    100103#ifdef INVARIANTS
    101         wait |= M_ZERO;
     104        flags |= M_ZERO;
    102105#endif
    103106
    104         if (addr != NULL && (wait & M_ZERO) != 0) {
     107        if (addr != NULL && (flags & M_ZERO) != 0) {
    105108                memset(addr, 0, size_in_bytes);
    106109        }
     
    114117
    115118        mtx_lock(&page_alloc.mtx);
    116         --page_alloc.used;
     119        ++page_alloc.free;
    117120        rtems_rbheap_free(&page_alloc.heap, addr);
    118121        wakeup(&page_alloc.heap);
     
    131134        uintptr_t heap_size;
    132135
    133         mtx_init(&page_alloc.mtx, "page heap", NULL, MTX_DEF);
     136        mtx_init(&page_alloc.mtx, "page heap", NULL, MTX_RECURSE);
    134137
    135138        heap_size = rtems_bsd_get_allocator_domain_size(
     
    148151
    149152        n = heap_size / PAGE_SIZE;
     153        page_alloc.free = n;
    150154
    151155        chunks = malloc(n * sizeof(*chunks), M_RTEMS_HEAP, M_NOWAIT);
Note: See TracChangeset for help on using the changeset viewer.