diff options
author | Matt Layher <mdlayher@gmail.com> | 2021-07-21 16:03:34 -0400 |
---|---|---|
committer | Matt Layher <mdlayher@gmail.com> | 2021-08-16 17:40:17 +0000 |
commit | 5c7a460a1c108e5bf7a99817b86ebded7ce81812 (patch) | |
tree | 8228d6e6d4459dba7ff762f935451a3262aca315 | |
parent | 850768bbc9fd2d74a88233fa1f46791d08d1afc8 (diff) | |
download | go-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>
-rw-r--r-- | src/syscall/netlink_linux.go | 25 |
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 { |