From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from merlin.infradead.org ([205.233.59.134]:58230 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725829AbfKOJHn (ORCPT ); Fri, 15 Nov 2019 04:07:43 -0500 Date: Fri, 15 Nov 2019 10:07:23 +0100 From: Peter Zijlstra Subject: Re: [RFC PATCH v3 6/7] scripts/sorttable: Add ORC unwind tables sort concurrently Message-ID: <20191115090723.GS4114@hirez.programming.kicks-ass.net> References: <20191115064750.47888-1-shile.zhang@linux.alibaba.com> <20191115064750.47888-7-shile.zhang@linux.alibaba.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20191115064750.47888-7-shile.zhang@linux.alibaba.com> Sender: linux-kbuild-owner@vger.kernel.org List-ID: To: Shile Zhang Cc: Josh Poimboeuf , Masahiro Yamada , Michal Marek , Thomas Gleixner , Ingo Molnar , Borislav Petkov , x86@kernel.org, "H . Peter Anvin" , linux-kernel@vger.kernel.org, linux-kbuild@vger.kernel.org On Fri, Nov 15, 2019 at 02:47:49PM +0800, Shile Zhang wrote: > +#if defined(SORTTABLE_64) && defined(UNWINDER_ORC_ENABLED) > +/* ORC unwinder only support X86_64 */ > +#include > +#include > +#include > + > +#define ORC_REG_UNDEFINED 0 > +#define ERRSTRING_MAXSZ 256 > + > +struct orc_entry { > + s16 sp_offset; > + s16 bp_offset; > + unsigned sp_reg:4; > + unsigned bp_reg:4; > + unsigned type:2; > + unsigned end:1; > +} __attribute__((packed)); > + > +struct orctable_info { > + size_t orc_size; > + size_t orc_ip_size; > +} orctable; There's ./arch/x86/include/asm/orc_types.h for this. Please don't duplicate. objtool uses that same header. > +/** > + * sort - sort an array of elements > + * @base: pointer to data to sort > + * @num: number of elements > + * @size: size of each element > + * @cmp_func: pointer to comparison function > + * @swap_func: pointer to swap function > + * > + * This function does a heapsort on the given array. You may provide a > + * swap_func function optimized to your element type. > + * > + * Sorting time is O(n log n) both on average and worst-case. While > + * qsort is about 20% faster on average, it suffers from exploitable > + * O(n*n) worst-case behavior and extra memory requirements that make > + * it less suitable for kernel use. > + * > + * This code token out of /lib/sort.c. > + */ > +static void sort(void *base, size_t num, size_t size, > + int (*cmp_func)(const void *, const void *), > + void (*swap_func)(void *, void *, int size)) > +{ > + /* pre-scale counters for performance */ > + int i = (num/2 - 1) * size, n = num * size, c, r; > + > + /* heapify */ > + for ( ; i >= 0; i -= size) { > + for (r = i; r * 2 + size < n; r = c) { > + c = r * 2 + size; > + if (c < n - size && > + cmp_func(base + c, base + c + size) < 0) > + c += size; > + if (cmp_func(base + r, base + c) >= 0) > + break; > + swap_func(base + r, base + c, size); > + } > + } > + > + /* sort */ > + for (i = n - size; i > 0; i -= size) { > + swap_func(base, base + i, size); > + for (r = 0; r * 2 + size < i; r = c) { > + c = r * 2 + size; > + if (c < i - size && > + cmp_func(base + c, base + c + size) < 0) > + c += size; > + if (cmp_func(base + r, base + c) >= 0) > + break; > + swap_func(base + r, base + c, size); > + } > + } > +} Do we really need to copy the heapsort implementation? That is, why not use libc's qsort() ? This is userspace after all.