ethernet: Device statistics must be updated using atomic operations.

Both send and receive can be called concurrently, and there aren't
any locks protecting these fields, so they must be updated with atomics.
This commit is contained in:
Augustin Cavalier 2023-11-23 15:02:45 -05:00
parent 6461885e2e
commit 75874bab1a

View File

@ -328,14 +328,14 @@ ethernet_send_data(net_device *_device, net_buffer *buffer)
//dprintf("sent: %ld\n", bytesWritten);
if (bytesWritten < 0) {
device->stats.send.errors++;
atomic_add((int32*)&device->stats.send.errors, 1);
if (allocated)
gBufferModule->free(allocated);
return errno;
}
device->stats.send.packets++;
device->stats.send.bytes += bytesWritten;
atomic_add((int32*)&device->stats.send.packets, 1);
atomic_add64((int64*)&device->stats.send.bytes, bytesWritten);
gBufferModule->free(original);
if (allocated)
@ -382,7 +382,7 @@ ethernet_receive_data(net_device *_device, net_buffer **_buffer)
bytesRead = read(device->fd, iovec.iov_base, iovec.iov_len);
if (bytesRead < 0) {
device->stats.receive.errors++;
atomic_add((int32*)&device->stats.receive.errors, 1);
status = errno;
goto err;
}
@ -393,12 +393,12 @@ ethernet_receive_data(net_device *_device, net_buffer **_buffer)
else
status = gBufferModule->trim(buffer, bytesRead);
if (status < B_OK) {
device->stats.receive.dropped++;
atomic_add((int32*)&device->stats.receive.dropped, 1);
goto err;
}
device->stats.receive.bytes += bytesRead;
device->stats.receive.packets++;
atomic_add((int32*)&device->stats.receive.packets, 1);
atomic_add64((int64*)&device->stats.receive.bytes, bytesRead);
*_buffer = buffer;
return B_OK;