mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-26 23:23:35 +00:00
bgpd: Replace peer->ibuf_scratch
The peer->ibuf_scratch was allocating 65535 * 10 bytes
for scratch space to hold data incoming from a read
from a peer. When you have 4k peers this is 262,1400,000
or 262 mb of data. Which is crazy large. Especially
since the i/o pthread is reading per peer without
any chance of having the data interfere with other reads.
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
(cherry picked from commit bdc1762405
)
This commit is contained in:
parent
577f06b556
commit
cb114f84a7
@ -480,6 +480,7 @@ done : {
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t ibuf_scratch[BGP_EXTENDED_MESSAGE_MAX_PACKET_SIZE * BGP_READ_PACKET_MAX];
|
||||||
/*
|
/*
|
||||||
* Reads a chunk of data from peer->fd into peer->ibuf_work.
|
* Reads a chunk of data from peer->fd into peer->ibuf_work.
|
||||||
*
|
*
|
||||||
@ -487,6 +488,10 @@ done : {
|
|||||||
* Pointer to location to store FSM event code in case of fatal error.
|
* Pointer to location to store FSM event code in case of fatal error.
|
||||||
*
|
*
|
||||||
* @return status flag (see top-of-file)
|
* @return status flag (see top-of-file)
|
||||||
|
*
|
||||||
|
* PLEASE NOTE: If we ever transform the bgp_read to be a pthread
|
||||||
|
* per peer then we need to rethink the global ibuf_scratch
|
||||||
|
* data structure above.
|
||||||
*/
|
*/
|
||||||
static uint16_t bgp_read(struct peer *peer, int *code_p)
|
static uint16_t bgp_read(struct peer *peer, int *code_p)
|
||||||
{
|
{
|
||||||
@ -502,9 +507,9 @@ static uint16_t bgp_read(struct peer *peer, int *code_p)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
readsize = MIN(ibuf_work_space, sizeof(peer->ibuf_scratch));
|
readsize = MIN(ibuf_work_space, sizeof(ibuf_scratch));
|
||||||
|
|
||||||
nbytes = read(peer->fd, peer->ibuf_scratch, readsize);
|
nbytes = read(peer->fd, 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)) {
|
||||||
@ -533,8 +538,8 @@ static uint16_t bgp_read(struct peer *peer, int *code_p)
|
|||||||
|
|
||||||
SET_FLAG(status, BGP_IO_FATAL_ERR);
|
SET_FLAG(status, BGP_IO_FATAL_ERR);
|
||||||
} else {
|
} else {
|
||||||
assert(ringbuf_put(peer->ibuf_work, peer->ibuf_scratch, nbytes)
|
assert(ringbuf_put(peer->ibuf_work, ibuf_scratch, nbytes) ==
|
||||||
== (size_t)nbytes);
|
(size_t)nbytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
@ -1150,9 +1150,6 @@ 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_EXTENDED_MESSAGE_MAX_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 *curr; // the current packet being parsed
|
struct stream *curr; // the current packet being parsed
|
||||||
|
Loading…
Reference in New Issue
Block a user