@@ -854,6 +854,7 @@ static const struct file_operations uprobe_profile_ops = {
854
854
struct uprobe_cpu_buffer {
855
855
struct mutex mutex ;
856
856
void * buf ;
857
+ int dsize ;
857
858
};
858
859
static struct uprobe_cpu_buffer __percpu * uprobe_cpu_buffer ;
859
860
static int uprobe_buffer_refcnt ;
@@ -943,9 +944,26 @@ static void uprobe_buffer_put(struct uprobe_cpu_buffer *ucb)
943
944
mutex_unlock (& ucb -> mutex );
944
945
}
945
946
947
+ static struct uprobe_cpu_buffer * prepare_uprobe_buffer (struct trace_uprobe * tu ,
948
+ struct pt_regs * regs )
949
+ {
950
+ struct uprobe_cpu_buffer * ucb ;
951
+ int dsize , esize ;
952
+
953
+ esize = SIZEOF_TRACE_ENTRY (is_ret_probe (tu ));
954
+ dsize = __get_data_size (& tu -> tp , regs , NULL );
955
+
956
+ ucb = uprobe_buffer_get ();
957
+ ucb -> dsize = tu -> tp .size + dsize ;
958
+
959
+ store_trace_args (ucb -> buf , & tu -> tp , regs , NULL , esize , dsize );
960
+
961
+ return ucb ;
962
+ }
963
+
946
964
static void __uprobe_trace_func (struct trace_uprobe * tu ,
947
965
unsigned long func , struct pt_regs * regs ,
948
- struct uprobe_cpu_buffer * ucb , int dsize ,
966
+ struct uprobe_cpu_buffer * ucb ,
949
967
struct trace_event_file * trace_file )
950
968
{
951
969
struct uprobe_trace_entry_head * entry ;
@@ -956,14 +974,14 @@ static void __uprobe_trace_func(struct trace_uprobe *tu,
956
974
957
975
WARN_ON (call != trace_file -> event_call );
958
976
959
- if (WARN_ON_ONCE (tu -> tp . size + dsize > PAGE_SIZE ))
977
+ if (WARN_ON_ONCE (ucb -> dsize > PAGE_SIZE ))
960
978
return ;
961
979
962
980
if (trace_trigger_soft_disabled (trace_file ))
963
981
return ;
964
982
965
983
esize = SIZEOF_TRACE_ENTRY (is_ret_probe (tu ));
966
- size = esize + tu -> tp . size + dsize ;
984
+ size = esize + ucb -> dsize ;
967
985
entry = trace_event_buffer_reserve (& fbuffer , trace_file , size );
968
986
if (!entry )
969
987
return ;
@@ -977,14 +995,14 @@ static void __uprobe_trace_func(struct trace_uprobe *tu,
977
995
data = DATAOF_TRACE_ENTRY (entry , false);
978
996
}
979
997
980
- memcpy (data , ucb -> buf , tu -> tp . size + dsize );
998
+ memcpy (data , ucb -> buf , ucb -> dsize );
981
999
982
1000
trace_event_buffer_commit (& fbuffer );
983
1001
}
984
1002
985
1003
/* uprobe handler */
986
1004
static int uprobe_trace_func (struct trace_uprobe * tu , struct pt_regs * regs ,
987
- struct uprobe_cpu_buffer * ucb , int dsize )
1005
+ struct uprobe_cpu_buffer * ucb )
988
1006
{
989
1007
struct event_file_link * link ;
990
1008
@@ -993,21 +1011,21 @@ static int uprobe_trace_func(struct trace_uprobe *tu, struct pt_regs *regs,
993
1011
994
1012
rcu_read_lock ();
995
1013
trace_probe_for_each_link_rcu (link , & tu -> tp )
996
- __uprobe_trace_func (tu , 0 , regs , ucb , dsize , link -> file );
1014
+ __uprobe_trace_func (tu , 0 , regs , ucb , link -> file );
997
1015
rcu_read_unlock ();
998
1016
999
1017
return 0 ;
1000
1018
}
1001
1019
1002
1020
static void uretprobe_trace_func (struct trace_uprobe * tu , unsigned long func ,
1003
1021
struct pt_regs * regs ,
1004
- struct uprobe_cpu_buffer * ucb , int dsize )
1022
+ struct uprobe_cpu_buffer * ucb )
1005
1023
{
1006
1024
struct event_file_link * link ;
1007
1025
1008
1026
rcu_read_lock ();
1009
1027
trace_probe_for_each_link_rcu (link , & tu -> tp )
1010
- __uprobe_trace_func (tu , func , regs , ucb , dsize , link -> file );
1028
+ __uprobe_trace_func (tu , func , regs , ucb , link -> file );
1011
1029
rcu_read_unlock ();
1012
1030
}
1013
1031
@@ -1335,7 +1353,7 @@ static bool uprobe_perf_filter(struct uprobe_consumer *uc,
1335
1353
1336
1354
static void __uprobe_perf_func (struct trace_uprobe * tu ,
1337
1355
unsigned long func , struct pt_regs * regs ,
1338
- struct uprobe_cpu_buffer * ucb , int dsize )
1356
+ struct uprobe_cpu_buffer * ucb )
1339
1357
{
1340
1358
struct trace_event_call * call = trace_probe_event_call (& tu -> tp );
1341
1359
struct uprobe_trace_entry_head * entry ;
@@ -1356,7 +1374,7 @@ static void __uprobe_perf_func(struct trace_uprobe *tu,
1356
1374
1357
1375
esize = SIZEOF_TRACE_ENTRY (is_ret_probe (tu ));
1358
1376
1359
- size = esize + tu -> tp . size + dsize ;
1377
+ size = esize + ucb -> dsize ;
1360
1378
size = ALIGN (size + sizeof (u32 ), sizeof (u64 )) - sizeof (u32 );
1361
1379
if (WARN_ONCE (size > PERF_MAX_TRACE_SIZE , "profile buffer not large enough" ))
1362
1380
return ;
@@ -1379,13 +1397,10 @@ static void __uprobe_perf_func(struct trace_uprobe *tu,
1379
1397
data = DATAOF_TRACE_ENTRY (entry , false);
1380
1398
}
1381
1399
1382
- memcpy (data , ucb -> buf , tu -> tp . size + dsize );
1400
+ memcpy (data , ucb -> buf , ucb -> dsize );
1383
1401
1384
- if (size - esize > tu -> tp .size + dsize ) {
1385
- int len = tu -> tp .size + dsize ;
1386
-
1387
- memset (data + len , 0 , size - esize - len );
1388
- }
1402
+ if (size - esize > ucb -> dsize )
1403
+ memset (data + ucb -> dsize , 0 , size - esize - ucb -> dsize );
1389
1404
1390
1405
perf_trace_buf_submit (entry , size , rctx , call -> event .type , 1 , regs ,
1391
1406
head , NULL );
@@ -1395,21 +1410,21 @@ static void __uprobe_perf_func(struct trace_uprobe *tu,
1395
1410
1396
1411
/* uprobe profile handler */
1397
1412
static int uprobe_perf_func (struct trace_uprobe * tu , struct pt_regs * regs ,
1398
- struct uprobe_cpu_buffer * ucb , int dsize )
1413
+ struct uprobe_cpu_buffer * ucb )
1399
1414
{
1400
1415
if (!uprobe_perf_filter (& tu -> consumer , 0 , current -> mm ))
1401
1416
return UPROBE_HANDLER_REMOVE ;
1402
1417
1403
1418
if (!is_ret_probe (tu ))
1404
- __uprobe_perf_func (tu , 0 , regs , ucb , dsize );
1419
+ __uprobe_perf_func (tu , 0 , regs , ucb );
1405
1420
return 0 ;
1406
1421
}
1407
1422
1408
1423
static void uretprobe_perf_func (struct trace_uprobe * tu , unsigned long func ,
1409
1424
struct pt_regs * regs ,
1410
- struct uprobe_cpu_buffer * ucb , int dsize )
1425
+ struct uprobe_cpu_buffer * ucb )
1411
1426
{
1412
- __uprobe_perf_func (tu , func , regs , ucb , dsize );
1427
+ __uprobe_perf_func (tu , func , regs , ucb );
1413
1428
}
1414
1429
1415
1430
int bpf_get_uprobe_info (const struct perf_event * event , u32 * fd_type ,
@@ -1475,10 +1490,8 @@ static int uprobe_dispatcher(struct uprobe_consumer *con, struct pt_regs *regs)
1475
1490
struct trace_uprobe * tu ;
1476
1491
struct uprobe_dispatch_data udd ;
1477
1492
struct uprobe_cpu_buffer * ucb ;
1478
- int dsize , esize ;
1479
1493
int ret = 0 ;
1480
1494
1481
-
1482
1495
tu = container_of (con , struct trace_uprobe , consumer );
1483
1496
tu -> nhit ++ ;
1484
1497
@@ -1490,18 +1503,14 @@ static int uprobe_dispatcher(struct uprobe_consumer *con, struct pt_regs *regs)
1490
1503
if (WARN_ON_ONCE (!uprobe_cpu_buffer ))
1491
1504
return 0 ;
1492
1505
1493
- dsize = __get_data_size (& tu -> tp , regs , NULL );
1494
- esize = SIZEOF_TRACE_ENTRY (is_ret_probe (tu ));
1495
-
1496
- ucb = uprobe_buffer_get ();
1497
- store_trace_args (ucb -> buf , & tu -> tp , regs , NULL , esize , dsize );
1506
+ ucb = prepare_uprobe_buffer (tu , regs );
1498
1507
1499
1508
if (trace_probe_test_flag (& tu -> tp , TP_FLAG_TRACE ))
1500
- ret |= uprobe_trace_func (tu , regs , ucb , dsize );
1509
+ ret |= uprobe_trace_func (tu , regs , ucb );
1501
1510
1502
1511
#ifdef CONFIG_PERF_EVENTS
1503
1512
if (trace_probe_test_flag (& tu -> tp , TP_FLAG_PROFILE ))
1504
- ret |= uprobe_perf_func (tu , regs , ucb , dsize );
1513
+ ret |= uprobe_perf_func (tu , regs , ucb );
1505
1514
#endif
1506
1515
uprobe_buffer_put (ucb );
1507
1516
return ret ;
@@ -1513,7 +1522,6 @@ static int uretprobe_dispatcher(struct uprobe_consumer *con,
1513
1522
struct trace_uprobe * tu ;
1514
1523
struct uprobe_dispatch_data udd ;
1515
1524
struct uprobe_cpu_buffer * ucb ;
1516
- int dsize , esize ;
1517
1525
1518
1526
tu = container_of (con , struct trace_uprobe , consumer );
1519
1527
@@ -1525,18 +1533,14 @@ static int uretprobe_dispatcher(struct uprobe_consumer *con,
1525
1533
if (WARN_ON_ONCE (!uprobe_cpu_buffer ))
1526
1534
return 0 ;
1527
1535
1528
- dsize = __get_data_size (& tu -> tp , regs , NULL );
1529
- esize = SIZEOF_TRACE_ENTRY (is_ret_probe (tu ));
1530
-
1531
- ucb = uprobe_buffer_get ();
1532
- store_trace_args (ucb -> buf , & tu -> tp , regs , NULL , esize , dsize );
1536
+ ucb = prepare_uprobe_buffer (tu , regs );
1533
1537
1534
1538
if (trace_probe_test_flag (& tu -> tp , TP_FLAG_TRACE ))
1535
- uretprobe_trace_func (tu , func , regs , ucb , dsize );
1539
+ uretprobe_trace_func (tu , func , regs , ucb );
1536
1540
1537
1541
#ifdef CONFIG_PERF_EVENTS
1538
1542
if (trace_probe_test_flag (& tu -> tp , TP_FLAG_PROFILE ))
1539
- uretprobe_perf_func (tu , func , regs , ucb , dsize );
1543
+ uretprobe_perf_func (tu , func , regs , ucb );
1540
1544
#endif
1541
1545
uprobe_buffer_put (ucb );
1542
1546
return 0 ;
0 commit comments