jsonrpc_recv() could take an unbounded amount of CPU time as long as data kept arriving, preventing other work from taking place. This limits the amount of work to processing at most 25 kB of received data and then yielding to the caller.
Signed-off-by: Ben Pfaff <[email protected]> --- lib/jsonrpc.c | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c index fc8a75b..4ebff10 100644 --- a/lib/jsonrpc.c +++ b/lib/jsonrpc.c @@ -277,13 +277,19 @@ jsonrpc_send(struct jsonrpc *rpc, struct jsonrpc_msg *msg) int jsonrpc_recv(struct jsonrpc *rpc, struct jsonrpc_msg **msgp) { + int i; + *msgp = NULL; if (rpc->status) { return rpc->status; } - while (!rpc->received) { - if (byteq_is_empty(&rpc->input)) { + for (i = 0; i < 50; i++) { + if (rpc->received) { + *msgp = rpc->received; + rpc->received = NULL; + return 0; + } else if (byteq_is_empty(&rpc->input)) { size_t chunk; int retval; @@ -328,9 +334,7 @@ jsonrpc_recv(struct jsonrpc *rpc, struct jsonrpc_msg **msgp) } } - *msgp = rpc->received; - rpc->received = NULL; - return 0; + return EAGAIN; } /* Causes the poll loop to wake up when jsonrpc_recv() may return a value other -- 1.7.2.5 _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
