mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-02 04:37:44 +08:00
Merge tag 'v3.4-rc5' into next
Linux 3.4-rc5
Merge to pull in prerequisite change for Smack:
86812bb0de
Requested by Casey.
This commit is contained in:
@@ -386,6 +386,8 @@ int copy_creds(struct task_struct *p, unsigned long clone_flags)
|
||||
struct cred *new;
|
||||
int ret;
|
||||
|
||||
p->replacement_session_keyring = NULL;
|
||||
|
||||
if (
|
||||
#ifdef CONFIG_KEYS
|
||||
!p->cred->thread_keyring &&
|
||||
|
||||
@@ -3183,7 +3183,7 @@ static void perf_event_for_each(struct perf_event *event,
|
||||
perf_event_for_each_child(event, func);
|
||||
func(event);
|
||||
list_for_each_entry(sibling, &event->sibling_list, group_entry)
|
||||
perf_event_for_each_child(event, func);
|
||||
perf_event_for_each_child(sibling, func);
|
||||
mutex_unlock(&ctx->mutex);
|
||||
}
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ config IRQ_DOMAIN_DEBUG
|
||||
help
|
||||
This option will show the mapping relationship between hardware irq
|
||||
numbers and Linux irq numbers. The mapping is exposed via debugfs
|
||||
in the file "virq_mapping".
|
||||
in the file "irq_domain_mapping".
|
||||
|
||||
If you don't know what this means you don't need it.
|
||||
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
|
||||
#include <linux/kallsyms.h>
|
||||
|
||||
#define P(f) if (desc->status_use_accessors & f) printk("%14s set\n", #f)
|
||||
#define PS(f) if (desc->istate & f) printk("%14s set\n", #f)
|
||||
#define ___P(f) if (desc->status_use_accessors & f) printk("%14s set\n", #f)
|
||||
#define ___PS(f) if (desc->istate & f) printk("%14s set\n", #f)
|
||||
/* FIXME */
|
||||
#define PD(f) do { } while (0)
|
||||
#define ___PD(f) do { } while (0)
|
||||
|
||||
static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
@@ -23,23 +23,23 @@ static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc)
|
||||
print_symbol("%s\n", (unsigned long)desc->action->handler);
|
||||
}
|
||||
|
||||
P(IRQ_LEVEL);
|
||||
P(IRQ_PER_CPU);
|
||||
P(IRQ_NOPROBE);
|
||||
P(IRQ_NOREQUEST);
|
||||
P(IRQ_NOTHREAD);
|
||||
P(IRQ_NOAUTOEN);
|
||||
___P(IRQ_LEVEL);
|
||||
___P(IRQ_PER_CPU);
|
||||
___P(IRQ_NOPROBE);
|
||||
___P(IRQ_NOREQUEST);
|
||||
___P(IRQ_NOTHREAD);
|
||||
___P(IRQ_NOAUTOEN);
|
||||
|
||||
PS(IRQS_AUTODETECT);
|
||||
PS(IRQS_REPLAY);
|
||||
PS(IRQS_WAITING);
|
||||
PS(IRQS_PENDING);
|
||||
___PS(IRQS_AUTODETECT);
|
||||
___PS(IRQS_REPLAY);
|
||||
___PS(IRQS_WAITING);
|
||||
___PS(IRQS_PENDING);
|
||||
|
||||
PD(IRQS_INPROGRESS);
|
||||
PD(IRQS_DISABLED);
|
||||
PD(IRQS_MASKED);
|
||||
___PD(IRQS_INPROGRESS);
|
||||
___PD(IRQS_DISABLED);
|
||||
___PD(IRQS_MASKED);
|
||||
}
|
||||
|
||||
#undef P
|
||||
#undef PS
|
||||
#undef PD
|
||||
#undef ___P
|
||||
#undef ___PS
|
||||
#undef ___PD
|
||||
|
||||
@@ -23,7 +23,6 @@ static LIST_HEAD(irq_domain_list);
|
||||
static DEFINE_MUTEX(irq_domain_mutex);
|
||||
|
||||
static DEFINE_MUTEX(revmap_trees_mutex);
|
||||
static unsigned int irq_virq_count = NR_IRQS;
|
||||
static struct irq_domain *irq_default_domain;
|
||||
|
||||
/**
|
||||
@@ -184,13 +183,16 @@ struct irq_domain *irq_domain_add_linear(struct device_node *of_node,
|
||||
}
|
||||
|
||||
struct irq_domain *irq_domain_add_nomap(struct device_node *of_node,
|
||||
unsigned int max_irq,
|
||||
const struct irq_domain_ops *ops,
|
||||
void *host_data)
|
||||
{
|
||||
struct irq_domain *domain = irq_domain_alloc(of_node,
|
||||
IRQ_DOMAIN_MAP_NOMAP, ops, host_data);
|
||||
if (domain)
|
||||
if (domain) {
|
||||
domain->revmap_data.nomap.max_irq = max_irq ? max_irq : ~0;
|
||||
irq_domain_add(domain);
|
||||
}
|
||||
return domain;
|
||||
}
|
||||
|
||||
@@ -262,22 +264,6 @@ void irq_set_default_host(struct irq_domain *domain)
|
||||
irq_default_domain = domain;
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_set_virq_count() - Set the maximum number of linux irqs
|
||||
* @count: number of linux irqs, capped with NR_IRQS
|
||||
*
|
||||
* This is mainly for use by platforms like iSeries who want to program
|
||||
* the virtual irq number in the controller to avoid the reverse mapping
|
||||
*/
|
||||
void irq_set_virq_count(unsigned int count)
|
||||
{
|
||||
pr_debug("irq: Trying to set virq count to %d\n", count);
|
||||
|
||||
BUG_ON(count < NUM_ISA_INTERRUPTS);
|
||||
if (count < NR_IRQS)
|
||||
irq_virq_count = count;
|
||||
}
|
||||
|
||||
static int irq_setup_virq(struct irq_domain *domain, unsigned int virq,
|
||||
irq_hw_number_t hwirq)
|
||||
{
|
||||
@@ -320,13 +306,12 @@ unsigned int irq_create_direct_mapping(struct irq_domain *domain)
|
||||
pr_debug("irq: create_direct virq allocation failed\n");
|
||||
return 0;
|
||||
}
|
||||
if (virq >= irq_virq_count) {
|
||||
if (virq >= domain->revmap_data.nomap.max_irq) {
|
||||
pr_err("ERROR: no free irqs available below %i maximum\n",
|
||||
irq_virq_count);
|
||||
domain->revmap_data.nomap.max_irq);
|
||||
irq_free_desc(virq);
|
||||
return 0;
|
||||
}
|
||||
|
||||
pr_debug("irq: create_direct obtained virq %d\n", virq);
|
||||
|
||||
if (irq_setup_virq(domain, virq, virq)) {
|
||||
@@ -350,7 +335,8 @@ unsigned int irq_create_direct_mapping(struct irq_domain *domain)
|
||||
unsigned int irq_create_mapping(struct irq_domain *domain,
|
||||
irq_hw_number_t hwirq)
|
||||
{
|
||||
unsigned int virq, hint;
|
||||
unsigned int hint;
|
||||
int virq;
|
||||
|
||||
pr_debug("irq: irq_create_mapping(0x%p, 0x%lx)\n", domain, hwirq);
|
||||
|
||||
@@ -377,13 +363,13 @@ unsigned int irq_create_mapping(struct irq_domain *domain,
|
||||
return irq_domain_legacy_revmap(domain, hwirq);
|
||||
|
||||
/* Allocate a virtual interrupt number */
|
||||
hint = hwirq % irq_virq_count;
|
||||
hint = hwirq % nr_irqs;
|
||||
if (hint == 0)
|
||||
hint++;
|
||||
virq = irq_alloc_desc_from(hint, 0);
|
||||
if (!virq)
|
||||
if (virq <= 0)
|
||||
virq = irq_alloc_desc_from(1, 0);
|
||||
if (!virq) {
|
||||
if (virq <= 0) {
|
||||
pr_debug("irq: -> virq allocation failed\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -515,7 +501,7 @@ unsigned int irq_find_mapping(struct irq_domain *domain,
|
||||
irq_hw_number_t hwirq)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned int hint = hwirq % irq_virq_count;
|
||||
unsigned int hint = hwirq % nr_irqs;
|
||||
|
||||
/* Look for default domain if nececssary */
|
||||
if (domain == NULL)
|
||||
@@ -536,7 +522,7 @@ unsigned int irq_find_mapping(struct irq_domain *domain,
|
||||
if (data && (data->domain == domain) && (data->hwirq == hwirq))
|
||||
return i;
|
||||
i++;
|
||||
if (i >= irq_virq_count)
|
||||
if (i >= nr_irqs)
|
||||
i = 1;
|
||||
} while(i != hint);
|
||||
return 0;
|
||||
@@ -642,8 +628,9 @@ static int virq_debug_show(struct seq_file *m, void *private)
|
||||
void *data;
|
||||
int i;
|
||||
|
||||
seq_printf(m, "%-5s %-7s %-15s %-18s %s\n", "virq", "hwirq",
|
||||
"chip name", "chip data", "domain name");
|
||||
seq_printf(m, "%-5s %-7s %-15s %-*s %s\n", "irq", "hwirq",
|
||||
"chip name", (int)(2 * sizeof(void *) + 2), "chip data",
|
||||
"domain name");
|
||||
|
||||
for (i = 1; i < nr_irqs; i++) {
|
||||
desc = irq_to_desc(i);
|
||||
@@ -666,7 +653,7 @@ static int virq_debug_show(struct seq_file *m, void *private)
|
||||
seq_printf(m, "%-15s ", p);
|
||||
|
||||
data = irq_desc_get_chip_data(desc);
|
||||
seq_printf(m, "0x%16p ", data);
|
||||
seq_printf(m, data ? "0x%p " : " %p ", data);
|
||||
|
||||
if (desc->irq_data.domain && desc->irq_data.domain->of_node)
|
||||
p = desc->irq_data.domain->of_node->full_name;
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <linux/irq_work.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/irqflags.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
/*
|
||||
|
||||
@@ -284,8 +284,12 @@ SYSCALL_DEFINE3(setitimer, int, which, struct itimerval __user *, value,
|
||||
if (value) {
|
||||
if(copy_from_user(&set_buffer, value, sizeof(set_buffer)))
|
||||
return -EFAULT;
|
||||
} else
|
||||
memset((char *) &set_buffer, 0, sizeof(set_buffer));
|
||||
} else {
|
||||
memset(&set_buffer, 0, sizeof(set_buffer));
|
||||
printk_once(KERN_WARNING "%s calls setitimer() with new_value NULL pointer."
|
||||
" Misfeature support will be removed\n",
|
||||
current->comm);
|
||||
}
|
||||
|
||||
error = do_setitimer(which, &set_buffer, ovalue ? &get_buffer : NULL);
|
||||
if (error || !ovalue)
|
||||
|
||||
@@ -97,7 +97,7 @@ void panic(const char *fmt, ...)
|
||||
/*
|
||||
* Avoid nested stack-dumping if a panic occurs during oops processing
|
||||
*/
|
||||
if (!oops_in_progress)
|
||||
if (!test_taint(TAINT_DIE) && oops_in_progress <= 1)
|
||||
dump_stack();
|
||||
#endif
|
||||
|
||||
|
||||
@@ -51,6 +51,23 @@
|
||||
|
||||
#define MAP_PAGE_ENTRIES (PAGE_SIZE / sizeof(sector_t) - 1)
|
||||
|
||||
/*
|
||||
* Number of free pages that are not high.
|
||||
*/
|
||||
static inline unsigned long low_free_pages(void)
|
||||
{
|
||||
return nr_free_pages() - nr_free_highpages();
|
||||
}
|
||||
|
||||
/*
|
||||
* Number of pages required to be kept free while writing the image. Always
|
||||
* half of all available low pages before the writing starts.
|
||||
*/
|
||||
static inline unsigned long reqd_free_pages(void)
|
||||
{
|
||||
return low_free_pages() / 2;
|
||||
}
|
||||
|
||||
struct swap_map_page {
|
||||
sector_t entries[MAP_PAGE_ENTRIES];
|
||||
sector_t next_swap;
|
||||
@@ -72,7 +89,7 @@ struct swap_map_handle {
|
||||
sector_t cur_swap;
|
||||
sector_t first_sector;
|
||||
unsigned int k;
|
||||
unsigned long nr_free_pages, written;
|
||||
unsigned long reqd_free_pages;
|
||||
u32 crc32;
|
||||
};
|
||||
|
||||
@@ -316,8 +333,7 @@ static int get_swap_writer(struct swap_map_handle *handle)
|
||||
goto err_rel;
|
||||
}
|
||||
handle->k = 0;
|
||||
handle->nr_free_pages = nr_free_pages() >> 1;
|
||||
handle->written = 0;
|
||||
handle->reqd_free_pages = reqd_free_pages();
|
||||
handle->first_sector = handle->cur_swap;
|
||||
return 0;
|
||||
err_rel:
|
||||
@@ -352,11 +368,11 @@ static int swap_write_page(struct swap_map_handle *handle, void *buf,
|
||||
handle->cur_swap = offset;
|
||||
handle->k = 0;
|
||||
}
|
||||
if (bio_chain && ++handle->written > handle->nr_free_pages) {
|
||||
if (bio_chain && low_free_pages() <= handle->reqd_free_pages) {
|
||||
error = hib_wait_on_bio_chain(bio_chain);
|
||||
if (error)
|
||||
goto out;
|
||||
handle->written = 0;
|
||||
handle->reqd_free_pages = reqd_free_pages();
|
||||
}
|
||||
out:
|
||||
return error;
|
||||
@@ -618,7 +634,7 @@ static int save_image_lzo(struct swap_map_handle *handle,
|
||||
* Adjust number of free pages after all allocations have been done.
|
||||
* We don't want to run out of pages when writing.
|
||||
*/
|
||||
handle->nr_free_pages = nr_free_pages() >> 1;
|
||||
handle->reqd_free_pages = reqd_free_pages();
|
||||
|
||||
/*
|
||||
* Start the CRC32 thread.
|
||||
|
||||
@@ -1820,7 +1820,6 @@ __call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu),
|
||||
* a quiescent state betweentimes.
|
||||
*/
|
||||
local_irq_save(flags);
|
||||
WARN_ON_ONCE(cpu_is_offline(smp_processor_id()));
|
||||
rdp = this_cpu_ptr(rsp->rda);
|
||||
|
||||
/* Add the callback to our list. */
|
||||
|
||||
@@ -6405,16 +6405,26 @@ static void __sdt_free(const struct cpumask *cpu_map)
|
||||
struct sd_data *sdd = &tl->data;
|
||||
|
||||
for_each_cpu(j, cpu_map) {
|
||||
struct sched_domain *sd = *per_cpu_ptr(sdd->sd, j);
|
||||
if (sd && (sd->flags & SD_OVERLAP))
|
||||
free_sched_groups(sd->groups, 0);
|
||||
kfree(*per_cpu_ptr(sdd->sd, j));
|
||||
kfree(*per_cpu_ptr(sdd->sg, j));
|
||||
kfree(*per_cpu_ptr(sdd->sgp, j));
|
||||
struct sched_domain *sd;
|
||||
|
||||
if (sdd->sd) {
|
||||
sd = *per_cpu_ptr(sdd->sd, j);
|
||||
if (sd && (sd->flags & SD_OVERLAP))
|
||||
free_sched_groups(sd->groups, 0);
|
||||
kfree(*per_cpu_ptr(sdd->sd, j));
|
||||
}
|
||||
|
||||
if (sdd->sg)
|
||||
kfree(*per_cpu_ptr(sdd->sg, j));
|
||||
if (sdd->sgp)
|
||||
kfree(*per_cpu_ptr(sdd->sgp, j));
|
||||
}
|
||||
free_percpu(sdd->sd);
|
||||
sdd->sd = NULL;
|
||||
free_percpu(sdd->sg);
|
||||
sdd->sg = NULL;
|
||||
free_percpu(sdd->sgp);
|
||||
sdd->sgp = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -784,7 +784,7 @@ account_entity_enqueue(struct cfs_rq *cfs_rq, struct sched_entity *se)
|
||||
update_load_add(&rq_of(cfs_rq)->load, se->load.weight);
|
||||
#ifdef CONFIG_SMP
|
||||
if (entity_is_task(se))
|
||||
list_add_tail(&se->group_node, &rq_of(cfs_rq)->cfs_tasks);
|
||||
list_add(&se->group_node, &rq_of(cfs_rq)->cfs_tasks);
|
||||
#endif
|
||||
cfs_rq->nr_running++;
|
||||
}
|
||||
@@ -3215,6 +3215,8 @@ static int move_one_task(struct lb_env *env)
|
||||
|
||||
static unsigned long task_h_load(struct task_struct *p);
|
||||
|
||||
static const unsigned int sched_nr_migrate_break = 32;
|
||||
|
||||
/*
|
||||
* move_tasks tries to move up to load_move weighted load from busiest to
|
||||
* this_rq, as part of a balancing operation within domain "sd".
|
||||
@@ -3242,7 +3244,7 @@ static int move_tasks(struct lb_env *env)
|
||||
|
||||
/* take a breather every nr_migrate tasks */
|
||||
if (env->loop > env->loop_break) {
|
||||
env->loop_break += sysctl_sched_nr_migrate;
|
||||
env->loop_break += sched_nr_migrate_break;
|
||||
env->flags |= LBF_NEED_BREAK;
|
||||
break;
|
||||
}
|
||||
@@ -3252,7 +3254,7 @@ static int move_tasks(struct lb_env *env)
|
||||
|
||||
load = task_h_load(p);
|
||||
|
||||
if (load < 16 && !env->sd->nr_balance_failed)
|
||||
if (sched_feat(LB_MIN) && load < 16 && !env->sd->nr_balance_failed)
|
||||
goto next;
|
||||
|
||||
if ((load / 2) > env->load_move)
|
||||
@@ -4407,7 +4409,7 @@ static int load_balance(int this_cpu, struct rq *this_rq,
|
||||
.dst_cpu = this_cpu,
|
||||
.dst_rq = this_rq,
|
||||
.idle = idle,
|
||||
.loop_break = sysctl_sched_nr_migrate,
|
||||
.loop_break = sched_nr_migrate_break,
|
||||
};
|
||||
|
||||
cpumask_copy(cpus, cpu_active_mask);
|
||||
@@ -4445,10 +4447,10 @@ redo:
|
||||
* correctly treated as an imbalance.
|
||||
*/
|
||||
env.flags |= LBF_ALL_PINNED;
|
||||
env.load_move = imbalance;
|
||||
env.src_cpu = busiest->cpu;
|
||||
env.src_rq = busiest;
|
||||
env.loop_max = busiest->nr_running;
|
||||
env.load_move = imbalance;
|
||||
env.src_cpu = busiest->cpu;
|
||||
env.src_rq = busiest;
|
||||
env.loop_max = min_t(unsigned long, sysctl_sched_nr_migrate, busiest->nr_running);
|
||||
|
||||
more_balance:
|
||||
local_irq_save(flags);
|
||||
|
||||
@@ -68,3 +68,4 @@ SCHED_FEAT(TTWU_QUEUE, true)
|
||||
|
||||
SCHED_FEAT(FORCE_SD_OVERLAP, false)
|
||||
SCHED_FEAT(RT_RUNTIME_SHARE, true)
|
||||
SCHED_FEAT(LB_MIN, false)
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
#
|
||||
# Timer subsystem related configuration options
|
||||
#
|
||||
|
||||
# Core internal switch. Selected by NO_HZ / HIGH_RES_TIMERS. This is
|
||||
# only related to the tick functionality. Oneshot clockevent devices
|
||||
# are supported independ of this.
|
||||
config TICK_ONESHOT
|
||||
bool
|
||||
|
||||
|
||||
@@ -346,7 +346,8 @@ int tick_resume_broadcast(void)
|
||||
tick_get_broadcast_mask());
|
||||
break;
|
||||
case TICKDEV_MODE_ONESHOT:
|
||||
broadcast = tick_resume_broadcast_oneshot(bc);
|
||||
if (!cpumask_empty(tick_get_broadcast_mask()))
|
||||
broadcast = tick_resume_broadcast_oneshot(bc);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -373,6 +374,9 @@ static int tick_broadcast_set_event(ktime_t expires, int force)
|
||||
{
|
||||
struct clock_event_device *bc = tick_broadcast_device.evtdev;
|
||||
|
||||
if (bc->mode != CLOCK_EVT_MODE_ONESHOT)
|
||||
clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT);
|
||||
|
||||
return clockevents_program_event(bc, expires, force);
|
||||
}
|
||||
|
||||
@@ -531,7 +535,6 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
|
||||
int was_periodic = bc->mode == CLOCK_EVT_MODE_PERIODIC;
|
||||
|
||||
bc->event_handler = tick_handle_oneshot_broadcast;
|
||||
clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT);
|
||||
|
||||
/* Take the do_timer update */
|
||||
tick_do_timer_cpu = cpu;
|
||||
@@ -549,6 +552,7 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
|
||||
to_cpumask(tmpmask));
|
||||
|
||||
if (was_periodic && !cpumask_empty(to_cpumask(tmpmask))) {
|
||||
clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT);
|
||||
tick_broadcast_init_next_event(to_cpumask(tmpmask),
|
||||
tick_next_period);
|
||||
tick_broadcast_set_event(tick_next_period, 1);
|
||||
@@ -575,15 +579,12 @@ void tick_broadcast_switch_to_oneshot(void)
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&tick_broadcast_lock, flags);
|
||||
if (cpumask_empty(tick_get_broadcast_mask()))
|
||||
goto end;
|
||||
|
||||
tick_broadcast_device.mode = TICKDEV_MODE_ONESHOT;
|
||||
bc = tick_broadcast_device.evtdev;
|
||||
if (bc)
|
||||
tick_broadcast_setup_oneshot(bc);
|
||||
|
||||
end:
|
||||
raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags);
|
||||
}
|
||||
|
||||
|
||||
@@ -534,9 +534,9 @@ static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)
|
||||
hrtimer_get_expires(&ts->sched_timer), 0))
|
||||
break;
|
||||
}
|
||||
/* Update jiffies and reread time */
|
||||
tick_do_update_jiffies64(now);
|
||||
/* Reread time and update jiffies */
|
||||
now = ktime_get();
|
||||
tick_do_update_jiffies64(now);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4629,7 +4629,8 @@ static ssize_t
|
||||
rb_simple_read(struct file *filp, char __user *ubuf,
|
||||
size_t cnt, loff_t *ppos)
|
||||
{
|
||||
struct ring_buffer *buffer = filp->private_data;
|
||||
struct trace_array *tr = filp->private_data;
|
||||
struct ring_buffer *buffer = tr->buffer;
|
||||
char buf[64];
|
||||
int r;
|
||||
|
||||
@@ -4647,7 +4648,8 @@ static ssize_t
|
||||
rb_simple_write(struct file *filp, const char __user *ubuf,
|
||||
size_t cnt, loff_t *ppos)
|
||||
{
|
||||
struct ring_buffer *buffer = filp->private_data;
|
||||
struct trace_array *tr = filp->private_data;
|
||||
struct ring_buffer *buffer = tr->buffer;
|
||||
unsigned long val;
|
||||
int ret;
|
||||
|
||||
@@ -4734,7 +4736,7 @@ static __init int tracer_init_debugfs(void)
|
||||
&trace_clock_fops);
|
||||
|
||||
trace_create_file("tracing_on", 0644, d_tracer,
|
||||
global_trace.buffer, &rb_simple_fops);
|
||||
&global_trace, &rb_simple_fops);
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
trace_create_file("dyn_ftrace_total_info", 0444, d_tracer,
|
||||
|
||||
@@ -836,11 +836,11 @@ extern const char *__stop___trace_bprintk_fmt[];
|
||||
filter)
|
||||
#include "trace_entries.h"
|
||||
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
#if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_FUNCTION_TRACER)
|
||||
int perf_ftrace_event_register(struct ftrace_event_call *call,
|
||||
enum trace_reg type, void *data);
|
||||
#else
|
||||
#define perf_ftrace_event_register NULL
|
||||
#endif /* CONFIG_FUNCTION_TRACER */
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_KERNEL_TRACE_H */
|
||||
|
||||
@@ -652,6 +652,8 @@ int trace_print_lat_context(struct trace_iterator *iter)
|
||||
{
|
||||
u64 next_ts;
|
||||
int ret;
|
||||
/* trace_find_next_entry will reset ent_size */
|
||||
int ent_size = iter->ent_size;
|
||||
struct trace_seq *s = &iter->seq;
|
||||
struct trace_entry *entry = iter->ent,
|
||||
*next_entry = trace_find_next_entry(iter, NULL,
|
||||
@@ -660,6 +662,9 @@ int trace_print_lat_context(struct trace_iterator *iter)
|
||||
unsigned long abs_usecs = ns2usecs(iter->ts - iter->tr->time_start);
|
||||
unsigned long rel_usecs;
|
||||
|
||||
/* Restore the original ent_size */
|
||||
iter->ent_size = ent_size;
|
||||
|
||||
if (!next_entry)
|
||||
next_ts = iter->ts;
|
||||
rel_usecs = ns2usecs(next_ts - iter->ts);
|
||||
|
||||
Reference in New Issue
Block a user