From: Matt Layher Date: Wed, 21 Jul 2021 20:03:34 +0000 (-0400) Subject: syscall: hoist Getsockname out of NetlinkRIB loops X-Git-Tag: go1.18beta1~1767 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=5c7a460a1c108e5bf7a99817b86ebded7ce81812;p=gostls13.git 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 TryBot-Result: Go Bot Trust: Matt Layher Reviewed-by: Tobias Klauser --- 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 {