From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752207AbbINWpT (ORCPT ); Mon, 14 Sep 2015 18:45:19 -0400 Received: from linuxhacker.ru ([217.76.32.60]:44260 "EHLO fiona.linuxhacker.ru" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1751848AbbINWmV (ORCPT ); Mon, 14 Sep 2015 18:42:21 -0400 From: green@linuxhacker.ru To: Greg Kroah-Hartman , devel@driverdev.osuosl.org, Andreas Dilger Cc: Linux Kernel Mailing List , Liang Zhen , Oleg Drokin Subject: [PATCH 11/19] staging/lustre/lnet: fix deadloop in ksocknal_push Date: Mon, 14 Sep 2015 18:41:27 -0400 Message-Id: <1442270495-1655259-12-git-send-email-green@linuxhacker.ru> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1442270495-1655259-1-git-send-email-green@linuxhacker.ru> References: <1442270495-1655259-1-git-send-email-green@linuxhacker.ru> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Liang Zhen ksocknal_push() should break the loop if it can't find matching peer Signed-off-by: Liang Zhen Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-4423 Reviewed-on: http://review.whamcloud.com/10128 Reviewed-by: James Simmons Reviewed-by: Doug Oucharek Reviewed-by: Isaac Huang Signed-off-by: Oleg Drokin --- .../staging/lustre/lnet/klnds/socklnd/socklnd.c | 51 +++++++++++----------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c index d8bfcad..22f4cd0 100644 --- a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c +++ b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c @@ -1874,52 +1874,51 @@ ksocknal_push_peer(ksock_peer_t *peer) } } -static int -ksocknal_push(lnet_ni_t *ni, lnet_process_id_t id) +static int ksocknal_push(lnet_ni_t *ni, lnet_process_id_t id) { - ksock_peer_t *peer; + struct list_head *start; + struct list_head *end; struct list_head *tmp; - int index; - int i; - int j; int rc = -ENOENT; + unsigned int hsize = ksocknal_data.ksnd_peer_hash_size; - for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) { - for (j = 0; ; j++) { - read_lock(&ksocknal_data.ksnd_global_lock); + if (id.nid == LNET_NID_ANY) { + start = &ksocknal_data.ksnd_peers[0]; + end = &ksocknal_data.ksnd_peers[hsize - 1]; + } else { + start = end = ksocknal_nid2peerlist(id.nid); + } - index = 0; - peer = NULL; + for (tmp = start; tmp <= end; tmp++) { + int peer_off; /* searching offset in peer hash table */ - list_for_each(tmp, &ksocknal_data.ksnd_peers[i]) { - peer = list_entry(tmp, ksock_peer_t, - ksnp_list); + for (peer_off = 0; ; peer_off++) { + ksock_peer_t *peer; + int i = 0; + read_lock(&ksocknal_data.ksnd_global_lock); + list_for_each_entry(peer, tmp, ksnp_list) { if (!((id.nid == LNET_NID_ANY || id.nid == peer->ksnp_id.nid) && (id.pid == LNET_PID_ANY || - id.pid == peer->ksnp_id.pid))) { - peer = NULL; + id.pid == peer->ksnp_id.pid))) continue; - } - if (index++ == j) { + if (i++ == peer_off) { ksocknal_peer_addref(peer); break; } } - read_unlock(&ksocknal_data.ksnd_global_lock); - if (peer != NULL) { - rc = 0; - ksocknal_push_peer(peer); - ksocknal_peer_decref(peer); - } - } + if (i == 0) /* no match */ + break; + rc = 0; + ksocknal_push_peer(peer); + ksocknal_peer_decref(peer); + } } - return rc; } -- 2.1.0