Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp171708imm; Mon, 4 Jun 2018 15:13:41 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJIUdRTV2rRIjIYtt1WSJL8nBuiBY9kvHRm2C4Lpr0ejG267aVjMa6Z9R9kmEppLp3ucL1X X-Received: by 2002:a62:3fdd:: with SMTP id z90-v6mr22895260pfj.216.1528150421613; Mon, 04 Jun 2018 15:13:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528150421; cv=none; d=google.com; s=arc-20160816; b=w220u4yesoL+0DwgkRDreDZaxr+RBqPgF90FJWrkrE4X/hWvSoudQhl9afIrv3MsVc VNq3rIlCWeneciCwmjmmK9e5QII0s8If1Msgqr+v07IeBJSOAZ6d5ug4CgySpfglv/Fw 0kcgDW/lJZlEuTaQBs325I0sznC7q+7KkdeLKI4xV+C5uUSzEAG/V9iNRYsp7V2OzvJg +eVgD3OLuSv98lmZJLK0vltethxo9KyNmF9acuvbo84MaHRC8m3sBaVDT2Uz187HzdoW Hd3JY1gKMAet0UoVfCYy3Ig1/pCp86ER0Dxnni62ZDF9iZq3cpBfWgidB9PE1BGrM1I4 CNGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=r2uQ1rPl6wKJKDMAeJpQRi41MdftSQQi68yBF/8/qWE=; b=d5eVg33Pjz/klWPcUy1Z9RxFdv9ukA2CLxJObkBCPlVsfKSbJh53JktROxLQEMgmxn HPakzMxPOH6+fHwKg9PgIteGp1WHZKcYXw8HHyTx1N+QYJqQuUaT2F2RQnD2SQ8eQe4S ogw6WN9yxnbseQBuxqXQnvf3bFe0vo7lrn1xHdvTsEUMeoBykx1zcQKxQ5RaxcUPTS4g 0kpWruJFaKpBf6dTAmI2NaGF1iec2U+M9/AgHXy9qV8Tx+zVhUhHilGyvVvQJ3oLny8z ie3zwqxgqFR2xnhTYwo2U6Az/7A3Key0jGliuavoQJ8yxF9vmyDtjFue9t0+6XQS0zE0 Pl5w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@quantonium-net.20150623.gappssmtp.com header.s=20150623 header.b=V+F9T8Bl; 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 w4-v6si36463769plp.357.2018.06.04.15.13.27; Mon, 04 Jun 2018 15:13:41 -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; dkim=pass header.i=@quantonium-net.20150623.gappssmtp.com header.s=20150623 header.b=V+F9T8Bl; 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 S1751502AbeFDWNE (ORCPT + 99 others); Mon, 4 Jun 2018 18:13:04 -0400 Received: from mail-wr0-f194.google.com ([209.85.128.194]:42910 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751230AbeFDWND (ORCPT ); Mon, 4 Jun 2018 18:13:03 -0400 Received: by mail-wr0-f194.google.com with SMTP id w10-v6so238072wrk.9 for ; Mon, 04 Jun 2018 15:13:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quantonium-net.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=r2uQ1rPl6wKJKDMAeJpQRi41MdftSQQi68yBF/8/qWE=; b=V+F9T8BlmSAqq9em11ZKFxWLdaIimboqwetGABrkisy0vp/eaHLY72jVjqzldUQ+xK vEXAAdyCL7h0X9TDYZz0lrTRmmJeYStWyglXc0XYlyMkhb95ayiM3Zv198hR173c1lCv JE6O1thx4DvyOMUMvirhTeNHBmAlzegFtnZobgnRlrzfo5ofTpOjH6kD0Cv7n015Gpaz SpKb3G+aIbLVznXyZEOcIq6OSOQwArZdO7rtx5j8IO1uMIbWbh4Cyyzk9RumNasNk4Fp a1PSNvbdzj7aix3HcFsrz1XOYpUAOVUvbWumyPNZRJHuzqysV7o+zy/kqYM7rroRNEcL yfQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=r2uQ1rPl6wKJKDMAeJpQRi41MdftSQQi68yBF/8/qWE=; b=leQBdxMGRGBAIWZyeD14umfLGxwKNIKrYkz1CvzmaQ34m+YioRWx+cGs7ntVDQHeGu NPID1x13P9+z1tEBMn9tEKoO+N6onxtfX8O1z1ufILBjFFNt2tYYinewlbNhnCpB8/Nj dlW6ki5lcOAk7jvZp1VeeCw5lzqzO1aa7IgqUQQO/0fY+eYXCz7iW0H964BWdLGUtJQK 6hfOzx2kdKuI4m6zjj69XEs0KJafAkOK5XdSL0tQQCC3lHjexZMNtnbXWcWHuhzkoANz H4/+tRPsASL/zVPHDYlsfKt0dFEUW/0obp6vRyW1qq9D9S330+a7B9CwStDzcjcJ7UII tYUw== X-Gm-Message-State: APt69E3JunlmuTE01hIZgaG/oc+9uLL0AffnHPyz7MOiE6IbiJbzQKdm Z9fFz2hjYX4le5i/U2aaStrc8B9xnn7OHPx1zHkM2g== X-Received: by 2002:adf:a20a:: with SMTP id p10-v6mr288817wra.196.1528150381843; Mon, 04 Jun 2018 15:13:01 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:adf:80e3:0:0:0:0:0 with HTTP; Mon, 4 Jun 2018 15:13:01 -0700 (PDT) In-Reply-To: References: <152782754287.30340.4395718227884933670.stgit@noble> <152782824964.30340.6329146982899668633.stgit@noble> <20180602154851.pfy4wryezuhxp76v@gondor.apana.org.au> <87y3fvpf40.fsf@notabene.neil.brown.name> <87sh63pakb.fsf@notabene.neil.brown.name> From: Tom Herbert Date: Mon, 4 Jun 2018 15:13:01 -0700 Message-ID: Subject: Re: [PATCH 10/18] rhashtable: remove rhashtable_walk_peek() To: Tom Herbert Cc: NeilBrown , Herbert Xu , Thomas Graf , Linux Kernel Network Developers , LKML Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Jun 4, 2018 at 2:31 PM, Tom Herbert wrote: > On Sun, Jun 3, 2018 at 7:09 PM, NeilBrown wrote: >> On Sun, Jun 03 2018, Tom Herbert wrote: >> >>> On Sun, Jun 3, 2018 at 5:30 PM, NeilBrown wrote: >>>> On Sat, Jun 02 2018, Herbert Xu wrote: >>>> >>>>> On Fri, Jun 01, 2018 at 02:44:09PM +1000, NeilBrown wrote: >>>>>> This function has a somewhat confused behavior that is not properly >>>>>> described by the documentation. >>>>>> Sometimes is returns the previous object, sometimes it returns the >>>>>> next one. >>>>>> Sometimes it changes the iterator, sometimes it doesn't. >>>>>> >>>>>> This function is not currently used and is not worth keeping, so >>>>>> remove it. >>>>>> >>>>>> A future patch will introduce a new function with a >>>>>> simpler interface which can meet the same need that >>>>>> this was added for. >>>>>> >>>>>> Signed-off-by: NeilBrown >>>>> >>>>> Please keep Tom Herbert in the loop. IIRC he had an issue with >>>>> this patch. >>>> >>>> Yes you are right - sorry for forgetting to add Tom. >>>> >>>> My understanding of where this issue stands is that Tom raised issue and >>>> asked for clarification, I replied, nothing further happened. >>>> >>>> It summary, my position is that: >>>> - most users of my new rhashtable_walk_prev() will use it like >>>> rhasthable_talk_prev() ?: rhashtable_walk_next() >>>> which is close to what rhashtable_walk_peek() does >>>> - I know of no use-case that could not be solved if we only had >>>> the combined operation >>>> - BUT it is hard to document the combined operation, as it really >>>> does two things. If it is hard to document, then it might be >>>> hard to understand. >>>> >>>> So provide the most understandable/maintainable solution, I think >>>> we should provide rhashtable_walk_prev() as a separate interface. >>>> >>> I'm still missing why requiring two API operations instead of one is >>> simpler or easier to document. Also, I disagree that >>> rhashtable_walk_peek does two things-- it just does one which is to >>> return the current element in the walk without advancing to the next >>> one. The fact that the iterator may or may not move is immaterial in >>> the API, that is an implementation detail. In fact, it's conceivable >>> that we might completely reimplement this someday such that the >>> iterator works completely differently implementation semantics but the >>> API doesn't change. Also the naming in your proposal is confusing, >>> we'd have operations to get the previous, and the next next object-- >>> so the user may ask where's the API to get the current object in the >>> walk? The idea that we get it by first trying to get the previous >>> object, and then if that fails getting the next object seems >>> counterintuitive. >> >> To respond to your points out of order: >> >> - I accept that "rhashtable_walk_prev" is not a perfect name. It >> suggests a stronger symmetry with rhasthable_walk_next than actually >> exist. I cannot think of a better name, but I think the >> description "Return the previously returned object if it is >> still in the table" is clear and simple and explains the name. >> I'm certainly open to suggestions for a better name. >> >> - I don't think it is meaningful to talk about a "current" element in a >> table where asynchronous insert/remove is to be expected. >> The best we can hope for is a "current location" is the sequence of >> objects in the table - a location which is after some objects and >> before all others. rhashtable_walk_next() returns the next object >> after the current location, and advances the location pointer past >> that object. >> rhashtable_walk_prev() *doesn't* return the previous object in the >> table. It returns the previously returned object. ("previous" in >> time, but not in space, if you like). >> >> - rhashtable_walk_peek() currently does one of two different things. >> It either returns the previously returned object (iter->p) if that >> is still in the table, or it find the next object, steps over it, and >> returns it. >> >> - I would like to suggest that when an API acts on a iterator object, >> the question of whether or not the iterator is advanced *must* be a >> fundamental question, not one that might change from time to time. >> >> Maybe a useful way forward would be for you to write documentation for >> the rhashtable_walk_peek() interface which correctly describes what it >> does and how it is used. Given that, I can implement that interface >> with the stability improvements that I'm working on. >> > > Here's how it's documented currently: > > "rhashtable_walk_peek - Return the next object but don't advance the iterator" > > I don't see what is incorrect about that. Peek returns the next object > in the walk, however does not move the iterator past that object, so > sucessive calls to peek return the same object. In other words it's a > way to inspect the next object but not "consume" it. This is what is > needed when netlink returns in the middle of a walk. The last object > retrieved from the table may not have been processed completely, so it > needs to be the first one processed on the next invocation to netlink. > > This is also easily distinguishable from > > "rhashtable_walk_next - Return the next object and advance the iterator" > > Where the only difference is that peek and walk is that, walk advances > the iterator and peek does not. Hence why "peek" is a descriptive name > for what is happening. > btw, we are using rhashtable_walk_peek with ILA code that hasn't been upstreamed yet. I'll (re)post the patches shortly, this demonstates why we need the peek functionality. If you think that rhashtable_walk_peek is nothing more than an inline that does "return rhashtable_walk_prev(iter) ? : rhashtable_walk_next(iter);" then maybe we could redefine rhashtable_walk_peek to be that. But, then I'll ask what the use case is for rhashtable_walk_prev as a standalone function? We created rhashtable_walk_peek for the netlink walk problem and I don't think any of the related use cases would ever call rhashtable_walk_prev without the rhashtable_walk_next fallback. Tom > Tom > >> Thanks, >> NeilBrown