From: Ben Pfaff Date: Thu, 12 Jul 2012 17:15:35 +0000 (-0700) Subject: rconn: Add byte counting feature to rconn_packet_counter. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=openvswitch;a=commitdiff_plain;h=a644168568471eb33f8d1e60e872859f4e5bbc69 rconn: Add byte counting feature to rconn_packet_counter. Signed-off-by: Ben Pfaff --- diff --git a/lib/rconn.c b/lib/rconn.c index 3241ab8b..1129a3b7 100644 --- a/lib/rconn.c +++ b/lib/rconn.c @@ -587,7 +587,7 @@ rconn_send(struct rconn *rc, struct ofpbuf *b, copy_to_monitor(rc, b); b->private_p = counter; if (counter) { - rconn_packet_counter_inc(counter); + rconn_packet_counter_inc(counter, b->size); } list_push_back(&rc->txq, &b->list_node); @@ -622,7 +622,9 @@ rconn_send_with_limit(struct rconn *rc, struct ofpbuf *b, struct rconn_packet_counter *counter, int queue_limit) { int retval; - retval = counter->n >= queue_limit ? EAGAIN : rconn_send(rc, b, counter); + retval = (counter->n_packets >= queue_limit + ? EAGAIN + : rconn_send(rc, b, counter)); if (retval) { COVERAGE_INC(rconn_overflow); } @@ -872,8 +874,7 @@ rconn_count_txqlen(const struct rconn *rc) struct rconn_packet_counter * rconn_packet_counter_create(void) { - struct rconn_packet_counter *c = xmalloc(sizeof *c); - c->n = 0; + struct rconn_packet_counter *c = xzalloc(sizeof *c); c->ref_cnt = 1; return c; } @@ -883,24 +884,32 @@ rconn_packet_counter_destroy(struct rconn_packet_counter *c) { if (c) { assert(c->ref_cnt > 0); - if (!--c->ref_cnt && !c->n) { + if (!--c->ref_cnt && !c->n_packets) { free(c); } } } void -rconn_packet_counter_inc(struct rconn_packet_counter *c) +rconn_packet_counter_inc(struct rconn_packet_counter *c, unsigned int n_bytes) { - c->n++; + c->n_packets++; + c->n_bytes += n_bytes; } void -rconn_packet_counter_dec(struct rconn_packet_counter *c) +rconn_packet_counter_dec(struct rconn_packet_counter *c, unsigned int n_bytes) { - assert(c->n > 0); - if (!--c->n && !c->ref_cnt) { - free(c); + assert(c->n_packets > 0); + assert(c->n_bytes >= n_bytes); + + c->n_bytes -= n_bytes; + c->n_packets--; + if (!c->n_packets) { + assert(!c->n_bytes); + if (!c->ref_cnt) { + free(c); + } } } @@ -927,6 +936,7 @@ static int try_send(struct rconn *rc) { struct ofpbuf *msg = ofpbuf_from_list(rc->txq.next); + unsigned int n_bytes = msg->size; struct rconn_packet_counter *counter = msg->private_p; int retval; @@ -947,7 +957,7 @@ try_send(struct rconn *rc) COVERAGE_INC(rconn_sent); rc->packets_sent++; if (counter) { - rconn_packet_counter_dec(counter); + rconn_packet_counter_dec(counter, n_bytes); } return 0; } @@ -1027,7 +1037,7 @@ flush_queue(struct rconn *rc) struct ofpbuf *b = ofpbuf_from_list(list_pop_front(&rc->txq)); struct rconn_packet_counter *counter = b->private_p; if (counter) { - rconn_packet_counter_dec(counter); + rconn_packet_counter_dec(counter, b->size); } COVERAGE_INC(rconn_discarded); ofpbuf_delete(b); diff --git a/lib/rconn.h b/lib/rconn.h index e4b73fc1..64eca532 100644 --- a/lib/rconn.h +++ b/lib/rconn.h @@ -94,21 +94,16 @@ unsigned int rconn_get_connection_seqno(const struct rconn *); int rconn_get_last_error(const struct rconn *); unsigned int rconn_count_txqlen(const struct rconn *); -/* Counts the number of packets queued into an rconn by a given source. */ +/* Counts packets and bytes queued into an rconn by a given source. */ struct rconn_packet_counter { - int n; /* Number of packets queued. */ + unsigned int n_packets; /* Number of packets queued. */ + unsigned int n_bytes; /* Number of bytes queued. */ int ref_cnt; /* Number of owners. */ }; struct rconn_packet_counter *rconn_packet_counter_create(void); void rconn_packet_counter_destroy(struct rconn_packet_counter *); -void rconn_packet_counter_inc(struct rconn_packet_counter *); -void rconn_packet_counter_dec(struct rconn_packet_counter *); - -static inline int -rconn_packet_counter_read(const struct rconn_packet_counter *counter) -{ - return counter->n; -} +void rconn_packet_counter_inc(struct rconn_packet_counter *, unsigned n_bytes); +void rconn_packet_counter_dec(struct rconn_packet_counter *, unsigned n_bytes); #endif /* rconn.h */ diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c index 18b80b87..3e750d24 100644 --- a/ofproto/connmgr.c +++ b/ofproto/connmgr.c @@ -1128,7 +1128,7 @@ ofconn_reconfigure(struct ofconn *ofconn, const struct ofproto_controller *c) static bool ofconn_may_recv(const struct ofconn *ofconn) { - int count = rconn_packet_counter_read (ofconn->reply_counter); + int count = ofconn->reply_counter->n_packets; return (!ofconn->blocked || ofconn->retry) && count < OFCONN_REPLY_MAX; }