{"id":2219440,"url":"http://patchwork.ozlabs.org/api/patches/2219440/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-arc/patch/20260403-cmpxchg-v2-1-23acd2727447@gmail.com/","project":{"id":48,"url":"http://patchwork.ozlabs.org/api/projects/48/?format=json","name":"Linux ARC development","link_name":"linux-arc","list_id":"linux-snps-arc.lists.infradead.org","list_email":"linux-snps-arc@lists.infradead.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260403-cmpxchg-v2-1-23acd2727447@gmail.com>","list_archive_url":null,"date":"2026-04-03T01:19:54","name":"[v2] cmpxchg: allow const-qualified old value in cmpxchg()","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"7a6636db281bed803dcf3ae6c86affc93be617ed","submitter":{"id":15639,"url":"http://patchwork.ozlabs.org/api/people/15639/?format=json","name":"Hangbin Liu","email":"liuhangbin@gmail.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-arc/patch/20260403-cmpxchg-v2-1-23acd2727447@gmail.com/mbox/","series":[{"id":498573,"url":"http://patchwork.ozlabs.org/api/series/498573/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-arc/list/?series=498573","date":"2026-04-03T01:19:54","name":"[v2] cmpxchg: allow const-qualified old value in cmpxchg()","version":2,"mbox":"http://patchwork.ozlabs.org/series/498573/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2219440/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2219440/checks/","tags":{},"related":[],"headers":{"Return-Path":"\n <linux-snps-arc-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=lists.infradead.org header.i=@lists.infradead.org\n header.a=rsa-sha256 header.s=bombadil.20210309 header.b=3OE8k1it;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=mgG1MAoX;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=none (no SPF record) smtp.mailfrom=lists.infradead.org\n (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org;\n envelope-from=linux-snps-arc-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from bombadil.infradead.org (bombadil.infradead.org\n [IPv6:2607:7c80:54:3::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fn1JY4d0Tz1yCs\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 03 Apr 2026 12:26:05 +1100 (AEDT)","from localhost ([::1] helo=bombadil.infradead.org)\n\tby bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1w8TIS-000000012zb-1HvC;\n\tFri, 03 Apr 2026 01:26:04 +0000","from mail-pj1-x102d.google.com ([2607:f8b0:4864:20::102d])\n\tby bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1w8TIQ-000000012yg-1umR\n\tfor linux-snps-arc@lists.infradead.org;\n\tFri, 03 Apr 2026 01:26:03 +0000","by mail-pj1-x102d.google.com with SMTP id\n 98e67ed59e1d1-35c124d2613so801358a91.2\n        for <linux-snps-arc@lists.infradead.org>;\n Thu, 02 Apr 2026 18:26:02 -0700 (PDT)","from 1.0.0.127.in-addr.arpa ([209.132.188.88])\n        by smtp.gmail.com with ESMTPSA id\n d9443c01a7336-2b27472d688sm42536555ad.8.2026.04.02.18.25.45\n        (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n        Thu, 02 Apr 2026 18:25:59 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=lists.infradead.org; s=bombadil.20210309; h=Sender:\n\tContent-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post:\n\tList-Archive:List-Unsubscribe:List-Id:Cc:To:Message-Id:MIME-Version:Subject:\n\tDate:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:\n\tResent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:\n\tList-Owner; bh=AcHUcpbKOAUtL+VDlciUuhkNnbEf5k0MS0Lu4jtxU1o=; b=3OE8k1it+A9diE\n\tWg6IKvoTzh1s5d1sGYsDNXp4rtx6k7XsqqT2B9ZeCDsTRdBxiFhvb1Iv8Gp7hqR2lAFajE2VOnGEo\n\tALizC+EKswhJjw2W2ii6hl5bC7wrYL3E9FvY9qnGIuk+JADJyJ9Ovv57hfIlj/Lm6mjNA0ZpiTQuN\n\t1JMs5yYvLFlOXymsezj7Sv8uQskIeQ8Kko9W+wabUWFTeEj51Hl3ImpK7SjNcp7KTFW4wroQw68ex\n\tDI06+2iPWTR3uMdUlyw4vq/pixATz8zk2u4UROCxZbIdIUWkYDd1hR6NWbUQtwlrDkACf7YpaVXG/\n\tMwKxv7lPaRyEliF0tWBA==;","v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=gmail.com; s=20251104; t=1775179561; x=1775784361;\n darn=lists.infradead.org;\n        h=cc:to:message-id:content-transfer-encoding:mime-version:subject\n         :date:from:from:to:cc:subject:date:message-id:reply-to;\n        bh=rY2ciLkg8RtFIf8Sumay9p4mc2pCLq551+da1KF5JtU=;\n        b=mgG1MAoXs1XMVLVjrFzIyHCMcbBFgAa0Oe4yc2CMZaH+bF78EIapa+owUV8O5mDutL\n         Vm++o9yfruC7WDcB4n25Y9inKn01czjVBJKR6dSsaIx4fKB1watWHJ+uRC0IfRL0hS+T\n         Z6kxTMl/NkZ7PNTenNLDDB4xf0H8nO7BD7FulW0p1E6ZJJjDN5peeuvdfj/wIwzbO2q+\n         7S1PaDkIZg/mw2YuRDY19t7qzjljGkFfwQZOFb+C6bNT/wgdjRG22EZZlq477HYuV2UK\n         ORynGG+FRfamdOujdmv9nLScnwH7p0hLWMv9MMNh+X7F92AR3JhmgWWJU9bVJFXB6cjP\n         /FGQ=="],"X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=1e100.net; s=20251104; t=1775179561; x=1775784361;\n        h=cc:to:message-id:content-transfer-encoding:mime-version:subject\n         :date:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n         :message-id:reply-to;\n        bh=rY2ciLkg8RtFIf8Sumay9p4mc2pCLq551+da1KF5JtU=;\n        b=tMfB2WvYG3mdRqfDVeM56ZdU9ReZVMzitJnCGFJdQzPNru4z4Ug05Wrt4q67BpkzjE\n         z6cffdEtLSpOUh556aGhxxzksKykO0og3tbxpvHLwzB9rd95SkOlQv37uXEf/P6A4//P\n         6Yalo7UYfTCSnldHDuvH9sIaTNYkqL6fVgVNC+xAD9ltEkjbygJFarG9XWXbOZa8QxCo\n         BcBTPrtOu/fYYrnIJr5XSuhmQze/kcoYy9hN7ZnIDaEGgTZUjMf1T7Pb0YcErRGO1ETi\n         fU88Ip6daCamOe/KHhxpBcFFiCS++uC0I6C9mXFPm1tw0miwq0Ch6ChIsD8TZk9Vy9j/\n         as6w==","X-Forwarded-Encrypted":"i=1;\n AJvYcCVAU4S/46XhAg2ekGEi1JYnk9zfuFUEZm/g6lCOD/87QKHIjR2xh/Fba80JjV7PgCIuuX6oPOajm8E5VfD5pQ==@lists.infradead.org","X-Gm-Message-State":"AOJu0YyhF8JFl8tlcRkrgCPSyXVSiCcn0p+ixhISUBGQ3JhhjgJJkWdt\n\to7GiTGpuvI1Wega7d50EwnRwTJf+Qv5MYlgMebxBGj66cPjpxCUBsu1f","X-Gm-Gg":"AeBDies+AZFNEQpBx8rYpxmOCCF9KEqvhglZtd9zC/3PmAclOiOHfxzaGO/XrCWWlDh\n\tGbYPUOohV0WZkd9B0mGKtl4LOdbwPCTktCxxUZyaX4IvmsPkf7dHGLlPukoKQu1EdbmMjgpMr7z\n\tuxuR2fla5QSlP8OkJBDgHlRssgYItJcSvBt7NAiDy8uKoKry8/x7wSslCC0kH0CfzgFkB+QfiW9\n\tTVcJLrQrEwnhl2tGgShXsr2KPtXa/UoT9FzKfWFkegdqZuvayERL6Xvo920KoBOZiK10rLVPKPJ\n\tgFLdAalME4hNYmxu5kNS/wEvXUCegmH81osTuV/lfwzIojnRk1C1j+Z+f62hScMfqZ9FzCQXESs\n\tHSzatExK3x0kywIV80u1hQwTHkIf5ZYVjC0gOrBHmAIFq5RGx6s5GPkB6/bAKVsv4btKmVzcQbM\n\tk2f2dTEX+XH4RCbARAvqQ5JDDvU8we6uwBh5g3mZXhfL9B5gJP","X-Received":"by 2002:a17:902:ea0b:b0:2b2:5da8:14be with SMTP id\n d9443c01a7336-2b28190a213mr12256705ad.41.1775179561300;\n        Thu, 02 Apr 2026 18:26:01 -0700 (PDT)","From":"Hangbin Liu <liuhangbin@gmail.com>","Date":"Fri, 03 Apr 2026 09:19:54 +0800","Subject":"[PATCH v2] cmpxchg: allow const-qualified old value in cmpxchg()","MIME-Version":"1.0","Message-Id":"<20260403-cmpxchg-v2-1-23acd2727447@gmail.com>","X-B4-Tracking":"v=1; b=H4sIAAAAAAAC/2XMSwrDIBSF4a2EO65Fb00KHXUfJQPxeaHGoEFSg\n nuvzbTD/3D4Dig2ky3wGA7ItlKhtPTAywA6qMVbRqY3IMeJS45Mx3XXwTN05sbvTkolBfT3mq2\n j/ZRec+9AZUv5c8JV/NZ/owommBwnYVHz0aB++qjofdUpwtxa+wIngfApngAAAA==","X-Change-ID":"20260402-cmpxchg-2fd307f44a41","To":"Richard Henderson <richard.henderson@linaro.org>,\n Matt Turner <mattst88@gmail.com>, Magnus Lindholm <linmag7@gmail.com>,\n Vineet Gupta <vgupta@kernel.org>, Brian Cain <bcain@kernel.org>,\n \"James E.J. Bottomley\" <James.Bottomley@HansenPartnership.com>,\n Helge Deller <deller@gmx.de>, Madhavan Srinivasan <maddy@linux.ibm.com>,\n Michael Ellerman <mpe@ellerman.id.au>, Nicholas Piggin <npiggin@gmail.com>,\n \"Christophe Leroy (CS GROUP)\" <chleroy@kernel.org>,\n Paul Walmsley <pjw@kernel.org>, Palmer Dabbelt <palmer@dabbelt.com>,\n Albert Ou <aou@eecs.berkeley.edu>, Alexandre Ghiti <alex@ghiti.fr>,\n Yoshinori Sato <ysato@users.sourceforge.jp>, Rich Felker <dalias@libc.org>,\n John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>,\n \"David S. Miller\" <davem@davemloft.net>,\n Andreas Larsson <andreas@gaisler.com>, Thomas Gleixner <tglx@kernel.org>,\n Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,\n Dave Hansen <dave.hansen@linux.intel.com>, x86@kernel.org,\n \"H. Peter Anvin\" <hpa@zytor.com>, Chris Zankel <chris@zankel.net>,\n Max Filippov <jcmvbkbc@gmail.com>,\n David Laight <david.laight.linux@gmail.com>","Cc":"linux-alpha@vger.kernel.org, linux-kernel@vger.kernel.org,\n linux-snps-arc@lists.infradead.org, linux-hexagon@vger.kernel.org,\n linux-parisc@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,\n linux-riscv@lists.infradead.org, linux-sh@vger.kernel.org,\n sparclinux@vger.kernel.org, Jakub Kicinski <kuba@kernel.org>,\n Hangbin Liu <liuhangbin@gmail.com>","X-Mailer":"b4 0.14.3","X-CRM114-Version":"20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 ","X-CRM114-CacheID":"sfid-20260402_182602_500878_7854988F ","X-CRM114-Status":"GOOD (  17.06  )","X-Spam-Score":"-2.1 (--)","X-Spam-Report":"Spam detection software,\n running on the system \"bombadil.infradead.org\",\n has NOT identified this incoming email as spam.  The original\n message has been attached to this so you can view it or label\n similar future email.  If you have any questions, see\n the administrator of that system for details.\n Content preview:  The old value passed to cmpxchg() is semantically\n read-only:\n    it is only loaded into a register as a comparand and is never written\n back.\n    However, the macro currently assigns it implicitly to a local v [...]\n Content analysis details:   (-2.1 points, 5.0 required)\n  pts rule name              description\n ---- ----------------------\n --------------------------------------------------\n -0.0 SPF_PASS               SPF: sender matches SPF record\n  0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record\n  0.1 DKIM_SIGNED            Message has a DKIM or DK signature,\n not necessarily valid\n -0.1 DKIM_VALID_EF          Message has a valid DKIM or DK signature from\n                             envelope-from domain\n -0.1 DKIM_VALID_AU          Message has a valid DKIM or DK signature from\n author's\n                             domain\n -0.1 DKIM_VALID             Message has at least one valid DKIM or DK\n signature\n -1.9 BAYES_00               BODY: Bayes spam probability is 0 to 1%\n                             [score: 0.0000]\n  0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail\n provider\n                             [liuhangbin(at)gmail.com]\n -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at https://www.dnswl.org/, no\n                             trust\n                             [2607:f8b0:4864:20:0:0:0:102d listed in]\n                             [list.dnswl.org]","X-BeenThere":"linux-snps-arc@lists.infradead.org","X-Mailman-Version":"2.1.34","Precedence":"list","List-Id":"Linux on Synopsys ARC Processors <linux-snps-arc.lists.infradead.org>","List-Unsubscribe":"<http://lists.infradead.org/mailman/options/linux-snps-arc>,\n <mailto:linux-snps-arc-request@lists.infradead.org?subject=unsubscribe>","List-Archive":"<http://lists.infradead.org/pipermail/linux-snps-arc/>","List-Post":"<mailto:linux-snps-arc@lists.infradead.org>","List-Help":"<mailto:linux-snps-arc-request@lists.infradead.org?subject=help>","List-Subscribe":"<http://lists.infradead.org/mailman/listinfo/linux-snps-arc>,\n <mailto:linux-snps-arc-request@lists.infradead.org?subject=subscribe>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Sender":"\"linux-snps-arc\" <linux-snps-arc-bounces@lists.infradead.org>","Errors-To":"\n linux-snps-arc-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org"},"content":"The old value passed to cmpxchg() is semantically read-only: it is\nonly loaded into a register as a comparand and is never written back.\nHowever, the macro currently assigns it implicitly to a local variable\nof type __typeof__(*(ptr)), which triggers -Werror=discarded-qualifiers\nwhen old is a const-qualified pointer and ptr points to a non-const type.\n\nFix this by using __auto_type with the conditional expression trick:\n\n  __auto_type _o_ = 1 ? (o) : *(ptr);\n\nThe __auto_type deduces the type from the expression, so _o_ naturally\ntakes the const-qualified type when o is const-qualified, avoiding the\ndiscarded-qualifiers warning. The conditional expression forces the\ncompiler to verify that o and *(ptr) have compatible types, preserving\nthe type-safety check that a bare __auto_type _o_ = (o) would lose.\nSince the condition is the constant 1, the compiler optimizes away the\n*(ptr) branch entirely with no runtime cost.\n\nFor macros where ptr is already captured in a local variable (arc's\n_p_, hexagon's __ptr, riscv's __ptr), the captured variable is used\nin the conditional expression to avoid re-evaluating ptr.\n\nThe new value is intentionally left without this treatment: new will\nbe stored into *ptr, so silently accepting a const-qualified new would\nallow callers to store a pointer-to-const into a non-const location\nwithout any compiler warning.\n\nSuggested-by: Jakub Kicinski <kuba@kernel.org>\nSigned-off-by: Hangbin Liu <liuhangbin@gmail.com>\n---\nChanges in v2:\n- Use __auto_type as the previous way will loose ptr type checking (David Laight)\n- Link to v1: https://lore.kernel.org/r/20260402-cmpxchg-v1-1-4561e2c05d2c@gmail.com\n---\n arch/alpha/include/asm/cmpxchg.h     | 4 ++--\n arch/arc/include/asm/cmpxchg.h       | 4 ++--\n arch/hexagon/include/asm/cmpxchg.h   | 2 +-\n arch/parisc/include/asm/cmpxchg.h    | 2 +-\n arch/powerpc/include/asm/cmpxchg.h   | 8 ++++----\n arch/riscv/include/asm/cmpxchg.h     | 4 ++--\n arch/sh/include/asm/cmpxchg.h        | 2 +-\n arch/sparc/include/asm/cmpxchg_32.h  | 2 +-\n arch/sparc/include/asm/cmpxchg_64.h  | 2 +-\n arch/x86/include/asm/cmpxchg.h       | 2 +-\n arch/xtensa/include/asm/cmpxchg.h    | 2 +-\n tools/arch/x86/include/asm/cmpxchg.h | 2 +-\n 12 files changed, 18 insertions(+), 18 deletions(-)\n\n\n---\nbase-commit: f8f5627a8aeab15183eef8930bf75ba88a51622f\nchange-id: 20260402-cmpxchg-2fd307f44a41\n\nBest regards,","diff":"diff --git a/arch/alpha/include/asm/cmpxchg.h b/arch/alpha/include/asm/cmpxchg.h\nindex ae1b96479d0c..e6cb60ca35bf 100644\n--- a/arch/alpha/include/asm/cmpxchg.h\n+++ b/arch/alpha/include/asm/cmpxchg.h\n@@ -234,7 +234,7 @@ ____cmpxchg(volatile void *ptr, unsigned long old, unsigned long new,\n \n #define arch_cmpxchg_local(ptr, o, n)\t\t\t\t\t\\\n ({\t\t\t\t\t\t\t\t\t\\\n-\t__typeof__(*(ptr)) _o_ = (o);\t\t\t\t\t\\\n+\t__auto_type _o_ = 1 ? (o) : *(ptr);\t\t\t\t\\\n \t__typeof__(*(ptr)) _n_ = (n);\t\t\t\t\t\\\n \t(__typeof__(*(ptr))) ____cmpxchg((ptr), (unsigned long)_o_,\t\\\n \t\t\t\t\t  (unsigned long)_n_,\t\t\\\n@@ -265,7 +265,7 @@ ____cmpxchg(volatile void *ptr, unsigned long old, unsigned long new,\n #define arch_cmpxchg(ptr, o, n)\t\t\t\t\t\t\\\n ({\t\t\t\t\t\t\t\t\t\\\n \t__typeof__(*(ptr)) __ret;\t\t\t\t\t\\\n-\t__typeof__(*(ptr)) _o_ = (o);\t\t\t\t\t\\\n+\t__auto_type _o_ = 1 ? (o) : *(ptr);\t\t\t\t\\\n \t__typeof__(*(ptr)) _n_ = (n);\t\t\t\t\t\\\n \tsmp_mb();\t\t\t\t\t\t\t\\\n \t__ret = (__typeof__(*(ptr))) ____cmpxchg((ptr),\t\t\t\\\ndiff --git a/arch/arc/include/asm/cmpxchg.h b/arch/arc/include/asm/cmpxchg.h\nindex 76f43db0890f..e18609174133 100644\n--- a/arch/arc/include/asm/cmpxchg.h\n+++ b/arch/arc/include/asm/cmpxchg.h\n@@ -42,7 +42,7 @@\n #define arch_cmpxchg_relaxed(ptr, old, new)\t\t\t\t\\\n ({\t\t\t\t\t\t\t\t\t\\\n \t__typeof__(ptr) _p_ = (ptr);\t\t\t\t\t\\\n-\t__typeof__(*(ptr)) _o_ = (old);\t\t\t\t\t\\\n+\t__auto_type _o_ = 1 ? (old) : *(_p_);\t\t\t\t\\\n \t__typeof__(*(ptr)) _n_ = (new);\t\t\t\t\t\\\n \t__typeof__(*(ptr)) _prev_;\t\t\t\t\t\\\n \t\t\t\t\t\t\t\t\t\\\n@@ -64,7 +64,7 @@\n #define arch_cmpxchg(ptr, old, new)\t\t\t\t        \\\n ({\t\t\t\t\t\t\t\t\t\\\n \tvolatile __typeof__(ptr) _p_ = (ptr);\t\t\t\t\\\n-\t__typeof__(*(ptr)) _o_ = (old);\t\t\t\t\t\\\n+\t__auto_type _o_ = 1 ? (old) : *(_p_);\t\t\t\t\\\n \t__typeof__(*(ptr)) _n_ = (new);\t\t\t\t\t\\\n \t__typeof__(*(ptr)) _prev_;\t\t\t\t\t\\\n \tunsigned long __flags;\t\t\t\t\t\t\\\ndiff --git a/arch/hexagon/include/asm/cmpxchg.h b/arch/hexagon/include/asm/cmpxchg.h\nindex 9c58fb81f7fd..88986fe04072 100644\n--- a/arch/hexagon/include/asm/cmpxchg.h\n+++ b/arch/hexagon/include/asm/cmpxchg.h\n@@ -54,7 +54,7 @@ __arch_xchg(unsigned long x, volatile void *ptr, int size)\n #define arch_cmpxchg(ptr, old, new)\t\t\t\t\\\n ({\t\t\t\t\t\t\t\t\\\n \t__typeof__(ptr) __ptr = (ptr);\t\t\t\t\\\n-\t__typeof__(*(ptr)) __old = (old);\t\t\t\\\n+\t__auto_type __old = 1 ? (old) : *(__ptr);\t\t\\\n \t__typeof__(*(ptr)) __new = (new);\t\t\t\\\n \t__typeof__(*(ptr)) __oldval = (__typeof__(*(ptr))) 0;\t\\\n \t\t\t\t\t\t\t\t\\\ndiff --git a/arch/parisc/include/asm/cmpxchg.h b/arch/parisc/include/asm/cmpxchg.h\nindex bf0a0f1189eb..30748e31aa17 100644\n--- a/arch/parisc/include/asm/cmpxchg.h\n+++ b/arch/parisc/include/asm/cmpxchg.h\n@@ -78,7 +78,7 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new_, int size)\n \n #define arch_cmpxchg(ptr, o, n)\t\t\t\t\t\t \\\n ({\t\t\t\t\t\t\t\t\t \\\n-\t__typeof__(*(ptr)) _o_ = (o);\t\t\t\t\t \\\n+\t__auto_type _o_ = 1 ? (o) : *(ptr);\t\t\t\t \\\n \t__typeof__(*(ptr)) _n_ = (n);\t\t\t\t\t \\\n \t(__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,\t \\\n \t\t\t\t    (unsigned long)_n_, sizeof(*(ptr))); \\\ndiff --git a/arch/powerpc/include/asm/cmpxchg.h b/arch/powerpc/include/asm/cmpxchg.h\nindex dbb50c06f0bf..eaf88b7d0443 100644\n--- a/arch/powerpc/include/asm/cmpxchg.h\n+++ b/arch/powerpc/include/asm/cmpxchg.h\n@@ -698,7 +698,7 @@ __cmpxchg_acquire(void *ptr, unsigned long old, unsigned long new,\n }\n #define arch_cmpxchg(ptr, o, n)\t\t\t\t\t\t \\\n   ({\t\t\t\t\t\t\t\t\t \\\n-     __typeof__(*(ptr)) _o_ = (o);\t\t\t\t\t \\\n+     __auto_type _o_ = 1 ? (o) : *(ptr);\t\t\t\t \\\n      __typeof__(*(ptr)) _n_ = (n);\t\t\t\t\t \\\n      (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,\t\t \\\n \t\t\t\t    (unsigned long)_n_, sizeof(*(ptr))); \\\n@@ -707,7 +707,7 @@ __cmpxchg_acquire(void *ptr, unsigned long old, unsigned long new,\n \n #define arch_cmpxchg_local(ptr, o, n)\t\t\t\t\t \\\n   ({\t\t\t\t\t\t\t\t\t \\\n-     __typeof__(*(ptr)) _o_ = (o);\t\t\t\t\t \\\n+     __auto_type _o_ = 1 ? (o) : *(ptr);\t\t\t\t \\\n      __typeof__(*(ptr)) _n_ = (n);\t\t\t\t\t \\\n      (__typeof__(*(ptr))) __cmpxchg_local((ptr), (unsigned long)_o_,\t \\\n \t\t\t\t    (unsigned long)_n_, sizeof(*(ptr))); \\\n@@ -715,7 +715,7 @@ __cmpxchg_acquire(void *ptr, unsigned long old, unsigned long new,\n \n #define arch_cmpxchg_relaxed(ptr, o, n)\t\t\t\t\t\\\n ({\t\t\t\t\t\t\t\t\t\\\n-\t__typeof__(*(ptr)) _o_ = (o);\t\t\t\t\t\\\n+\t__auto_type _o_ = 1 ? (o) : *(ptr);\t\t\t\t\\\n \t__typeof__(*(ptr)) _n_ = (n);\t\t\t\t\t\\\n \t(__typeof__(*(ptr))) __cmpxchg_relaxed((ptr),\t\t\t\\\n \t\t\t(unsigned long)_o_, (unsigned long)_n_,\t\t\\\n@@ -724,7 +724,7 @@ __cmpxchg_acquire(void *ptr, unsigned long old, unsigned long new,\n \n #define arch_cmpxchg_acquire(ptr, o, n)\t\t\t\t\t\\\n ({\t\t\t\t\t\t\t\t\t\\\n-\t__typeof__(*(ptr)) _o_ = (o);\t\t\t\t\t\\\n+\t__auto_type _o_ = 1 ? (o) : *(ptr);\t\t\t\t\\\n \t__typeof__(*(ptr)) _n_ = (n);\t\t\t\t\t\\\n \t(__typeof__(*(ptr))) __cmpxchg_acquire((ptr),\t\t\t\\\n \t\t\t(unsigned long)_o_, (unsigned long)_n_,\t\t\\\ndiff --git a/arch/riscv/include/asm/cmpxchg.h b/arch/riscv/include/asm/cmpxchg.h\nindex 8712cf9c69dc..30ade671298f 100644\n--- a/arch/riscv/include/asm/cmpxchg.h\n+++ b/arch/riscv/include/asm/cmpxchg.h\n@@ -215,7 +215,7 @@\n \t\t      cas_prepend, cas_append)\t\t\t\t\\\n ({\t\t\t\t\t\t\t\t\t\\\n \t__typeof__(ptr) __ptr = (ptr);\t\t\t\t\t\\\n-\t__typeof__(*(__ptr)) __old = (old);\t\t\t\t\\\n+\t__auto_type __old = 1 ? (old) : *(__ptr);\t\t\t\\\n \t__typeof__(*(__ptr)) __new = (new);\t\t\t\t\\\n \t__typeof__(*(__ptr)) __ret;\t\t\t\t\t\\\n \t\t\t\t\t\t\t\t\t\\\n@@ -331,7 +331,7 @@ union __u128_halves {\n \n #define __arch_cmpxchg128(p, o, n, cas_sfx)\t\t\t\t\t\\\n ({\t\t\t\t\t\t\t\t\t\t\\\n-\t__typeof__(*(p)) __o = (o);                                             \\\n+\t__auto_type __o = 1 ? (o) : *(p);\t\t\t\t\t\\\n \tunion __u128_halves __hn = { .full = (n) };\t\t\t\t\\\n \tunion __u128_halves __ho = { .full = (__o) };\t\t\t\t\\\n \tregister unsigned long t1 asm (\"t1\") = __hn.low;\t\t\t\\\ndiff --git a/arch/sh/include/asm/cmpxchg.h b/arch/sh/include/asm/cmpxchg.h\nindex 1e5dc5ccf7bf..6c1bfb367f11 100644\n--- a/arch/sh/include/asm/cmpxchg.h\n+++ b/arch/sh/include/asm/cmpxchg.h\n@@ -68,7 +68,7 @@ static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old,\n \n #define arch_cmpxchg(ptr,o,n)\t\t\t\t\t\t \\\n   ({\t\t\t\t\t\t\t\t\t \\\n-     __typeof__(*(ptr)) _o_ = (o);\t\t\t\t\t \\\n+     __auto_type _o_ = 1 ? (o) : *(ptr);\t\t\t\t \\\n      __typeof__(*(ptr)) _n_ = (n);\t\t\t\t\t \\\n      (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,\t\t \\\n \t\t\t\t    (unsigned long)_n_, sizeof(*(ptr))); \\\ndiff --git a/arch/sparc/include/asm/cmpxchg_32.h b/arch/sparc/include/asm/cmpxchg_32.h\nindex 8c1a3ca34eeb..df40a16dd021 100644\n--- a/arch/sparc/include/asm/cmpxchg_32.h\n+++ b/arch/sparc/include/asm/cmpxchg_32.h\n@@ -55,7 +55,7 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new_, int size)\n \n #define arch_cmpxchg(ptr, o, n)\t\t\t\t\t\t\\\n ({\t\t\t\t\t\t\t\t\t\\\n-\t__typeof__(*(ptr)) _o_ = (o);\t\t\t\t\t\\\n+\t__auto_type _o_ = 1 ? (o) : *(ptr);\t\t\t\t\\\n \t__typeof__(*(ptr)) _n_ = (n);\t\t\t\t\t\\\n \t(__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,\t\\\n \t\t\t(unsigned long)_n_, sizeof(*(ptr)));\t\t\\\ndiff --git a/arch/sparc/include/asm/cmpxchg_64.h b/arch/sparc/include/asm/cmpxchg_64.h\nindex 3de25262c411..4b540405fcc7 100644\n--- a/arch/sparc/include/asm/cmpxchg_64.h\n+++ b/arch/sparc/include/asm/cmpxchg_64.h\n@@ -170,7 +170,7 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)\n \n #define arch_cmpxchg(ptr,o,n)\t\t\t\t\t\t \\\n   ({\t\t\t\t\t\t\t\t\t \\\n-     __typeof__(*(ptr)) _o_ = (o);\t\t\t\t\t \\\n+     __auto_type _o_ = 1 ? (o) : *(ptr);\t\t\t\t \\\n      __typeof__(*(ptr)) _n_ = (n);\t\t\t\t\t \\\n      (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,\t\t \\\n \t\t\t\t    (unsigned long)_n_, sizeof(*(ptr))); \\\ndiff --git a/arch/x86/include/asm/cmpxchg.h b/arch/x86/include/asm/cmpxchg.h\nindex a88b06f1c35e..e0340579ef69 100644\n--- a/arch/x86/include/asm/cmpxchg.h\n+++ b/arch/x86/include/asm/cmpxchg.h\n@@ -85,7 +85,7 @@ extern void __add_wrong_size(void)\n #define __raw_cmpxchg(ptr, old, new, size, lock)\t\t\t\\\n ({\t\t\t\t\t\t\t\t\t\\\n \t__typeof__(*(ptr)) __ret;\t\t\t\t\t\\\n-\t__typeof__(*(ptr)) __old = (old);\t\t\t\t\\\n+\t__auto_type __old = 1 ? (old) : *(ptr);\t\t\t\t\\\n \t__typeof__(*(ptr)) __new = (new);\t\t\t\t\\\n \tswitch (size) {\t\t\t\t\t\t\t\\\n \tcase __X86_CASE_B:\t\t\t\t\t\t\\\ndiff --git a/arch/xtensa/include/asm/cmpxchg.h b/arch/xtensa/include/asm/cmpxchg.h\nindex b6db4838b175..057fd24ed125 100644\n--- a/arch/xtensa/include/asm/cmpxchg.h\n+++ b/arch/xtensa/include/asm/cmpxchg.h\n@@ -83,7 +83,7 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)\n }\n \n #define arch_cmpxchg(ptr,o,n)\t\t\t\t\t\t      \\\n-\t({ __typeof__(*(ptr)) _o_ = (o);\t\t\t\t      \\\n+\t({ __auto_type _o_ = 1 ? (o) : *(ptr);\t\t\t\t      \\\n \t   __typeof__(*(ptr)) _n_ = (n);\t\t\t\t      \\\n \t   (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,\t      \\\n \t   \t\t\t        (unsigned long)_n_, sizeof (*(ptr))); \\\ndiff --git a/tools/arch/x86/include/asm/cmpxchg.h b/tools/arch/x86/include/asm/cmpxchg.h\nindex 0ed9ca2766ad..bbd3960c2218 100644\n--- a/tools/arch/x86/include/asm/cmpxchg.h\n+++ b/tools/arch/x86/include/asm/cmpxchg.h\n@@ -35,7 +35,7 @@ extern void __cmpxchg_wrong_size(void)\n #define __raw_cmpxchg(ptr, old, new, size, lock)\t\t\t\\\n ({\t\t\t\t\t\t\t\t\t\\\n \t__typeof__(*(ptr)) __ret;\t\t\t\t\t\\\n-\t__typeof__(*(ptr)) __old = (old);\t\t\t\t\\\n+\t__auto_type __old = 1 ? (old) : *(ptr);\t\t\t\t\\\n \t__typeof__(*(ptr)) __new = (new);\t\t\t\t\\\n \tswitch (size) {\t\t\t\t\t\t\t\\\n \tcase __X86_CASE_B:\t\t\t\t\t\t\\\n","prefixes":["v2"]}