From cce84e4a24c37e6055769208503437c47787fa2a Mon Sep 17 00:00:00 2001 From: Michael Blizek Date: Tue, 23 Mar 2010 19:48:21 +0100 Subject: [PATCH] ping locking --- net/cor/cor.h | 6 ++++-- net/cor/neighbor.c | 29 ++++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/net/cor/cor.h b/net/cor/cor.h index cac396aefe1..323e33f2e79 100644 --- a/net/cor/cor.h +++ b/net/cor/cor.h @@ -282,8 +282,10 @@ struct neighbor{ __u32 length; - unsigned long last_ping_time; - __u32 noping_cnt; + unsigned long last_ping_time; /* protected by cmsg_lock */ + __u32 noping_cnt;/* protected by cmsg_lock */ + + struct mutex pingcookie_lock; __u32 ping_intransit; struct ping_cookie cookies[PING_COOKIES_PER_NEIGH]; __u32 lastcookie; diff --git a/net/cor/neighbor.c b/net/cor/neighbor.c index 7b68aef31bf..73238a6dc19 100644 --- a/net/cor/neighbor.c +++ b/net/cor/neighbor.c @@ -130,6 +130,7 @@ static struct neighbor *alloc_neighbor(gfp_t allocflags) nb->last_ping_time = jiffies; atomic_set(&(nb->ooo_packets), 0); get_random_bytes((char *) &seqno, sizeof(seqno)); + mutex_init(&(nb->pingcookie_lock)); atomic_set(&(nb->kpacket_seqno), seqno); atomic_set(&(nb->latency), 0); mutex_init(&(nb->conn_list_lock)); @@ -284,13 +285,17 @@ static struct ping_cookie *find_cookie(struct neighbor *nb, __u32 cookie) void ping_resp(struct neighbor *nb, __u32 cookie, __u32 respdelay) { - struct ping_cookie *c = find_cookie(nb, cookie); + struct ping_cookie *c; int i; __s64 newlatency; + mutex_lock(&(nb->pingcookie_lock)); + + c = find_cookie(nb, cookie); + if (c == 0) - return; + goto out; newlatency = ((((__s64) ((__u32)atomic_read(&(nb->latency)))) * 15 + jiffies_to_usecs(jiffies - c->time) - respdelay) / 16); @@ -315,6 +320,8 @@ void ping_resp(struct neighbor *nb, __u32 cookie, __u32 respdelay) } } } +out: + mutex_unlock(&(nb->pingcookie_lock)); } __u32 add_ping_req(struct neighbor *nb) @@ -322,6 +329,10 @@ __u32 add_ping_req(struct neighbor *nb) struct ping_cookie *c; int i; + __u32 cookie; + + mutex_lock(&(nb->pingcookie_lock)); + for (i=0;icookies[i].cookie == 0) goto found; @@ -341,8 +352,12 @@ found: c->cookie = nb->lastcookie; nb->ping_intransit++; + + cookie = c->cookie; + + mutex_unlock(&(nb->pingcookie_lock)); - return c->cookie; + return cookie; } @@ -355,6 +370,9 @@ found: */ int time_to_send_ping(struct neighbor *nb) { + int rc = 1; + + mutex_lock(&(nb->pingcookie_lock)); if (nb->ping_intransit >= PING_COOKIES_NOTHROTTLE) { __u32 mindelay = (((__u32)atomic_read(&(nb->latency)))/1000) << (nb->ping_intransit + 1 - @@ -363,10 +381,11 @@ int time_to_send_ping(struct neighbor *nb) mindelay = PING_THROTTLE_LIMIT_MS; if (jiffies_to_msecs(jiffies - nb->last_ping_time) < mindelay) - return 0; + rc = 0; } + mutex_unlock(&(nb->pingcookie_lock)); - return 1; + return rc; } static void add_neighbor(struct neighbor *nb) -- 2.11.4.GIT