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:
parent
b02908b051
commit
0d2224733e
@ -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_ */
|
||||
|
Loading…
Reference in New Issue
Block a user