Commit e48af7aa authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'please-pull-misc-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux

Pull ia64 updates from Tony Luck:
 "Miscellaneous ia64 cleanups"

* tag 'please-pull-misc-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux:
  ia64: salinfo: use a waitqueue instead a sema down/up combo
  ia64: efi: use timespec64 for persistent clock
parents ed780686 fbb0e4da
...@@ -236,7 +236,7 @@ STUB_GET_NEXT_HIGH_MONO_COUNT(virt, id) ...@@ -236,7 +236,7 @@ STUB_GET_NEXT_HIGH_MONO_COUNT(virt, id)
STUB_RESET_SYSTEM(virt, id) STUB_RESET_SYSTEM(virt, id)
void void
efi_gettimeofday (struct timespec *ts) efi_gettimeofday (struct timespec64 *ts)
{ {
efi_time_t tm; efi_time_t tm;
...@@ -245,7 +245,7 @@ efi_gettimeofday (struct timespec *ts) ...@@ -245,7 +245,7 @@ efi_gettimeofday (struct timespec *ts)
return; return;
} }
ts->tv_sec = mktime(tm.year, tm.month, tm.day, ts->tv_sec = mktime64(tm.year, tm.month, tm.day,
tm.hour, tm.minute, tm.second); tm.hour, tm.minute, tm.second);
ts->tv_nsec = tm.nanosecond; ts->tv_nsec = tm.nanosecond;
} }
......
...@@ -141,7 +141,7 @@ enum salinfo_state { ...@@ -141,7 +141,7 @@ enum salinfo_state {
struct salinfo_data { struct salinfo_data {
cpumask_t cpu_event; /* which cpus have outstanding events */ cpumask_t cpu_event; /* which cpus have outstanding events */
struct semaphore mutex; wait_queue_head_t read_wait;
u8 *log_buffer; u8 *log_buffer;
u64 log_size; u64 log_size;
u8 *oemdata; /* decoded oem data */ u8 *oemdata; /* decoded oem data */
...@@ -182,21 +182,6 @@ struct salinfo_platform_oemdata_parms { ...@@ -182,21 +182,6 @@ struct salinfo_platform_oemdata_parms {
int ret; int ret;
}; };
/* Kick the mutex that tells user space that there is work to do. Instead of
* trying to track the state of the mutex across multiple cpus, in user
* context, interrupt context, non-maskable interrupt context and hotplug cpu,
* it is far easier just to grab the mutex if it is free then release it.
*
* This routine must be called with data_saved_lock held, to make the down/up
* operation atomic.
*/
static void
salinfo_work_to_do(struct salinfo_data *data)
{
(void)(down_trylock(&data->mutex) ?: 0);
up(&data->mutex);
}
static void static void
salinfo_platform_oemdata_cpu(void *context) salinfo_platform_oemdata_cpu(void *context)
{ {
...@@ -258,7 +243,7 @@ salinfo_log_wakeup(int type, u8 *buffer, u64 size, int irqsafe) ...@@ -258,7 +243,7 @@ salinfo_log_wakeup(int type, u8 *buffer, u64 size, int irqsafe)
} }
cpumask_set_cpu(smp_processor_id(), &data->cpu_event); cpumask_set_cpu(smp_processor_id(), &data->cpu_event);
if (irqsafe) { if (irqsafe) {
salinfo_work_to_do(data); wake_up_interruptible(&data->read_wait);
spin_unlock_irqrestore(&data_saved_lock, flags); spin_unlock_irqrestore(&data_saved_lock, flags);
} }
} }
...@@ -271,14 +256,10 @@ extern void ia64_mlogbuf_dump(void); ...@@ -271,14 +256,10 @@ extern void ia64_mlogbuf_dump(void);
static void static void
salinfo_timeout_check(struct salinfo_data *data) salinfo_timeout_check(struct salinfo_data *data)
{ {
unsigned long flags;
if (!data->open) if (!data->open)
return; return;
if (!cpumask_empty(&data->cpu_event)) { if (!cpumask_empty(&data->cpu_event))
spin_lock_irqsave(&data_saved_lock, flags); wake_up_interruptible(&data->read_wait);
salinfo_work_to_do(data);
spin_unlock_irqrestore(&data_saved_lock, flags);
}
} }
static void static void
...@@ -308,10 +289,11 @@ salinfo_event_read(struct file *file, char __user *buffer, size_t count, loff_t ...@@ -308,10 +289,11 @@ salinfo_event_read(struct file *file, char __user *buffer, size_t count, loff_t
int i, n, cpu = -1; int i, n, cpu = -1;
retry: retry:
if (cpumask_empty(&data->cpu_event) && down_trylock(&data->mutex)) { if (cpumask_empty(&data->cpu_event)) {
if (file->f_flags & O_NONBLOCK) if (file->f_flags & O_NONBLOCK)
return -EAGAIN; return -EAGAIN;
if (down_interruptible(&data->mutex)) if (wait_event_interruptible(data->read_wait,
!cpumask_empty(&data->cpu_event)))
return -EINTR; return -EINTR;
} }
...@@ -510,7 +492,7 @@ salinfo_log_clear(struct salinfo_data *data, int cpu) ...@@ -510,7 +492,7 @@ salinfo_log_clear(struct salinfo_data *data, int cpu)
if (data->state == STATE_LOG_RECORD) { if (data->state == STATE_LOG_RECORD) {
spin_lock_irqsave(&data_saved_lock, flags); spin_lock_irqsave(&data_saved_lock, flags);
cpumask_set_cpu(cpu, &data->cpu_event); cpumask_set_cpu(cpu, &data->cpu_event);
salinfo_work_to_do(data); wake_up_interruptible(&data->read_wait);
spin_unlock_irqrestore(&data_saved_lock, flags); spin_unlock_irqrestore(&data_saved_lock, flags);
} }
return 0; return 0;
...@@ -582,7 +564,7 @@ salinfo_cpu_callback(struct notifier_block *nb, unsigned long action, void *hcpu ...@@ -582,7 +564,7 @@ salinfo_cpu_callback(struct notifier_block *nb, unsigned long action, void *hcpu
i < ARRAY_SIZE(salinfo_data); i < ARRAY_SIZE(salinfo_data);
++i, ++data) { ++i, ++data) {
cpumask_set_cpu(cpu, &data->cpu_event); cpumask_set_cpu(cpu, &data->cpu_event);
salinfo_work_to_do(data); wake_up_interruptible(&data->read_wait);
} }
spin_unlock_irqrestore(&data_saved_lock, flags); spin_unlock_irqrestore(&data_saved_lock, flags);
break; break;
...@@ -640,7 +622,7 @@ salinfo_init(void) ...@@ -640,7 +622,7 @@ salinfo_init(void)
for (i = 0; i < ARRAY_SIZE(salinfo_log_name); i++) { for (i = 0; i < ARRAY_SIZE(salinfo_log_name); i++) {
data = salinfo_data + i; data = salinfo_data + i;
data->type = i; data->type = i;
sema_init(&data->mutex, 1); init_waitqueue_head(&data->read_wait);
dir = proc_mkdir(salinfo_log_name[i], salinfo_dir); dir = proc_mkdir(salinfo_log_name[i], salinfo_dir);
if (!dir) if (!dir)
continue; continue;
......
...@@ -355,7 +355,7 @@ static struct irqaction timer_irqaction = { ...@@ -355,7 +355,7 @@ static struct irqaction timer_irqaction = {
.name = "timer" .name = "timer"
}; };
void read_persistent_clock(struct timespec *ts) void read_persistent_clock64(struct timespec64 *ts)
{ {
efi_gettimeofday(ts); efi_gettimeofday(ts);
} }
......
...@@ -879,7 +879,7 @@ extern void efi_init (void); ...@@ -879,7 +879,7 @@ extern void efi_init (void);
extern void *efi_get_pal_addr (void); extern void *efi_get_pal_addr (void);
extern void efi_map_pal_code (void); extern void efi_map_pal_code (void);
extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg); extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
extern void efi_gettimeofday (struct timespec *ts); extern void efi_gettimeofday (struct timespec64 *ts);
extern void efi_enter_virtual_mode (void); /* switch EFI to virtual mode, if possible */ extern void efi_enter_virtual_mode (void); /* switch EFI to virtual mode, if possible */
#ifdef CONFIG_X86 #ifdef CONFIG_X86
extern void efi_late_init(void); extern void efi_late_init(void);
......
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