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] fix alloc_pgste check in init_new_context [S390] oprofile: fix min/max interval query checks [S390] replace diag10() with diag10_range() function [S390] disassembler: handle b280/spp instruction [S390] kernel: Initialize register 14 when starting new CPU [S390] dasd: prevent IO error during reserve/release loop [S390] sclp/memory hotplug: fix initial usecount of increments
This commit is contained in:
commit
409ab140e2
|
@ -9,9 +9,22 @@
|
||||||
#define _ASM_S390_DIAG_H
|
#define _ASM_S390_DIAG_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Diagnose 10: Release pages
|
* Diagnose 10: Release page range
|
||||||
*/
|
*/
|
||||||
extern void diag10(unsigned long addr);
|
static inline void diag10_range(unsigned long start_pfn, unsigned long num_pfn)
|
||||||
|
{
|
||||||
|
unsigned long start_addr, end_addr;
|
||||||
|
|
||||||
|
start_addr = start_pfn << PAGE_SHIFT;
|
||||||
|
end_addr = (start_pfn + num_pfn - 1) << PAGE_SHIFT;
|
||||||
|
|
||||||
|
asm volatile(
|
||||||
|
"0: diag %0,%1,0x10\n"
|
||||||
|
"1:\n"
|
||||||
|
EX_TABLE(0b, 1b)
|
||||||
|
EX_TABLE(1b, 1b)
|
||||||
|
: : "a" (start_addr), "a" (end_addr));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Diagnose 14: Input spool file manipulation
|
* Diagnose 14: Input spool file manipulation
|
||||||
|
|
|
@ -23,7 +23,7 @@ static inline int init_new_context(struct task_struct *tsk,
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
mm->context.asce_bits |= _ASCE_TYPE_REGION3;
|
mm->context.asce_bits |= _ASCE_TYPE_REGION3;
|
||||||
#endif
|
#endif
|
||||||
if (current->mm->context.alloc_pgste) {
|
if (current->mm && current->mm->context.alloc_pgste) {
|
||||||
/*
|
/*
|
||||||
* alloc_pgste indicates, that any NEW context will be created
|
* alloc_pgste indicates, that any NEW context will be created
|
||||||
* with extended page tables. The old context is unchanged. The
|
* with extended page tables. The old context is unchanged. The
|
||||||
|
|
|
@ -8,27 +8,6 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <asm/diag.h>
|
#include <asm/diag.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* Diagnose 10: Release pages
|
|
||||||
*/
|
|
||||||
void diag10(unsigned long addr)
|
|
||||||
{
|
|
||||||
if (addr >= 0x7ff00000)
|
|
||||||
return;
|
|
||||||
asm volatile(
|
|
||||||
#ifdef CONFIG_64BIT
|
|
||||||
" sam31\n"
|
|
||||||
" diag %0,%0,0x10\n"
|
|
||||||
"0: sam64\n"
|
|
||||||
#else
|
|
||||||
" diag %0,%0,0x10\n"
|
|
||||||
"0:\n"
|
|
||||||
#endif
|
|
||||||
EX_TABLE(0b, 0b)
|
|
||||||
: : "a" (addr));
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(diag10);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Diagnose 14: Input spool file manipulation
|
* Diagnose 14: Input spool file manipulation
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -672,6 +672,7 @@ static struct insn opcode_b2[] = {
|
||||||
{ "rp", 0x77, INSTR_S_RD },
|
{ "rp", 0x77, INSTR_S_RD },
|
||||||
{ "stcke", 0x78, INSTR_S_RD },
|
{ "stcke", 0x78, INSTR_S_RD },
|
||||||
{ "sacf", 0x79, INSTR_S_RD },
|
{ "sacf", 0x79, INSTR_S_RD },
|
||||||
|
{ "spp", 0x80, INSTR_S_RD },
|
||||||
{ "stsi", 0x7d, INSTR_S_RD },
|
{ "stsi", 0x7d, INSTR_S_RD },
|
||||||
{ "srnm", 0x99, INSTR_S_RD },
|
{ "srnm", 0x99, INSTR_S_RD },
|
||||||
{ "stfpc", 0x9c, INSTR_S_RD },
|
{ "stfpc", 0x9c, INSTR_S_RD },
|
||||||
|
|
|
@ -836,7 +836,7 @@ restart_base:
|
||||||
stosm __SF_EMPTY(%r15),0x04 # now we can turn dat on
|
stosm __SF_EMPTY(%r15),0x04 # now we can turn dat on
|
||||||
basr %r14,0
|
basr %r14,0
|
||||||
l %r14,restart_addr-.(%r14)
|
l %r14,restart_addr-.(%r14)
|
||||||
br %r14 # branch to start_secondary
|
basr %r14,%r14 # branch to start_secondary
|
||||||
restart_addr:
|
restart_addr:
|
||||||
.long start_secondary
|
.long start_secondary
|
||||||
.align 8
|
.align 8
|
||||||
|
|
|
@ -841,7 +841,7 @@ restart_base:
|
||||||
mvc __LC_SYSTEM_TIMER(8),__TI_system_timer(%r1)
|
mvc __LC_SYSTEM_TIMER(8),__TI_system_timer(%r1)
|
||||||
xc __LC_STEAL_TIMER(8),__LC_STEAL_TIMER
|
xc __LC_STEAL_TIMER(8),__LC_STEAL_TIMER
|
||||||
stosm __SF_EMPTY(%r15),0x04 # now we can turn dat on
|
stosm __SF_EMPTY(%r15),0x04 # now we can turn dat on
|
||||||
jg start_secondary
|
brasl %r14,start_secondary
|
||||||
.align 8
|
.align 8
|
||||||
restart_vtime:
|
restart_vtime:
|
||||||
.long 0x7fffffff,0xffffffff
|
.long 0x7fffffff,0xffffffff
|
||||||
|
|
|
@ -91,7 +91,7 @@ static long cmm_alloc_pages(long nr, long *counter,
|
||||||
} else
|
} else
|
||||||
free_page((unsigned long) npa);
|
free_page((unsigned long) npa);
|
||||||
}
|
}
|
||||||
diag10(addr);
|
diag10_range(addr >> PAGE_SHIFT, 1);
|
||||||
pa->pages[pa->index++] = addr;
|
pa->pages[pa->index++] = addr;
|
||||||
(*counter)++;
|
(*counter)++;
|
||||||
spin_unlock(&cmm_lock);
|
spin_unlock(&cmm_lock);
|
||||||
|
|
|
@ -1021,20 +1021,14 @@ deallocate_exit:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
long hwsampler_query_min_interval(void)
|
unsigned long hwsampler_query_min_interval(void)
|
||||||
{
|
{
|
||||||
if (min_sampler_rate)
|
|
||||||
return min_sampler_rate;
|
return min_sampler_rate;
|
||||||
else
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
long hwsampler_query_max_interval(void)
|
unsigned long hwsampler_query_max_interval(void)
|
||||||
{
|
{
|
||||||
if (max_sampler_rate)
|
|
||||||
return max_sampler_rate;
|
return max_sampler_rate;
|
||||||
else
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long hwsampler_get_sample_overflow_count(unsigned int cpu)
|
unsigned long hwsampler_get_sample_overflow_count(unsigned int cpu)
|
||||||
|
|
|
@ -102,8 +102,8 @@ int hwsampler_setup(void);
|
||||||
int hwsampler_shutdown(void);
|
int hwsampler_shutdown(void);
|
||||||
int hwsampler_allocate(unsigned long sdbt, unsigned long sdb);
|
int hwsampler_allocate(unsigned long sdbt, unsigned long sdb);
|
||||||
int hwsampler_deallocate(void);
|
int hwsampler_deallocate(void);
|
||||||
long hwsampler_query_min_interval(void);
|
unsigned long hwsampler_query_min_interval(void);
|
||||||
long hwsampler_query_max_interval(void);
|
unsigned long hwsampler_query_max_interval(void);
|
||||||
int hwsampler_start_all(unsigned long interval);
|
int hwsampler_start_all(unsigned long interval);
|
||||||
int hwsampler_stop_all(void);
|
int hwsampler_stop_all(void);
|
||||||
int hwsampler_deactivate(unsigned int cpu);
|
int hwsampler_deactivate(unsigned int cpu);
|
||||||
|
|
|
@ -145,15 +145,11 @@ static int oprofile_hwsampler_init(struct oprofile_operations *ops)
|
||||||
* create hwsampler files only if hwsampler_setup() succeeds.
|
* create hwsampler files only if hwsampler_setup() succeeds.
|
||||||
*/
|
*/
|
||||||
oprofile_min_interval = hwsampler_query_min_interval();
|
oprofile_min_interval = hwsampler_query_min_interval();
|
||||||
if (oprofile_min_interval < 0) {
|
if (oprofile_min_interval == 0)
|
||||||
oprofile_min_interval = 0;
|
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
|
||||||
oprofile_max_interval = hwsampler_query_max_interval();
|
oprofile_max_interval = hwsampler_query_max_interval();
|
||||||
if (oprofile_max_interval < 0) {
|
if (oprofile_max_interval == 0)
|
||||||
oprofile_max_interval = 0;
|
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
|
||||||
|
|
||||||
if (oprofile_timer_init(ops))
|
if (oprofile_timer_init(ops))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
|
@ -1742,11 +1742,20 @@ int dasd_sleep_on_interruptible(struct dasd_ccw_req *cqr)
|
||||||
static inline int _dasd_term_running_cqr(struct dasd_device *device)
|
static inline int _dasd_term_running_cqr(struct dasd_device *device)
|
||||||
{
|
{
|
||||||
struct dasd_ccw_req *cqr;
|
struct dasd_ccw_req *cqr;
|
||||||
|
int rc;
|
||||||
|
|
||||||
if (list_empty(&device->ccw_queue))
|
if (list_empty(&device->ccw_queue))
|
||||||
return 0;
|
return 0;
|
||||||
cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist);
|
cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist);
|
||||||
return device->discipline->term_IO(cqr);
|
rc = device->discipline->term_IO(cqr);
|
||||||
|
if (!rc)
|
||||||
|
/*
|
||||||
|
* CQR terminated because a more important request is pending.
|
||||||
|
* Undo decreasing of retry counter because this is
|
||||||
|
* not an error case.
|
||||||
|
*/
|
||||||
|
cqr->retries++;
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr)
|
int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr)
|
||||||
|
|
|
@ -518,6 +518,8 @@ static void __init insert_increment(u16 rn, int standby, int assigned)
|
||||||
return;
|
return;
|
||||||
new_incr->rn = rn;
|
new_incr->rn = rn;
|
||||||
new_incr->standby = standby;
|
new_incr->standby = standby;
|
||||||
|
if (!standby)
|
||||||
|
new_incr->usecount = 1;
|
||||||
last_rn = 0;
|
last_rn = 0;
|
||||||
prev = &sclp_mem_list;
|
prev = &sclp_mem_list;
|
||||||
list_for_each_entry(incr, &sclp_mem_list, list) {
|
list_for_each_entry(incr, &sclp_mem_list, list) {
|
||||||
|
|
Loading…
Reference in New Issue