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