From mboxrd@z Thu Jan 1 00:00:00 1970 From: Darrick J. Wong Date: Tue, 10 Jan 2023 13:56:44 -0800 Subject: [Cluster-devel] [PATCH v5 7/9] iomap/xfs: Eliminate the iomap_valid handler In-Reply-To: References: <20221231150919.659533-1-agruenba@redhat.com> <20221231150919.659533-8-agruenba@redhat.com> Message-ID: List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit On Sun, Jan 08, 2023 at 07:50:01PM +0100, Andreas Gruenbacher wrote: > On Sun, Jan 8, 2023 at 6:32 PM Christoph Hellwig wrote: > > On Wed, Jan 04, 2023 at 07:08:17PM +0000, Matthew Wilcox wrote: > > > On Wed, Jan 04, 2023 at 09:53:17AM -0800, Darrick J. Wong wrote: > > > > I wonder if this should be reworked a bit to reduce indenting: > > > > > > > > if (PTR_ERR(folio) == -ESTALE) { > > > > > > FYI this is a bad habit to be in. The compiler can optimise > > > > > > if (folio == ERR_PTR(-ESTALE)) > > > > > > better than it can optimise the other way around. > > > > Yes. I think doing the recording that Darrick suggested combined > > with this style would be best: > > > > if (folio == ERR_PTR(-ESTALE)) { > > iter->iomap.flags |= IOMAP_F_STALE; > > return 0; > > } > > if (IS_ERR(folio)) > > return PTR_ERR(folio); > > Again, I've implemented this as a nested if because the -ESTALE case > should be pretty rare, and if we unnest, we end up with an additional > check on the main code path. To be specific, the "before" code here on > my current system is this: > > ------------------------------------ > if (IS_ERR(folio)) { > 22ad: 48 81 fd 00 f0 ff ff cmp $0xfffffffffffff000,%rbp > 22b4: 0f 87 bf 03 00 00 ja 2679 > return 0; > } > return PTR_ERR(folio); > } > [...] > 2679: 89 e8 mov %ebp,%eax > if (folio == ERR_PTR(-ESTALE)) { > 267b: 48 83 fd 8c cmp $0xffffffffffffff8c,%rbp > 267f: 0f 85 b7 fc ff ff jne 233c > iter->iomap.flags |= IOMAP_F_STALE; > 2685: 66 81 4b 42 00 02 orw $0x200,0x42(%rbx) > return 0; > 268b: e9 aa fc ff ff jmp 233a > ------------------------------------ > > While the "after" code is this: > > ------------------------------------ > if (folio == ERR_PTR(-ESTALE)) { > 22ad: 48 83 fd 8c cmp $0xffffffffffffff8c,%rbp > 22b1: 0f 84 bc 00 00 00 je 2373 > iter->iomap.flags |= IOMAP_F_STALE; > return 0; > } > if (IS_ERR(folio)) > return PTR_ERR(folio); > 22b7: 89 e8 mov %ebp,%eax > if (IS_ERR(folio)) > 22b9: 48 81 fd 00 f0 ff ff cmp $0xfffffffffffff000,%rbp > 22c0: 0f 87 82 00 00 00 ja 2348 > ------------------------------------ > > The compiler isn't smart enough to re-nest the ifs by recognizing that > folio == ERR_PTR(-ESTALE) is a subset of IS_ERR(folio). > > So do you still insist on that un-nesting even though it produces worse code? Me? Not anymore. :) --D > Thanks, > Andreas >