Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35010334 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'x86-fixes-for-linus' of...

Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, vm86: fix preemption bug
  x86, olpc: fix model detection without OFW
  x86, hpet: fix for LS21 + HPET = boot hang
  x86: CPA avoid repeated lazy mmu flush
  x86: warn if arch_flush_lazy_mmu_cpu is called in preemptible context
  x86/paravirt: make arch_flush_lazy_mmu/cpu disable preemption
  x86, pat: fix warn_on_once() while mapping 0-1MB range with /dev/mem
  x86/cpa: make sure cpa is safe to call in lazy mmu mode
  x86, ptrace, mm: fix double-free on race
parents 8ce9a75a be716615
Loading
Loading
Loading
Loading
+0 −1
Original line number Original line Diff line number Diff line
@@ -57,7 +57,6 @@ typedef struct { pgdval_t pgd; } pgd_t;
typedef struct { pgprotval_t pgprot; } pgprot_t;
typedef struct { pgprotval_t pgprot; } pgprot_t;


extern int page_is_ram(unsigned long pagenr);
extern int page_is_ram(unsigned long pagenr);
extern int pagerange_is_ram(unsigned long start, unsigned long end);
extern int devmem_is_allowed(unsigned long pagenr);
extern int devmem_is_allowed(unsigned long pagenr);
extern void map_devmem(unsigned long pfn, unsigned long size,
extern void map_devmem(unsigned long pfn, unsigned long size,
		       pgprot_t vma_prot);
		       pgprot_t vma_prot);
+2 −15
Original line number Original line Diff line number Diff line
@@ -1352,14 +1352,7 @@ static inline void arch_leave_lazy_cpu_mode(void)
	PVOP_VCALL0(pv_cpu_ops.lazy_mode.leave);
	PVOP_VCALL0(pv_cpu_ops.lazy_mode.leave);
}
}


static inline void arch_flush_lazy_cpu_mode(void)
void arch_flush_lazy_cpu_mode(void);
{
	if (unlikely(paravirt_get_lazy_mode() == PARAVIRT_LAZY_CPU)) {
		arch_leave_lazy_cpu_mode();
		arch_enter_lazy_cpu_mode();
	}
}



#define  __HAVE_ARCH_ENTER_LAZY_MMU_MODE
#define  __HAVE_ARCH_ENTER_LAZY_MMU_MODE
static inline void arch_enter_lazy_mmu_mode(void)
static inline void arch_enter_lazy_mmu_mode(void)
@@ -1372,13 +1365,7 @@ static inline void arch_leave_lazy_mmu_mode(void)
	PVOP_VCALL0(pv_mmu_ops.lazy_mode.leave);
	PVOP_VCALL0(pv_mmu_ops.lazy_mode.leave);
}
}


static inline void arch_flush_lazy_mmu_mode(void)
void arch_flush_lazy_mmu_mode(void);
{
	if (unlikely(paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU)) {
		arch_leave_lazy_mmu_mode();
		arch_enter_lazy_mmu_mode();
	}
}


static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
				unsigned long phys, pgprot_t flags)
				unsigned long phys, pgprot_t flags)
+2 −0
Original line number Original line Diff line number Diff line
@@ -269,6 +269,8 @@ static void hpet_set_mode(enum clock_event_mode mode,
		now = hpet_readl(HPET_COUNTER);
		now = hpet_readl(HPET_COUNTER);
		cmp = now + (unsigned long) delta;
		cmp = now + (unsigned long) delta;
		cfg = hpet_readl(HPET_Tn_CFG(timer));
		cfg = hpet_readl(HPET_Tn_CFG(timer));
		/* Make sure we use edge triggered interrupts */
		cfg &= ~HPET_TN_LEVEL;
		cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC |
		cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC |
		       HPET_TN_SETVAL | HPET_TN_32BIT;
		       HPET_TN_SETVAL | HPET_TN_32BIT;
		hpet_writel(cfg, HPET_Tn_CFG(timer));
		hpet_writel(cfg, HPET_Tn_CFG(timer));
+1 −1
Original line number Original line Diff line number Diff line
@@ -203,7 +203,7 @@ static void __init platform_detect(void)
static void __init platform_detect(void)
static void __init platform_detect(void)
{
{
	/* stopgap until OFW support is added to the kernel */
	/* stopgap until OFW support is added to the kernel */
	olpc_platform_info.boardrev = 0xc2;
	olpc_platform_info.boardrev = olpc_board(0xc2);
}
}
#endif
#endif


+26 −0
Original line number Original line Diff line number Diff line
@@ -268,6 +268,32 @@ enum paravirt_lazy_mode paravirt_get_lazy_mode(void)
	return __get_cpu_var(paravirt_lazy_mode);
	return __get_cpu_var(paravirt_lazy_mode);
}
}


void arch_flush_lazy_mmu_mode(void)
{
	preempt_disable();

	if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) {
		WARN_ON(preempt_count() == 1);
		arch_leave_lazy_mmu_mode();
		arch_enter_lazy_mmu_mode();
	}

	preempt_enable();
}

void arch_flush_lazy_cpu_mode(void)
{
	preempt_disable();

	if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_CPU) {
		WARN_ON(preempt_count() == 1);
		arch_leave_lazy_cpu_mode();
		arch_enter_lazy_cpu_mode();
	}

	preempt_enable();
}

struct pv_info pv_info = {
struct pv_info pv_info = {
	.name = "bare hardware",
	.name = "bare hardware",
	.paravirt_enabled = 0,
	.paravirt_enabled = 0,
Loading