From patchwork Mon Oct 1 14:41:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 10622265 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 39E1115E8 for ; Mon, 1 Oct 2018 14:42:28 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1F18A290FE for ; Mon, 1 Oct 2018 14:42:28 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 134AB29396; Mon, 1 Oct 2018 14:42:28 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 041EE2921C for ; Mon, 1 Oct 2018 14:42:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729493AbeJAVUe (ORCPT ); Mon, 1 Oct 2018 17:20:34 -0400 Received: from mail-it1-f196.google.com ([209.85.166.196]:37266 "EHLO mail-it1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729487AbeJAVUe (ORCPT ); Mon, 1 Oct 2018 17:20:34 -0400 Received: by mail-it1-f196.google.com with SMTP id m9-v6so11756973ita.2 for ; Mon, 01 Oct 2018 07:42:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=r+Gug+c0xMBDhawUH83hv1SalLcTz8PprXfSPSIZcEk=; b=uhoOKNfLuqPIFZ8FL5x99wXyBfpmCPqGHkXxAAnd2vPauKD1/rPCXhVJDeXJPNuW5Y RjveHT5ed3FwT5SNmLB8KP+CknbHuH7dy8EYmw2QmkwNoLmJmkzdkYBeX6hIGbiaygdk HKFg0Vy4+XChL9cxl6guHqO55sXZug7GprrHp9CxOx64hAinjYSopd8aBEaIAXXvHQ/2 t/wnb76CiNQQOVUm12qFYNVzq5OK4ULFnN+oHYlVxgQ+RVSZ7uo60m8uDTS1EAKD3IiE 6cOHi+b7//BXCG6acjV4pvYyeqW246E6JJwG4qZfJ3ulEPk9T+f6Budpo+FvMjdSmwyn 1tqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=r+Gug+c0xMBDhawUH83hv1SalLcTz8PprXfSPSIZcEk=; b=kv9Kx13CJrRyiOm0uS6QcE+JFuTijtdZwIzO4Yi/8vQN0hBV13sy44Ypw3BBvRXBFn 4sbqeLVF7icY3aakgfRdWA8Vu5Yq5nvcJZ3Yo5X8nv4NC65jcDbTMzxgmVy9eJDcWqFb 3/X/Lvuc1TQY+Qhx2BqMoZcSItYlkcyvFQNrEjF4upblxksFU1pcuteHWEYiqer4y2Nq S1wwQNE4dpxy97TiKVkWm/3lfaDXd25J00288AkWpVtoWUd7E02uqsUb7Ps83b56IL0r N30KmSfjpkfIWDHjPpmUwgICko2yxjEUPYFsnYdEyVD9XQPWBbQJrxW21gF+sbabL6GH sVYg== X-Gm-Message-State: ABuFfoiGmX8mY1OLxbu36pjm23zOLOLEeDrAGPwk4VOvLfNOxZIw7TRd HMvw2aToLdi1N52cTDr9zQ== X-Google-Smtp-Source: ACcGV61AXXPXeZw6IESdX3aI1cBMQy3wSvJN6iqbV/MT9SUdxkvaz/St/G8v6xNJZNJS3g0Y0uLD+Q== X-Received: by 2002:a24:75ca:: with SMTP id y193-v6mr9414241itc.70.1538404944764; Mon, 01 Oct 2018 07:42:24 -0700 (PDT) Received: from leira.trondhjem.org.localdomain (c-68-40-195-73.hsd1.mi.comcast.net. [68.40.195.73]) by smtp.gmail.com with ESMTPSA id j75-v6sm2055597itj.33.2018.10.01.07.42.24 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 01 Oct 2018 07:42:24 -0700 (PDT) From: Trond Myklebust X-Google-Original-From: Trond Myklebust To: "J . Bruce Fields" Cc: linux-nfs@vger.kernel.org Subject: [PATCH 06/15] SUNRPC: Lockless server RPCSEC_GSS context lookup Date: Mon, 1 Oct 2018 10:41:48 -0400 Message-Id: <20181001144157.3515-7-trond.myklebust@hammerspace.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181001144157.3515-6-trond.myklebust@hammerspace.com> References: <20181001144157.3515-1-trond.myklebust@hammerspace.com> <20181001144157.3515-2-trond.myklebust@hammerspace.com> <20181001144157.3515-3-trond.myklebust@hammerspace.com> <20181001144157.3515-4-trond.myklebust@hammerspace.com> <20181001144157.3515-5-trond.myklebust@hammerspace.com> <20181001144157.3515-6-trond.myklebust@hammerspace.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Use RCU protection for looking up the RPCSEC_GSS context. Signed-off-by: Trond Myklebust --- net/sunrpc/auth_gss/svcauth_gss.c | 32 +++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c index 87c71fb0f0ea..1ece4bc3eb8d 100644 --- a/net/sunrpc/auth_gss/svcauth_gss.c +++ b/net/sunrpc/auth_gss/svcauth_gss.c @@ -76,6 +76,7 @@ struct rsi { struct xdr_netobj in_handle, in_token; struct xdr_netobj out_handle, out_token; int major_status, minor_status; + struct rcu_head rcu_head; }; static struct rsi *rsi_update(struct cache_detail *cd, struct rsi *new, struct rsi *old); @@ -89,13 +90,21 @@ static void rsi_free(struct rsi *rsii) kfree(rsii->out_token.data); } -static void rsi_put(struct kref *ref) +static void rsi_free_rcu(struct rcu_head *head) { - struct rsi *rsii = container_of(ref, struct rsi, h.ref); + struct rsi *rsii = container_of(head, struct rsi, rcu_head); + rsi_free(rsii); kfree(rsii); } +static void rsi_put(struct kref *ref) +{ + struct rsi *rsii = container_of(ref, struct rsi, h.ref); + + call_rcu(&rsii->rcu_head, rsi_free_rcu); +} + static inline int rsi_hash(struct rsi *item) { return hash_mem(item->in_handle.data, item->in_handle.len, RSI_HASHBITS) @@ -282,7 +291,7 @@ static struct rsi *rsi_lookup(struct cache_detail *cd, struct rsi *item) struct cache_head *ch; int hash = rsi_hash(item); - ch = sunrpc_cache_lookup(cd, &item->h, hash); + ch = sunrpc_cache_lookup_rcu(cd, &item->h, hash); if (ch) return container_of(ch, struct rsi, h); else @@ -330,6 +339,7 @@ struct rsc { struct svc_cred cred; struct gss_svc_seq_data seqdata; struct gss_ctx *mechctx; + struct rcu_head rcu_head; }; static struct rsc *rsc_update(struct cache_detail *cd, struct rsc *new, struct rsc *old); @@ -343,12 +353,22 @@ static void rsc_free(struct rsc *rsci) free_svc_cred(&rsci->cred); } +static void rsc_free_rcu(struct rcu_head *head) +{ + struct rsc *rsci = container_of(head, struct rsc, rcu_head); + + kfree(rsci->handle.data); + kfree(rsci); +} + static void rsc_put(struct kref *ref) { struct rsc *rsci = container_of(ref, struct rsc, h.ref); - rsc_free(rsci); - kfree(rsci); + if (rsci->mechctx) + gss_delete_sec_context(&rsci->mechctx); + free_svc_cred(&rsci->cred); + call_rcu(&rsci->rcu_head, rsc_free_rcu); } static inline int @@ -542,7 +562,7 @@ static struct rsc *rsc_lookup(struct cache_detail *cd, struct rsc *item) struct cache_head *ch; int hash = rsc_hash(item); - ch = sunrpc_cache_lookup(cd, &item->h, hash); + ch = sunrpc_cache_lookup_rcu(cd, &item->h, hash); if (ch) return container_of(ch, struct rsc, h); else