diff options
Diffstat (limited to 'src/firemon/procevent.c')
-rw-r--r-- | src/firemon/procevent.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/src/firemon/procevent.c b/src/firemon/procevent.c index b79f12362..762d22514 100644 --- a/src/firemon/procevent.c +++ b/src/firemon/procevent.c | |||
@@ -173,6 +173,20 @@ static int procevent_netlink_setup(void) { | |||
173 | if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) | 173 | if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) |
174 | goto errexit; | 174 | goto errexit; |
175 | 175 | ||
176 | // set a large socket rx buffer | ||
177 | // the regular default value as set in /proc/sys/net/core/rmem_default will fill the | ||
178 | // buffer much quicker than we can process it | ||
179 | int bsize = 1024 * 1024; // 1MB | ||
180 | socklen_t blen = sizeof(int); | ||
181 | if (setsockopt(sock, SOL_SOCKET, SO_RCVBUFFORCE, &bsize, blen) == -1) | ||
182 | fprintf(stderr, "Warning: cannot set rx buffer size, using default system value\n"); | ||
183 | else if (arg_debug) { | ||
184 | if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &bsize, &blen) == -1) | ||
185 | fprintf(stderr, "Error: cannot read rx buffer size\n"); | ||
186 | else | ||
187 | printf("rx buffer size %d\n", bsize / 2); // the value returned is duble the real one, see man 7 socket | ||
188 | } | ||
189 | |||
176 | // send monitoring message | 190 | // send monitoring message |
177 | struct nlmsghdr nlmsghdr; | 191 | struct nlmsghdr nlmsghdr; |
178 | memset(&nlmsghdr, 0, sizeof(nlmsghdr)); | 192 | memset(&nlmsghdr, 0, sizeof(nlmsghdr)); |
@@ -244,14 +258,19 @@ static int procevent_monitor(const int sock, pid_t mypid) { | |||
244 | } | 258 | } |
245 | 259 | ||
246 | 260 | ||
247 | if ((len = recv(sock, buf, sizeof(buf), 0)) == 0) { | 261 | if ((len = recv(sock, buf, sizeof(buf), 0)) == 0) |
248 | return 0; | 262 | return 0; |
249 | } | ||
250 | if (len == -1) { | 263 | if (len == -1) { |
251 | if (errno == EINTR) { | 264 | if (errno == EINTR) |
252 | return 0; | 265 | continue; |
253 | } else { | 266 | else if (errno == ENOBUFS) { |
254 | fprintf(stderr,"recv: %s\n", strerror(errno)); | 267 | // rx buffer is full, the kernel started dropping messages |
268 | printf("*** Waning *** - message burst received, not all events are printed\n"); | ||
269 | //return -1; | ||
270 | continue; | ||
271 | } | ||
272 | else { | ||
273 | fprintf(stderr,"Error: rx socket recv call, errno %d, %s\n", errno, strerror(errno)); | ||
255 | return -1; | 274 | return -1; |
256 | } | 275 | } |
257 | } | 276 | } |