mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 00:56:19 +00:00
Merge pull request #8570 from qlyoung/revert-ringbuf-readv
Revert "bgpd: improve socket read performance"
This commit is contained in:
commit
c962ab93a8
@ -462,10 +462,13 @@ done : {
|
|||||||
*/
|
*/
|
||||||
static uint16_t bgp_read(struct peer *peer, int *code_p)
|
static uint16_t bgp_read(struct peer *peer, int *code_p)
|
||||||
{
|
{
|
||||||
|
size_t readsize; // how many bytes we want to read
|
||||||
ssize_t nbytes; // how many bytes we actually read
|
ssize_t nbytes; // how many bytes we actually read
|
||||||
uint16_t status = 0;
|
uint16_t status = 0;
|
||||||
|
|
||||||
nbytes = ringbuf_read(peer->ibuf_work, peer->fd);
|
readsize =
|
||||||
|
MIN(ringbuf_space(peer->ibuf_work), sizeof(peer->ibuf_scratch));
|
||||||
|
nbytes = read(peer->fd, peer->ibuf_scratch, readsize);
|
||||||
|
|
||||||
/* EAGAIN or EWOULDBLOCK; come back later */
|
/* EAGAIN or EWOULDBLOCK; come back later */
|
||||||
if (nbytes < 0 && ERRNO_IO_RETRY(errno)) {
|
if (nbytes < 0 && ERRNO_IO_RETRY(errno)) {
|
||||||
@ -493,6 +496,9 @@ static uint16_t bgp_read(struct peer *peer, int *code_p)
|
|||||||
*code_p = TCP_connection_closed;
|
*code_p = TCP_connection_closed;
|
||||||
|
|
||||||
SET_FLAG(status, BGP_IO_FATAL_ERR);
|
SET_FLAG(status, BGP_IO_FATAL_ERR);
|
||||||
|
} else {
|
||||||
|
assert(ringbuf_put(peer->ibuf_work, peer->ibuf_scratch, nbytes)
|
||||||
|
== (size_t)nbytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#include "bgp_addpath_types.h"
|
#include "bgp_addpath_types.h"
|
||||||
#include "bgp_nexthop.h"
|
#include "bgp_nexthop.h"
|
||||||
#include "bgp_damp.h"
|
#include "bgp_damp.h"
|
||||||
|
#include "bgp_io.h"
|
||||||
|
|
||||||
#include "lib/bfd.h"
|
#include "lib/bfd.h"
|
||||||
|
|
||||||
@ -1047,6 +1048,9 @@ struct peer {
|
|||||||
struct stream_fifo *ibuf; // packets waiting to be processed
|
struct stream_fifo *ibuf; // packets waiting to be processed
|
||||||
struct stream_fifo *obuf; // packets waiting to be written
|
struct stream_fifo *obuf; // packets waiting to be written
|
||||||
|
|
||||||
|
/* used as a block to deposit raw wire data to */
|
||||||
|
uint8_t ibuf_scratch[BGP_MAX_EXTENDED_MESSAGE_PACKET_SIZE
|
||||||
|
* BGP_READ_PACKET_MAX];
|
||||||
struct ringbuf *ibuf_work; // WiP buffer used by bgp_read() only
|
struct ringbuf *ibuf_work; // WiP buffer used by bgp_read() only
|
||||||
struct stream *obuf_work; // WiP buffer used to construct packets
|
struct stream *obuf_work; // WiP buffer used to construct packets
|
||||||
|
|
||||||
|
@ -131,38 +131,3 @@ void ringbuf_wipe(struct ringbuf *buf)
|
|||||||
memset(buf->data, 0x00, buf->size);
|
memset(buf->data, 0x00, buf->size);
|
||||||
ringbuf_reset(buf);
|
ringbuf_reset(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t ringbuf_read(struct ringbuf *buf, int sock)
|
|
||||||
{
|
|
||||||
size_t to_read = ringbuf_space(buf);
|
|
||||||
size_t bytes_to_end = buf->size - buf->end;
|
|
||||||
ssize_t bytes_read;
|
|
||||||
struct iovec iov[2] = {};
|
|
||||||
|
|
||||||
/* Calculate amount of read blocks. */
|
|
||||||
if (to_read > bytes_to_end) {
|
|
||||||
iov[0].iov_base = buf->data + buf->end;
|
|
||||||
iov[0].iov_len = bytes_to_end;
|
|
||||||
iov[1].iov_base = buf->data;
|
|
||||||
iov[1].iov_len = to_read - bytes_to_end;
|
|
||||||
} else {
|
|
||||||
iov[0].iov_base = buf->data + buf->end;
|
|
||||||
iov[0].iov_len = to_read;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Do the system call. */
|
|
||||||
bytes_read = readv(sock, iov, 2);
|
|
||||||
if (bytes_read <= 0)
|
|
||||||
return bytes_read;
|
|
||||||
|
|
||||||
/* Calculate the new end. */
|
|
||||||
if ((size_t)bytes_read > bytes_to_end)
|
|
||||||
buf->end = bytes_read - bytes_to_end;
|
|
||||||
else
|
|
||||||
buf->end += bytes_read;
|
|
||||||
|
|
||||||
/* Set emptiness state. */
|
|
||||||
buf->empty = (buf->start == buf->end) && (buf->empty && !bytes_read);
|
|
||||||
|
|
||||||
return bytes_read;
|
|
||||||
}
|
|
||||||
|
@ -126,17 +126,6 @@ void ringbuf_reset(struct ringbuf *buf);
|
|||||||
*/
|
*/
|
||||||
void ringbuf_wipe(struct ringbuf *buf);
|
void ringbuf_wipe(struct ringbuf *buf);
|
||||||
|
|
||||||
/**
|
|
||||||
* Perform a socket/file `read()` in to the ring buffer.
|
|
||||||
*
|
|
||||||
* \param buf the ring buffer pointer.
|
|
||||||
* \param sock the file descriptor.
|
|
||||||
* \returns the number of bytes read, `0` on connection close or `-1` with
|
|
||||||
* `errno` pointing the error (see `readv()` man page for more
|
|
||||||
* information.)
|
|
||||||
*/
|
|
||||||
ssize_t ringbuf_read(struct ringbuf *buf, int sock);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user