mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 09:41:54 +00:00
Merge commit '707cad61' into thread-next
This commit is contained in:
commit
93621ed9f4
@ -1508,11 +1508,12 @@ This argument can be omitted if there exists only a single instance.
|
||||
Control protocol debugging.
|
||||
|
||||
<tag><label id="cli-dump">dump resources|sockets|interfaces|neighbors|attributes|routes|protocols "<m/file/"</tag>
|
||||
Truncates the given file and dumps contents of internal data structures
|
||||
there. By sending SIGUSR1, you get all of these concatenated to
|
||||
<cf/bird.dump/ in the current directory. The file is only readable for
|
||||
the user running the daemon. The format of dump files is internal and
|
||||
could change in the future.
|
||||
Creates the given file (it must not exist) and dumps contents of
|
||||
internal data structures there. By sending SIGUSR1, you get all of
|
||||
these concatenated to <cf/bird.dump/ in the current directory.
|
||||
The file is only readable for the user running the daemon.
|
||||
The format of dump files is internal and could change in the future
|
||||
without any notice.
|
||||
|
||||
<tag><label id="cli-echo">echo all|off|{ <m/list of log classes/ } [ <m/buffer-size/ ]</tag>
|
||||
Control echoing of log messages to the command-line output.
|
||||
|
@ -153,6 +153,7 @@ extern _Atomic int pages_kept;
|
||||
extern _Atomic int pages_kept_locally;
|
||||
extern _Atomic int pages_kept_cold;
|
||||
extern _Atomic int pages_kept_cold_index;
|
||||
extern _Atomic int pages_total;
|
||||
void *alloc_page(void);
|
||||
void free_page(void *);
|
||||
void flush_local_pages(void);
|
||||
|
25
nest/cmds.c
25
nest/cmds.c
@ -123,18 +123,29 @@ cmd_show_memory(void)
|
||||
print_size("Current config:", rmemsize(config_pool));
|
||||
struct resmem total = rmemsize(&root_pool);
|
||||
#ifdef HAVE_MMAP
|
||||
int pk = atomic_load_explicit(&pages_kept, memory_order_relaxed)
|
||||
+ atomic_load_explicit(&pages_kept_locally, memory_order_relaxed)
|
||||
+ atomic_load_explicit(&pages_kept_cold_index, memory_order_relaxed);
|
||||
print_size("Standby memory:", (struct resmem) { .overhead = page_size * pk });
|
||||
total.overhead += page_size * pk;
|
||||
uint hot_pages = atomic_load_explicit(&pages_kept, memory_order_relaxed)
|
||||
+ atomic_load_explicit(&pages_kept_locally, memory_order_relaxed);
|
||||
uint cold_pages_index = atomic_load_explicit(&pages_kept_cold_index, memory_order_relaxed);
|
||||
print_size("Standby memory:", (struct resmem) { .overhead = page_size * (hot_pages + cold_pages_index) });
|
||||
total.overhead += page_size * (hot_pages + cold_pages_index);
|
||||
#endif
|
||||
|
||||
print_size("Total:", total);
|
||||
cli_msg(-1018, "");
|
||||
|
||||
#ifdef HAVE_MMAP
|
||||
struct size_args cold = get_size_args(atomic_load_explicit(&pages_kept_cold, memory_order_relaxed) * page_size);
|
||||
cli_msg(-1018, "%-23s " SIZE_FORMAT, "Cold memory:", SIZE_ARGS(cold));
|
||||
uint cold_pages = atomic_load_explicit(&pages_kept_cold, memory_order_relaxed);
|
||||
uint pages_total_loc = atomic_load_explicit(&pages_total, memory_order_relaxed);
|
||||
uint pages_active = pages_total_loc - hot_pages - cold_pages_index - cold_pages;
|
||||
|
||||
struct size_args active = get_size_args(page_size * pages_active);
|
||||
struct size_args kept = get_size_args(page_size * (hot_pages + cold_pages_index));
|
||||
struct size_args cold = get_size_args(page_size * cold_pages);
|
||||
|
||||
cli_msg(-1018, "%-17s " SIZE_FORMAT, "Active pages:", SIZE_ARGS(active));
|
||||
cli_msg(-1018, "%-17s " SIZE_FORMAT, "Kept free pages:", SIZE_ARGS(kept));
|
||||
cli_msg(-1018, "%-17s " SIZE_FORMAT, "Cold free pages:", SIZE_ARGS(cold));
|
||||
|
||||
#endif
|
||||
cli_msg(0, "");
|
||||
}
|
||||
|
@ -126,6 +126,7 @@ long page_size = 0;
|
||||
static struct empty_pages *empty_pages = NULL;
|
||||
_Atomic int pages_kept_cold = 0;
|
||||
_Atomic int pages_kept_cold_index = 0;
|
||||
_Atomic int pages_total = 0;
|
||||
|
||||
static struct free_page * _Atomic page_stack = NULL;
|
||||
static _Thread_local struct free_page * local_page_stack = NULL;
|
||||
@ -155,6 +156,7 @@ long page_size = 0;
|
||||
if (ptr == MAP_FAILED)
|
||||
die("mmap(%ld) failed: %m", (s64) page_size);
|
||||
|
||||
atomic_fetch_add_explicit(&pages_total, ALLOC_PAGES_AT_ONCE, memory_order_acq_rel);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
@ -173,6 +175,7 @@ alloc_page(void)
|
||||
/* If the system page allocator is goofy, we use posix_memalign to get aligned blocks of memory. */
|
||||
if (use_fake)
|
||||
{
|
||||
atomic_fetch_add_explicit(&pages_total, 1, memory_order_acq_rel);
|
||||
void *ptr = NULL;
|
||||
int err = posix_memalign(&ptr, page_size, page_size);
|
||||
|
||||
@ -271,6 +274,7 @@ free_page(void *ptr)
|
||||
/* If the system page allocator is goofy, we just free the block and care no more. */
|
||||
if (use_fake)
|
||||
{
|
||||
atomic_fetch_sub_explicit(&pages_total, 1, memory_order_acq_rel);
|
||||
free(ptr);
|
||||
return;
|
||||
}
|
||||
@ -452,6 +456,7 @@ page_dump(struct dump_request *dreq)
|
||||
RDUMP(" %p\n", ep->pages[i]);
|
||||
}
|
||||
UNLOCK_DOMAIN(resource, empty_pages_domain);
|
||||
RDUMP("This request: %p\n", dreq);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -373,7 +373,7 @@ void
|
||||
dump_to_file_run(struct dump_request *dr, const char *file, const char *what, void (*dump)(struct dump_request *))
|
||||
{
|
||||
struct dump_request_file *req = SKIP_BACK(struct dump_request_file, dr, dr);
|
||||
req->fd = open(file, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR);
|
||||
req->fd = open(file, O_CREAT | O_WRONLY | O_EXCL, S_IRUSR);
|
||||
|
||||
if (req->fd < 0)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user