Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: [S390] correct ktime to tod clock comparator conversion [S390] 3215 deadlock with tty_wakeup [S390] incorrect PageTables counter for kvm page tables [S390] idle: avoid RCU usage in extended quiescent state
This commit is contained in:
commit
39e255dab5
|
@ -76,7 +76,6 @@ static void default_idle(void)
|
||||||
if (test_thread_flag(TIF_MCCK_PENDING)) {
|
if (test_thread_flag(TIF_MCCK_PENDING)) {
|
||||||
local_mcck_enable();
|
local_mcck_enable();
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
s390_handle_mcck();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
trace_hardirqs_on();
|
trace_hardirqs_on();
|
||||||
|
@ -93,10 +92,12 @@ void cpu_idle(void)
|
||||||
for (;;) {
|
for (;;) {
|
||||||
tick_nohz_idle_enter();
|
tick_nohz_idle_enter();
|
||||||
rcu_idle_enter();
|
rcu_idle_enter();
|
||||||
while (!need_resched())
|
while (!need_resched() && !test_thread_flag(TIF_MCCK_PENDING))
|
||||||
default_idle();
|
default_idle();
|
||||||
rcu_idle_exit();
|
rcu_idle_exit();
|
||||||
tick_nohz_idle_exit();
|
tick_nohz_idle_exit();
|
||||||
|
if (test_thread_flag(TIF_MCCK_PENDING))
|
||||||
|
s390_handle_mcck();
|
||||||
preempt_enable_no_resched();
|
preempt_enable_no_resched();
|
||||||
schedule();
|
schedule();
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
|
|
@ -113,11 +113,14 @@ static void fixup_clock_comparator(unsigned long long delta)
|
||||||
static int s390_next_ktime(ktime_t expires,
|
static int s390_next_ktime(ktime_t expires,
|
||||||
struct clock_event_device *evt)
|
struct clock_event_device *evt)
|
||||||
{
|
{
|
||||||
|
struct timespec ts;
|
||||||
u64 nsecs;
|
u64 nsecs;
|
||||||
|
|
||||||
nsecs = ktime_to_ns(ktime_sub(expires, ktime_get_monotonic_offset()));
|
ts.tv_sec = ts.tv_nsec = 0;
|
||||||
|
monotonic_to_bootbased(&ts);
|
||||||
|
nsecs = ktime_to_ns(ktime_add(timespec_to_ktime(ts), expires));
|
||||||
do_div(nsecs, 125);
|
do_div(nsecs, 125);
|
||||||
S390_lowcore.clock_comparator = TOD_UNIX_EPOCH + (nsecs << 9);
|
S390_lowcore.clock_comparator = sched_clock_base_cc + (nsecs << 9);
|
||||||
set_clock_comparator(S390_lowcore.clock_comparator);
|
set_clock_comparator(S390_lowcore.clock_comparator);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -574,7 +574,7 @@ static inline void page_table_free_pgste(unsigned long *table)
|
||||||
page = pfn_to_page(__pa(table) >> PAGE_SHIFT);
|
page = pfn_to_page(__pa(table) >> PAGE_SHIFT);
|
||||||
mp = (struct gmap_pgtable *) page->index;
|
mp = (struct gmap_pgtable *) page->index;
|
||||||
BUG_ON(!list_empty(&mp->mapper));
|
BUG_ON(!list_empty(&mp->mapper));
|
||||||
pgtable_page_ctor(page);
|
pgtable_page_dtor(page);
|
||||||
atomic_set(&page->_mapcount, -1);
|
atomic_set(&page->_mapcount, -1);
|
||||||
kfree(mp);
|
kfree(mp);
|
||||||
__free_page(page);
|
__free_page(page);
|
||||||
|
|
|
@ -87,6 +87,7 @@ struct raw3215_info {
|
||||||
struct tty_struct *tty; /* pointer to tty structure if present */
|
struct tty_struct *tty; /* pointer to tty structure if present */
|
||||||
struct raw3215_req *queued_read; /* pointer to queued read requests */
|
struct raw3215_req *queued_read; /* pointer to queued read requests */
|
||||||
struct raw3215_req *queued_write;/* pointer to queued write requests */
|
struct raw3215_req *queued_write;/* pointer to queued write requests */
|
||||||
|
struct tasklet_struct tlet; /* tasklet to invoke tty_wakeup */
|
||||||
wait_queue_head_t empty_wait; /* wait queue for flushing */
|
wait_queue_head_t empty_wait; /* wait queue for flushing */
|
||||||
struct timer_list timer; /* timer for delayed output */
|
struct timer_list timer; /* timer for delayed output */
|
||||||
int line_pos; /* position on the line (for tabs) */
|
int line_pos; /* position on the line (for tabs) */
|
||||||
|
@ -333,20 +334,24 @@ static inline void raw3215_try_io(struct raw3215_info *raw)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Call tty_wakeup from tasklet context
|
||||||
|
*/
|
||||||
|
static void raw3215_wakeup(unsigned long data)
|
||||||
|
{
|
||||||
|
struct raw3215_info *raw = (struct raw3215_info *) data;
|
||||||
|
tty_wakeup(raw->tty);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Try to start the next IO and wake up processes waiting on the tty.
|
* Try to start the next IO and wake up processes waiting on the tty.
|
||||||
*/
|
*/
|
||||||
static void raw3215_next_io(struct raw3215_info *raw)
|
static void raw3215_next_io(struct raw3215_info *raw)
|
||||||
{
|
{
|
||||||
struct tty_struct *tty;
|
|
||||||
|
|
||||||
raw3215_mk_write_req(raw);
|
raw3215_mk_write_req(raw);
|
||||||
raw3215_try_io(raw);
|
raw3215_try_io(raw);
|
||||||
tty = raw->tty;
|
if (raw->tty && RAW3215_BUFFER_SIZE - raw->count >= RAW3215_MIN_SPACE)
|
||||||
if (tty != NULL &&
|
tasklet_schedule(&raw->tlet);
|
||||||
RAW3215_BUFFER_SIZE - raw->count >= RAW3215_MIN_SPACE) {
|
|
||||||
tty_wakeup(tty);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -682,6 +687,7 @@ static int raw3215_probe (struct ccw_device *cdev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
init_waitqueue_head(&raw->empty_wait);
|
init_waitqueue_head(&raw->empty_wait);
|
||||||
|
tasklet_init(&raw->tlet, raw3215_wakeup, (unsigned long) raw);
|
||||||
|
|
||||||
dev_set_drvdata(&cdev->dev, raw);
|
dev_set_drvdata(&cdev->dev, raw);
|
||||||
cdev->handler = raw3215_irq;
|
cdev->handler = raw3215_irq;
|
||||||
|
@ -901,6 +907,7 @@ static int __init con3215_init(void)
|
||||||
|
|
||||||
raw->flags |= RAW3215_FIXED;
|
raw->flags |= RAW3215_FIXED;
|
||||||
init_waitqueue_head(&raw->empty_wait);
|
init_waitqueue_head(&raw->empty_wait);
|
||||||
|
tasklet_init(&raw->tlet, raw3215_wakeup, (unsigned long) raw);
|
||||||
|
|
||||||
/* Request the console irq */
|
/* Request the console irq */
|
||||||
if (raw3215_startup(raw) != 0) {
|
if (raw3215_startup(raw) != 0) {
|
||||||
|
@ -966,6 +973,7 @@ static void tty3215_close(struct tty_struct *tty, struct file * filp)
|
||||||
tty->closing = 1;
|
tty->closing = 1;
|
||||||
/* Shutdown the terminal */
|
/* Shutdown the terminal */
|
||||||
raw3215_shutdown(raw);
|
raw3215_shutdown(raw);
|
||||||
|
tasklet_kill(&raw->tlet);
|
||||||
tty->closing = 0;
|
tty->closing = 0;
|
||||||
raw->tty = NULL;
|
raw->tty = NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue