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
This commit is contained in:
Mitchell Horne 2021-11-25 12:01:11 -04:00
parent b02908b051
commit 0d2224733e
5 changed files with 34 additions and 10 deletions

View File

@ -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_ */

View File

@ -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

View File

@ -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_ */

View File

@ -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) {

View File

@ -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_ */