Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6: [IA64] fix file and descriptor handling in perfmon [IA64] TS_RESTORE_SIGMASK [IA64] smp.c coding style fix [IA64] fix section mismatch in arch/ia64/kernel/topology.c [IA64] fix section mismatch in arch/ia64/kernel/palinfo.c [IA64] fix section mismatch in arch/ia64/kernel/irq.c [IA64] fix section mismatch in arch/ia64/kernel/acpi.c
This commit is contained in:
commit
8bec4a5d93
|
@ -463,7 +463,7 @@ sys32_sigsuspend (int history0, int history1, old_sigset_t mask)
|
||||||
|
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
current->state = TASK_INTERRUPTIBLE;
|
||||||
schedule();
|
schedule();
|
||||||
set_thread_flag(TIF_RESTORE_SIGMASK);
|
set_restore_sigmask();
|
||||||
return -ERESTARTNOHAND;
|
return -ERESTARTNOHAND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -966,7 +966,7 @@ acpi_map_iosapics (void)
|
||||||
fs_initcall(acpi_map_iosapics);
|
fs_initcall(acpi_map_iosapics);
|
||||||
#endif /* CONFIG_ACPI_NUMA */
|
#endif /* CONFIG_ACPI_NUMA */
|
||||||
|
|
||||||
int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base)
|
int __ref acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
|
|
@ -183,10 +183,10 @@ void fixup_irqs(void)
|
||||||
{
|
{
|
||||||
unsigned int irq;
|
unsigned int irq;
|
||||||
extern void ia64_process_pending_intr(void);
|
extern void ia64_process_pending_intr(void);
|
||||||
extern void ia64_disable_timer(void);
|
|
||||||
extern volatile int time_keeper_id;
|
extern volatile int time_keeper_id;
|
||||||
|
|
||||||
ia64_disable_timer();
|
/* Mask ITV to disable timer */
|
||||||
|
ia64_set_itv(1 << 16);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find a new timesync master
|
* Find a new timesync master
|
||||||
|
|
|
@ -1053,7 +1053,7 @@ static int __cpuinit palinfo_cpu_callback(struct notifier_block *nfb,
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct notifier_block palinfo_cpu_notifier __cpuinitdata =
|
static struct notifier_block __refdata palinfo_cpu_notifier =
|
||||||
{
|
{
|
||||||
.notifier_call = palinfo_cpu_callback,
|
.notifier_call = palinfo_cpu_callback,
|
||||||
.priority = 0,
|
.priority = 0,
|
||||||
|
|
|
@ -867,7 +867,7 @@ pfm_rvfree(void *mem, unsigned long size)
|
||||||
}
|
}
|
||||||
|
|
||||||
static pfm_context_t *
|
static pfm_context_t *
|
||||||
pfm_context_alloc(void)
|
pfm_context_alloc(int ctx_flags)
|
||||||
{
|
{
|
||||||
pfm_context_t *ctx;
|
pfm_context_t *ctx;
|
||||||
|
|
||||||
|
@ -878,6 +878,46 @@ pfm_context_alloc(void)
|
||||||
ctx = kzalloc(sizeof(pfm_context_t), GFP_KERNEL);
|
ctx = kzalloc(sizeof(pfm_context_t), GFP_KERNEL);
|
||||||
if (ctx) {
|
if (ctx) {
|
||||||
DPRINT(("alloc ctx @%p\n", ctx));
|
DPRINT(("alloc ctx @%p\n", ctx));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* init context protection lock
|
||||||
|
*/
|
||||||
|
spin_lock_init(&ctx->ctx_lock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* context is unloaded
|
||||||
|
*/
|
||||||
|
ctx->ctx_state = PFM_CTX_UNLOADED;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* initialization of context's flags
|
||||||
|
*/
|
||||||
|
ctx->ctx_fl_block = (ctx_flags & PFM_FL_NOTIFY_BLOCK) ? 1 : 0;
|
||||||
|
ctx->ctx_fl_system = (ctx_flags & PFM_FL_SYSTEM_WIDE) ? 1: 0;
|
||||||
|
ctx->ctx_fl_no_msg = (ctx_flags & PFM_FL_OVFL_NO_MSG) ? 1: 0;
|
||||||
|
/*
|
||||||
|
* will move to set properties
|
||||||
|
* ctx->ctx_fl_excl_idle = (ctx_flags & PFM_FL_EXCL_IDLE) ? 1: 0;
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* init restart semaphore to locked
|
||||||
|
*/
|
||||||
|
init_completion(&ctx->ctx_restart_done);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* activation is used in SMP only
|
||||||
|
*/
|
||||||
|
ctx->ctx_last_activation = PFM_INVALID_ACTIVATION;
|
||||||
|
SET_LAST_CPU(ctx, -1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* initialize notification message queue
|
||||||
|
*/
|
||||||
|
ctx->ctx_msgq_head = ctx->ctx_msgq_tail = 0;
|
||||||
|
init_waitqueue_head(&ctx->ctx_msgq_wait);
|
||||||
|
init_waitqueue_head(&ctx->ctx_zombieq);
|
||||||
|
|
||||||
}
|
}
|
||||||
return ctx;
|
return ctx;
|
||||||
}
|
}
|
||||||
|
@ -2165,28 +2205,21 @@ static struct dentry_operations pfmfs_dentry_operations = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static int
|
static struct file *
|
||||||
pfm_alloc_fd(struct file **cfile)
|
pfm_alloc_file(pfm_context_t *ctx)
|
||||||
{
|
{
|
||||||
int fd, ret = 0;
|
struct file *file;
|
||||||
struct file *file = NULL;
|
struct inode *inode;
|
||||||
struct inode * inode;
|
struct dentry *dentry;
|
||||||
char name[32];
|
char name[32];
|
||||||
struct qstr this;
|
struct qstr this;
|
||||||
|
|
||||||
fd = get_unused_fd();
|
|
||||||
if (fd < 0) return -ENFILE;
|
|
||||||
|
|
||||||
ret = -ENFILE;
|
|
||||||
|
|
||||||
file = get_empty_filp();
|
|
||||||
if (!file) goto out;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* allocate a new inode
|
* allocate a new inode
|
||||||
*/
|
*/
|
||||||
inode = new_inode(pfmfs_mnt->mnt_sb);
|
inode = new_inode(pfmfs_mnt->mnt_sb);
|
||||||
if (!inode) goto out;
|
if (!inode)
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
DPRINT(("new inode ino=%ld @%p\n", inode->i_ino, inode));
|
DPRINT(("new inode ino=%ld @%p\n", inode->i_ino, inode));
|
||||||
|
|
||||||
|
@ -2199,59 +2232,28 @@ pfm_alloc_fd(struct file **cfile)
|
||||||
this.len = strlen(name);
|
this.len = strlen(name);
|
||||||
this.hash = inode->i_ino;
|
this.hash = inode->i_ino;
|
||||||
|
|
||||||
ret = -ENOMEM;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* allocate a new dcache entry
|
* allocate a new dcache entry
|
||||||
*/
|
*/
|
||||||
file->f_path.dentry = d_alloc(pfmfs_mnt->mnt_sb->s_root, &this);
|
dentry = d_alloc(pfmfs_mnt->mnt_sb->s_root, &this);
|
||||||
if (!file->f_path.dentry) goto out;
|
if (!dentry) {
|
||||||
|
iput(inode);
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
file->f_path.dentry->d_op = &pfmfs_dentry_operations;
|
dentry->d_op = &pfmfs_dentry_operations;
|
||||||
|
d_add(dentry, inode);
|
||||||
|
|
||||||
d_add(file->f_path.dentry, inode);
|
file = alloc_file(pfmfs_mnt, dentry, FMODE_READ, &pfm_file_ops);
|
||||||
file->f_path.mnt = mntget(pfmfs_mnt);
|
if (!file) {
|
||||||
file->f_mapping = inode->i_mapping;
|
dput(dentry);
|
||||||
|
return ERR_PTR(-ENFILE);
|
||||||
|
}
|
||||||
|
|
||||||
file->f_op = &pfm_file_ops;
|
|
||||||
file->f_mode = FMODE_READ;
|
|
||||||
file->f_flags = O_RDONLY;
|
file->f_flags = O_RDONLY;
|
||||||
file->f_pos = 0;
|
file->private_data = ctx;
|
||||||
|
|
||||||
/*
|
return file;
|
||||||
* may have to delay until context is attached?
|
|
||||||
*/
|
|
||||||
fd_install(fd, file);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* the file structure we will use
|
|
||||||
*/
|
|
||||||
*cfile = file;
|
|
||||||
|
|
||||||
return fd;
|
|
||||||
out:
|
|
||||||
if (file) put_filp(file);
|
|
||||||
put_unused_fd(fd);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
pfm_free_fd(int fd, struct file *file)
|
|
||||||
{
|
|
||||||
struct files_struct *files = current->files;
|
|
||||||
struct fdtable *fdt;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* there ie no fd_uninstall(), so we do it here
|
|
||||||
*/
|
|
||||||
spin_lock(&files->file_lock);
|
|
||||||
fdt = files_fdtable(files);
|
|
||||||
rcu_assign_pointer(fdt->fd[fd], NULL);
|
|
||||||
spin_unlock(&files->file_lock);
|
|
||||||
|
|
||||||
if (file)
|
|
||||||
put_filp(file);
|
|
||||||
put_unused_fd(fd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -2475,6 +2477,7 @@ pfm_setup_buffer_fmt(struct task_struct *task, struct file *filp, pfm_context_t
|
||||||
|
|
||||||
/* link buffer format and context */
|
/* link buffer format and context */
|
||||||
ctx->ctx_buf_fmt = fmt;
|
ctx->ctx_buf_fmt = fmt;
|
||||||
|
ctx->ctx_fl_is_sampling = 1; /* assume record() is defined */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* check if buffer format wants to use perfmon buffer allocation/mapping service
|
* check if buffer format wants to use perfmon buffer allocation/mapping service
|
||||||
|
@ -2669,78 +2672,45 @@ pfm_context_create(pfm_context_t *ctx, void *arg, int count, struct pt_regs *reg
|
||||||
{
|
{
|
||||||
pfarg_context_t *req = (pfarg_context_t *)arg;
|
pfarg_context_t *req = (pfarg_context_t *)arg;
|
||||||
struct file *filp;
|
struct file *filp;
|
||||||
|
struct path path;
|
||||||
int ctx_flags;
|
int ctx_flags;
|
||||||
|
int fd;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* let's check the arguments first */
|
/* let's check the arguments first */
|
||||||
ret = pfarg_is_sane(current, req);
|
ret = pfarg_is_sane(current, req);
|
||||||
if (ret < 0) return ret;
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
ctx_flags = req->ctx_flags;
|
ctx_flags = req->ctx_flags;
|
||||||
|
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
|
||||||
ctx = pfm_context_alloc();
|
fd = get_unused_fd();
|
||||||
if (!ctx) goto error;
|
if (fd < 0)
|
||||||
|
return fd;
|
||||||
|
|
||||||
ret = pfm_alloc_fd(&filp);
|
ctx = pfm_context_alloc(ctx_flags);
|
||||||
if (ret < 0) goto error_file;
|
if (!ctx)
|
||||||
|
goto error;
|
||||||
|
|
||||||
req->ctx_fd = ctx->ctx_fd = ret;
|
filp = pfm_alloc_file(ctx);
|
||||||
|
if (IS_ERR(filp)) {
|
||||||
|
ret = PTR_ERR(filp);
|
||||||
|
goto error_file;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
req->ctx_fd = ctx->ctx_fd = fd;
|
||||||
* attach context to file
|
|
||||||
*/
|
|
||||||
filp->private_data = ctx;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* does the user want to sample?
|
* does the user want to sample?
|
||||||
*/
|
*/
|
||||||
if (pfm_uuid_cmp(req->ctx_smpl_buf_id, pfm_null_uuid)) {
|
if (pfm_uuid_cmp(req->ctx_smpl_buf_id, pfm_null_uuid)) {
|
||||||
ret = pfm_setup_buffer_fmt(current, filp, ctx, ctx_flags, 0, req);
|
ret = pfm_setup_buffer_fmt(current, filp, ctx, ctx_flags, 0, req);
|
||||||
if (ret) goto buffer_error;
|
if (ret)
|
||||||
|
goto buffer_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* init context protection lock
|
|
||||||
*/
|
|
||||||
spin_lock_init(&ctx->ctx_lock);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* context is unloaded
|
|
||||||
*/
|
|
||||||
ctx->ctx_state = PFM_CTX_UNLOADED;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* initialization of context's flags
|
|
||||||
*/
|
|
||||||
ctx->ctx_fl_block = (ctx_flags & PFM_FL_NOTIFY_BLOCK) ? 1 : 0;
|
|
||||||
ctx->ctx_fl_system = (ctx_flags & PFM_FL_SYSTEM_WIDE) ? 1: 0;
|
|
||||||
ctx->ctx_fl_is_sampling = ctx->ctx_buf_fmt ? 1 : 0; /* assume record() is defined */
|
|
||||||
ctx->ctx_fl_no_msg = (ctx_flags & PFM_FL_OVFL_NO_MSG) ? 1: 0;
|
|
||||||
/*
|
|
||||||
* will move to set properties
|
|
||||||
* ctx->ctx_fl_excl_idle = (ctx_flags & PFM_FL_EXCL_IDLE) ? 1: 0;
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* init restart semaphore to locked
|
|
||||||
*/
|
|
||||||
init_completion(&ctx->ctx_restart_done);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* activation is used in SMP only
|
|
||||||
*/
|
|
||||||
ctx->ctx_last_activation = PFM_INVALID_ACTIVATION;
|
|
||||||
SET_LAST_CPU(ctx, -1);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* initialize notification message queue
|
|
||||||
*/
|
|
||||||
ctx->ctx_msgq_head = ctx->ctx_msgq_tail = 0;
|
|
||||||
init_waitqueue_head(&ctx->ctx_msgq_wait);
|
|
||||||
init_waitqueue_head(&ctx->ctx_zombieq);
|
|
||||||
|
|
||||||
DPRINT(("ctx=%p flags=0x%x system=%d notify_block=%d excl_idle=%d no_msg=%d ctx_fd=%d \n",
|
DPRINT(("ctx=%p flags=0x%x system=%d notify_block=%d excl_idle=%d no_msg=%d ctx_fd=%d \n",
|
||||||
ctx,
|
ctx,
|
||||||
ctx_flags,
|
ctx_flags,
|
||||||
|
@ -2755,10 +2725,14 @@ pfm_context_create(pfm_context_t *ctx, void *arg, int count, struct pt_regs *reg
|
||||||
*/
|
*/
|
||||||
pfm_reset_pmu_state(ctx);
|
pfm_reset_pmu_state(ctx);
|
||||||
|
|
||||||
|
fd_install(fd, filp);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
buffer_error:
|
buffer_error:
|
||||||
pfm_free_fd(ctx->ctx_fd, filp);
|
path = filp->f_path;
|
||||||
|
put_filp(filp);
|
||||||
|
path_put(&path);
|
||||||
|
|
||||||
if (ctx->ctx_buf_fmt) {
|
if (ctx->ctx_buf_fmt) {
|
||||||
pfm_buf_fmt_exit(ctx->ctx_buf_fmt, current, NULL, regs);
|
pfm_buf_fmt_exit(ctx->ctx_buf_fmt, current, NULL, regs);
|
||||||
|
@ -2767,6 +2741,7 @@ error_file:
|
||||||
pfm_context_free(ctx);
|
pfm_context_free(ctx);
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
put_unused_fd(fd);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -464,7 +464,7 @@ ia64_do_signal (struct sigscratch *scr, long in_syscall)
|
||||||
if (!user_mode(&scr->pt))
|
if (!user_mode(&scr->pt))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (test_thread_flag(TIF_RESTORE_SIGMASK))
|
if (current_thread_info()->status & TS_RESTORE_SIGMASK)
|
||||||
oldset = ¤t->saved_sigmask;
|
oldset = ¤t->saved_sigmask;
|
||||||
else
|
else
|
||||||
oldset = ¤t->blocked;
|
oldset = ¤t->blocked;
|
||||||
|
@ -530,12 +530,13 @@ ia64_do_signal (struct sigscratch *scr, long in_syscall)
|
||||||
* continue to iterate in this loop so we can deliver the SIGSEGV...
|
* continue to iterate in this loop so we can deliver the SIGSEGV...
|
||||||
*/
|
*/
|
||||||
if (handle_signal(signr, &ka, &info, oldset, scr)) {
|
if (handle_signal(signr, &ka, &info, oldset, scr)) {
|
||||||
/* a signal was successfully delivered; the saved
|
/*
|
||||||
|
* A signal was successfully delivered; the saved
|
||||||
* sigmask will have been stored in the signal frame,
|
* sigmask will have been stored in the signal frame,
|
||||||
* and will be restored by sigreturn, so we can simply
|
* and will be restored by sigreturn, so we can simply
|
||||||
* clear the TIF_RESTORE_SIGMASK flag */
|
* clear the TS_RESTORE_SIGMASK flag.
|
||||||
if (test_thread_flag(TIF_RESTORE_SIGMASK))
|
*/
|
||||||
clear_thread_flag(TIF_RESTORE_SIGMASK);
|
current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -566,8 +567,8 @@ ia64_do_signal (struct sigscratch *scr, long in_syscall)
|
||||||
|
|
||||||
/* if there's no signal to deliver, we just put the saved sigmask
|
/* if there's no signal to deliver, we just put the saved sigmask
|
||||||
* back */
|
* back */
|
||||||
if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
|
if (current_thread_info()->status & TS_RESTORE_SIGMASK) {
|
||||||
clear_thread_flag(TIF_RESTORE_SIGMASK);
|
current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
|
||||||
sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
|
sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,8 +98,33 @@ unlock_ipi_calllock(void)
|
||||||
spin_unlock_irq(&call_lock);
|
spin_unlock_irq(&call_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
handle_call_data(void)
|
||||||
|
{
|
||||||
|
struct call_data_struct *data;
|
||||||
|
void (*func)(void *info);
|
||||||
|
void *info;
|
||||||
|
int wait;
|
||||||
|
|
||||||
|
/* release the 'pointer lock' */
|
||||||
|
data = (struct call_data_struct *)call_data;
|
||||||
|
func = data->func;
|
||||||
|
info = data->info;
|
||||||
|
wait = data->wait;
|
||||||
|
|
||||||
|
mb();
|
||||||
|
atomic_inc(&data->started);
|
||||||
|
/* At this point the structure may be gone unless wait is true. */
|
||||||
|
(*func)(info);
|
||||||
|
|
||||||
|
/* Notify the sending CPU that the task is done. */
|
||||||
|
mb();
|
||||||
|
if (wait)
|
||||||
|
atomic_inc(&data->finished);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
stop_this_cpu (void)
|
stop_this_cpu(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Remove this CPU:
|
* Remove this CPU:
|
||||||
|
@ -139,31 +164,7 @@ handle_IPI (int irq, void *dev_id)
|
||||||
|
|
||||||
switch (which) {
|
switch (which) {
|
||||||
case IPI_CALL_FUNC:
|
case IPI_CALL_FUNC:
|
||||||
{
|
handle_call_data();
|
||||||
struct call_data_struct *data;
|
|
||||||
void (*func)(void *info);
|
|
||||||
void *info;
|
|
||||||
int wait;
|
|
||||||
|
|
||||||
/* release the 'pointer lock' */
|
|
||||||
data = (struct call_data_struct *) call_data;
|
|
||||||
func = data->func;
|
|
||||||
info = data->info;
|
|
||||||
wait = data->wait;
|
|
||||||
|
|
||||||
mb();
|
|
||||||
atomic_inc(&data->started);
|
|
||||||
/*
|
|
||||||
* At this point the structure may be gone unless
|
|
||||||
* wait is true.
|
|
||||||
*/
|
|
||||||
(*func)(info);
|
|
||||||
|
|
||||||
/* Notify the sending CPU that the task is done. */
|
|
||||||
mb();
|
|
||||||
if (wait)
|
|
||||||
atomic_inc(&data->finished);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IPI_CPU_STOP:
|
case IPI_CPU_STOP:
|
||||||
|
@ -175,7 +176,8 @@ handle_IPI (int irq, void *dev_id)
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
printk(KERN_CRIT "Unknown IPI on CPU %d: %lu\n", this_cpu, which);
|
printk(KERN_CRIT "Unknown IPI on CPU %d: %lu\n",
|
||||||
|
this_cpu, which);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while (ops);
|
} while (ops);
|
||||||
|
|
|
@ -379,11 +379,6 @@ static struct irqaction timer_irqaction = {
|
||||||
.name = "timer"
|
.name = "timer"
|
||||||
};
|
};
|
||||||
|
|
||||||
void __devinit ia64_disable_timer(void)
|
|
||||||
{
|
|
||||||
ia64_set_itv(1 << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __init
|
void __init
|
||||||
time_init (void)
|
time_init (void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -36,9 +36,11 @@ void arch_fix_phys_package_id(int num, u32 slot)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(arch_fix_phys_package_id);
|
EXPORT_SYMBOL_GPL(arch_fix_phys_package_id);
|
||||||
|
|
||||||
int arch_register_cpu(int num)
|
|
||||||
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
|
int __ref arch_register_cpu(int num)
|
||||||
{
|
{
|
||||||
#if defined (CONFIG_ACPI) && defined (CONFIG_HOTPLUG_CPU)
|
#ifdef CONFIG_ACPI
|
||||||
/*
|
/*
|
||||||
* If CPEI can be re-targetted or if this is not
|
* If CPEI can be re-targetted or if this is not
|
||||||
* CPEI target, then it is hotpluggable
|
* CPEI target, then it is hotpluggable
|
||||||
|
@ -47,19 +49,21 @@ int arch_register_cpu(int num)
|
||||||
sysfs_cpus[num].cpu.hotpluggable = 1;
|
sysfs_cpus[num].cpu.hotpluggable = 1;
|
||||||
map_cpu_to_node(num, node_cpuid[num].nid);
|
map_cpu_to_node(num, node_cpuid[num].nid);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return register_cpu(&sysfs_cpus[num].cpu, num);
|
return register_cpu(&sysfs_cpus[num].cpu, num);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(arch_register_cpu);
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
|
||||||
|
|
||||||
void arch_unregister_cpu(int num)
|
void arch_unregister_cpu(int num)
|
||||||
{
|
{
|
||||||
unregister_cpu(&sysfs_cpus[num].cpu);
|
unregister_cpu(&sysfs_cpus[num].cpu);
|
||||||
unmap_cpu_from_node(num, cpu_to_node(num));
|
unmap_cpu_from_node(num, cpu_to_node(num));
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(arch_register_cpu);
|
|
||||||
EXPORT_SYMBOL(arch_unregister_cpu);
|
EXPORT_SYMBOL(arch_unregister_cpu);
|
||||||
|
#else
|
||||||
|
static int __init arch_register_cpu(int num)
|
||||||
|
{
|
||||||
|
return register_cpu(&sysfs_cpus[num].cpu, num);
|
||||||
|
}
|
||||||
#endif /*CONFIG_HOTPLUG_CPU*/
|
#endif /*CONFIG_HOTPLUG_CPU*/
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,8 @@ DECLARE_PER_CPU(struct ia64_cpu, cpu_devices);
|
||||||
|
|
||||||
DECLARE_PER_CPU(int, cpu_state);
|
DECLARE_PER_CPU(int, cpu_state);
|
||||||
|
|
||||||
extern int arch_register_cpu(int num);
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
|
extern int arch_register_cpu(int num);
|
||||||
extern void arch_unregister_cpu(int);
|
extern void arch_unregister_cpu(int);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -108,13 +108,11 @@ extern void tsk_clear_notify_resume(struct task_struct *tsk);
|
||||||
#define TIF_DB_DISABLED 19 /* debug trap disabled for fsyscall */
|
#define TIF_DB_DISABLED 19 /* debug trap disabled for fsyscall */
|
||||||
#define TIF_FREEZE 20 /* is freezing for suspend */
|
#define TIF_FREEZE 20 /* is freezing for suspend */
|
||||||
#define TIF_RESTORE_RSE 21 /* user RBS is newer than kernel RBS */
|
#define TIF_RESTORE_RSE 21 /* user RBS is newer than kernel RBS */
|
||||||
#define TIF_RESTORE_SIGMASK 22 /* restore signal mask in do_signal() */
|
|
||||||
|
|
||||||
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
|
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
|
||||||
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
|
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
|
||||||
#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
|
#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
|
||||||
#define _TIF_SYSCALL_TRACEAUDIT (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP)
|
#define _TIF_SYSCALL_TRACEAUDIT (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP)
|
||||||
#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK)
|
|
||||||
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
|
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
|
||||||
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
|
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
|
||||||
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
|
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
|
||||||
|
@ -131,7 +129,18 @@ extern void tsk_clear_notify_resume(struct task_struct *tsk);
|
||||||
#define TIF_WORK_MASK (TIF_ALLWORK_MASK&~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT))
|
#define TIF_WORK_MASK (TIF_ALLWORK_MASK&~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT))
|
||||||
|
|
||||||
#define TS_POLLING 1 /* true if in idle loop and not sleeping */
|
#define TS_POLLING 1 /* true if in idle loop and not sleeping */
|
||||||
|
#define TS_RESTORE_SIGMASK 2 /* restore signal mask in do_signal() */
|
||||||
|
|
||||||
#define tsk_is_polling(t) (task_thread_info(t)->status & TS_POLLING)
|
#define tsk_is_polling(t) (task_thread_info(t)->status & TS_POLLING)
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
#define HAVE_SET_RESTORE_SIGMASK 1
|
||||||
|
static inline void set_restore_sigmask(void)
|
||||||
|
{
|
||||||
|
struct thread_info *ti = current_thread_info();
|
||||||
|
ti->status |= TS_RESTORE_SIGMASK;
|
||||||
|
set_bit(TIF_SIGPENDING, &ti->flags);
|
||||||
|
}
|
||||||
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
|
||||||
#endif /* _ASM_IA64_THREAD_INFO_H */
|
#endif /* _ASM_IA64_THREAD_INFO_H */
|
||||||
|
|
Loading…
Reference in New Issue