Commit 0d222473 authored by Mitchell Horne's avatar Mitchell Horne
Browse files

Implement GET_STACK_USAGE on remaining archs

This definition enables callers to estimate remaining space on the
kstack, and take action on it. Notably, it enables optimizations in the
GEOM and netgraph subsystems to directly dispatch work items when there
is sufficient stack space, rather than queuing them for a worker thread.

Implement it for riscv, arm, and mips. Remove the #ifdefs, so it will
not go unimplemented elsewhere.

PR:		259157
Reviewed by:	mav, kib, markj (previous version)
MFC after:	1 week
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D32580
parent b02908b0
......@@ -72,4 +72,15 @@ struct syscall_args {
register_t args[MAXARGS];
} __aligned(8);
#ifdef _KERNEL
#include <machine/pcb.h>
/* Get the current kernel thread stack usage. */
#define GET_STACK_USAGE(total, used) do { \
struct thread *td = curthread; \
(total) = td->td_kstack_pages * PAGE_SIZE - sizeof(struct pcb); \
(used) = td->td_kstack + (total) - (vm_offset_t)&td; \
} while (0)
#endif /* _KERNEL */
#endif /* !_MACHINE_PROC_H_ */
......@@ -559,7 +559,6 @@ g_io_request(struct bio *bp, struct g_consumer *cp)
atomic_add_int(&cp->nstart, 1);
#endif
#ifdef GET_STACK_USAGE
direct = (cp->flags & G_CF_DIRECT_SEND) != 0 &&
(pp->flags & G_PF_DIRECT_RECEIVE) != 0 &&
!g_is_geom_thread(curthread) &&
......@@ -573,9 +572,6 @@ g_io_request(struct bio *bp, struct g_consumer *cp)
if (su * 2 > st)
direct = 0;
}
#else
direct = 0;
#endif
if (direct) {
error = g_io_check(bp);
......@@ -655,7 +651,6 @@ g_io_deliver(struct bio *bp, int error)
bp->bio_bcount = bp->bio_length;
bp->bio_resid = bp->bio_bcount - bp->bio_completed;
#ifdef GET_STACK_USAGE
direct = (pp->flags & G_PF_DIRECT_SEND) &&
(cp->flags & G_CF_DIRECT_RECEIVE) &&
!g_is_geom_thread(curthread);
......@@ -666,9 +661,6 @@ g_io_deliver(struct bio *bp, int error)
if (su * 2 > st)
direct = 0;
}
#else
direct = 0;
#endif
/*
* The statistics collection is lockless, as such, but we
......
......@@ -96,4 +96,15 @@ struct syscall_args {
#define KINFO_PROC_SIZE 816
#endif
#ifdef _KERNEL
#include <machine/pcb.h>
/* Get the current kernel thread stack usage. */
#define GET_STACK_USAGE(total, used) do { \
struct thread *td = curthread; \
(total) = td->td_kstack_pages * PAGE_SIZE - sizeof(struct pcb); \
(used) = td->td_kstack + (total) - (vm_offset_t)&td; \
} while (0)
#endif /* _KERNEL */
#endif /* !_MACHINE_PROC_H_ */
......@@ -2281,7 +2281,7 @@ ng_snd_item(item_p item, int flags)
queue = 1;
} else {
queue = 0;
#ifdef GET_STACK_USAGE
/*
* Most of netgraph nodes have small stack consumption and
* for them 25% of free stack space is more than enough.
......@@ -2296,7 +2296,6 @@ ng_snd_item(item_p item, int flags)
((node->nd_flags & NGF_HI_STACK) || (hook &&
(hook->hk_flags & HK_HI_STACK)))))
queue = 1;
#endif
}
if (queue) {
......
......@@ -53,4 +53,15 @@ struct syscall_args {
register_t args[MAXARGS];
};
#ifdef _KERNEL
#include <machine/pcb.h>
/* Get the current kernel thread stack usage. */
#define GET_STACK_USAGE(total, used) do { \
struct thread *td = curthread; \
(total) = td->td_kstack_pages * PAGE_SIZE - sizeof(struct pcb); \
(used) = td->td_kstack + (total) - (vm_offset_t)&td; \
} while (0)
#endif /* _KERNEL */
#endif /* !_MACHINE_PROC_H_ */
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment