Commit 409ab140 authored by Linus Torvalds's avatar Linus Torvalds

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
parents ce845377 badb8bb9
...@@ -9,9 +9,22 @@ ...@@ -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, ...@@ -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 @@ ...@@ -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[] = { ...@@ -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: ...@@ -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: ...@@ -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, ...@@ -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 @@ int hwsampler_deallocate() ...@@ -1021,20 +1021,14 @@ int hwsampler_deallocate()
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); ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment