freebsd-dev/sys
Konstantin Belousov dc43978aa5 amd64: allow parallel shootdown IPIs
Stop using smp_ipi_mtx to protect global shootdown state, and
move/multiply the global state into pcpu.  Now each CPU can initiate
shootdown IPI independently from other CPUs.  Initiator enters
critical section, then fills its local PCPU shootdown info
(pc_smp_tlb_XXX), then clears scoreboard generation at location (cpu,
my_cpuid) for each target cpu.  After that IPI is sent to all targets
which scan for zeroed scoreboard generation words.  Upon finding such
word the shootdown data is read from corresponding cpu' pcpu, and
generation is set.  Meantime initiator loops waiting for all zeroed
generations in scoreboard to update.

Initiator does not disable interrupts, which should allow
non-invalidation IPIs from deadlocking, it only needs to disable
preemption to pin itself to the instance of the pcpu smp_tlb data.

The generation is set before the actual invalidation is performed in
handler. It is safe because target CPU cannot return to userspace
before handler finishes. In principle only NMI can preempt the
handler, but NMI would see the kernel handler frame and not touch
not-invalidated user page table.

Handlers loop until they do not see zeroed scoreboard generations.
This, together with hardware keeping one pending IPI in LAPIC IRR
should prevent lost shootdowns.

Notes.
1. The code does protect writes to LAPIC ICR with exclusion. I believe
   this is fine because we in fact do not send IPIs from interrupt
   handlers. More for !x2APIC mode where ICR access for write requires
   two registers write, we disable interrupts around it. If considered
   incorrect, I can add per-cpu spinlock around ipi_send().
2. Scoreboard lines owned by given target CPU can be padded to the
   cache line, to reduce ping-pong.

Reviewed by:	markj (previous version)
Discussed with:	alc
Tested by:	pho
Sponsored by:	The FreeBSD Foundation
MFC after:	3 weeks
Differential revision:	https://reviews.freebsd.org/D25510
2020-07-14 20:37:50 +00:00
..
amd64 amd64: allow parallel shootdown IPIs 2020-07-14 20:37:50 +00:00
arm Fix the module name for some arm drivers. 2020-07-12 07:27:21 +00:00
arm64 Print the arm64 registers in more exception handling panics 2020-07-14 18:50:48 +00:00
bsm bsm: add AUE_CLOSERANGE 2020-04-24 01:27:25 +00:00
cam Use the more descriptive src_ccb and dst_ccb for the two ccbs being merged. 2020-06-20 04:07:23 +00:00
cddl Fix page fault in zfsctl_snapdir_getattr 2020-07-02 13:17:31 +00:00
compat Fix r363125 (Implement CLOCK_MONOTONIC_RAW (linux >= 2.6.28)), 2020-07-12 14:57:29 +00:00
conf Add a driver for the SafeXcel EIP-97. 2020-07-14 14:09:29 +00:00
contrib Rename nvpair.c to bsd_nvpair.c to not conflict with openzfs' version. 2020-06-27 00:55:03 +00:00
crypto Add domain policy allocation for amd64 fpu_kern_ctx 2020-07-03 14:54:46 +00:00
ddb [PowerPC] More relocation fixes 2020-06-21 03:39:26 +00:00
dev Add stepping to the kern.hwpmc.cpuid string on x86. 2020-07-14 18:11:05 +00:00
dts Remove licenses 2020-06-04 17:20:58 +00:00
fs Minor code cleanup that removes "nd->nd_bpos = mcp;" in both if and else. 2020-07-13 01:28:45 +00:00
gdb Mark more nodes as CTLFLAG_MPSAFE or CTLFLAG_NEEDGIANT (17 of many) 2020-02-26 14:26:36 +00:00
geom g_concat_find_device: trim /dev/ if it is present, like other GEOM 2020-07-09 08:00:46 +00:00
gnu dts: patch the am33xx dts for upcoming clock support 2020-06-05 20:14:54 +00:00
i386 amd64: allow parallel shootdown IPIs 2020-07-14 20:37:50 +00:00
isa
kern fd: stop looping in pwd_hold 2020-07-11 21:57:03 +00:00
kgssapi Add support for optional separate output buffers to in-kernel crypto. 2020-05-25 22:12:04 +00:00
libkern libkern: Add arc4random_uniform 2020-05-23 17:51:06 +00:00
mips Add dwc_otg_acpi 2020-06-30 15:58:29 +00:00
modules Add a driver for the SafeXcel EIP-97. 2020-07-14 14:09:29 +00:00
net Switch inet6 default route subscription to the new rib subscription api. 2020-07-12 11:24:23 +00:00
net80211 [net80211] Commit files missing in the previous commit 2020-07-01 00:24:55 +00:00
netgraph Add support for [read|write] supported data length commands. 2020-07-08 06:33:07 +00:00
netinet Improve the error handling in generating ASCONF chunks. 2020-07-14 20:32:50 +00:00
netinet6 Switch inet6 default route subscription to the new rib subscription api. 2020-07-12 11:24:23 +00:00
netipsec Simplify IPsec transform-specific teardown. 2020-06-25 23:59:16 +00:00
netpfil Don't print VNET pointer when initializing dummynet 2020-07-13 13:35:36 +00:00
netsmb Mark more nodes as CTLFLAG_MPSAFE or CTLFLAG_NEEDGIANT (17 of many) 2020-02-26 14:26:36 +00:00
nfs Use epoch(9) for rtentries to simplify control plane operations. 2020-05-23 10:21:02 +00:00
nfsclient
nfsserver
nlm Fix export_args ex_flags field so that is 64bits, the same as mnt_flags. 2020-06-14 00:10:18 +00:00
ofed Infiniband clients must be attached and detached in a specific order in ibcore. 2020-07-06 08:50:11 +00:00
opencrypto Convert cryptostats to a counter_u64 array. 2020-06-30 22:01:21 +00:00
powerpc Revert r362998, r326999 while a better compatibility strategy is devised. 2020-07-09 22:38:36 +00:00
riscv riscv plic: Do not complete interrupts until the interrupt handler has run 2020-07-06 21:29:50 +00:00
rpc Fix up a comment added by r362455. 2020-06-21 02:49:56 +00:00
security audit: provide AUDITING_TD for !AUDIT case 2020-07-04 06:21:20 +00:00
sys Make CLOCK_REALTIME and TIMER_ABSTIME available for XOPEN_SOURCE >= 500. 2020-07-14 20:23:27 +00:00
teken
tests Mark more nodes as CTLFLAG_MPSAFE or CTLFLAG_NEEDGIANT (17 of many) 2020-02-26 14:26:36 +00:00
tools vfs: stop null checking routines in vop wrappers 2020-01-26 00:41:38 +00:00
ufs The binary representation of the superblock (the fs structure) is written 2020-06-19 01:04:25 +00:00
vm Add vm_map_valid_range_KBI(). 2020-07-13 16:39:27 +00:00
x86 amd64: allow parallel shootdown IPIs 2020-07-14 20:37:50 +00:00
xdr Split XDR into separate kernel module. Make krpc depend on xdr. 2020-04-17 06:04:20 +00:00
xen Mark more nodes as CTLFLAG_MPSAFE or CTLFLAG_NEEDGIANT (16 of many) 2020-02-25 19:04:39 +00:00
Makefile Remove sparc64 kernel support 2020-02-03 17:35:11 +00:00