aboutsummaryrefslogtreecommitdiff
path: root/src/syscall
diff options
context:
space:
mode:
authorMatt Layher <mdlayher@gmail.com>2021-07-21 16:03:34 -0400
committerMatt Layher <mdlayher@gmail.com>2021-08-16 17:40:17 +0000
commit5c7a460a1c108e5bf7a99817b86ebded7ce81812 (patch)
tree8228d6e6d4459dba7ff762f935451a3262aca315 /src/syscall
parent850768bbc9fd2d74a88233fa1f46791d08d1afc8 (diff)
downloadgo-5c7a460a1c108e5bf7a99817b86ebded7ce81812.tar.gz
go-5c7a460a1c108e5bf7a99817b86ebded7ce81812.zip
syscall: hoist Getsockname out of NetlinkRIB loops
Calling Getsockname once to fetch the Pid field from the *SockaddrNetlink is necessary, but this data will remain static for the rest of the netlink socket's lifetime. Moving this call and type assertion outside of the inner loops will remove a number of unnecessary system calls. Change-Id: I7e7e81866af1a31fccdaaf7531efd6cc4cbb8926 Reviewed-on: https://go-review.googlesource.com/c/go/+/336369 Run-TryBot: Matt Layher <mdlayher@gmail.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: Matt Layher <mdlayher@gmail.com> Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
Diffstat (limited to 'src/syscall')
-rw-r--r--src/syscall/netlink_linux.go25
1 files changed, 12 insertions, 13 deletions
diff --git a/src/syscall/netlink_linux.go b/src/syscall/netlink_linux.go
index 0937ff797a..2d810705bf 100644
--- a/src/syscall/netlink_linux.go
+++ b/src/syscall/netlink_linux.go
@@ -55,14 +55,22 @@ func NetlinkRIB(proto, family int) ([]byte, error) {
return nil, err
}
defer Close(s)
- lsa := &SockaddrNetlink{Family: AF_NETLINK}
- if err := Bind(s, lsa); err != nil {
+ sa := &SockaddrNetlink{Family: AF_NETLINK}
+ if err := Bind(s, sa); err != nil {
return nil, err
}
wb := newNetlinkRouteRequest(proto, 1, family)
- if err := Sendto(s, wb, 0, lsa); err != nil {
+ if err := Sendto(s, wb, 0, sa); err != nil {
return nil, err
}
+ lsa, err := Getsockname(s)
+ if err != nil {
+ return nil, err
+ }
+ lsanl, ok := lsa.(*SockaddrNetlink)
+ if !ok {
+ return nil, EINVAL
+ }
var tab []byte
rbNew := make([]byte, Getpagesize())
done:
@@ -82,16 +90,7 @@ done:
return nil, err
}
for _, m := range msgs {
- lsa, err := Getsockname(s)
- if err != nil {
- return nil, err
- }
- switch v := lsa.(type) {
- case *SockaddrNetlink:
- if m.Header.Seq != 1 || m.Header.Pid != v.Pid {
- return nil, EINVAL
- }
- default:
+ if m.Header.Seq != 1 || m.Header.Pid != lsanl.Pid {
return nil, EINVAL
}
if m.Header.Type == NLMSG_DONE {