From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthew Wilcox Subject: Re: drm pull for v5.3-rc1 Date: Tue, 6 Aug 2019 12:09:38 -0700 Message-ID: <20190806190937.GD30179@bombadil.infradead.org> References: <48890b55-afc5-ced8-5913-5a755ce6c1ab@shipmail.org> <20190806073831.GA26668@infradead.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org To: Linus Torvalds Cc: Christoph Hellwig , Thomas =?iso-8859-1?Q?Hellstr=F6m_=28VMware=29?= , Dave Airlie , Thomas Hellstrom , Daniel Vetter , LKML , dri-devel , Jerome Glisse , Jason Gunthorpe , Andrew Morton , Steven Price , Linux-MM List-Id: dri-devel@lists.freedesktop.org On Tue, Aug 06, 2019 at 11:50:42AM -0700, Linus Torvalds wrote: > In fact, I do note that a lot of the users don't actually use the > "void *private" argument at all - they just want the walker - and just > pass in a NULL private pointer. So we have things like this: > > > + if (walk_page_range(&init_mm, va, va + size, &set_nocache_walk_ops, > > + NULL)) { > > and in a perfect world we'd have arguments with default values so that > we could skip those entirely for when people just don't need it. > > I'm not a huge fan of C++ because of a lot of the complexity (and some > really bad decisions), but many of the _syntactic_ things in C++ would > be nice to use. This one doesn't seem to be one that the gcc people > have picked up as an extension ;( > > Yes, yes, we could do it with a macro, I guess. > > #define walk_page_range(mm, start,end, ops, ...) \ > __walk_page_range(mm, start, end, (NULL , ## __VA_ARGS__)) > > but I'm not sure it's worthwhile. Has anyone looked at turning the interface inside-out? ie something like: struct mm_walk_state state = { .mm = mm, .start = start, .end = end, }; for_each_page_range(&state, page) { ... do something with page ... } with appropriate macrology along the lines of: #define for_each_page_range(state, page) \ while ((page = page_range_walk_next(state))) Then you don't need to package anything up into structs that are shared between the caller and the iterated function.