Skip to content

Commit

Permalink
mm,x86: fix kmap_atomic_push vs ioremap_32.c
Browse files Browse the repository at this point in the history
It appears i386 uses kmap_atomic infrastructure regardless of
CONFIG_HIGHMEM which results in a compile error when highmem is disabled.

Cure this by providing the needed few bits for both CONFIG_HIGHMEM and
CONFIG_X86_32.

Signed-off-by: Peter Zijlstra <[email protected]>
Reported-by: Chris Wilson <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Peter Zijlstra authored and torvalds committed Oct 28, 2010
1 parent 12ba8d1 commit a8e23a2
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 22 deletions.
46 changes: 25 additions & 21 deletions include/linux/highmem.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,27 +37,6 @@ extern unsigned long totalhigh_pages;

void kmap_flush_unused(void);

DECLARE_PER_CPU(int, __kmap_atomic_idx);

static inline int kmap_atomic_idx_push(void)
{
int idx = __get_cpu_var(__kmap_atomic_idx)++;
#ifdef CONFIG_DEBUG_HIGHMEM
WARN_ON_ONCE(in_irq() && !irqs_disabled());
BUG_ON(idx > KM_TYPE_NR);
#endif
return idx;
}

static inline int kmap_atomic_idx_pop(void)
{
int idx = --__get_cpu_var(__kmap_atomic_idx);
#ifdef CONFIG_DEBUG_HIGHMEM
BUG_ON(idx < 0);
#endif
return idx;
}

#else /* CONFIG_HIGHMEM */

static inline unsigned int nr_free_highpages(void) { return 0; }
Expand Down Expand Up @@ -95,6 +74,31 @@ static inline void __kunmap_atomic(void *addr)

#endif /* CONFIG_HIGHMEM */

#if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32)

DECLARE_PER_CPU(int, __kmap_atomic_idx);

static inline int kmap_atomic_idx_push(void)
{
int idx = __get_cpu_var(__kmap_atomic_idx)++;
#ifdef CONFIG_DEBUG_HIGHMEM
WARN_ON_ONCE(in_irq() && !irqs_disabled());
BUG_ON(idx > KM_TYPE_NR);
#endif
return idx;
}

static inline int kmap_atomic_idx_pop(void)
{
int idx = --__get_cpu_var(__kmap_atomic_idx);
#ifdef CONFIG_DEBUG_HIGHMEM
BUG_ON(idx < 0);
#endif
return idx;
}

#endif

/*
* Make both: kmap_atomic(page, idx) and kmap_atomic(page) work.
*/
Expand Down
6 changes: 5 additions & 1 deletion mm/highmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@
#include <linux/kgdb.h>
#include <asm/tlbflush.h>


#if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32)
DEFINE_PER_CPU(int, __kmap_atomic_idx);
#endif

/*
* Virtual_count is not a pure "count".
* 0 means that it is not mapped, and has not been mapped
Expand All @@ -43,7 +48,6 @@ unsigned long totalhigh_pages __read_mostly;
EXPORT_SYMBOL(totalhigh_pages);


DEFINE_PER_CPU(int, __kmap_atomic_idx);
EXPORT_PER_CPU_SYMBOL(__kmap_atomic_idx);

unsigned int nr_free_highpages (void)
Expand Down

0 comments on commit a8e23a2

Please sign in to comment.