History log of /dragonfly/sys/platform/vkernel64/x86_64/mp.c (Results 1 – 25 of 30)
Revision (<<< Hide revision tags) (Show revision tags >>>) Date Author Comments
Revision tags: v6.2.1, v6.2.0, v6.3.0, v6.0.1
# 5229377c 07-Sep-2021 Sascha Wildner <saw@online.de>

kernel/libc: Remove the old vmm code.

Removes the kernel code and two system calls.

Bump __DragonFly_version too.

Reviewed-by: aly, dillon


# 712b6620 21-May-2021 Aaron LI <aly@aaronly.me>

vm: Change 'kernel_object' global to pointer type

Following the previous commits, this commit changes the 'kernel_object'
to pointer type of 'struct vm_object *'. This makes it align better
with 'k

vm: Change 'kernel_object' global to pointer type

Following the previous commits, this commit changes the 'kernel_object'
to pointer type of 'struct vm_object *'. This makes it align better
with 'kernel_map' and simplifies the code a bit.

No functional changes.

show more ...


# 1eeaf6b2 20-May-2021 Aaron LI <aly@aaronly.me>

vm: Change 'kernel_map' global to type of 'struct vm_map *'

Change the global variable 'kernel_map' from type 'struct vm_map' to a
pointer to this struct. This simplify the code a bit since all
inv

vm: Change 'kernel_map' global to type of 'struct vm_map *'

Change the global variable 'kernel_map' from type 'struct vm_map' to a
pointer to this struct. This simplify the code a bit since all
invocations take its address. This change also aligns with NetBSD's
'kernal_map' that it's also a pointer, which also helps the porting of
NVMM.

No functional changes.

show more ...


Revision tags: v6.0.0, v6.0.0rc1, v6.1.0, v5.8.3, v5.8.2, v5.8.1, v5.8.0, v5.9.0, v5.8.0rc1, v5.6.3
# 4499490f 03-Feb-2020 Sascha Wildner <saw@online.de>

vkernel: Include <sys/malloc.h> for malloc_reinit_ncpus() prototype.

Fixes the VKERNEL64 build.


# 3ab3ae18 17-Dec-2019 Matthew Dillon <dillon@apollo.backplane.com>

kernel - Refactor malloc_type to reduce static data in image

* malloc_type was embedding a SMP_MAXCPU array of kmalloc_use
structures, which winds up being 16KB a pop x 400+ MALLOC_DEFINE()
decl

kernel - Refactor malloc_type to reduce static data in image

* malloc_type was embedding a SMP_MAXCPU array of kmalloc_use
structures, which winds up being 16KB a pop x 400+ MALLOC_DEFINE()
declarations.

This was over 6MB of static data in the kernel binary, and it
wasn't BSS because the declaration is initialized with some defaults.
So this reduction is significant and directly impacts both memory
use and kernel boot times.

* Change malloc_type->ks_use from an array to a pointer. Embed
a single kmalloc_use structure (ks_use0) as the default.

When ncpus is probed, the kernel now goes through all malloc_type
structures and dynamically allocates a properly-sized ks_use
array. Any new malloc hoppers after that point will also dynamically
allocate ks_use.

show more ...


# da82a65a 11-Nov-2019 zrj <rimvydas.jasinskas@gmail.com>

Add <sys/cpumask.h>.

Collect and gather all scatter cpumask bits to correct headers. This
cleans up the namespace and simplifies platform handling in asm macros.
The cpumask_t together with its m

Add <sys/cpumask.h>.

Collect and gather all scatter cpumask bits to correct headers. This
cleans up the namespace and simplifies platform handling in asm macros.
The cpumask_t together with its macros is already non MI feature that is
used in userland utilities, libraries, kernel scheduler and syscalls.
It deserves sys/ header. Adjust syscalls.master and rerun sysent.

While there, fix an issue in ports that set POSIX env, but has
implementation of setting thread names through pthread_set_name_np().

show more ...


Revision tags: v5.6.2, v5.6.1, v5.6.0, v5.6.0rc1, v5.7.0, v5.4.3, v5.4.2
# fcf6efef 02-Mar-2019 Sascha Wildner <saw@online.de>

kernel: Remove numerous #include <sys/thread2.h>.

Most of them were added when we converted spl*() calls to
crit_enter()/crit_exit(), almost 14 years ago. We can now
remove a good chunk of them agai

kernel: Remove numerous #include <sys/thread2.h>.

Most of them were added when we converted spl*() calls to
crit_enter()/crit_exit(), almost 14 years ago. We can now
remove a good chunk of them again for where crit_*() are
no longer used.

I had to adjust some files that were relying on thread2.h
or headers that it includes coming in via other headers
that it was removed from.

show more ...


Revision tags: v5.4.1, v5.4.0, v5.5.0, v5.4.0rc1, v5.2.2, v5.2.1, v5.2.0, v5.3.0, v5.2.0rc, v5.0.2, v5.0.1
# 2a048cf0 16-Oct-2017 Sepherosa Ziehau <sephe@dragonflybsd.org>

kern: Remove ncpus2 and friends.

They were no longer used, after netisr_ncpus was delployed.

Reminded-by: dillon@


Revision tags: v5.0.0, v5.0.0rc2, v5.1.0, v5.0.0rc1
# cc3685b0 21-Sep-2017 Sepherosa Ziehau <sephe@dragonflybsd.org>

arc4random: Make arc4random context per-cpu.

Critical section is commented out, no consumers from ISRs/ithreads.


Revision tags: v4.8.1, v4.8.0, v4.6.2, v4.9.0, v4.8.0rc
# c91894e0 22-Jan-2017 Matthew Dillon <dillon@apollo.backplane.com>

vkernel - Restabilize pmap code, redo kqueue, systimer, and console code

* Remove vm_token and add necessary vm_page spin locks to the vkernel's
pmap code, improving its stability.

* Separate the

vkernel - Restabilize pmap code, redo kqueue, systimer, and console code

* Remove vm_token and add necessary vm_page spin locks to the vkernel's
pmap code, improving its stability.

* Separate the systimer interrupt and console tty support from the
kqueue subsystem.

Uses SIGURG for systimer
Uses SIGIO for kqueue
Uses SIGALRM for cothread signalling

* The vkernel systimer code now uses a dedicated cothread for timing. The
cothread is a bit of a hack at the moment but is a more direct way of
handling systimers.

* Attempt to fix user%/sys%/intr%/idle% in the systat -vm and
systat -pv output. Still isn't perfect, but it is now more
accurate.

show more ...


# 3091de50 17-Dec-2016 Matthew Dillon <dillon@apollo.backplane.com>

kernel - Tag vm_map_entry structure, slight optimization to zalloc, misc.

* Tag the vm_map_entry structure, allowing debugging programs to
break-down how KMEM is being used more easily.

This re

kernel - Tag vm_map_entry structure, slight optimization to zalloc, misc.

* Tag the vm_map_entry structure, allowing debugging programs to
break-down how KMEM is being used more easily.

This requires an additional argument to vm_map_find() and most
kmem_alloc*() functions.

* Remove the page chunking parameter to zinit() and zinitna(). It was
only being used degeneratively. Increase the chunking from one page
to four pages, which will reduce the amount of vm_map_entry spam in
the kernel_map.

* Use atomic ops when adjusting zone_kern_pages.

show more ...


Revision tags: v4.6.1
# 95636606 10-Oct-2016 Matthew Dillon <dillon@backplane.com>

vkernel - Fix FP corruption in VMX/EPT mode

* Properly invalidating the EPT TLB cache when it potentially becomes
stale.

* When destroying a VMX context, make sure the EPT TLB cache has been
in

vkernel - Fix FP corruption in VMX/EPT mode

* Properly invalidating the EPT TLB cache when it potentially becomes
stale.

* When destroying a VMX context, make sure the EPT TLB cache has been
invalidated for that context as a safety.

* Fix a bug in vmx_vminit() where it was losing track of the currently
loaded VMX.

* Setup the VMX to clear the host CR0_TS, and the host makes sure the FP
state is correct prior to vmlaunch.

* Make sure the GUEST_CR0's CR0_TS reflects the vkernel says it should
reflect.

* The vkernel has a choice of asking the guest user context to #NM fault
on FP use or not. Both mechanics work, but its probably better for it
to ensure that the FP state is valid and tell the user context to not
fault. However, this commit makes sure that both mechanics work.

* Document why we shouldn't vmclear the old current context when loading
a different context.

* Cleanup some of the vkernel's pmap handling. This isn't perfect and
probably needs to be rewritten (we need a more powerful guest pmap
adjustment system call to properly synchronize changes). For now
we try to avoid races against detecting the (M)odified flag by clearing
the RW flag first.

show more ...


# 4dd1b994 20-Sep-2016 Antonio Huete Jimenez <tuxillo@quantumachine.net>

vkernel - Fix a vkernel lockup on startup

- During ap_init() any pending IPIs is processed manually so
clear gd_npoll as the real kernel does.
- Do not disable interrupts for vkernels during lwkt_

vkernel - Fix a vkernel lockup on startup

- During ap_init() any pending IPIs is processed manually so
clear gd_npoll as the real kernel does.
- Do not disable interrupts for vkernels during lwkt_send_ipiq3()
because they don't seem to be re-enabled afterwards as they should.
I'm not entirely sure this is the right fix, more investigation
is required.

show more ...


Revision tags: v4.6.0, v4.6.0rc2, v4.6.0rc, v4.7.0, v4.4.3, v4.4.2, v4.4.1, v4.4.0, v4.5.0, v4.4.0rc, v4.2.4, v4.3.1, v4.2.3, v4.2.1, v4.2.0, v4.0.6, v4.3.0, v4.2.0rc, v4.0.5
# f3f3eadb 12-Mar-2015 Sascha Wildner <saw@online.de>

kernel: Move semicolon from the definition of SYSINIT() to its invocations.

This affected around 70 of our (more or less) 270 SYSINIT() calls.

style(9) advocates the terminating semicolon to be sup

kernel: Move semicolon from the definition of SYSINIT() to its invocations.

This affected around 70 of our (more or less) 270 SYSINIT() calls.

style(9) advocates the terminating semicolon to be supplied by the
invocation too, because it can make life easier for editors and other
source code parsing programs.

show more ...


Revision tags: v4.0.4, v4.0.3, v4.0.2, v4.0.1, v4.0.0, v4.0.0rc3, v4.0.0rc2, v4.0.0rc, v4.1.0, v3.8.2
# 739d9bd3 07-Jul-2014 Matthew Dillon <dillon@apollo.backplane.com>

vkernel64 - Make operational again after bootstrap changes

* vkernel64's need the same cpu_idle_restore() fix that x86-64 got to
properly handle pending migrations on the BSP at bootstrap time.

vkernel64 - Make operational again after bootstrap changes

* vkernel64's need the same cpu_idle_restore() fix that x86-64 got to
properly handle pending migrations on the BSP at bootstrap time.
(this occurs due to the way initclocks_other() works now).

* Add a warning/reminder in param.h regarding increasing MAXCPU beyond 256.

show more ...


# d97990a1 07-Jul-2014 Matthew Dillon <dillon@apollo.backplane.com>

build - Fix vkernel64 build

* Fix build due to missing declaration from recent commit.


# 1997b4c2 06-Jul-2014 Matthew Dillon <dillon@apollo.backplane.com>

kernel - extend cpus past 64 - fixes and adjustments

* Reorder the SMP cpu boot code to remove a great deal of lock contention.
The APs must still loop waiting for the BSP to adjust the stage, but

kernel - extend cpus past 64 - fixes and adjustments

* Reorder the SMP cpu boot code to remove a great deal of lock contention.
The APs must still loop waiting for the BSP to adjust the stage, but
they no longer need to hold a token or spinlock so startup under emulation
is considerably faster.

* Do not initialize our systimer periodics on each target cpu from the
idle thread bootstrap. Previously with the MP lock held the locks acquired
during this initialization were serialized and could not block. Now
that cpu startup runs mostly concurrently, that is no longer the
case.

Instead, systimer periodics are handled by process 0 as a post-smp-startup
call.

* statclock() now uses sys_cputimer() directly to calculate the delta time.

* The TSC is now implemented as sys_cputimer before any systimer periodics
(particularly statclock()) are set-up, allowing the system to take control
away from the i8254 earlier.

* Clean up struct lwkt_ipiq. Remove the 'lwkt_ipiq' typedef. Calculate
allocation sizes separately.

* Add a new loader.conf tunable, hw.tsc_cputimer_force. If set to 1 and
a TSC is present, the system will force invariant and mpsync operation
and always use the TSC as the cputimer (primarily useful for qemu).

* Remove unnecessary kmem_alloc() of the globaldata structure. We are
using a static array now. This access was wasting memory for a long
time.

* Make the boot stack bigger for the APs.

show more ...


# 1ad93419 04-Jul-2014 Nuno Antunes <nuno.antunes@gmail.com>

kernel: Unbreak vkernel64 build.


# c07315c4 04-Jul-2014 Matthew Dillon <dillon@apollo.backplane.com>

kernel - Refactor cpumask_t to extend cpus past 64, part 1/2

* 64-bit systems only. 32-bit builds use the macros but cannot be expanded
past 32 cpus.

* Change cpumask_t from __uint64_t to a stru

kernel - Refactor cpumask_t to extend cpus past 64, part 1/2

* 64-bit systems only. 32-bit builds use the macros but cannot be expanded
past 32 cpus.

* Change cpumask_t from __uint64_t to a structure. This commit implements
one 64-bit sub-element (the next one will implement four for 256 cpus).

* Create a CPUMASK_*() macro API for non-atomic and atomic cpumask
manipulation. These macros generally take lvalues as arguments, allowing
for a fairly optimal implementation.

* Change all C code operating on cpumask's to use the newly created CPUMASK_*()
macro API.

* Compile-test 32 and 64-bit. Run-test 64-bit.

* Adjust sbin/usched, usr.sbin/powerd. usched currently needs more work.

show more ...


Revision tags: v3.8.1, v3.6.3, v3.8.0, v3.8.0rc2, v3.9.0, v3.8.0rc, v3.6.2, v3.6.1, v3.6.0, v3.7.1, v3.6.0rc, v3.7.0
# a86ce0cd 20-Sep-2013 Matthew Dillon <dillon@apollo.backplane.com>

hammer2 - Merge Mihai Carabas's VKERNEL/VMM GSOC project into the main tree

* This merge contains work primarily by Mihai Carabas, with some misc
fixes also by Matthew Dillon.

* Special note on G

hammer2 - Merge Mihai Carabas's VKERNEL/VMM GSOC project into the main tree

* This merge contains work primarily by Mihai Carabas, with some misc
fixes also by Matthew Dillon.

* Special note on GSOC core

This is, needless to say, a huge amount of work compressed down into a
few paragraphs of comments. Adds the pc64/vmm subdirectory and tons
of stuff to support hardware virtualization in guest-user mode, plus
the ability for programs (vkernels) running in this mode to make normal
system calls to the host.

* Add system call infrastructure for VMM mode operations in kern/sys_vmm.c
which vectors through a structure to machine-specific implementations.

vmm_guest_ctl_args()
vmm_guest_sync_addr_args()

vmm_guest_ctl_args() - bootstrap VMM and EPT modes. Copydown the original
user stack for EPT (since EPT 'physical' addresses cannot reach that far
into the backing store represented by the process's original VM space).
Also installs the GUEST_CR3 for the guest using parameters supplied by
the guest.

vmm_guest_sync_addr_args() - A host helper function that the vkernel can
use to invalidate page tables on multiple real cpus. This is a lot more
efficient than having the vkernel try to do it itself with IPI signals
via cpusync*().

* Add Intel VMX support to the host infrastructure. Again, tons of work
compressed down into a one paragraph commit message. Intel VMX support
added. AMD SVM support is not part of this GSOC and not yet supported
by DragonFly.

* Remove PG_* defines for PTE's and related mmu operations. Replace with
a table lookup so the same pmap code can be used for normal page tables
and also EPT tables.

* Also include X86_PG_V defines specific to normal page tables for a few
situations outside the pmap code.

* Adjust DDB to disassemble SVM related (intel) instructions.

* Add infrastructure to exit1() to deal related structures.

* Optimize pfind() and pfindn() to remove the global token when looking
up the current process's PID (Matt)

* Add support for EPT (double layer page tables). This primarily required
adjusting the pmap code to use a table lookup to get the PG_* bits.

Add an indirect vector for copyin, copyout, and other user address space
copy operations to support manual walks when EPT is in use.

A multitude of system calls which manually looked up user addresses via
the vm_map now need a VMM layer call to translate EPT.

* Remove the MP lock from trapsignal() use cases in trap().

* (Matt) Add pthread_yield()s in most spin loops to help situations where
the vkernel is running on more cpu's than the host has, and to help with
scheduler edge cases on the host.

* (Matt) Add a pmap_fault_page_quick() infrastructure that vm_fault_page()
uses to try to shortcut operations and avoid locks. Implement it for
pc64. This function checks whether the page is already faulted in as
requested by looking up the PTE. If not it returns NULL and the full
blown vm_fault_page() code continues running.

* (Matt) Remove the MP lock from most the vkernel's trap() code

* (Matt) Use a shared spinlock when possible for certain critical paths
related to the copyin/copyout path.

show more ...


Revision tags: v3.4.3, v3.4.2, v3.4.0, v3.4.1, v3.4.0rc, v3.5.0, v3.2.2
# 1918fc5c 24-Oct-2012 Sascha Wildner <saw@online.de>

kernel: Make SMP support default (and non-optional).

The 'SMP' kernel option gets removed with this commit, so it has to
be removed from everybody's configs.

Reviewed-by: sjg
Approved-by: many


Revision tags: v3.2.1, v3.2.0, v3.3.0
# 9bea6114 22-Aug-2012 Mihai Carabas <mihai.carabas@gmail.com>

vkernel{,64} - CPU topology support

* Part of "Add SMT/HT awareness to DragonFly BSD scheduler" GSoC
project.

* Details at: http://leaf.dragonflybsd.org/mailarchive/kernel/2012-08/msg00009.htm

vkernel{,64} - CPU topology support

* Part of "Add SMT/HT awareness to DragonFly BSD scheduler" GSoC
project.

* Details at: http://leaf.dragonflybsd.org/mailarchive/kernel/2012-08/msg00009.html

Mentored-by: Alex Hornung (alexh@)
Sponsored-by: Google Summer of Code 2012

show more ...


Revision tags: v3.0.3, v3.0.2, v3.0.1, v3.1.0, v3.0.0
# 86d7f5d3 26-Nov-2011 John Marino <draco@marino.st>

Initial import of binutils 2.22 on the new vendor branch

Future versions of binutils will also reside on this branch rather
than continuing to create new binutils branches for each new version.


# b12defdc 18-Oct-2011 Matthew Dillon <dillon@apollo.backplane.com>

kernel - Major SMP performance patch / VM system, bus-fault/seg-fault fixes

This is a very large patch which reworks locking in the entire VM subsystem,
concentrated on VM objects and the x86-64 pma

kernel - Major SMP performance patch / VM system, bus-fault/seg-fault fixes

This is a very large patch which reworks locking in the entire VM subsystem,
concentrated on VM objects and the x86-64 pmap code. These fixes remove
nearly all the spin lock contention for non-threaded VM faults and narrows
contention for threaded VM faults to just the threads sharing the pmap.

Multi-socket many-core machines will see a 30-50% improvement in parallel
build performance (tested on a 48-core opteron), depending on how well
the build parallelizes.

As part of this work a long-standing problem on 64-bit systems where programs
would occasionally seg-fault or bus-fault for no reason has been fixed. The
problem was related to races between vm_fault, the vm_object collapse code,
and the vm_map splitting code.

* Most uses of vm_token have been removed. All uses of vm_spin have been
removed. These have been replaced with per-object tokens and per-queue
(vm_page_queues[]) spin locks.

Note in particular that since we still have the page coloring code the
PQ_FREE and PQ_CACHE queues are actually many queues, individually
spin-locked, resulting in very excellent MP page allocation and freeing
performance.

* Reworked vm_page_lookup() and vm_object->rb_memq. All (object,pindex)
lookup operations are now covered by the vm_object hold/drop system,
which utilize pool tokens on vm_objects. Calls now require that the
VM object be held in order to ensure a stable outcome.

Also added vm_page_lookup_busy_wait(), vm_page_lookup_busy_try(),
vm_page_busy_wait(), vm_page_busy_try(), and other API functions
which integrate the PG_BUSY handling.

* Added OBJ_CHAINLOCK. Most vm_object operations are protected by
the vm_object_hold/drop() facility which is token-based. Certain
critical functions which must traverse backing_object chains use
a hard-locking flag and lock almost the entire chain as it is traversed
to prevent races against object deallocation, collapses, and splits.

The last object in the chain (typically a vnode) is NOT locked in
this manner, so concurrent faults which terminate at the same vnode will
still have good performance. This is important e.g. for parallel compiles
which might be running dozens of the same compiler binary concurrently.

* Created a per vm_map token and removed most uses of vmspace_token.

* Removed the mp_lock in sys_execve(). It has not been needed in a while.

* Add kmem_lim_size() which returns approximate available memory (reduced
by available KVM), in megabytes. This is now used to scale up the
slab allocator cache and the pipe buffer caches to reduce unnecessary
global kmem operations.

* Rewrote vm_page_alloc(), various bits in vm/vm_contig.c, the swapcache
scan code, and the pageout scan code. These routines were rewritten
to use the per-queue spin locks.

* Replaced the exponential backoff in the spinlock code with something
a bit less complex and cleaned it up.

* Restructured the IPIQ func/arg1/arg2 array for better cache locality.
Removed the per-queue ip_npoll and replaced it with a per-cpu gd_npoll,
which is used by other cores to determine if they need to issue an
actual hardware IPI or not. This reduces hardware IPI issuance
considerably (and the removal of the decontention code reduced it even
more).

* Temporarily removed the lwkt thread fairq code and disabled a number of
features. These will be worked back in once we track down some of the
remaining performance issues.

Temproarily removed the lwkt thread resequencer for tokens for the same
reason. This might wind up being permanent.

Added splz_check()s in a few critical places.

* Increased the number of pool tokens from 1024 to 4001 and went to a
prime-number mod algorithm to reduce overlaps.

* Removed the token decontention code. This was a bit of an eyesore and
while it did its job when we had global locks it just gets in the way now
that most of the global locks are gone.

Replaced the decontention code with a fall back which acquires the
tokens in sorted order, to guarantee that deadlocks will always be
resolved eventually in the scheduler.

* Introduced a simplified spin-for-a-little-while function
_lwkt_trytoken_spin() that the token code now uses rather than giving
up immediately.

* The vfs_bio subsystem no longer uses vm_token and now uses the
vm_object_hold/drop API for buffer cache operations, resulting
in very good concurrency.

* Gave the vnode its own spinlock instead of sharing vp->v_lock.lk_spinlock,
which fixes a deadlock.

* Adjusted all platform pamp.c's to handle the new main kernel APIs. The
i386 pmap.c is still a bit out of date but should be compatible.

* Completely rewrote very large chunks of the x86-64 pmap.c code. The
critical path no longer needs pmap_spin but pmap_spin itself is still
used heavily, particularin the pv_entry handling code.

A per-pmap token and per-pmap object are now used to serialize pmamp
access and vm_page lookup operations when needed.

The x86-64 pmap.c code now uses only vm_page->crit_count instead of
both crit_count and hold_count, which fixes races against other parts of
the kernel uses vm_page_hold().

_pmap_allocpte() mechanics have been completely rewritten to remove
potential races. Much of pmap_enter() and pmap_enter_quick() has also
been rewritten.

Many other changes.

* The following subsystems (and probably more) no longer use the vm_token
or vmobj_token in critical paths:

x The swap_pager now uses the vm_object_hold/drop API instead of vm_token.

x mmap() and vm_map/vm_mmap in general now use the vm_object_hold/drop API
instead of vm_token.

x vnode_pager

x zalloc

x vm_page handling

x vfs_bio

x umtx system calls

x vm_fault and friends

* Minor fixes to fill_kinfo_proc() to deal with process scan panics (ps)
revealed by recent global lock removals.

* lockmgr() locks no longer support LK_NOSPINWAIT. Spin locks are
unconditionally acquired.

* Replaced netif/e1000's spinlocks with lockmgr locks. The spinlocks
were not appropriate owing to the large context they were covering.

* Misc atomic ops added

show more ...


Revision tags: v2.12.0, v2.13.0
# da0b0e8b 29-Jul-2011 Matthew Dillon <dillon@apollo.backplane.com>

kernel - Fix rare IPIQ freezes

* Ensure that an IPI interrupt is sent went waiting for an IPIQ
to drain. The IPIQ can be pushed up by passive IPIs and not
necessarily have a signal pending on t

kernel - Fix rare IPIQ freezes

* Ensure that an IPI interrupt is sent went waiting for an IPIQ
to drain. The IPIQ can be pushed up by passive IPIs and not
necessarily have a signal pending on the target cpu, so we
have to put the check in our drain loop rather than outside
the loop.

* Add a cpu_pause() to reduce power use for the IPIQ drain case.

* Normalize the use of gd_intr_nesting_level and clean up the
code syntax for the ipiq_optimized case.

* Remove the previous temporary IPI interrupt signaling fix, it
was incomplete.

* Fix a missing crit_exit() in the ENOENT case for
lwkt_send_ipiq3_nowait().

* Track cpu's which are in the middle of ipiq processing and
assert that a cpu is not in an IPIQ processing loop when
switching between threads.

* Normalize the use of ip->ip_npoll in the IPIQ code. This
field is used to avoid unnecessary IPI interrupts.

show more ...


12