From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933793AbcLHB3c (ORCPT ); Wed, 7 Dec 2016 20:29:32 -0500 Received: from mail-wj0-f174.google.com ([209.85.210.174]:33759 "EHLO mail-wj0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932372AbcLHB3b (ORCPT ); Wed, 7 Dec 2016 20:29:31 -0500 From: Rasmus Villemoes To: Tejun Heo , Andrew Morton Cc: linux-kernel@vger.kernel.org, Lai Jiangshan , Jens Axboe , Greg Kroah-Hartman , Rasmus Villemoes Subject: [RFC 03/10] lib/idr.c: only fill ida->idr when needed Date: Thu, 8 Dec 2016 02:22:58 +0100 Message-Id: <1481160187-9652-4-git-send-email-linux@rasmusvillemoes.dk> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1481160187-9652-1-git-send-email-linux@rasmusvillemoes.dk> References: <1481160187-9652-1-git-send-email-linux@rasmusvillemoes.dk> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If I'm reading the code correctly, every call of ida_simple_get (and almost all users of ida use that) starts by calling ida_pre_get -> __idr_pre_get which fills up the free list of &ida->idr with MAX_IDR_FREE (aka 8) struct idr_layers. After a successful id allocation, ida_get_new_above gets rid of up to one of these (maybe some were used during the allocation, but in the common case all 8 will still be there). On the next call of ida_simple_get, we again fill up &ida->idr, and deallocate at most one, which at least contradicts the comment at the bottom of ida_get_new_above. So rather than unconditionally calling ida_pre_get in ida_simple_get, only do that if we get -EAGAIN. But I'm not really convinced that this is a good way of doing things. Many users of ida probably only ever allocates one or two ids, so those would not hit the "free the excess idr_layers" often enough to actually get rid of the extra memory. In practice, those two bits could cost around 16KB of memory. But maybe the users shouldn't be using ida in the first place, then. (For example, the watchdog code always passes max=MAX_DOGS==32, so they'd be much better served with a small fixed bitmap). Signed-off-by: Rasmus Villemoes --- lib/idr.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/idr.c b/lib/idr.c index 1e786f817e66..6393feb4b087 100644 --- a/lib/idr.c +++ b/lib/idr.c @@ -1092,9 +1092,6 @@ int ida_simple_get(struct ida *ida, unsigned int start, unsigned int end, } again: - if (!ida_pre_get(ida, gfp_mask)) - return -ENOMEM; - spin_lock_irqsave(&simple_ida_lock, flags); ret = ida_get_new_above(ida, start, &id); if (!ret) { @@ -1107,8 +1104,11 @@ int ida_simple_get(struct ida *ida, unsigned int start, unsigned int end, } spin_unlock_irqrestore(&simple_ida_lock, flags); - if (unlikely(ret == -EAGAIN)) + if (unlikely(ret == -EAGAIN)) { + if (!ida_pre_get(ida, gfp_mask)) + return -ENOMEM; goto again; + } return ret; } -- 2.1.4