From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D2DFF143736; Mon, 24 Mar 2025 15:53:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742831620; cv=none; b=XvzpPK35lE0sluQSc5+exwAUdZ9+t5a0oIbAzMHONVbWJsqE47cU5Jo3a+Y46XopWNiuLo4ZO5UFODkv5h0zV8GkjcvzbhHAvk0iOpAVptYHKYdLH511nYvi+Qw0Wi4Jhy5RyALQFZausAOtEJWas6SD6kC9CdJs5qZR82FWmNc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742831620; c=relaxed/simple; bh=4jXCcTm30AJQi4N1CnuKV/ZoTyk5Joxp7KbG+aaJZ/E=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=N0w52R9rRhonp7RZYrx7BMJNYZoWjbNcf7whb36GQYbBzNxxCxoJhsQ+RfA2VH/qXELtix1SE6vrp+X7DDGLfMs5Xpwp5oft5+bXbdIgCDBDtWG5WmcDfRarTMjGyPzEOH9+iGeuWX4dH0HG9DPow0jDdeQ4Os6QAIf2SKub1v8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=jha6qwoE; arc=none smtp.client-ip=209.85.214.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="jha6qwoE" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-2239c066347so103043735ad.2; Mon, 24 Mar 2025 08:53:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742831618; x=1743436418; darn=vger.kernel.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=lnK90d9tJkBMNCcbTrjmAdHYPBfyopuTDuiHWu7djtw=; b=jha6qwoEuOpOpN7nTl4pfYoeNPLPm2nfW6OdM5p1OspX62EFwSNb8uSoDNPsOwtys9 kx5dCL1A+I/XPo1ONKx9JnEIAESsPSqQJQ4B/easnxjXRkgx/VRkIpUhcDLyxgQccQLW 8tZqejAuD+5Kd3+5Dc6sPKUhdI7R4fKm5hrDZGDKfxoltscxhj9y8xF26sxazUxmQCS4 4E0TM2LTKMUdiog/vtospJeVH7/K5BOlzrpeBKtJLQ8evYNntC2EmV86WVsLu3De6NUZ EbKzHHHnveWHphzKlRQh4qrg9IRqBT+yObQmNidKQ3CfG4OH9rWMx3V11XqRW2TFwSYq AfZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742831618; x=1743436418; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=lnK90d9tJkBMNCcbTrjmAdHYPBfyopuTDuiHWu7djtw=; b=g/gh7wBToSDfZoDosp32BsmD26MnEOcYGwHPxTv5VowRdUV0NjZgMNZtL6tDN9A6aA YsKVjAn0ILGyn6REIvN8JWMqFn9o+wyPFBrZdJBWfjVo5iNs7mZoYKRokIEOivdlUf4L FIvOgnIUrGcviT6hg4IO2h2eMgbzYcXpvnnxdkvTTwacRVSOmU4p/n+3R7f6e1a5zgam /fPfGjtY07dbDu3TUstL0q/adtFKpUVlCqBJ9LVdYfZn4/kP5RFOt8vteszqqJkezuFs mo3jkvMJTtdf9OtsGPqKJc5JMoflipw1CdXqY+27B7AN2+0YB17Yi9OLClXvB7ZrZVcz hckQ== X-Forwarded-Encrypted: i=1; AJvYcCUD9XBoxXdsx7zUVw3GVew1xFjhPNHeOVYUhgKi0o4rfLQl7FreeU3Y9IXbKTYWx0GCJMYXMCQJ@vger.kernel.org, AJvYcCUqIs3sGFmx7KcglgVKiLkUfCEz+WX2D7WEAkB+XWooxC29qJiL76kshEDTwHY/0Ttf8aI8m825vixrbno=@vger.kernel.org, AJvYcCVdwKeQc8NVP6LSlpQzFWYOb71lx/MTe65/nw/XW9GtY7NB33+nDA7/k/3q5b/7af5kO8ep9WtCyMCDSm6E@vger.kernel.org, AJvYcCWCy2ya6DZms0NOuHIt7KI5M6VIiuzAtRRwaTxDoed+BWMX/zXyA73uBS514SwaL8vXrj1T9C5mgIF3u5Y4ozQ=@vger.kernel.org, AJvYcCWiZsjbelWRZ52rXcTV9nDZKme4wu+wrYLq8WCUqn3TCZadUMbTA+ZxzABsJvdXyr46bIWPIUHNaUKhMyEa@vger.kernel.org, AJvYcCXTwZkKG2qsYbnd/L2N6UwojqFJEHraGYvL770Pc3b9sJz3Aq+9NAYgtEW6I9IeYH6YerC/90rJ9bHsPQo=@vger.kernel.org, AJvYcCXxN3lia1h5R/XFzyrDTQapIsxiHBBODSNYdoTc6XRmWhMQaEsf9F25FicnzOIKk1gCO+U=@vger.kernel.org X-Gm-Message-State: AOJu0Yy9/4ufDbSY+qA43M1ZPTX+/oe4pxWypYubuNdrobWFj2QDgyKT CgbqXTMXJKBrEby242fSHYE9+Or04JcNzjp/R49ciKHk57EYJvr1 X-Gm-Gg: ASbGncuwXHUGmfm0xCK9PSq/LsrnoRiOU7/R48vlezetWZQWhFkspYVpFQGwfmSq0+c D0B4i3tpm+3epafEv+sHWMbyhQFI4rZZopRijA8LuM1yHSe7V/sw4FM/UkvEibzzaEiABzDD2G6 rRCiDXBT1d7jZf7/FHVoyC5tYQXn0waivZTjDOWs+JMxJUmeT7rGaK03EDE+FsWZZt+S7GHYMyu t3w5LYWH9yxQ8fvaN+bs0MB2igKoI97pn3gSCcuOzdguE/yfWXS17hgs45I5s38gH5u8Eb07NVb 8t+Pf8EVtbYO+qvxElRON0jXBu8VHwVchnuLsbUvgFJ2+BsUSbeWuyvzztvwthhz8vE+4yjmeOF 1jrk= X-Google-Smtp-Source: AGHT+IF0G/P2idoIFxvn1IOSBSyy+/lpGPgy71fA+n6lIv43FiatMDA7/IWCIIb00BiyzdXZ3fQN0Q== X-Received: by 2002:aa7:9317:0:b0:736:a682:deb8 with SMTP id d2e1a72fcca58-7390596685bmr25612682b3a.8.1742831617683; Mon, 24 Mar 2025 08:53:37 -0700 (PDT) Received: from localhost (maglev-oncall.nvidia.com. [216.228.125.128]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7390600a5f6sm8119083b3a.82.2025.03.24.08.53.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Mar 2025 08:53:36 -0700 (PDT) Date: Mon, 24 Mar 2025 11:53:35 -0400 From: Yury Norov To: "H. Peter Anvin" Cc: Kuan-Wei Chiu , David Laight , Andrew Cooper , Laurent.pinchart@ideasonboard.com, airlied@gmail.com, akpm@linux-foundation.org, alistair@popple.id.au, andrew+netdev@lunn.ch, andrzej.hajda@intel.com, arend.vanspriel@broadcom.com, awalls@md.metrocast.net, bp@alien8.de, bpf@vger.kernel.org, brcm80211-dev-list.pdl@broadcom.com, brcm80211@lists.linux.dev, dave.hansen@linux.intel.com, davem@davemloft.net, dmitry.torokhov@gmail.com, dri-devel@lists.freedesktop.org, eajames@linux.ibm.com, edumazet@google.com, eleanor15x@gmail.com, gregkh@linuxfoundation.org, hverkuil@xs4all.nl, jernej.skrabec@gmail.com, jirislaby@kernel.org, jk@ozlabs.org, joel@jms.id.au, johannes@sipsolutions.net, jonas@kwiboo.se, jserv@ccns.ncku.edu.tw, kuba@kernel.org, linux-fsi@lists.ozlabs.org, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-mtd@lists.infradead.org, linux-serial@vger.kernel.org, linux-wireless@vger.kernel.org, linux@rasmusvillemoes.dk, louis.peens@corigine.com, maarten.lankhorst@linux.intel.com, mchehab@kernel.org, mingo@redhat.com, miquel.raynal@bootlin.com, mripard@kernel.org, neil.armstrong@linaro.org, netdev@vger.kernel.org, oss-drivers@corigine.com, pabeni@redhat.com, parthiban.veerasooran@microchip.com, rfoss@kernel.org, richard@nod.at, simona@ffwll.ch, tglx@linutronix.de, tzimmermann@suse.de, vigneshr@ti.com, x86@kernel.org Subject: Re: [PATCH v3 00/16] Introduce and use generic parity16/32/64 helper Message-ID: References: <20250307195310.58abff8c@pumpkin> <80771542-476C-493E-858A-D2AF6A355CC1@zytor.com> <05F7AC70-E8E7-4D14-A4EB-880D92A96534@zytor.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <05F7AC70-E8E7-4D14-A4EB-880D92A96534@zytor.com> On Sun, Mar 23, 2025 at 03:40:20PM -0700, H. Peter Anvin wrote: > On March 23, 2025 8:16:24 AM PDT, Kuan-Wei Chiu wrote: > >On Thu, Mar 13, 2025 at 03:41:49PM +0800, Kuan-Wei Chiu wrote: > >> On Thu, Mar 13, 2025 at 12:29:13AM +0800, Kuan-Wei Chiu wrote: > >> > On Wed, Mar 12, 2025 at 11:51:12AM -0400, Yury Norov wrote: > >> > > On Tue, Mar 11, 2025 at 03:24:14PM -0700, H. Peter Anvin wrote: > >> > > > On March 11, 2025 3:01:30 PM PDT, Yury Norov wrote: > >> > > > >On Sun, Mar 09, 2025 at 11:48:26PM +0800, Kuan-Wei Chiu wrote: > >> > > > >> On Fri, Mar 07, 2025 at 12:07:02PM -0800, H. Peter Anvin wrote: > >> > > > >> > On March 7, 2025 11:53:10 AM PST, David Laight wrote: > >> > > > >> > >On Fri, 07 Mar 2025 11:30:35 -0800 > >> > > > >> > >"H. Peter Anvin" wrote: > >> > > > >> > > > >> > > > >> > >> On March 7, 2025 10:49:56 AM PST, Andrew Cooper wrote: > >> > > > >> > >> >> (int)true most definitely is guaranteed to be 1. > >> > > > >> > >> > > >> > > > >> > >> >That's not technically correct any more. > >> > > > >> > >> > > >> > > > >> > >> >GCC has introduced hardened bools that intentionally have bit patterns > >> > > > >> > >> >other than 0 and 1. > >> > > > >> > >> > > >> > > > >> > >> >https://gcc.gnu.org/gcc-14/changes.html > >> > > > >> > >> > > >> > > > >> > >> >~Andrew > >> > > > >> > >> > >> > > > >> > >> Bit patterns in memory maybe (not that I can see the Linux kernel using them) but > >> > > > >> > >> for compiler-generated conversations that's still a given, or the manager isn't C > >> > > > >> > >> or anything even remotely like it. > >> > > > >> > >> > >> > > > >> > > > >> > > > >> > >The whole idea of 'bool' is pretty much broken by design. > >> > > > >> > >The underlying problem is that values other than 'true' and 'false' can > >> > > > >> > >always get into 'bool' variables. > >> > > > >> > > > >> > > > >> > >Once that has happened it is all fubar. > >> > > > >> > > > >> > > > >> > >Trying to sanitise a value with (say): > >> > > > >> > >int f(bool v) > >> > > > >> > >{ > >> > > > >> > > return (int)v & 1; > >> > > > >> > >} > >> > > > >> > >just doesn't work (see https://www.godbolt.org/z/MEndP3q9j) > >> > > > >> > > > >> > > > >> > >I really don't see how using (say) 0xaa and 0x55 helps. > >> > > > >> > >What happens if the value is wrong? a trap or exception?, good luck recovering > >> > > > >> > >from that. > >> > > > >> > > > >> > > > >> > > David > >> > > > >> > > >> > > > >> > Did you just discover GIGO? > >> > > > >> > >> > > > >> Thanks for all the suggestions. > >> > > > >> > >> > > > >> I don't have a strong opinion on the naming or return type. I'm still a > >> > > > >> bit confused about whether I can assume that casting bool to int always > >> > > > >> results in 0 or 1. > >> > > > >> > >> > > > >> If that's the case, since most people prefer bool over int as the > >> > > > >> return type and some are against introducing u1, my current plan is to > >> > > > >> use the following in the next version: > >> > > > >> > >> > > > >> bool parity_odd(u64 val); > >> > > > >> > >> > > > >> This keeps the bool return type, renames the function for better > >> > > > >> clarity, and avoids extra maintenance burden by having just one > >> > > > >> function. > >> > > > >> > >> > > > >> If I can't assume that casting bool to int always results in 0 or 1, > >> > > > >> would it be acceptable to keep the return type as int? > >> > > > >> > >> > > > >> Would this work for everyone? > >> > > > > > >> > > > >Alright, it's clearly a split opinion. So what I would do myself in > >> > > > >such case is to look at existing code and see what people who really > >> > > > >need parity invent in their drivers: > >> > > > > > >> > > > > bool parity_odd > >> > > > >static inline int parity8(u8 val) - - > >> > > > >static u8 calc_parity(u8 val) - - > >> > > > >static int odd_parity(u8 c) - + > >> > > > >static int saa711x_odd_parity - + > >> > > > >static int max3100_do_parity - - > >> > > > >static inline int parity(unsigned x) - - > >> > > > >static int bit_parity(u32 pkt) - - > >> > > > >static int oa_tc6_get_parity(u32 p) - - > >> > > > >static u32 parity32(__le32 data) - - > >> > > > >static u32 parity(u32 sample) - - > >> > > > >static int get_parity(int number, - - > >> > > > > int size) > >> > > > >static bool i2cr_check_parity32(u32 v, + - > >> > > > > bool parity) > >> > > > >static bool i2cr_check_parity64(u64 v) + - > >> > > > >static int sw_parity(__u64 t) - - > >> > > > >static bool parity(u64 value) + - > >> > > > > > >> > > > >Now you can refer to that table say that int parity(uXX) is what > >> > > > >people want to see in their drivers. > >> > > > > > >> > > > >Whichever interface you choose, please discuss it's pros and cons. > >> > > > >What bloat-o-meter says for each option? What's maintenance burden? > >> > > > >Perf test? Look at generated code? > >> > > > > > >> > > > >I personally for a macro returning boolean, something like I > >> > > > >proposed at the very beginning. > >> > > > > > >> > > > >Thanks, > >> > > > >Yury > >> > > > > >> > > > Also, please at least provide a way for an arch to opt in to using the builtins, which seem to produce as good results or better at least on some architectures like x86 and probably with CPU options that imply fast popcnt is available. > >> > > > >> > > Yeah. And because linux/bitops.h already includes asm/bitops.h > >> > > the simplest way would be wrapping generic implementation with > >> > > the #ifndef parity, similarly to how we handle find_next_bit case. > >> > > > >> > > So: > >> > > 1. Kuan-Wei, please don't invent something like ARCH_HAS_PARITY; > >> > > 2. This may, and probably should, be a separate follow-up series, > >> > > likely created by corresponding arch experts. > >> > > > >> > I saw discussions in the previous email thread about both > >> > __builtin_parity and x86-specific implementations. However, from the > >> > discussion, I learned that before considering any optimization, we > >> > should first ask: which driver or subsystem actually cares about parity > >> > efficiency? If someone does, I can help with a micro-benchmark to > >> > provide performance numbers, but I don't have enough domain knowledge > >> > to identify hot paths where parity efficiency matters. > >> > > >> IMHO, > >> > >> If parity is never used in any hot path and we don't care about parity: > >> > >> Then benchmarking its performance seems meaningless. In this case, a > >> function with a u64 argument would suffice, and we might not even need > >> a macro to optimize for different types—especially since the macro > >> requires special hacks to avoid compiler warnings. Also, I don't think > >> code size matters here. If it does, we should first consider making > >> parity a non-inline function in a .c file rather than an inline > >> function/macro in a header. > >> > >> If parity is used in a hot path: > >> > >> We need different handling for different type sizes. As previously > >> discussed, x86 assembly might use different instructions for u8 and > >> u16. This may sound stubborn, but I want to ask again: should we > >> consider using parity8/16/32/64 interfaces? Like in the i3c driver > >> example, if we only have a single parity macro that selects an > >> implementation based on type size, users must explicitly cast types. > >> If future users also need parity in a hot path, they might not be aware > >> of this requirement and end up generating suboptimal code. Since we > >> care about efficiency and generated code, why not follow hweight() and > >> provide separate implementations for different sizes? > >> > >It seems no one will reply to my two emails. So, I have summarized > >different interface approaches. If there is a next version, I will send > >it after the merge window closes. > > > >Interface 1: Single Function > >Description: bool parity_odd(u64) > >Pros: Minimal maintenance cost > >Cons: Difficult to integrate with architecture-specific implementations > > due to the inability to optimize for different argument sizes How difficult? It's just as simple as find_next_bit(). I already pointed that. > >Opinions: Jiri supports this approach > > > >Interface 2: Single Macro > >Description: parity_odd() macro > >Pros: Allows type-specific implementation > >Cons: Requires hacks to avoid warnings; users may need explicit So if the hack is documented, it's OK. I don't know the other way to motivate compilers to get better other than pointing them to their bugs. > > casting; potential sub-optimal code on 32-bit x86 Any asm listings? Any real impact? > >Opinions: Yury supports this approach > > > >Interface 3: Multiple Functions > >Description: bool parity_odd8/16/32/64() > >Pros: No need for explicit casting; easy to integrate Explicit castings are sometimes better than implicit ones. > > architecture-specific optimizations; except for parity8(), all > > functions are one-liners with no significant code duplication > >Cons: More functions may increase maintenance burden s/may/will/ > >Opinions: Only I support this approach > > > >Regards, > >Kuan-Wei > > You can add me to the final option. I think it makes most sense This is not a democracy, and we are not voting here. We are engineers. We share our expert opinions and choose the best one. I'll be happy to go with any solution, if we all make sure it's the best. I'm for #2 because it - generates better code than #1; - easier to use than #3; and - has less maintenance burden than #3. Why exactly #3 makes the most sense to you? Most variables are ints and longs. How are you going to handle those with fixed-types parity()s? Thanks, Yury From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 465DEC36002 for ; Mon, 24 Mar 2025 15:53:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=A6yf6x43IEAuzMrh5zGFMVndXkUX9naFqN5zurKiLR4=; b=sVp9VEcnKoKA21 lEJEXpMHw7Hyu+Hk60fsX+QzfKs+hJzu+UfWnnJ/ErWMqeSyJ3eRVawd2Mf9ySSp+WUx8haRc5oUl oqT5I/nT6dPAuyq0RsBxqeSrCe7UNKAY58lwMeuwQjzyIXTa2Csp3bklm6Hre8s9vFwnKvi/iw19a +b8ssG+Z7lU0pn3ffqf9IZFrb/GJgFHxfWT962Xjjqb6vXFvQrHuJcw33tyq1AfSMgyC0j0cpbVCQ VTwhUh9S1q/jsI0l77BDuW5VkG7iEc0g+4FhncrWpfxrgFqx5JOXiTqon+EUgI81W49poxo3m5tVJ T5ybYZMU6BV2wSe2xBww==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1twk7R-00000003ZGf-3mdE; Mon, 24 Mar 2025 15:53:41 +0000 Received: from mail-pl1-x636.google.com ([2607:f8b0:4864:20::636]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1twk7O-00000003ZFz-38mS for linux-mtd@lists.infradead.org; Mon, 24 Mar 2025 15:53:40 +0000 Received: by mail-pl1-x636.google.com with SMTP id d9443c01a7336-223fd89d036so88602425ad.1 for ; Mon, 24 Mar 2025 08:53:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742831618; x=1743436418; darn=lists.infradead.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=lnK90d9tJkBMNCcbTrjmAdHYPBfyopuTDuiHWu7djtw=; b=ggrlrvujE3wH4iznzfFoUUhoVv6Z2d1TXROyC9Xz9at30GICwpiBCY7uEqxNC9v9s1 6/RWjyjVKOipZKODK4M520Y+LyUszo/44577tYgYX+2ZJGZzjSNlE531WSU1fwQk0N6i bDc7ZMedNr6KwbeQSP5vjkAAqM5VAPVBkbWrLbG4JTbWiJ/tN24Z3AGvW2yfO266/zOd bSZA/YgYkYSvNDyaPP0XlmjiEk2TzKrM58sdlWcA8fuoDEeOb0RsPYeKmMqh9kRgJh1A uRUlS/pnNU8y613v+YyuN/UFFamjlUqckiH29MTs6n+ssCcJvDEip7PO6l2Tyq7V8UlO oefA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742831618; x=1743436418; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=lnK90d9tJkBMNCcbTrjmAdHYPBfyopuTDuiHWu7djtw=; b=py+Qiw6M/dnmnTPg6X/7Roz7zEhjg2VWJwCtXwTZPc24YQYlargOCmvxfS3pc+hzY7 n5iklOJxfTYptuCHZE9R5h4vM0sPQZ4Cp18CAIMIt9q9uV7IOfDJGcEABZlRbfiabFBL W8JMW+1jeBqDhhzuUPaqa8unamMrSXvJbvq3X6e8Ct1FzE9uz9fH7n8wk8Qh9OU5GcMz VjCC+Z1zOygt+MJbvJSs/69HJ4K9PiZZuuc3I3sTSQdOGsqIwDenCGj6v7EE8w32KuLp FcPnhxclY4J9itN8UHT/n6nfM30XoO8L6lQ99k78Lg/5mNqM4uDzj2qIFQiDDF3p/mVa XM9A== X-Forwarded-Encrypted: i=1; AJvYcCW1fHiDNDQHSrrMPvv4DkYnlOdgXIQRvUCMw4tJU58M+XEKuzhw2onCopSoxnqPEdZDllBqmyES5w8=@lists.infradead.org X-Gm-Message-State: AOJu0YwsSWNl7dPP+4YNWk+GmKwRD9ObBUB/f78uJ0NmXxmq7toqgdDB lMp8N+2gSkS0BT9v09n43mALAUURGKxIDTiY4Dr5LA2rwm9oCRDF X-Gm-Gg: ASbGncsn1OZIsnKjRsbd4vl9nDkHpWvcGwZTTLJtmp/F/Swk+0u2lkhTWyUMEylPBFY ShJZ6fLEu0ma2s2PQH5pHUj5R+oaLAd132Lc4Y3Pj6mICALt/YU1DkzOdeJzDaE9EqSTegRYi// Bamz8ICWyDnzpx0orfxUFAiB4Vxtlg8pEjrezQVCKt9J+z8t+tIrmNlVRotIVj9lBXOX/K6Fy0A kfHPvAJRQnAuwzvlaF0EowbzxdJhdnL5SKnu3wMbNYN5UUiG/RrJEAdDRCYcYXaBqfyYDoCixWa RFPcpZIr5IhnL5KmVQgD5++eEAP9gxiwK7mocN9sjrXjNBMWgaZJDwwrjX3NNIcupSGqWhfr1ir ZyIk= X-Google-Smtp-Source: AGHT+IF0G/P2idoIFxvn1IOSBSyy+/lpGPgy71fA+n6lIv43FiatMDA7/IWCIIb00BiyzdXZ3fQN0Q== X-Received: by 2002:aa7:9317:0:b0:736:a682:deb8 with SMTP id d2e1a72fcca58-7390596685bmr25612682b3a.8.1742831617683; Mon, 24 Mar 2025 08:53:37 -0700 (PDT) Received: from localhost (maglev-oncall.nvidia.com. [216.228.125.128]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7390600a5f6sm8119083b3a.82.2025.03.24.08.53.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Mar 2025 08:53:36 -0700 (PDT) Date: Mon, 24 Mar 2025 11:53:35 -0400 From: Yury Norov To: "H. Peter Anvin" Cc: Kuan-Wei Chiu , David Laight , Andrew Cooper , Laurent.pinchart@ideasonboard.com, airlied@gmail.com, akpm@linux-foundation.org, alistair@popple.id.au, andrew+netdev@lunn.ch, andrzej.hajda@intel.com, arend.vanspriel@broadcom.com, awalls@md.metrocast.net, bp@alien8.de, bpf@vger.kernel.org, brcm80211-dev-list.pdl@broadcom.com, brcm80211@lists.linux.dev, dave.hansen@linux.intel.com, davem@davemloft.net, dmitry.torokhov@gmail.com, dri-devel@lists.freedesktop.org, eajames@linux.ibm.com, edumazet@google.com, eleanor15x@gmail.com, gregkh@linuxfoundation.org, hverkuil@xs4all.nl, jernej.skrabec@gmail.com, jirislaby@kernel.org, jk@ozlabs.org, joel@jms.id.au, johannes@sipsolutions.net, jonas@kwiboo.se, jserv@ccns.ncku.edu.tw, kuba@kernel.org, linux-fsi@lists.ozlabs.org, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-mtd@lists.infradead.org, linux-serial@vger.kernel.org, linux-wireless@vger.kernel.org, linux@rasmusvillemoes.dk, louis.peens@corigine.com, maarten.lankhorst@linux.intel.com, mchehab@kernel.org, mingo@redhat.com, miquel.raynal@bootlin.com, mripard@kernel.org, neil.armstrong@linaro.org, netdev@vger.kernel.org, oss-drivers@corigine.com, pabeni@redhat.com, parthiban.veerasooran@microchip.com, rfoss@kernel.org, richard@nod.at, simona@ffwll.ch, tglx@linutronix.de, tzimmermann@suse.de, vigneshr@ti.com, x86@kernel.org Subject: Re: [PATCH v3 00/16] Introduce and use generic parity16/32/64 helper Message-ID: References: <20250307195310.58abff8c@pumpkin> <80771542-476C-493E-858A-D2AF6A355CC1@zytor.com> <05F7AC70-E8E7-4D14-A4EB-880D92A96534@zytor.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <05F7AC70-E8E7-4D14-A4EB-880D92A96534@zytor.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250324_085338_795232_DF4B8896 X-CRM114-Status: GOOD ( 57.46 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org T24gU3VuLCBNYXIgMjMsIDIwMjUgYXQgMDM6NDA6MjBQTSAtMDcwMCwgSC4gUGV0ZXIgQW52aW4g d3JvdGU6Cj4gT24gTWFyY2ggMjMsIDIwMjUgODoxNjoyNCBBTSBQRFQsIEt1YW4tV2VpIENoaXUg PHZpc2l0b3Jja3dAZ21haWwuY29tPiB3cm90ZToKPiA+T24gVGh1LCBNYXIgMTMsIDIwMjUgYXQg MDM6NDE6NDlQTSArMDgwMCwgS3Vhbi1XZWkgQ2hpdSB3cm90ZToKPiA+PiBPbiBUaHUsIE1hciAx MywgMjAyNSBhdCAxMjoyOToxM0FNICswODAwLCBLdWFuLVdlaSBDaGl1IHdyb3RlOgo+ID4+ID4g T24gV2VkLCBNYXIgMTIsIDIwMjUgYXQgMTE6NTE6MTJBTSAtMDQwMCwgWXVyeSBOb3JvdiB3cm90 ZToKPiA+PiA+ID4gT24gVHVlLCBNYXIgMTEsIDIwMjUgYXQgMDM6MjQ6MTRQTSAtMDcwMCwgSC4g UGV0ZXIgQW52aW4gd3JvdGU6Cj4gPj4gPiA+ID4gT24gTWFyY2ggMTEsIDIwMjUgMzowMTozMCBQ TSBQRFQsIFl1cnkgTm9yb3YgPHl1cnkubm9yb3ZAZ21haWwuY29tPiB3cm90ZToKPiA+PiA+ID4g PiA+T24gU3VuLCBNYXIgMDksIDIwMjUgYXQgMTE6NDg6MjZQTSArMDgwMCwgS3Vhbi1XZWkgQ2hp dSB3cm90ZToKPiA+PiA+ID4gPiA+PiBPbiBGcmksIE1hciAwNywgMjAyNSBhdCAxMjowNzowMlBN IC0wODAwLCBILiBQZXRlciBBbnZpbiB3cm90ZToKPiA+PiA+ID4gPiA+PiA+IE9uIE1hcmNoIDcs IDIwMjUgMTE6NTM6MTAgQU0gUFNULCBEYXZpZCBMYWlnaHQgPGRhdmlkLmxhaWdodC5saW51eEBn bWFpbC5jb20+IHdyb3RlOgo+ID4+ID4gPiA+ID4+ID4gPk9uIEZyaSwgMDcgTWFyIDIwMjUgMTE6 MzA6MzUgLTA4MDAKPiA+PiA+ID4gPiA+PiA+ID4iSC4gUGV0ZXIgQW52aW4iIDxocGFAenl0b3Iu Y29tPiB3cm90ZToKPiA+PiA+ID4gPiA+PiA+ID4KPiA+PiA+ID4gPiA+PiA+ID4+IE9uIE1hcmNo IDcsIDIwMjUgMTA6NDk6NTYgQU0gUFNULCBBbmRyZXcgQ29vcGVyIDxhbmRyZXcuY29vcGVyM0Bj aXRyaXguY29tPiB3cm90ZToKPiA+PiA+ID4gPiA+PiA+ID4+ID4+IChpbnQpdHJ1ZSBtb3N0IGRl ZmluaXRlbHkgaXMgZ3VhcmFudGVlZCB0byBiZSAxLiAgCj4gPj4gPiA+ID4gPj4gPiA+PiA+Cj4g Pj4gPiA+ID4gPj4gPiA+PiA+VGhhdCdzIG5vdCB0ZWNobmljYWxseSBjb3JyZWN0IGFueSBtb3Jl Lgo+ID4+ID4gPiA+ID4+ID4gPj4gPgo+ID4+ID4gPiA+ID4+ID4gPj4gPkdDQyBoYXMgaW50cm9k dWNlZCBoYXJkZW5lZCBib29scyB0aGF0IGludGVudGlvbmFsbHkgaGF2ZSBiaXQgcGF0dGVybnMK PiA+PiA+ID4gPiA+PiA+ID4+ID5vdGhlciB0aGFuIDAgYW5kIDEuCj4gPj4gPiA+ID4gPj4gPiA+ PiA+Cj4gPj4gPiA+ID4gPj4gPiA+PiA+aHR0cHM6Ly9nY2MuZ251Lm9yZy9nY2MtMTQvY2hhbmdl cy5odG1sCj4gPj4gPiA+ID4gPj4gPiA+PiA+Cj4gPj4gPiA+ID4gPj4gPiA+PiA+fkFuZHJldyAg Cj4gPj4gPiA+ID4gPj4gPiA+PiAKPiA+PiA+ID4gPiA+PiA+ID4+IEJpdCBwYXR0ZXJucyBpbiBt ZW1vcnkgbWF5YmUgKG5vdCB0aGF0IEkgY2FuIHNlZSB0aGUgTGludXgga2VybmVsIHVzaW5nIHRo ZW0pIGJ1dAo+ID4+ID4gPiA+ID4+ID4gPj4gZm9yIGNvbXBpbGVyLWdlbmVyYXRlZCBjb252ZXJz YXRpb25zIHRoYXQncyBzdGlsbCBhIGdpdmVuLCBvciB0aGUgbWFuYWdlciBpc24ndCBDCj4gPj4g PiA+ID4gPj4gPiA+PiBvciBhbnl0aGluZyBldmVuIHJlbW90ZWx5IGxpa2UgaXQuCj4gPj4gPiA+ ID4gPj4gPiA+PiAKPiA+PiA+ID4gPiA+PiA+ID4KPiA+PiA+ID4gPiA+PiA+ID5UaGUgd2hvbGUg aWRlYSBvZiAnYm9vbCcgaXMgcHJldHR5IG11Y2ggYnJva2VuIGJ5IGRlc2lnbi4KPiA+PiA+ID4g PiA+PiA+ID5UaGUgdW5kZXJseWluZyBwcm9ibGVtIGlzIHRoYXQgdmFsdWVzIG90aGVyIHRoYW4g J3RydWUnIGFuZCAnZmFsc2UnIGNhbgo+ID4+ID4gPiA+ID4+ID4gPmFsd2F5cyBnZXQgaW50byAn Ym9vbCcgdmFyaWFibGVzLgo+ID4+ID4gPiA+ID4+ID4gPgo+ID4+ID4gPiA+ID4+ID4gPk9uY2Ug dGhhdCBoYXMgaGFwcGVuZWQgaXQgaXMgYWxsIGZ1YmFyLgo+ID4+ID4gPiA+ID4+ID4gPgo+ID4+ ID4gPiA+ID4+ID4gPlRyeWluZyB0byBzYW5pdGlzZSBhIHZhbHVlIHdpdGggKHNheSk6Cj4gPj4g PiA+ID4gPj4gPiA+aW50IGYoYm9vbCB2KQo+ID4+ID4gPiA+ID4+ID4gPnsKPiA+PiA+ID4gPiA+ PiA+ID4JcmV0dXJuIChpbnQpdiAmIDE7Cj4gPj4gPiA+ID4gPj4gPiA+fSAgICAKPiA+PiA+ID4g PiA+PiA+ID5qdXN0IGRvZXNuJ3Qgd29yayAoc2VlIGh0dHBzOi8vd3d3LmdvZGJvbHQub3JnL3ov TUVuZFAzcTlqKQo+ID4+ID4gPiA+ID4+ID4gPgo+ID4+ID4gPiA+ID4+ID4gPkkgcmVhbGx5IGRv bid0IHNlZSBob3cgdXNpbmcgKHNheSkgMHhhYSBhbmQgMHg1NSBoZWxwcy4KPiA+PiA+ID4gPiA+ PiA+ID5XaGF0IGhhcHBlbnMgaWYgdGhlIHZhbHVlIGlzIHdyb25nPyBhIHRyYXAgb3IgZXhjZXB0 aW9uPywgZ29vZCBsdWNrIHJlY292ZXJpbmcKPiA+PiA+ID4gPiA+PiA+ID5mcm9tIHRoYXQuCj4g Pj4gPiA+ID4gPj4gPiA+Cj4gPj4gPiA+ID4gPj4gPiA+CURhdmlkCj4gPj4gPiA+ID4gPj4gPiAK PiA+PiA+ID4gPiA+PiA+IERpZCB5b3UganVzdCBkaXNjb3ZlciBHSUdPPwo+ID4+ID4gPiA+ID4+ IAo+ID4+ID4gPiA+ID4+IFRoYW5rcyBmb3IgYWxsIHRoZSBzdWdnZXN0aW9ucy4KPiA+PiA+ID4g PiA+PiAKPiA+PiA+ID4gPiA+PiBJIGRvbid0IGhhdmUgYSBzdHJvbmcgb3BpbmlvbiBvbiB0aGUg bmFtaW5nIG9yIHJldHVybiB0eXBlLiBJJ20gc3RpbGwgYQo+ID4+ID4gPiA+ID4+IGJpdCBjb25m dXNlZCBhYm91dCB3aGV0aGVyIEkgY2FuIGFzc3VtZSB0aGF0IGNhc3RpbmcgYm9vbCB0byBpbnQg YWx3YXlzCj4gPj4gPiA+ID4gPj4gcmVzdWx0cyBpbiAwIG9yIDEuCj4gPj4gPiA+ID4gPj4gCj4g Pj4gPiA+ID4gPj4gSWYgdGhhdCdzIHRoZSBjYXNlLCBzaW5jZSBtb3N0IHBlb3BsZSBwcmVmZXIg Ym9vbCBvdmVyIGludCBhcyB0aGUKPiA+PiA+ID4gPiA+PiByZXR1cm4gdHlwZSBhbmQgc29tZSBh cmUgYWdhaW5zdCBpbnRyb2R1Y2luZyB1MSwgbXkgY3VycmVudCBwbGFuIGlzIHRvCj4gPj4gPiA+ ID4gPj4gdXNlIHRoZSBmb2xsb3dpbmcgaW4gdGhlIG5leHQgdmVyc2lvbjoKPiA+PiA+ID4gPiA+ PiAKPiA+PiA+ID4gPiA+PiBib29sIHBhcml0eV9vZGQodTY0IHZhbCk7Cj4gPj4gPiA+ID4gPj4g Cj4gPj4gPiA+ID4gPj4gVGhpcyBrZWVwcyB0aGUgYm9vbCByZXR1cm4gdHlwZSwgcmVuYW1lcyB0 aGUgZnVuY3Rpb24gZm9yIGJldHRlcgo+ID4+ID4gPiA+ID4+IGNsYXJpdHksIGFuZCBhdm9pZHMg ZXh0cmEgbWFpbnRlbmFuY2UgYnVyZGVuIGJ5IGhhdmluZyBqdXN0IG9uZQo+ID4+ID4gPiA+ID4+ IGZ1bmN0aW9uLgo+ID4+ID4gPiA+ID4+IAo+ID4+ID4gPiA+ID4+IElmIEkgY2FuJ3QgYXNzdW1l IHRoYXQgY2FzdGluZyBib29sIHRvIGludCBhbHdheXMgcmVzdWx0cyBpbiAwIG9yIDEsCj4gPj4g PiA+ID4gPj4gd291bGQgaXQgYmUgYWNjZXB0YWJsZSB0byBrZWVwIHRoZSByZXR1cm4gdHlwZSBh cyBpbnQ/Cj4gPj4gPiA+ID4gPj4gCj4gPj4gPiA+ID4gPj4gV291bGQgdGhpcyB3b3JrIGZvciBl dmVyeW9uZT8KPiA+PiA+ID4gPiA+Cj4gPj4gPiA+ID4gPkFscmlnaHQsIGl0J3MgY2xlYXJseSBh IHNwbGl0IG9waW5pb24uIFNvIHdoYXQgSSB3b3VsZCBkbyBteXNlbGYgaW4KPiA+PiA+ID4gPiA+ c3VjaCBjYXNlIGlzIHRvIGxvb2sgYXQgZXhpc3RpbmcgY29kZSBhbmQgc2VlIHdoYXQgcGVvcGxl IHdobyByZWFsbHkKPiA+PiA+ID4gPiA+bmVlZCBwYXJpdHkgaW52ZW50IGluIHRoZWlyIGRyaXZl cnM6Cj4gPj4gPiA+ID4gPgo+ID4+ID4gPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgYm9vbCAgICAgIHBhcml0eV9vZGQKPiA+PiA+ID4gPiA+c3RhdGljIGlubGluZSBp bnQgcGFyaXR5OCh1OCB2YWwpICAgICAgIC0gICAgICAgICAgICAgICAtCj4gPj4gPiA+ID4gPnN0 YXRpYyB1OCBjYWxjX3Bhcml0eSh1OCB2YWwpICAgICAgICAgICAtICAgICAgICAgICAgICAgLQo+ ID4+ID4gPiA+ID5zdGF0aWMgaW50IG9kZF9wYXJpdHkodTggYykgICAgICAgICAgICAgLSAgICAg ICAgICAgICAgICsKPiA+PiA+ID4gPiA+c3RhdGljIGludCBzYWE3MTF4X29kZF9wYXJpdHkgICAg ICAgICAgIC0gICAgICAgICAgICAgICArCj4gPj4gPiA+ID4gPnN0YXRpYyBpbnQgbWF4MzEwMF9k b19wYXJpdHkgICAgICAgICAgICAtICAgICAgICAgICAgICAgLQo+ID4+ID4gPiA+ID5zdGF0aWMg aW5saW5lIGludCBwYXJpdHkodW5zaWduZWQgeCkgICAgLSAgICAgICAgICAgICAgIC0KPiA+PiA+ ID4gPiA+c3RhdGljIGludCBiaXRfcGFyaXR5KHUzMiBwa3QpICAgICAgICAgIC0gICAgICAgICAg ICAgICAtCj4gPj4gPiA+ID4gPnN0YXRpYyBpbnQgb2FfdGM2X2dldF9wYXJpdHkodTMyIHApICAg ICAtICAgICAgICAgICAgICAgLQo+ID4+ID4gPiA+ID5zdGF0aWMgdTMyIHBhcml0eTMyKF9fbGUz MiBkYXRhKSAgICAgICAgLSAgICAgICAgICAgICAgIC0KPiA+PiA+ID4gPiA+c3RhdGljIHUzMiBw YXJpdHkodTMyIHNhbXBsZSkgICAgICAgICAgIC0gICAgICAgICAgICAgICAtCj4gPj4gPiA+ID4g PnN0YXRpYyBpbnQgZ2V0X3Bhcml0eShpbnQgbnVtYmVyLCAgICAgICAtICAgICAgICAgICAgICAg LQo+ID4+ID4gPiA+ID4gICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpCj4gPj4gPiA+ID4g PnN0YXRpYyBib29sIGkyY3JfY2hlY2tfcGFyaXR5MzIodTMyIHYsICArICAgICAgICAgICAgICAg LQo+ID4+ID4gPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICBib29sIHBhcml0eSkKPiA+PiA+ ID4gPiA+c3RhdGljIGJvb2wgaTJjcl9jaGVja19wYXJpdHk2NCh1NjQgdikgICsgICAgICAgICAg ICAgICAtCj4gPj4gPiA+ID4gPnN0YXRpYyBpbnQgc3dfcGFyaXR5KF9fdTY0IHQpICAgICAgICAg ICAtICAgICAgICAgICAgICAgLQo+ID4+ID4gPiA+ID5zdGF0aWMgYm9vbCBwYXJpdHkodTY0IHZh bHVlKSAgICAgICAgICAgKyAgICAgICAgICAgICAgIC0KPiA+PiA+ID4gPiA+Cj4gPj4gPiA+ID4g Pk5vdyB5b3UgY2FuIHJlZmVyIHRvIHRoYXQgdGFibGUgc2F5IHRoYXQgaW50IHBhcml0eSh1WFgp IGlzIHdoYXQKPiA+PiA+ID4gPiA+cGVvcGxlIHdhbnQgdG8gc2VlIGluIHRoZWlyIGRyaXZlcnMu Cj4gPj4gPiA+ID4gPgo+ID4+ID4gPiA+ID5XaGljaGV2ZXIgaW50ZXJmYWNlIHlvdSBjaG9vc2Us IHBsZWFzZSBkaXNjdXNzIGl0J3MgcHJvcyBhbmQgY29ucy4KPiA+PiA+ID4gPiA+V2hhdCBibG9h dC1vLW1ldGVyIHNheXMgZm9yIGVhY2ggb3B0aW9uPyBXaGF0J3MgbWFpbnRlbmFuY2UgYnVyZGVu Pwo+ID4+ID4gPiA+ID5QZXJmIHRlc3Q/IExvb2sgYXQgZ2VuZXJhdGVkIGNvZGU/Cj4gPj4gPiA+ ID4gPgo+ID4+ID4gPiA+ID5JIHBlcnNvbmFsbHkgZm9yIGEgbWFjcm8gcmV0dXJuaW5nIGJvb2xl YW4sIHNvbWV0aGluZyBsaWtlIEkKPiA+PiA+ID4gPiA+cHJvcG9zZWQgYXQgdGhlIHZlcnkgYmVn aW5uaW5nLgo+ID4+ID4gPiA+ID4KPiA+PiA+ID4gPiA+VGhhbmtzLAo+ID4+ID4gPiA+ID5ZdXJ5 Cj4gPj4gPiA+ID4gCj4gPj4gPiA+ID4gQWxzbywgcGxlYXNlIGF0IGxlYXN0IHByb3ZpZGUgYSB3 YXkgZm9yIGFuIGFyY2ggdG8gb3B0IGluIHRvIHVzaW5nIHRoZSBidWlsdGlucywgd2hpY2ggc2Vl bSB0byBwcm9kdWNlIGFzIGdvb2QgcmVzdWx0cyBvciBiZXR0ZXIgYXQgbGVhc3Qgb24gc29tZSBh cmNoaXRlY3R1cmVzIGxpa2UgeDg2IGFuZCBwcm9iYWJseSB3aXRoIENQVSBvcHRpb25zIHRoYXQg aW1wbHkgZmFzdCBwb3BjbnQgaXMgYXZhaWxhYmxlLgo+ID4+ID4gPiAKPiA+PiA+ID4gWWVhaC4g QW5kIGJlY2F1c2UgbGludXgvYml0b3BzLmggYWxyZWFkeSBpbmNsdWRlcyBhc20vYml0b3BzLmgK PiA+PiA+ID4gdGhlIHNpbXBsZXN0IHdheSB3b3VsZCBiZSB3cmFwcGluZyBnZW5lcmljIGltcGxl bWVudGF0aW9uIHdpdGgKPiA+PiA+ID4gdGhlICNpZm5kZWYgcGFyaXR5LCBzaW1pbGFybHkgdG8g aG93IHdlIGhhbmRsZSBmaW5kX25leHRfYml0IGNhc2UuCj4gPj4gPiA+IAo+ID4+ID4gPiBTbzoK PiA+PiA+ID4gMS4gS3Vhbi1XZWksIHBsZWFzZSBkb24ndCBpbnZlbnQgc29tZXRoaW5nIGxpa2Ug QVJDSF9IQVNfUEFSSVRZOwo+ID4+ID4gPiAyLiBUaGlzIG1heSwgYW5kIHByb2JhYmx5IHNob3Vs ZCwgYmUgYSBzZXBhcmF0ZSBmb2xsb3ctdXAgc2VyaWVzLAo+ID4+ID4gPiAgICBsaWtlbHkgY3Jl YXRlZCBieSBjb3JyZXNwb25kaW5nIGFyY2ggZXhwZXJ0cy4KPiA+PiA+ID4gCj4gPj4gPiBJIHNh dyBkaXNjdXNzaW9ucyBpbiB0aGUgcHJldmlvdXMgZW1haWwgdGhyZWFkIGFib3V0IGJvdGgKPiA+ PiA+IF9fYnVpbHRpbl9wYXJpdHkgYW5kIHg4Ni1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMuIEhv d2V2ZXIsIGZyb20gdGhlCj4gPj4gPiBkaXNjdXNzaW9uLCBJIGxlYXJuZWQgdGhhdCBiZWZvcmUg Y29uc2lkZXJpbmcgYW55IG9wdGltaXphdGlvbiwgd2UKPiA+PiA+IHNob3VsZCBmaXJzdCBhc2s6 IHdoaWNoIGRyaXZlciBvciBzdWJzeXN0ZW0gYWN0dWFsbHkgY2FyZXMgYWJvdXQgcGFyaXR5Cj4g Pj4gPiBlZmZpY2llbmN5PyBJZiBzb21lb25lIGRvZXMsIEkgY2FuIGhlbHAgd2l0aCBhIG1pY3Jv LWJlbmNobWFyayB0bwo+ID4+ID4gcHJvdmlkZSBwZXJmb3JtYW5jZSBudW1iZXJzLCBidXQgSSBk b24ndCBoYXZlIGVub3VnaCBkb21haW4ga25vd2xlZGdlCj4gPj4gPiB0byBpZGVudGlmeSBob3Qg cGF0aHMgd2hlcmUgcGFyaXR5IGVmZmljaWVuY3kgbWF0dGVycy4KPiA+PiA+IAo+ID4+IElNSE8s Cj4gPj4gCj4gPj4gSWYgcGFyaXR5IGlzIG5ldmVyIHVzZWQgaW4gYW55IGhvdCBwYXRoIGFuZCB3 ZSBkb24ndCBjYXJlIGFib3V0IHBhcml0eToKPiA+PiAKPiA+PiBUaGVuIGJlbmNobWFya2luZyBp dHMgcGVyZm9ybWFuY2Ugc2VlbXMgbWVhbmluZ2xlc3MuIEluIHRoaXMgY2FzZSwgYQo+ID4+IGZ1 bmN0aW9uIHdpdGggYSB1NjQgYXJndW1lbnQgd291bGQgc3VmZmljZSwgYW5kIHdlIG1pZ2h0IG5v dCBldmVuIG5lZWQKPiA+PiBhIG1hY3JvIHRvIG9wdGltaXplIGZvciBkaWZmZXJlbnQgdHlwZXPi gJRlc3BlY2lhbGx5IHNpbmNlIHRoZSBtYWNybwo+ID4+IHJlcXVpcmVzIHNwZWNpYWwgaGFja3Mg dG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuIEFsc28sIEkgZG9uJ3QgdGhpbmsKPiA+PiBjb2Rl IHNpemUgbWF0dGVycyBoZXJlLiBJZiBpdCBkb2VzLCB3ZSBzaG91bGQgZmlyc3QgY29uc2lkZXIg bWFraW5nCj4gPj4gcGFyaXR5IGEgbm9uLWlubGluZSBmdW5jdGlvbiBpbiBhIC5jIGZpbGUgcmF0 aGVyIHRoYW4gYW4gaW5saW5lCj4gPj4gZnVuY3Rpb24vbWFjcm8gaW4gYSBoZWFkZXIuCj4gPj4g Cj4gPj4gSWYgcGFyaXR5IGlzIHVzZWQgaW4gYSBob3QgcGF0aDoKPiA+PiAKPiA+PiBXZSBuZWVk IGRpZmZlcmVudCBoYW5kbGluZyBmb3IgZGlmZmVyZW50IHR5cGUgc2l6ZXMuIEFzIHByZXZpb3Vz bHkKPiA+PiBkaXNjdXNzZWQsIHg4NiBhc3NlbWJseSBtaWdodCB1c2UgZGlmZmVyZW50IGluc3Ry dWN0aW9ucyBmb3IgdTggYW5kCj4gPj4gdTE2LiBUaGlzIG1heSBzb3VuZCBzdHViYm9ybiwgYnV0 IEkgd2FudCB0byBhc2sgYWdhaW46IHNob3VsZCB3ZQo+ID4+IGNvbnNpZGVyIHVzaW5nIHBhcml0 eTgvMTYvMzIvNjQgaW50ZXJmYWNlcz8gTGlrZSBpbiB0aGUgaTNjIGRyaXZlcgo+ID4+IGV4YW1w bGUsIGlmIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBwYXJpdHkgbWFjcm8gdGhhdCBzZWxlY3RzIGFu Cj4gPj4gaW1wbGVtZW50YXRpb24gYmFzZWQgb24gdHlwZSBzaXplLCB1c2VycyBtdXN0IGV4cGxp Y2l0bHkgY2FzdCB0eXBlcy4KPiA+PiBJZiBmdXR1cmUgdXNlcnMgYWxzbyBuZWVkIHBhcml0eSBp biBhIGhvdCBwYXRoLCB0aGV5IG1pZ2h0IG5vdCBiZSBhd2FyZQo+ID4+IG9mIHRoaXMgcmVxdWly ZW1lbnQgYW5kIGVuZCB1cCBnZW5lcmF0aW5nIHN1Ym9wdGltYWwgY29kZS4gU2luY2Ugd2UKPiA+ PiBjYXJlIGFib3V0IGVmZmljaWVuY3kgYW5kIGdlbmVyYXRlZCBjb2RlLCB3aHkgbm90IGZvbGxv dyBod2VpZ2h0KCkgYW5kCj4gPj4gcHJvdmlkZSBzZXBhcmF0ZSBpbXBsZW1lbnRhdGlvbnMgZm9y IGRpZmZlcmVudCBzaXplcz8KPiA+PiAKPiA+SXQgc2VlbXMgbm8gb25lIHdpbGwgcmVwbHkgdG8g bXkgdHdvIGVtYWlscy4gU28sIEkgaGF2ZSBzdW1tYXJpemVkCj4gPmRpZmZlcmVudCBpbnRlcmZh Y2UgYXBwcm9hY2hlcy4gSWYgdGhlcmUgaXMgYSBuZXh0IHZlcnNpb24sIEkgd2lsbCBzZW5kCj4g Pml0IGFmdGVyIHRoZSBtZXJnZSB3aW5kb3cgY2xvc2VzLgo+ID4KPiA+SW50ZXJmYWNlIDE6IFNp bmdsZSBGdW5jdGlvbgo+ID5EZXNjcmlwdGlvbjogYm9vbCBwYXJpdHlfb2RkKHU2NCkKPiA+UHJv czogTWluaW1hbCBtYWludGVuYW5jZSBjb3N0Cj4gPkNvbnM6IERpZmZpY3VsdCB0byBpbnRlZ3Jh dGUgd2l0aCBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zCj4gPiAgICAgIGR1 ZSB0byB0aGUgaW5hYmlsaXR5IHRvIG9wdGltaXplIGZvciBkaWZmZXJlbnQgYXJndW1lbnQgc2l6 ZXMKCkhvdyBkaWZmaWN1bHQ/IEl0J3MganVzdCBhcyBzaW1wbGUgYXMgZmluZF9uZXh0X2JpdCgp LiBJIGFscmVhZHkKcG9pbnRlZCB0aGF0LgoKPiA+T3BpbmlvbnM6IEppcmkgc3VwcG9ydHMgdGhp cyBhcHByb2FjaAo+ID4KPiA+SW50ZXJmYWNlIDI6IFNpbmdsZSBNYWNybwo+ID5EZXNjcmlwdGlv bjogcGFyaXR5X29kZCgpIG1hY3JvCj4gPlByb3M6IEFsbG93cyB0eXBlLXNwZWNpZmljIGltcGxl bWVudGF0aW9uCj4gPkNvbnM6IFJlcXVpcmVzIGhhY2tzIHRvIGF2b2lkIHdhcm5pbmdzOyB1c2Vy cyBtYXkgbmVlZCBleHBsaWNpdAoKU28gaWYgdGhlIGhhY2sgaXMgZG9jdW1lbnRlZCwgaXQncyBP Sy4gSSBkb24ndCBrbm93IHRoZSBvdGhlciB3YXkgdG8KbW90aXZhdGUgY29tcGlsZXJzIHRvIGdl dCBiZXR0ZXIgb3RoZXIgdGhhbiBwb2ludGluZyB0aGVtIHRvIHRoZWlyCmJ1Z3MuCgo+ID4gICAg ICBjYXN0aW5nOyBwb3RlbnRpYWwgc3ViLW9wdGltYWwgY29kZSBvbiAzMi1iaXQgeDg2CgpBbnkg YXNtIGxpc3RpbmdzPyBBbnkgcmVhbCBpbXBhY3Q/Cgo+ID5PcGluaW9uczogWXVyeSBzdXBwb3J0 cyB0aGlzIGFwcHJvYWNoCj4gPgo+ID5JbnRlcmZhY2UgMzogTXVsdGlwbGUgRnVuY3Rpb25zCj4g PkRlc2NyaXB0aW9uOiBib29sIHBhcml0eV9vZGQ4LzE2LzMyLzY0KCkKPiA+UHJvczogTm8gbmVl ZCBmb3IgZXhwbGljaXQgY2FzdGluZzsgZWFzeSB0byBpbnRlZ3JhdGUKCkV4cGxpY2l0IGNhc3Rp bmdzIGFyZSBzb21ldGltZXMgYmV0dGVyIHRoYW4gaW1wbGljaXQgb25lcy4KCj4gPiAgICAgIGFy Y2hpdGVjdHVyZS1zcGVjaWZpYyBvcHRpbWl6YXRpb25zOyBleGNlcHQgZm9yIHBhcml0eTgoKSwg YWxsCj4gPiAgICAgIGZ1bmN0aW9ucyBhcmUgb25lLWxpbmVycyB3aXRoIG5vIHNpZ25pZmljYW50 IGNvZGUgZHVwbGljYXRpb24KPiA+Q29uczogTW9yZSBmdW5jdGlvbnMgbWF5IGluY3JlYXNlIG1h aW50ZW5hbmNlIGJ1cmRlbgoKcy9tYXkvd2lsbC8KCj4gPk9waW5pb25zOiBPbmx5IEkgc3VwcG9y dCB0aGlzIGFwcHJvYWNoCj4gPgo+ID5SZWdhcmRzLAo+ID5LdWFuLVdlaQo+IAo+IFlvdSBjYW4g YWRkIG1lIHRvIHRoZSBmaW5hbCBvcHRpb24uIEkgdGhpbmsgaXQgbWFrZXMgbW9zdCBzZW5zZQoK VGhpcyBpcyBub3QgYSBkZW1vY3JhY3ksIGFuZCB3ZSBhcmUgbm90IHZvdGluZyBoZXJlLiBXZSBh cmUgZW5naW5lZXJzLgpXZSBzaGFyZSBvdXIgZXhwZXJ0IG9waW5pb25zIGFuZCBjaG9vc2UgdGhl IGJlc3Qgb25lLiBJJ2xsIGJlIGhhcHB5IHRvCmdvIHdpdGggYW55IHNvbHV0aW9uLCBpZiB3ZSBh bGwgbWFrZSBzdXJlIGl0J3MgdGhlIGJlc3QuCgpJJ20gZm9yICMyIGJlY2F1c2UgaXQgCiAtIGdl bmVyYXRlcyBiZXR0ZXIgY29kZSB0aGFuICMxOwogLSBlYXNpZXIgdG8gdXNlIHRoYW4gIzM7IGFu ZAogLSBoYXMgbGVzcyBtYWludGVuYW5jZSBidXJkZW4gdGhhbiAjMy4KCldoeSBleGFjdGx5ICMz IG1ha2VzIHRoZSBtb3N0IHNlbnNlIHRvIHlvdT8gTW9zdCB2YXJpYWJsZXMgYXJlIGludHMKYW5k IGxvbmdzLiBIb3cgYXJlIHlvdSBnb2luZyB0byBoYW5kbGUgdGhvc2Ugd2l0aCBmaXhlZC10eXBl cyBwYXJpdHkoKXM/CgpUaGFua3MsCll1cnkKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eCBNVEQgZGlzY3Vzc2lvbiBtYWlsaW5nIGxp c3QKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1tdGQv Cg==