From patchwork Wed Jun 13 16:41:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Varsha Rao X-Patchwork-Id: 928979 X-Patchwork-Delegate: pablo@netfilter.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netfilter-devel-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="iFT2DSIF"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 415XbD1Y6nz9s3C for ; Thu, 14 Jun 2018 02:42:00 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934925AbeFMQl7 (ORCPT ); Wed, 13 Jun 2018 12:41:59 -0400 Received: from mail-pg0-f67.google.com ([74.125.83.67]:41977 "EHLO mail-pg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934388AbeFMQl6 (ORCPT ); Wed, 13 Jun 2018 12:41:58 -0400 Received: by mail-pg0-f67.google.com with SMTP id l65-v6so1541461pgl.8 for ; Wed, 13 Jun 2018 09:41:58 -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; bh=yi5ogOqShmsOp5fQjsWuDGv2eocGi/5rJqmudDWR2Mo=; b=iFT2DSIFc4dkaEJ9HB59pLxTI1utAZhjNRIcD5lXcP8LBAGsEODOSO9A7tfyMYnM46 wZljZAaJDb1R5ld4POkOaA8bimf/kS8FYtOh8xOUyEWLfjoIqXOPaXxE2qfXcgxdikWk AgViN2L6WCJw3y2Xea8t+E7QN2RwH7soIW+LZLVCxLVh+XnXOF6jCj+oYAMg3UwI8IuL cNeCDLwxDlK4DUiIpMl2h0M7ziWX4+jtODO0wC6tx+i1O5TtiWmUB2oEPVM5TR8hLJ3s 07TXsR3aNmV/ymnaok46mMM7Mj+bp7dANi3oFi2I3lwb65GRry/AQZMoT3RElTPCI1bU HeNg== 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; bh=yi5ogOqShmsOp5fQjsWuDGv2eocGi/5rJqmudDWR2Mo=; b=hyyUnhk3xWDtRUIcUeqNR7I3GTVMFx2rQFb6+3mFblaywcgcGdiDSbsmrAkjMORnVd qOTeOct+y0gZbrpD2LNplo6sTFZGkyW4LrP58OVyCb2SVw8cj9TcSsQvJVQ574vuLQY6 ZuhPDarilwxp6mNAX7JWA94F6zefFbT/G32k40QjQR1EYoqdglF22zR7ASBS/rCGS02k EE0zX/DPt3G4E2GL0SsL5rKY3KyWJw2q5M1mz/pGuAQYsTAiOv+1HZimYYcA2gkCkEoZ ++RRwNWNvP9qHUj4OwCkrjHaPkpTMzuC6X8GO+Td+x7jM7pj5ww4Nwy3ByV0vnbUUJ89 mFow== X-Gm-Message-State: APt69E3dZUVLmQ5cyr18rZAXR8i0tnxIe0zRUnnkqqeKUydI+9VUd4k5 IX8JBVvAadAKvwrCiPwaAxxEXjch X-Google-Smtp-Source: ADUXVKLo4t3Cb84vrs47E6OeIZ/upUaPG61o8XkexqbLRjr+CcK/B8/hmitNVCsiXxFw0OWUYphong== X-Received: by 2002:a63:4346:: with SMTP id q67-v6mr4690207pga.328.1528908117858; Wed, 13 Jun 2018 09:41:57 -0700 (PDT) Received: from localhost.localdomain ([2409:4071:228c:15bc:7fcc:8371:2371:35cc]) by smtp.googlemail.com with ESMTPSA id c19-v6sm4664251pfn.182.2018.06.13.09.41.55 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 13 Jun 2018 09:41:57 -0700 (PDT) From: Varsha Rao To: Pablo Neira Ayuso , netfilter-devel@vger.kernel.org Cc: Varsha Rao Subject: [PATCH nf-next v4] net: netfilter: nf_tables_api: Use id allocation. Date: Wed, 13 Jun 2018 22:11:43 +0530 Message-Id: <20180613164143.19232-1-rvarsha016@gmail.com> X-Mailer: git-send-email 2.17.0 Sender: netfilter-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netfilter-devel@vger.kernel.org In nf_tables_set_alloc_name function, remove get_zeroed_page find_first_zero_bit and set_bit functions. Instead use ida_get_new_above function as it simplifies the code. Signed-off-by: Varsha Rao --- Changes in v2: - Modified the upper limit of page size. Changes in v3: - Used ida_get_new_above instead of ida_simple_get due to internal locking. - Defined macro NFT_SET_IDA_SIZE. - Modified commit message. Changes in v4: - Removed -EAGAIN return value. - Updated NFT_SET_IDA_SIZE value. net/netfilter/nf_tables_api.c | 49 ++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index ca4c4d994ddb..7f6e164607a9 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c @@ -2919,46 +2919,47 @@ struct nft_set *nft_set_lookup_global(const struct net *net, } EXPORT_SYMBOL_GPL(nft_set_lookup_global); +#define NFT_SET_IDA_SIZE (8 * _BITUL(12)) + static int nf_tables_set_alloc_name(struct nft_ctx *ctx, struct nft_set *set, const char *name) { const struct nft_set *i; const char *p; - unsigned long *inuse; - unsigned int n = 0, min = 0; + int n = 0, id; + DEFINE_IDA(inuse); p = strchr(name, '%'); if (p != NULL) { if (p[1] != 'd' || strchr(p + 2, '%')) return -EINVAL; - inuse = (unsigned long *)get_zeroed_page(GFP_KERNEL); - if (inuse == NULL) - return -ENOMEM; -cont: - list_for_each_entry(i, &ctx->table->sets, list) { - int tmp; + list_for_each_entry(i, &ctx->table->sets, list) { + int tmp; - if (!nft_is_active_next(ctx->net, set)) - continue; - if (!sscanf(i->name, name, &tmp)) - continue; - if (tmp < min || tmp >= min + BITS_PER_BYTE * PAGE_SIZE) - continue; + if (!nft_is_active_next(ctx->net, set)) + continue; + if (!sscanf(i->name, name, &tmp)) + continue; + if (tmp < 0 || tmp >= NFT_SET_IDA_SIZE) + continue; - set_bit(tmp - min, inuse); - } + n = ida_get_new_above(&inuse, tmp, &id); + if ((n < 0) && (n != -EAGAIN)) + return n; + } + n = ida_get_new_above(&inuse, 0, &id); - n = find_first_zero_bit(inuse, BITS_PER_BYTE * PAGE_SIZE); - if (n >= BITS_PER_BYTE * PAGE_SIZE) { - min += BITS_PER_BYTE * PAGE_SIZE; - memset(inuse, 0, PAGE_SIZE); - goto cont; - } - free_page((unsigned long)inuse); + if ((n < 0) && (n != -EAGAIN)) { + if (n == -ENOSPC) + ida_destroy(&inuse); + return n; + } + + ida_destroy(&inuse); } - set->name = kasprintf(GFP_KERNEL, name, min + n); + set->name = kasprintf(GFP_KERNEL, name, id); if (!set->name) return -ENOMEM;