Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6: [S390] cio: fix cio_tpi ignoring adapter interrupts [S390] gmap: always up mmap_sem properly [S390] Do not clobber personality flags on exec
This commit is contained in:
commit
0ecdb12a7a
|
@ -188,7 +188,8 @@ extern char elf_platform[];
|
||||||
#define SET_PERSONALITY(ex) \
|
#define SET_PERSONALITY(ex) \
|
||||||
do { \
|
do { \
|
||||||
if (personality(current->personality) != PER_LINUX32) \
|
if (personality(current->personality) != PER_LINUX32) \
|
||||||
set_personality(PER_LINUX); \
|
set_personality(PER_LINUX | \
|
||||||
|
(current->personality & ~PER_MASK)); \
|
||||||
if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
|
if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
|
||||||
set_thread_flag(TIF_31BIT); \
|
set_thread_flag(TIF_31BIT); \
|
||||||
else \
|
else \
|
||||||
|
|
|
@ -303,15 +303,15 @@ int gmap_unmap_segment(struct gmap *gmap, unsigned long to, unsigned long len)
|
||||||
/* Walk the guest addr space page table */
|
/* Walk the guest addr space page table */
|
||||||
table = gmap->table + (((to + off) >> 53) & 0x7ff);
|
table = gmap->table + (((to + off) >> 53) & 0x7ff);
|
||||||
if (*table & _REGION_ENTRY_INV)
|
if (*table & _REGION_ENTRY_INV)
|
||||||
return 0;
|
goto out;
|
||||||
table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
|
table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
|
||||||
table = table + (((to + off) >> 42) & 0x7ff);
|
table = table + (((to + off) >> 42) & 0x7ff);
|
||||||
if (*table & _REGION_ENTRY_INV)
|
if (*table & _REGION_ENTRY_INV)
|
||||||
return 0;
|
goto out;
|
||||||
table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
|
table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
|
||||||
table = table + (((to + off) >> 31) & 0x7ff);
|
table = table + (((to + off) >> 31) & 0x7ff);
|
||||||
if (*table & _REGION_ENTRY_INV)
|
if (*table & _REGION_ENTRY_INV)
|
||||||
return 0;
|
goto out;
|
||||||
table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
|
table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
|
||||||
table = table + (((to + off) >> 20) & 0x7ff);
|
table = table + (((to + off) >> 20) & 0x7ff);
|
||||||
|
|
||||||
|
@ -319,6 +319,7 @@ int gmap_unmap_segment(struct gmap *gmap, unsigned long to, unsigned long len)
|
||||||
flush |= gmap_unlink_segment(gmap, table);
|
flush |= gmap_unlink_segment(gmap, table);
|
||||||
*table = _SEGMENT_ENTRY_INV;
|
*table = _SEGMENT_ENTRY_INV;
|
||||||
}
|
}
|
||||||
|
out:
|
||||||
up_read(&gmap->mm->mmap_sem);
|
up_read(&gmap->mm->mmap_sem);
|
||||||
if (flush)
|
if (flush)
|
||||||
gmap_flush_tlb(gmap);
|
gmap_flush_tlb(gmap);
|
||||||
|
|
|
@ -654,8 +654,8 @@ static struct io_subchannel_private console_priv;
|
||||||
static int console_subchannel_in_use;
|
static int console_subchannel_in_use;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Use tpi to get a pending interrupt, call the interrupt handler and
|
* Use cio_tpi to get a pending interrupt and call the interrupt handler.
|
||||||
* return a pointer to the subchannel structure.
|
* Return non-zero if an interrupt was processed, zero otherwise.
|
||||||
*/
|
*/
|
||||||
static int cio_tpi(void)
|
static int cio_tpi(void)
|
||||||
{
|
{
|
||||||
|
@ -667,6 +667,10 @@ static int cio_tpi(void)
|
||||||
tpi_info = (struct tpi_info *)&S390_lowcore.subchannel_id;
|
tpi_info = (struct tpi_info *)&S390_lowcore.subchannel_id;
|
||||||
if (tpi(NULL) != 1)
|
if (tpi(NULL) != 1)
|
||||||
return 0;
|
return 0;
|
||||||
|
if (tpi_info->adapter_IO) {
|
||||||
|
do_adapter_IO(tpi_info->isc);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
irb = (struct irb *)&S390_lowcore.irb;
|
irb = (struct irb *)&S390_lowcore.irb;
|
||||||
/* Store interrupt response block to lowcore. */
|
/* Store interrupt response block to lowcore. */
|
||||||
if (tsch(tpi_info->schid, irb) != 0)
|
if (tsch(tpi_info->schid, irb) != 0)
|
||||||
|
|
Loading…
Reference in New Issue