X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Flacp.c;h=4aee64f4835acacb7b724bd897bf1de8f7288535;hb=cfc50ae514f805dcd9c14589f21158185424daf6;hp=9eec1f962d073f500dc0dc4bc67dcc3dfd8cbdd8;hpb=428b2eddc9c47d8306252f0fc5218839d2ff017c;p=sliver-openvswitch.git diff --git a/lib/lacp.c b/lib/lacp.c index 9eec1f962..4aee64f48 100644 --- a/lib/lacp.c +++ b/lib/lacp.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011, 2012, 2013 Nicira, Inc. +/* Copyright (c) 2011, 2012, 2013, 2014 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -106,7 +106,7 @@ struct lacp { bool update; /* True if lacp_update() needs to be called. */ bool fallback_ab; /* True if fallback to active-backup on LACP failure. */ - atomic_int ref_cnt; + struct ovs_refcount ref_cnt; }; struct slave { @@ -181,7 +181,8 @@ parse_lacp_packet(const struct ofpbuf *b) { const struct lacp_pdu *pdu; - pdu = ofpbuf_at(b, (uint8_t *)b->l3 - (uint8_t *)b->data, LACP_PDU_LEN); + pdu = ofpbuf_at(b, (uint8_t *)ofpbuf_l3(b) - (uint8_t *)ofpbuf_data(b), + LACP_PDU_LEN); if (pdu && pdu->subtype == 1 && pdu->actor_type == 1 && pdu->actor_len == 20 @@ -216,7 +217,7 @@ lacp_create(void) OVS_EXCLUDED(mutex) lacp = xzalloc(sizeof *lacp); hmap_init(&lacp->slaves); - atomic_init(&lacp->ref_cnt, 1); + ovs_refcount_init(&lacp->ref_cnt); ovs_mutex_lock(&mutex); list_push_back(all_lacps, &lacp->node); @@ -229,9 +230,7 @@ lacp_ref(const struct lacp *lacp_) { struct lacp *lacp = CONST_CAST(struct lacp *, lacp_); if (lacp) { - int orig; - atomic_add(&lacp->ref_cnt, 1, &orig); - ovs_assert(orig > 0); + ovs_refcount_ref(&lacp->ref_cnt); } return lacp; } @@ -240,15 +239,7 @@ lacp_ref(const struct lacp *lacp_) void lacp_unref(struct lacp *lacp) OVS_EXCLUDED(mutex) { - int orig; - - if (!lacp) { - return; - } - - atomic_sub(&lacp->ref_cnt, 1, &orig); - ovs_assert(orig > 0); - if (orig == 1) { + if (lacp && ovs_refcount_unref(&lacp->ref_cnt) == 1) { struct slave *slave, *next; ovs_mutex_lock(&mutex);