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: add linux kernel support for YMM state
  x86: fix wrong section of pat_disable & make it static
  x86: Fix section mismatches in mpparse
  x86: fix set_fixmap to use phys_addr_t
  x86: Document get_user_pages_fast()
  x86, intr-remap: fix eoi for interrupt remapping without x2apic
This commit is contained in:
Linus Torvalds 2009-04-13 11:32:09 -07:00
commit b8256b45d1
10 changed files with 57 additions and 19 deletions

View File

@ -193,8 +193,10 @@ extern void __iomem *ioremap_wc(resource_size_t offset, unsigned long size);
*/ */
extern void early_ioremap_init(void); extern void early_ioremap_init(void);
extern void early_ioremap_reset(void); extern void early_ioremap_reset(void);
extern void __iomem *early_ioremap(unsigned long offset, unsigned long size); extern void __iomem *early_ioremap(resource_size_t phys_addr,
extern void __iomem *early_memremap(unsigned long offset, unsigned long size); unsigned long size);
extern void __iomem *early_memremap(resource_size_t phys_addr,
unsigned long size);
extern void early_iounmap(void __iomem *addr, unsigned long size); extern void early_iounmap(void __iomem *addr, unsigned long size);
#define IO_SPACE_LIMIT 0xffff #define IO_SPACE_LIMIT 0xffff

View File

@ -352,6 +352,11 @@ struct i387_soft_struct {
u32 entry_eip; u32 entry_eip;
}; };
struct ymmh_struct {
/* 16 * 16 bytes for each YMMH-reg = 256 bytes */
u32 ymmh_space[64];
};
struct xsave_hdr_struct { struct xsave_hdr_struct {
u64 xstate_bv; u64 xstate_bv;
u64 reserved1[2]; u64 reserved1[2];
@ -361,6 +366,7 @@ struct xsave_hdr_struct {
struct xsave_struct { struct xsave_struct {
struct i387_fxsave_struct i387; struct i387_fxsave_struct i387;
struct xsave_hdr_struct xsave_hdr; struct xsave_hdr_struct xsave_hdr;
struct ymmh_struct ymmh;
/* new processor state extensions will go here */ /* new processor state extensions will go here */
} __attribute__ ((packed, aligned (64))); } __attribute__ ((packed, aligned (64)));

View File

@ -269,6 +269,11 @@ struct _xsave_hdr {
__u64 reserved2[5]; __u64 reserved2[5];
}; };
struct _ymmh_state {
/* 16 * 16 bytes for each YMMH-reg */
__u32 ymmh_space[64];
};
/* /*
* Extended state pointed by the fpstate pointer in the sigcontext. * Extended state pointed by the fpstate pointer in the sigcontext.
* In addition to the fpstate, information encoded in the xstate_hdr * In addition to the fpstate, information encoded in the xstate_hdr
@ -278,6 +283,7 @@ struct _xsave_hdr {
struct _xstate { struct _xstate {
struct _fpstate fpstate; struct _fpstate fpstate;
struct _xsave_hdr xstate_hdr; struct _xsave_hdr xstate_hdr;
struct _ymmh_state ymmh;
/* new processor state extensions go here */ /* new processor state extensions go here */
}; };

View File

@ -7,6 +7,7 @@
#define XSTATE_FP 0x1 #define XSTATE_FP 0x1
#define XSTATE_SSE 0x2 #define XSTATE_SSE 0x2
#define XSTATE_YMM 0x4
#define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE) #define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE)
@ -15,7 +16,7 @@
/* /*
* These are the features that the OS can handle currently. * These are the features that the OS can handle currently.
*/ */
#define XCNTXT_MASK (XSTATE_FP | XSTATE_SSE) #define XCNTXT_MASK (XSTATE_FP | XSTATE_SSE | XSTATE_YMM)
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
#define REX_PREFIX "0x48, " #define REX_PREFIX "0x48, "

View File

@ -2524,7 +2524,6 @@ static void irq_complete_move(struct irq_desc **descp)
static inline void irq_complete_move(struct irq_desc **descp) {} static inline void irq_complete_move(struct irq_desc **descp) {}
#endif #endif
#ifdef CONFIG_X86_X2APIC
static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg) static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg)
{ {
int apic, pin; int apic, pin;
@ -2558,6 +2557,7 @@ eoi_ioapic_irq(struct irq_desc *desc)
spin_unlock_irqrestore(&ioapic_lock, flags); spin_unlock_irqrestore(&ioapic_lock, flags);
} }
#ifdef CONFIG_X86_X2APIC
static void ack_x2apic_level(unsigned int irq) static void ack_x2apic_level(unsigned int irq)
{ {
struct irq_desc *desc = irq_to_desc(irq); struct irq_desc *desc = irq_to_desc(irq);
@ -2634,6 +2634,9 @@ static void ack_apic_level(unsigned int irq)
*/ */
ack_APIC_irq(); ack_APIC_irq();
if (irq_remapped(irq))
eoi_ioapic_irq(desc);
/* Now we can move and renable the irq */ /* Now we can move and renable the irq */
if (unlikely(do_unmask_irq)) { if (unlikely(do_unmask_irq)) {
/* Only migrate the irq if the ack has been received. /* Only migrate the irq if the ack has been received.

View File

@ -679,7 +679,7 @@ void __init get_smp_config(void)
__get_smp_config(0); __get_smp_config(0);
} }
static void smp_reserve_bootmem(struct mpf_intel *mpf) static void __init smp_reserve_bootmem(struct mpf_intel *mpf)
{ {
unsigned long size = get_mpc_size(mpf->physptr); unsigned long size = get_mpc_size(mpf->physptr);
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
@ -838,7 +838,7 @@ static int __init get_MP_intsrc_index(struct mpc_intsrc *m)
static struct mpc_intsrc __initdata *m_spare[SPARE_SLOT_NUM]; static struct mpc_intsrc __initdata *m_spare[SPARE_SLOT_NUM];
static void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) static void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare)
{ {
int i; int i;
@ -866,7 +866,8 @@ static void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare)
} }
} }
#else /* CONFIG_X86_IO_APIC */ #else /* CONFIG_X86_IO_APIC */
static inline void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {} static
inline void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {}
#endif /* CONFIG_X86_IO_APIC */ #endif /* CONFIG_X86_IO_APIC */
static int check_slot(unsigned long mpc_new_phys, unsigned long mpc_new_length, static int check_slot(unsigned long mpc_new_phys, unsigned long mpc_new_length,

View File

@ -324,7 +324,7 @@ void __ref xsave_cntxt_init(void)
} }
/* /*
* for now OS knows only about FP/SSE * Support only the state known to OS.
*/ */
pcntxt_mask = pcntxt_mask & XCNTXT_MASK; pcntxt_mask = pcntxt_mask & XCNTXT_MASK;
xsave_init(); xsave_init();

View File

@ -219,6 +219,22 @@ static int gup_pud_range(pgd_t pgd, unsigned long addr, unsigned long end,
return 1; return 1;
} }
/**
* get_user_pages_fast() - pin user pages in memory
* @start: starting user address
* @nr_pages: number of pages from start to pin
* @write: whether pages will be written to
* @pages: array that receives pointers to the pages pinned.
* Should be at least nr_pages long.
*
* Attempt to pin user pages in memory without taking mm->mmap_sem.
* If not successful, it will fall back to taking the lock and
* calling get_user_pages().
*
* Returns number of pages pinned. This may be fewer than the number
* requested. If nr_pages is 0 or negative, returns 0. If no pages
* were pinned, returns -errno.
*/
int get_user_pages_fast(unsigned long start, int nr_pages, int write, int get_user_pages_fast(unsigned long start, int nr_pages, int write,
struct page **pages) struct page **pages)
{ {

View File

@ -547,7 +547,7 @@ void __init early_ioremap_reset(void)
} }
static void __init __early_set_fixmap(enum fixed_addresses idx, static void __init __early_set_fixmap(enum fixed_addresses idx,
unsigned long phys, pgprot_t flags) phys_addr_t phys, pgprot_t flags)
{ {
unsigned long addr = __fix_to_virt(idx); unsigned long addr = __fix_to_virt(idx);
pte_t *pte; pte_t *pte;
@ -566,7 +566,7 @@ static void __init __early_set_fixmap(enum fixed_addresses idx,
} }
static inline void __init early_set_fixmap(enum fixed_addresses idx, static inline void __init early_set_fixmap(enum fixed_addresses idx,
unsigned long phys, pgprot_t prot) phys_addr_t phys, pgprot_t prot)
{ {
if (after_paging_init) if (after_paging_init)
__set_fixmap(idx, phys, prot); __set_fixmap(idx, phys, prot);
@ -607,9 +607,10 @@ static int __init check_early_ioremap_leak(void)
late_initcall(check_early_ioremap_leak); late_initcall(check_early_ioremap_leak);
static void __init __iomem * static void __init __iomem *
__early_ioremap(unsigned long phys_addr, unsigned long size, pgprot_t prot) __early_ioremap(resource_size_t phys_addr, unsigned long size, pgprot_t prot)
{ {
unsigned long offset, last_addr; unsigned long offset;
resource_size_t last_addr;
unsigned int nrpages; unsigned int nrpages;
enum fixed_addresses idx0, idx; enum fixed_addresses idx0, idx;
int i, slot; int i, slot;
@ -625,15 +626,15 @@ __early_ioremap(unsigned long phys_addr, unsigned long size, pgprot_t prot)
} }
if (slot < 0) { if (slot < 0) {
printk(KERN_INFO "early_iomap(%08lx, %08lx) not found slot\n", printk(KERN_INFO "early_iomap(%08llx, %08lx) not found slot\n",
phys_addr, size); (u64)phys_addr, size);
WARN_ON(1); WARN_ON(1);
return NULL; return NULL;
} }
if (early_ioremap_debug) { if (early_ioremap_debug) {
printk(KERN_INFO "early_ioremap(%08lx, %08lx) [%d] => ", printk(KERN_INFO "early_ioremap(%08llx, %08lx) [%d] => ",
phys_addr, size, slot); (u64)phys_addr, size, slot);
dump_stack(); dump_stack();
} }
@ -680,13 +681,15 @@ __early_ioremap(unsigned long phys_addr, unsigned long size, pgprot_t prot)
} }
/* Remap an IO device */ /* Remap an IO device */
void __init __iomem *early_ioremap(unsigned long phys_addr, unsigned long size) void __init __iomem *
early_ioremap(resource_size_t phys_addr, unsigned long size)
{ {
return __early_ioremap(phys_addr, size, PAGE_KERNEL_IO); return __early_ioremap(phys_addr, size, PAGE_KERNEL_IO);
} }
/* Remap memory */ /* Remap memory */
void __init __iomem *early_memremap(unsigned long phys_addr, unsigned long size) void __init __iomem *
early_memremap(resource_size_t phys_addr, unsigned long size)
{ {
return __early_ioremap(phys_addr, size, PAGE_KERNEL); return __early_ioremap(phys_addr, size, PAGE_KERNEL);
} }

View File

@ -31,7 +31,7 @@
#ifdef CONFIG_X86_PAT #ifdef CONFIG_X86_PAT
int __read_mostly pat_enabled = 1; int __read_mostly pat_enabled = 1;
void __cpuinit pat_disable(const char *reason) static inline void pat_disable(const char *reason)
{ {
pat_enabled = 0; pat_enabled = 0;
printk(KERN_INFO "%s\n", reason); printk(KERN_INFO "%s\n", reason);