forked from Minki/linux
bca25bafbb
dmi_alloc() for CONFIG_X86_64 is defined to allocate from a static array and it maintains a allocation index which is advanced each time allocation is attempted - it gets incremented even if an allocation fails thereby depriving any future request that may be small enough to be satisfied from the array. Fix this by first testing if allocation is going to be possible and incrementing alloc index only then. Signed-off-by: Parag Warudkar <parag.warudkar@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
37 lines
764 B
C
37 lines
764 B
C
#ifndef _ASM_X86_DMI_H
|
|
#define _ASM_X86_DMI_H
|
|
|
|
#include <asm/io.h>
|
|
|
|
#ifdef CONFIG_X86_32
|
|
|
|
/* Use early IO mappings for DMI because it's initialized early */
|
|
#define dmi_ioremap bt_ioremap
|
|
#define dmi_iounmap bt_iounmap
|
|
#define dmi_alloc alloc_bootmem
|
|
|
|
#else /* CONFIG_X86_32 */
|
|
|
|
#define DMI_MAX_DATA 2048
|
|
|
|
extern int dmi_alloc_index;
|
|
extern char dmi_alloc_data[DMI_MAX_DATA];
|
|
|
|
/* This is so early that there is no good way to allocate dynamic memory.
|
|
Allocate data in an BSS array. */
|
|
static inline void *dmi_alloc(unsigned len)
|
|
{
|
|
int idx = dmi_alloc_index;
|
|
if ((dmi_alloc_index + len) > DMI_MAX_DATA)
|
|
return NULL;
|
|
dmi_alloc_index += len;
|
|
return dmi_alloc_data + idx;
|
|
}
|
|
|
|
#define dmi_ioremap early_ioremap
|
|
#define dmi_iounmap early_iounmap
|
|
|
|
#endif
|
|
|
|
#endif
|