Skip to content

Commit 0f00d05

Browse files
committed
conn: reduce initial memory in Receive()
Reduce memory footprint by starting with a smaller buffer and adjust the buffer size accordingly after peeking at the upcoming netlink message. Signed-off-by: Florian Lehner <[email protected]>
1 parent 0f7746f commit 0f00d05

File tree

1 file changed

+11
-19
lines changed

1 file changed

+11
-19
lines changed

conn_linux.go

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -121,28 +121,20 @@ func (c *conn) Send(m Message) error {
121121

122122
// Receive receives one or more Messages from netlink.
123123
func (c *conn) Receive() ([]Message, error) {
124-
b := make([]byte, os.Getpagesize())
125-
for {
126-
// Peek at the buffer to see how many bytes are available.
127-
//
128-
// TODO(mdlayher): deal with OOB message data if available, such as
129-
// when PacketInfo ConnOption is true.
130-
n, _, _, _, err := c.s.Recvmsg(context.Background(), b, nil, unix.MSG_PEEK)
131-
if err != nil {
132-
return nil, err
133-
}
134-
135-
// Break when we can read all messages
136-
if n < len(b) {
137-
break
138-
}
139-
140-
// Double in size if not enough bytes
141-
b = make([]byte, len(b)*2)
124+
b := make([]byte, unix.SizeofNlMsghdr)
125+
// Peek at the buffer to see how many bytes are available.
126+
//
127+
// TODO(mdlayher): deal with OOB message data if available, such as
128+
// when PacketInfo ConnOption is true.
129+
n, _, _, _, err := c.s.Recvmsg(context.Background(), b, nil, unix.MSG_PEEK|unix.MSG_TRUNC)
130+
if err != nil {
131+
return nil, err
142132
}
133+
// Resize buffer to the expected size.
134+
b = make([]byte, nlmsgAlign(n))
143135

144136
// Read out all available messages
145-
n, _, _, _, err := c.s.Recvmsg(context.Background(), b, nil, 0)
137+
n, _, _, _, err = c.s.Recvmsg(context.Background(), b, nil, 0)
146138
if err != nil {
147139
return nil, err
148140
}

0 commit comments

Comments
 (0)