forked from Minki/linux
a3819e3e71
Four instances of incorrect usage of non-static "inline" crept up in arch/x86, all trivial; cleaning them up: EVT_TO_HPET_DEV() - made static, it is only used in kernel/hpet.c Debug version of check_iommu_entries() is an __init function. Non-debug dummy empty version of it is declared "inline" instead - which doesn't help to eliminate it (the caller is in a different unit, inlining doesn't happen). Switch to non-inlined __init function, which does eliminate it (by discarding it as part of __init section). crypto/sha-mb/sha1_mb.c: looks like they just forgot to add "static" to their two internal inlines, which emitted two unused functions into vmlinux. text data bss dec hex filename 95903394 20860288 35991552 152755234 91adc22 vmlinux_before 95903266 20860288 35991552 152755106 91adba2 vmlinux Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: linux-kernel@vger.kernel.org Link: http://lkml.kernel.org/r/1460739626-12179-1-git-send-email-dvlasenk@redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
80 lines
1.7 KiB
C
80 lines
1.7 KiB
C
#include <linux/dma-mapping.h>
|
|
#include <asm/iommu_table.h>
|
|
#include <linux/string.h>
|
|
#include <linux/kallsyms.h>
|
|
|
|
|
|
#define DEBUG 1
|
|
|
|
static struct iommu_table_entry * __init
|
|
find_dependents_of(struct iommu_table_entry *start,
|
|
struct iommu_table_entry *finish,
|
|
struct iommu_table_entry *q)
|
|
{
|
|
struct iommu_table_entry *p;
|
|
|
|
if (!q)
|
|
return NULL;
|
|
|
|
for (p = start; p < finish; p++)
|
|
if (p->detect == q->depend)
|
|
return p;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
void __init sort_iommu_table(struct iommu_table_entry *start,
|
|
struct iommu_table_entry *finish) {
|
|
|
|
struct iommu_table_entry *p, *q, tmp;
|
|
|
|
for (p = start; p < finish; p++) {
|
|
again:
|
|
q = find_dependents_of(start, finish, p);
|
|
/* We are bit sneaky here. We use the memory address to figure
|
|
* out if the node we depend on is past our point, if so, swap.
|
|
*/
|
|
if (q > p) {
|
|
tmp = *p;
|
|
memmove(p, q, sizeof(*p));
|
|
*q = tmp;
|
|
goto again;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
void __init check_iommu_entries(struct iommu_table_entry *start,
|
|
struct iommu_table_entry *finish)
|
|
{
|
|
struct iommu_table_entry *p, *q, *x;
|
|
|
|
/* Simple cyclic dependency checker. */
|
|
for (p = start; p < finish; p++) {
|
|
q = find_dependents_of(start, finish, p);
|
|
x = find_dependents_of(start, finish, q);
|
|
if (p == x) {
|
|
printk(KERN_ERR "CYCLIC DEPENDENCY FOUND! %pS depends on %pS and vice-versa. BREAKING IT.\n",
|
|
p->detect, q->detect);
|
|
/* Heavy handed way..*/
|
|
x->depend = 0;
|
|
}
|
|
}
|
|
|
|
for (p = start; p < finish; p++) {
|
|
q = find_dependents_of(p, finish, p);
|
|
if (q && q > p) {
|
|
printk(KERN_ERR "EXECUTION ORDER INVALID! %pS should be called before %pS!\n",
|
|
p->detect, q->detect);
|
|
}
|
|
}
|
|
}
|
|
#else
|
|
void __init check_iommu_entries(struct iommu_table_entry *start,
|
|
struct iommu_table_entry *finish)
|
|
{
|
|
}
|
|
#endif
|