From patchwork Wed Jun 3 00:59:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Simmons X-Patchwork-Id: 11584737 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BB3651391 for ; Wed, 3 Jun 2020 01:00:27 +0000 (UTC) Received: from pdx1-mailman02.dreamhost.com (pdx1-mailman02.dreamhost.com [64.90.62.194]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A3DDD2072F for ; Wed, 3 Jun 2020 01:00:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A3DDD2072F Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lustre-devel-bounces@lists.lustre.org Received: from pdx1-mailman02.dreamhost.com (localhost [IPv6:::1]) by pdx1-mailman02.dreamhost.com (Postfix) with ESMTP id 886C621F98D; Tue, 2 Jun 2020 18:00:16 -0700 (PDT) X-Original-To: lustre-devel@lists.lustre.org Delivered-To: lustre-devel-lustre.org@pdx1-mailman02.dreamhost.com Received: from smtp3.ccs.ornl.gov (smtp3.ccs.ornl.gov [160.91.203.39]) by pdx1-mailman02.dreamhost.com (Postfix) with ESMTP id 4FD3521F37D for ; Tue, 2 Jun 2020 18:00:07 -0700 (PDT) Received: from star.ccs.ornl.gov (star.ccs.ornl.gov [160.91.202.134]) by smtp3.ccs.ornl.gov (Postfix) with ESMTP id 6C50D60A; Tue, 2 Jun 2020 21:00:02 -0400 (EDT) Received: by star.ccs.ornl.gov (Postfix, from userid 2004) id 652702D1; Tue, 2 Jun 2020 21:00:02 -0400 (EDT) From: James Simmons To: Andreas Dilger , Oleg Drokin , NeilBrown Date: Tue, 2 Jun 2020 20:59:45 -0400 Message-Id: <1591146001-27171-7-git-send-email-jsimmons@infradead.org> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1591146001-27171-1-git-send-email-jsimmons@infradead.org> References: <1591146001-27171-1-git-send-email-jsimmons@infradead.org> Subject: [lustre-devel] [PATCH 06/22] lnet: tidy lnet_discover and fix mem accounting bug. X-BeenThere: lustre-devel@lists.lustre.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "For discussing Lustre software development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Lustre Development List MIME-Version: 1.0 Errors-To: lustre-devel-bounces@lists.lustre.org Sender: "lustre-devel" From: Mr NeilBrown A recent patch introduce a memory accounting bug because "n_ids" can change between the ALLOC call and the FREE call. With this patch we fix that by ensuring n_ids doesn't change - the current change is not needed. Also: - discard 'max_intf' var. It is always exactly lnet_interfaces_max, so just use that directly. - only copy back the number of interfaces found - report the number of interfaces actually copied. - Move the copy_to_user until after all locks and references are dropped so there is no need to re-take any locks. WC-bug-id: https://jira.whamcloud.com/browse/LU-9679 Lustre-commit: 45722de60a8fb ("LU-9679 lnet: tidy lnet_discover and fix mem accounting bug.") Signed-off-by: Mr NeilBrown Reviewed-on: https://review.whamcloud.com/38644 Reviewed-by: Shaun Tancheff Reviewed-by: Chris Horn Reviewed-by: Oleg Drokin Signed-off-by: James Simmons --- net/lnet/lnet/api-ni.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/net/lnet/lnet/api-ni.c b/net/lnet/lnet/api-ni.c index e2c364b..629a597 100644 --- a/net/lnet/lnet/api-ni.c +++ b/net/lnet/lnet/api-ni.c @@ -4163,7 +4163,6 @@ static int lnet_ping(struct lnet_process_id id, signed long timeout, int cpt; int i; int rc; - int max_intf = lnet_interfaces_max; if (n_ids <= 0 || id.nid == LNET_NID_ANY) @@ -4172,11 +4171,11 @@ static int lnet_ping(struct lnet_process_id id, signed long timeout, if (id.pid == LNET_PID_ANY) id.pid = LNET_PID_LUSTRE; - /* if the user buffer has more space than the max_intf - * then only fill it up to max_intf + /* If the user buffer has more space than the lnet_interfaces_max, + * then only fill it up to lnet_interfaces_max. */ - if (n_ids > max_intf) - n_ids = max_intf; + if (n_ids > lnet_interfaces_max) + n_ids = lnet_interfaces_max; buf = kcalloc(n_ids, sizeof(*buf), GFP_KERNEL); if (!buf) @@ -4204,11 +4203,6 @@ static int lnet_ping(struct lnet_process_id id, signed long timeout, if (rc) goto out_decref; - /* Peer may have changed. */ - lp = lpni->lpni_peer_net->lpn_peer; - if (lp->lp_nnis < n_ids) - n_ids = lp->lp_nnis; - i = 0; p = NULL; while ((p = lnet_get_next_peer_ni_locked(lp, NULL, p)) != NULL) { @@ -4217,20 +4211,18 @@ static int lnet_ping(struct lnet_process_id id, signed long timeout, if (++i >= n_ids) break; } + rc = i; - lnet_net_unlock(cpt); - - rc = -EFAULT; - if (copy_to_user(ids, buf, n_ids * sizeof(*buf))) - goto out_relock; - rc = n_ids; -out_relock: - lnet_net_lock(cpt); out_decref: lnet_peer_ni_decref_locked(lpni); out: lnet_net_unlock(cpt); + + if (rc >= 0) + if (copy_to_user(ids, buf, rc * sizeof(*buf))) + rc = -EFAULT; kfree(buf); + return rc; }