summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2026-02-10 19:52:18 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2026-02-10 19:52:18 -0800
commit45a1b8cc6c0690d82f176ec9c3ca8ad0aa050511 (patch)
tree5ff38b3ac21e4f64e8f22f8083cde7cf15c9c69b
parent6f7e6393d1ce636bb7ec77a7fe7b77458fddf701 (diff)
parent6b32c93560cb194e10279bd3be3c1d0fa30df3e7 (diff)
Merge tag 'x86_misc_for_7.0-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull misc x86 updates from Dave Hansen: "The usual smattering of x86/misc changes. The IPv6 patch in here surprised me in a couple of ways. First, the function it inlines is able to eat a lot more CPU time than I would have expected. Second, the inlining does not seem to bloat the kernel, at least in the configs folks have tested. - Inline x86-specific IPv6 checksum helper - Update IOMMU docs to use stable identifiers - Print unhashed pointers on fatal stack overflows" * tag 'x86_misc_for_7.0-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/traps: Print unhashed pointers on stack overflow Documentation/x86: Update IOMMU spec references to use stable identifiers x86/lib: Inline csum_ipv6_magic()
-rw-r--r--Documentation/arch/x86/iommu.rst7
-rw-r--r--arch/x86/include/asm/checksum_64.h45
-rw-r--r--arch/x86/kernel/traps.c2
-rw-r--r--arch/x86/lib/csum-wrappers_64.c22
4 files changed, 38 insertions, 38 deletions
diff --git a/Documentation/arch/x86/iommu.rst b/Documentation/arch/x86/iommu.rst
index 41fbadfe2221..79c33560299b 100644
--- a/Documentation/arch/x86/iommu.rst
+++ b/Documentation/arch/x86/iommu.rst
@@ -2,10 +2,11 @@
x86 IOMMU Support
=================
-The architecture specs can be obtained from the below locations.
+The architecture specs can be obtained from the vendor websites.
+Search for the following documents to obtain the latest versions:
-- Intel: http://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/vt-directed-io-spec.pdf
-- AMD: https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/specifications/48882_3_07_PUB.pdf
+- Intel: Intel Virtualization Technology for Directed I/O Architecture Specification (ID: D51397)
+- AMD: AMD I/O Virtualization Technology (IOMMU) Specification (ID: 48882)
This guide gives a quick cheat sheet for some basic understanding.
diff --git a/arch/x86/include/asm/checksum_64.h b/arch/x86/include/asm/checksum_64.h
index 4d4a47a3a8ab..5bdfd2db2b5a 100644
--- a/arch/x86/include/asm/checksum_64.h
+++ b/arch/x86/include/asm/checksum_64.h
@@ -9,6 +9,7 @@
*/
#include <linux/compiler.h>
+#include <linux/in6.h>
#include <asm/byteorder.h>
/**
@@ -145,6 +146,17 @@ extern __wsum csum_partial_copy_nocheck(const void *src, void *dst, int len);
*/
extern __sum16 ip_compute_csum(const void *buff, int len);
+static inline unsigned add32_with_carry(unsigned a, unsigned b)
+{
+ asm("addl %2,%0\n\t"
+ "adcl $0,%0"
+ : "=r" (a)
+ : "0" (a), "rm" (b));
+ return a;
+}
+
+#define _HAVE_ARCH_IPV6_CSUM 1
+
/**
* csum_ipv6_magic - Compute checksum of an IPv6 pseudo header.
* @saddr: source address
@@ -158,20 +170,29 @@ extern __sum16 ip_compute_csum(const void *buff, int len);
* Returns the unfolded 32bit checksum.
*/
-struct in6_addr;
+static inline __sum16 csum_ipv6_magic(
+ const struct in6_addr *_saddr, const struct in6_addr *_daddr,
+ __u32 len, __u8 proto, __wsum sum)
+{
+ const unsigned long *saddr = (const unsigned long *)_saddr;
+ const unsigned long *daddr = (const unsigned long *)_daddr;
+ __u64 sum64;
-#define _HAVE_ARCH_IPV6_CSUM 1
-extern __sum16
-csum_ipv6_magic(const struct in6_addr *saddr, const struct in6_addr *daddr,
- __u32 len, __u8 proto, __wsum sum);
+ sum64 = (__force __u64)htonl(len) + (__force __u64)htons(proto) +
+ (__force __u64)sum;
-static inline unsigned add32_with_carry(unsigned a, unsigned b)
-{
- asm("addl %2,%0\n\t"
- "adcl $0,%0"
- : "=r" (a)
- : "0" (a), "rm" (b));
- return a;
+ asm(" addq %1,%[sum64]\n"
+ " adcq %2,%[sum64]\n"
+ " adcq %3,%[sum64]\n"
+ " adcq %4,%[sum64]\n"
+ " adcq $0,%[sum64]\n"
+
+ : [sum64] "+r" (sum64)
+ : "m" (saddr[0]), "m" (saddr[1]),
+ "m" (daddr[0]), "m" (daddr[1]));
+
+ return csum_fold(
+ (__force __wsum)add32_with_carry(sum64 & 0xffffffff, sum64>>32));
}
#define HAVE_ARCH_CSUM_ADD
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index bcf1dedc1d00..5a6a772e0a6c 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -549,7 +549,7 @@ __visible void __noreturn handle_stack_overflow(struct pt_regs *regs,
{
const char *name = stack_type_name(info->type);
- printk(KERN_EMERG "BUG: %s stack guard page was hit at %p (stack is %p..%p)\n",
+ printk(KERN_EMERG "BUG: %s stack guard page was hit at %px (stack is %px..%px)\n",
name, (void *)fault_address, info->begin, info->end);
die("stack guard page", regs, 0);
diff --git a/arch/x86/lib/csum-wrappers_64.c b/arch/x86/lib/csum-wrappers_64.c
index f4df4d241526..831b7110b041 100644
--- a/arch/x86/lib/csum-wrappers_64.c
+++ b/arch/x86/lib/csum-wrappers_64.c
@@ -68,25 +68,3 @@ csum_partial_copy_nocheck(const void *src, void *dst, int len)
}
EXPORT_SYMBOL(csum_partial_copy_nocheck);
-__sum16 csum_ipv6_magic(const struct in6_addr *saddr,
- const struct in6_addr *daddr,
- __u32 len, __u8 proto, __wsum sum)
-{
- __u64 rest, sum64;
-
- rest = (__force __u64)htonl(len) + (__force __u64)htons(proto) +
- (__force __u64)sum;
-
- asm(" addq (%[saddr]),%[sum]\n"
- " adcq 8(%[saddr]),%[sum]\n"
- " adcq (%[daddr]),%[sum]\n"
- " adcq 8(%[daddr]),%[sum]\n"
- " adcq $0,%[sum]\n"
-
- : [sum] "=r" (sum64)
- : "[sum]" (rest), [saddr] "r" (saddr), [daddr] "r" (daddr));
-
- return csum_fold(
- (__force __wsum)add32_with_carry(sum64 & 0xffffffff, sum64>>32));
-}
-EXPORT_SYMBOL(csum_ipv6_magic);