From: qmuntal Date: Fri, 27 Jan 2023 20:53:06 +0000 (+0100) Subject: internal/poll: don't queue port completion entry for udp on windows X-Git-Tag: go1.21rc1~1746 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=932d0ae83ea8ce9adb2b23b28788b860447b1f61;p=gostls13.git internal/poll: don't queue port completion entry for udp on windows This CL sets the FILE_SKIP_COMPLETION_PORT_ON_SUCCESS notification mode for all udp and tcp networks. When SetFileCompletionNotificationModes was implemented, back in go 1.2 [1], it was not possible to enable this mode on udp connections because it is buggy on Windows 7 and earlier. The bug was fixed on Windows 8. We can safely enable this mode now, since go 1.21 will require Windows 10 or higher. While here, I noticed that this mode is only enabled for tcp, but not for tcp4 nor tcp6. I don't think this restriction makes sense, so I'm lifting it. The performance gains are relevant: name old time/op new time/op delta ReadWriteMsgUDPAddrPort-12 13.3µs ± 4% 11.2µs ± 8% -15.90% (p=0.000 n=10+9) WriteToReadFromUDP-12 14.5µs ±18% 11.4µs ± 4% -21.35% (p=0.000 n=10+9) WriteToReadFromUDPAddrPort-12 13.4µs ± 3% 11.0µs ± 2% -18.00% (p=0.000 n=10+9) [1] https://codereview.appspot.com/12409044 Change-Id: Idf41c35898beceac39d21decb47910f7d8ac247b Reviewed-on: https://go-review.googlesource.com/c/go/+/463839 Reviewed-by: Ian Lance Taylor TryBot-Result: Gopher Robot Reviewed-by: Alex Brainman Run-TryBot: Quim Muntal Reviewed-by: Bryan Mills --- diff --git a/src/internal/poll/fd_windows.go b/src/internal/poll/fd_windows.go index 3a4a74f2ae..f863ecb998 100644 --- a/src/internal/poll/fd_windows.go +++ b/src/internal/poll/fd_windows.go @@ -325,9 +325,9 @@ func (fd *FD) Init(net string, pollable bool) (string, error) { if pollable && useSetFileCompletionNotificationModes { // We do not use events, so we can skip them always. flags := uint8(syscall.FILE_SKIP_SET_EVENT_ON_HANDLE) - // It's not safe to skip completion notifications for UDP: - // https://docs.microsoft.com/en-us/archive/blogs/winserverperformance/designing-applications-for-high-performance-part-iii - if net == "tcp" { + switch net { + case "tcp", "tcp4", "tcp6", + "udp", "udp4", "udp6": flags |= syscall.FILE_SKIP_COMPLETION_PORT_ON_SUCCESS } err := syscall.SetFileCompletionNotificationModes(fd.Sysfd, flags)