]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Stored pages release routine
authorMaria Matejka <mq@jmq.cz>
Tue, 23 Nov 2021 11:13:11 +0000 (11:13 +0000)
committerMaria Matejka <mq@jmq.cz>
Tue, 23 Nov 2021 11:13:11 +0000 (11:13 +0000)
sysdep/unix/alloc.c
sysdep/unix/io.c

index 4ae1a9db7272ff62e131445735f4047f158c62f4..61360e73e8b86288f2c8638a78eadd590105f73d 100644 (file)
@@ -135,3 +135,32 @@ free_sys_page(void *ptr)
 #endif
     free(ptr);
 }
+
+void
+check_stored_pages(void)
+{
+#ifdef ENOMEM
+  if (atomic_load_explicit(&global_page_list_not_empty, memory_order_relaxed) == 0)
+    return;
+
+  for (uint limit = 0; limit < 256; limit++)
+  {
+    GLOBAL_PAGE_SPIN_LOCK;
+    void *ptr = HEAD(global_page_list);
+    if (!NODE_VALID(ptr))
+    {
+      atomic_store_explicit(&global_page_list_not_empty, 0, memory_order_relaxed);
+      GLOBAL_PAGE_SPIN_UNLOCK;
+      return;
+    }
+
+    rem_node(ptr);
+    if (munmap(ptr, page_size) < 0)
+      if (errno == ENOMEM)
+       add_tail(&global_page_list, ptr);
+      else
+       bug("munmap(%p) failed: %m", ptr);
+    GLOBAL_PAGE_SPIN_UNLOCK;
+  }
+#endif
+}
index dd385c80266ebb77159236c65633c5be63c1ec86..91d717d011f510174818d8eeb794cc3f44b1a1e2 100644 (file)
@@ -2193,6 +2193,7 @@ static int short_loops = 0;
 #define WORK_EVENTS_MAX 10
 
 void pipe_drain(int fd);
+void check_stored_pages(void);
 
 void
 io_loop(void)
@@ -2215,6 +2216,9 @@ io_loop(void)
       timers_fire(&main_birdloop.time, 1);
       io_close_event();
 
+      /* Try to release some memory if possible */
+      check_stored_pages();
+
       // FIXME
       poll_tout = (events ? 0 : 3000); /* Time in milliseconds */
       if (t = timers_first(&main_birdloop.time))