@@ -4921,6 +4921,11 @@ static int tracing_open(struct inode *inode, struct file *file)
4921
4921
static bool
4922
4922
trace_ok_for_array (struct tracer * t , struct trace_array * tr )
4923
4923
{
4924
+ #ifdef CONFIG_TRACER_SNAPSHOT
4925
+ /* arrays with mapped buffer range do not have snapshots */
4926
+ if (tr -> range_addr_start && t -> use_max_tr )
4927
+ return false;
4928
+ #endif
4924
4929
return (tr -> flags & TRACE_ARRAY_FL_GLOBAL ) || t -> allow_instances ;
4925
4930
}
4926
4931
@@ -8664,11 +8669,13 @@ tracing_init_tracefs_percpu(struct trace_array *tr, long cpu)
8664
8669
tr , cpu , & tracing_entries_fops );
8665
8670
8666
8671
#ifdef CONFIG_TRACER_SNAPSHOT
8667
- trace_create_cpu_file ("snapshot" , TRACE_MODE_WRITE , d_cpu ,
8668
- tr , cpu , & snapshot_fops );
8672
+ if (!tr -> range_addr_start ) {
8673
+ trace_create_cpu_file ("snapshot" , TRACE_MODE_WRITE , d_cpu ,
8674
+ tr , cpu , & snapshot_fops );
8669
8675
8670
- trace_create_cpu_file ("snapshot_raw" , TRACE_MODE_READ , d_cpu ,
8671
- tr , cpu , & snapshot_raw_fops );
8676
+ trace_create_cpu_file ("snapshot_raw" , TRACE_MODE_READ , d_cpu ,
8677
+ tr , cpu , & snapshot_raw_fops );
8678
+ }
8672
8679
#endif
8673
8680
}
8674
8681
@@ -9205,7 +9212,18 @@ allocate_trace_buffer(struct trace_array *tr, struct array_buffer *buf, int size
9205
9212
9206
9213
buf -> tr = tr ;
9207
9214
9208
- buf -> buffer = ring_buffer_alloc (size , rb_flags );
9215
+ if (tr -> range_addr_start && tr -> range_addr_size ) {
9216
+ buf -> buffer = ring_buffer_alloc_range (size , rb_flags , 0 ,
9217
+ tr -> range_addr_start ,
9218
+ tr -> range_addr_size );
9219
+ /*
9220
+ * This is basically the same as a mapped buffer,
9221
+ * with the same restrictions.
9222
+ */
9223
+ tr -> mapped ++ ;
9224
+ } else {
9225
+ buf -> buffer = ring_buffer_alloc (size , rb_flags );
9226
+ }
9209
9227
if (!buf -> buffer )
9210
9228
return - ENOMEM ;
9211
9229
@@ -9242,6 +9260,10 @@ static int allocate_trace_buffers(struct trace_array *tr, int size)
9242
9260
return ret ;
9243
9261
9244
9262
#ifdef CONFIG_TRACER_MAX_TRACE
9263
+ /* Fix mapped buffer trace arrays do not have snapshot buffers */
9264
+ if (tr -> range_addr_start )
9265
+ return 0 ;
9266
+
9245
9267
ret = allocate_trace_buffer (tr , & tr -> max_buffer ,
9246
9268
allocate_snapshot ? size : 1 );
9247
9269
if (MEM_FAIL (ret , "Failed to allocate trace buffer\n" )) {
@@ -9342,7 +9364,9 @@ static int trace_array_create_dir(struct trace_array *tr)
9342
9364
}
9343
9365
9344
9366
static struct trace_array *
9345
- trace_array_create_systems (const char * name , const char * systems )
9367
+ trace_array_create_systems (const char * name , const char * systems ,
9368
+ unsigned long range_addr_start ,
9369
+ unsigned long range_addr_size )
9346
9370
{
9347
9371
struct trace_array * tr ;
9348
9372
int ret ;
@@ -9368,6 +9392,10 @@ trace_array_create_systems(const char *name, const char *systems)
9368
9392
goto out_free_tr ;
9369
9393
}
9370
9394
9395
+ /* Only for boot up memory mapped ring buffers */
9396
+ tr -> range_addr_start = range_addr_start ;
9397
+ tr -> range_addr_size = range_addr_size ;
9398
+
9371
9399
tr -> trace_flags = global_trace .trace_flags & ~ZEROED_TRACE_FLAGS ;
9372
9400
9373
9401
cpumask_copy (tr -> tracing_cpumask , cpu_all_mask );
@@ -9425,7 +9453,7 @@ trace_array_create_systems(const char *name, const char *systems)
9425
9453
9426
9454
static struct trace_array * trace_array_create (const char * name )
9427
9455
{
9428
- return trace_array_create_systems (name , NULL );
9456
+ return trace_array_create_systems (name , NULL , 0 , 0 );
9429
9457
}
9430
9458
9431
9459
static int instance_mkdir (const char * name )
@@ -9479,7 +9507,7 @@ struct trace_array *trace_array_get_by_name(const char *name, const char *system
9479
9507
goto out_unlock ;
9480
9508
}
9481
9509
9482
- tr = trace_array_create_systems (name , systems );
9510
+ tr = trace_array_create_systems (name , systems , 0 , 0 );
9483
9511
9484
9512
if (IS_ERR (tr ))
9485
9513
tr = NULL ;
@@ -9672,8 +9700,10 @@ init_tracer_tracefs(struct trace_array *tr, struct dentry *d_tracer)
9672
9700
MEM_FAIL (1 , "Could not allocate function filter files" );
9673
9701
9674
9702
#ifdef CONFIG_TRACER_SNAPSHOT
9675
- trace_create_file ("snapshot" , TRACE_MODE_WRITE , d_tracer ,
9676
- tr , & snapshot_fops );
9703
+ if (!tr -> range_addr_start ) {
9704
+ trace_create_file ("snapshot" , TRACE_MODE_WRITE , d_tracer ,
9705
+ tr , & snapshot_fops );
9706
+ }
9677
9707
#endif
9678
9708
9679
9709
trace_create_file ("error_log" , TRACE_MODE_WRITE , d_tracer ,
0 commit comments