Received: by 2002:ac0:a591:0:0:0:0:0 with SMTP id m17-v6csp1469679imm; Fri, 6 Jul 2018 00:14:53 -0700 (PDT) X-Google-Smtp-Source: AAOMgpetDgupVLqdVzrUjPp3Vi9N2ycxO4wwN3S03OMzD+EF52tCsJ64OJgX4Tt8Eln8gK/V4EnQ X-Received: by 2002:a17:902:5602:: with SMTP id h2-v6mr9258115pli.314.1530861293557; Fri, 06 Jul 2018 00:14:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530861293; cv=none; d=google.com; s=arc-20160816; b=X1M0RFMUlAxq0D4oWDLTvxFQSy2wrxHojKG6GkS7o/FohD7hSjs95tdWg52fDO6K/3 b7UaTyKLTczlIG8WKfz4OZcXWx/f6VvIDr/ZdHkLxztZPhC83Zmsp4yvSGz+o24kKp5C ftlZnJSRsklG8mUq1DjWouahjBYsL8BWr/YNMfeGaJpWtI9FZScZrN/ltTmjKpQ9VFhV PgP2SkkaEKWr9vRzhdtIlz3xjB8JerDiX43XPmbHWqOHi+AEFs9WlNCREJC983NDhqBT Yz2CMkmy7GGiZa1bpOU6AYfvrt6U5hmcr3oVRJnEKfJa7HVsAMkW17CBJn8XtnMn/tA3 +6Xw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:cc:subject:date:to :from:arc-authentication-results; bh=v8/NVR/UoxDOUTYEHwc/SdktHlKc1zaYR8pYVetAzxc=; b=GSKkf1xWa+aIWrnigmTxlRqUkXtnvIj54BlbDDErNypkCMa/EPsuPg79EgzN+rz6fF U1IZE1WWVY0Di12i9qzvuGQR/OUkRT0jxKK0N8RqCUOnzeb5qtUZ3jlryc9HcHcovwOz 4dmdjGnuSUU6tDGcdvo0v2iaPr6MJrj64V5/viPq8yg7+tc5q9qii59QM/smKQMm10xV 0ioZq3UsC9dqOI8yu9OjbX6StsZZAdqGPQfql9uAxEyDoXNRQvHORhJt5tI/gYui6uzT zjYS5RzKK78TJjjZm7Txn4gFpdPnaXaOw/Muq7dd44YP/ZDI6MpCXGLqdAa0T10G7jHu aTAw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i126-v6si8060413pfc.296.2018.07.06.00.14.38; Fri, 06 Jul 2018 00:14:53 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754071AbeGFHNo (ORCPT + 99 others); Fri, 6 Jul 2018 03:13:44 -0400 Received: from mx2.suse.de ([195.135.220.15]:45104 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753604AbeGFHNm (ORCPT ); Fri, 6 Jul 2018 03:13:42 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id A3E8BAD80; Fri, 6 Jul 2018 07:13:40 +0000 (UTC) From: NeilBrown To: Thomas Graf , Herbert Xu , Tom Herbert Date: Fri, 06 Jul 2018 17:11:32 +1000 Subject: [PATCH 2/3] rhashtable: add rhashtable_walk_last_seen() Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org Message-ID: <153086109260.2825.1459722786871837620.stgit@noble> In-Reply-To: <153086101070.2825.6850140624411927465.stgit@noble> References: <153086101070.2825.6850140624411927465.stgit@noble> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org rhashtable_walk_last_seen() returns the object returned by the previous rhashtable_walk_next(), providing it is still in the table (or was during this grace period). This works even if rhashtable_walk_stop() and rhashtable_talk_start() have been called since the last rhashtable_walk_next(). If there have been no calls to rhashtable_walk_next(), or if the object is gone from the table, then NULL is returned. This can usefully be used in a seq_file ->start() function. If the pos is the same as was returned by the last ->next() call, then rhashtable_walk_last_seen() can be used to re-establish the current location in the table. If it returns NULL, then rhashtable_walk_next() should be used. Signed-off-by: NeilBrown --- include/linux/rhashtable.h | 1 + lib/rhashtable.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/linux/rhashtable.h b/include/linux/rhashtable.h index 657e37ae314c..d63b472e9d50 100644 --- a/include/linux/rhashtable.h +++ b/include/linux/rhashtable.h @@ -248,6 +248,7 @@ static inline void rhashtable_walk_start(struct rhashtable_iter *iter) void *rhashtable_walk_next(struct rhashtable_iter *iter); void *rhashtable_walk_peek(struct rhashtable_iter *iter); +void *rhashtable_walk_last_seen(struct rhashtable_iter *iter); void rhashtable_walk_stop(struct rhashtable_iter *iter) __releases(RCU); void rhashtable_free_and_destroy(struct rhashtable *ht, diff --git a/lib/rhashtable.c b/lib/rhashtable.c index 36f97d0c69ce..2d0227822262 100644 --- a/lib/rhashtable.c +++ b/lib/rhashtable.c @@ -947,6 +947,36 @@ void *rhashtable_walk_peek(struct rhashtable_iter *iter) } EXPORT_SYMBOL_GPL(rhashtable_walk_peek); +/** + * rhashtable_walk_last_seen - Return the previously returned object, if available + * @iter: Hash table iterator + * + * If rhashtable_walk_next() has previously been called and the object + * it returned is still in the hash table, that object is returned again, + * otherwise %NULL is returned. + * + * If the recent rhashtable_walk_next() call was since the most recent + * rhashtable_walk_start() call then the returned object may not, strictly + * speaking, still be in the table. It will be safe to dereference. + * + * Note that the iterator is not changed. + */ +void *rhashtable_walk_last_seen(struct rhashtable_iter *iter) +{ + struct rhashtable *ht = iter->ht; + struct rhash_head *p = iter->p; + + if (!p) + return NULL; + if (!iter->p_is_unsafe || ht->rhlist) + return p; + rht_for_each_rcu(p, iter->walker.tbl, iter->slot) + if (p == iter->p) + return p; + return NULL; +} +EXPORT_SYMBOL_GPL(rhashtable_walk_last_seen); + /** * rhashtable_walk_stop - Finish a hash table walk * @iter: Hash table iterator