Skip to content

Commit 884ed3e

Browse files
ocp: Fixes for OCP 2.5 Telemetry DA1 FIFO Event Parsing
This commit fixes several issues related to parsing the Telemetry DA 1 and 2 Event FIFO's. Fixes parsing of VU Event Data. Added checking for VU data. Removed the vu_event_identifier field from the debug event class structs since it's not guaranteed to be there. Added nvme_ocp_common_dbg_evt_class_vu_data to be used to access the VU data. Added checking for NULL pointers Added a check for the end of the Event FIFO entries that will break from the while loop when detected. Fixed lines longer then 100 columns. Fixed other miscellaneous errors flagged by checkpatch.pl. Fixed "Suspicious sizeof offset in a pointer arithmetic expression." errors flagged by Code scanning. Fixed loop index size error Fixed LE variable declarations and conversion issues Fixed vu data size errors Make variable names more descriptive Signed-off-by: jeff-lien-wdc <[email protected]>
1 parent dd59efc commit 884ed3e

File tree

4 files changed

+359
-222
lines changed

4 files changed

+359
-222
lines changed

plugins/ocp/ocp-nvme.c

Lines changed: 53 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,7 @@ static int get_telemetry_data(struct nvme_dev *dev, __u32 ns, __u8 tele_type,
990990
cmd.cdw14 = 0;
991991
return nvme_submit_admin_passthru(dev_fd(dev), &cmd, NULL);
992992
}
993+
993994
static void print_telemetry_data_area_1(struct telemetry_data_area_1 *da1,
994995
int tele_type)
995996
{
@@ -1075,13 +1076,13 @@ static void print_telemetry_da_stat(struct telemetry_stats_desc *da_stat,
10751076
}
10761077
}
10771078
static void print_telemetry_da_fifo(struct telemetry_event_desc *da_fifo,
1078-
__le64 buf_size,
1079+
__u64 buf_size,
10791080
int tele_type,
10801081
int da,
10811082
int index)
10821083
{
10831084
if (da_fifo) {
1084-
unsigned int i = 0;
1085+
__u64 i = 0;
10851086
struct telemetry_event_desc *next_da_fifo = da_fifo;
10861087

10871088
if (tele_type == TELEMETRY_TYPE_HOST)
@@ -1091,8 +1092,11 @@ static void print_telemetry_da_fifo(struct telemetry_event_desc *da_fifo,
10911092
printf("====== Telemetry Controller Data area %d Event FIFO %d ======\n",
10921093
da, index);
10931094

1094-
10951095
while ((i + 4) < buf_size) {
1096+
/* break if last entry */
1097+
if (next_da_fifo->class == 0)
1098+
break;
1099+
10961100
/* Print Event Data */
10971101
print_telemetry_fifo_event(next_da_fifo->class, /* Event class type */
10981102
next_da_fifo->id, /* Event ID */
@@ -1190,7 +1194,7 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
11901194
enum TELEMETRY_TYPE tele_type, int data_area, bool header_print)
11911195
{
11921196
__u32 err = 0, nsid = 0;
1193-
__le64 da1_sz = 512, m_512_sz = 0, da1_off = 0, m_512_off = 0, diff = 0,
1197+
__u64 da1_sz = 512, m_512_sz = 0, da1_off = 0, m_512_off = 0, diff = 0,
11941198
temp_sz = 0, temp_ofst = 0;
11951199
__u8 lsp = 0, rae = 0, flag = 0;
11961200
__u8 data[TELEMETRY_HEADER_SIZE] = { 0 };
@@ -1242,16 +1246,16 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
12421246
/* Print the Data Area 1 Stats */
12431247
if (da1->da1_stat_size != 0) {
12441248
diff = 0;
1245-
da1_sz = (da1->da1_stat_size) * 4;
1246-
m_512_sz = (da1->da1_stat_size) * 4;
1247-
da1_off = (da1->da1_stat_start) * 4;
1248-
m_512_off = (da1->da1_stat_start) * 4;
1249-
temp_sz = (da1->da1_stat_size) * 4;
1250-
temp_ofst = (da1->da1_stat_start) * 4;
1249+
da1_sz = le64_to_cpu(da1->da1_stat_size) * 4;
1250+
m_512_sz = le64_to_cpu(da1->da1_stat_size) * 4;
1251+
da1_off = le64_to_cpu(da1->da1_stat_start) * 4;
1252+
m_512_off = le64_to_cpu(da1->da1_stat_start) * 4;
1253+
temp_sz = le64_to_cpu(da1->da1_stat_size) * 4;
1254+
temp_ofst = le64_to_cpu(da1->da1_stat_start) * 4;
12511255
flag = 0;
12521256

12531257
if ((da1_off % 512) > 0) {
1254-
m_512_off = (__le64) ((da1_off / 512));
1258+
m_512_off = (da1_off / 512);
12551259
da1_off = m_512_off * 512;
12561260
diff = temp_ofst - da1_off;
12571261
flag = 1;
@@ -1261,15 +1265,15 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
12611265
da1_sz = 512;
12621266
else if ((da1_sz % 512) > 0) {
12631267
if (flag == 0) {
1264-
m_512_sz = (__le64) ((da1_sz / 512) + 1);
1268+
m_512_sz = (da1_sz / 512) + 1;
12651269
da1_sz = m_512_sz * 512;
12661270
} else {
12671271
if (diff < 512)
12681272
diff = 1;
12691273
else
12701274
diff = (diff / 512) * 512;
12711275

1272-
m_512_sz = (__le64) ((da1_sz / 512) + 1 + diff + 1);
1276+
m_512_sz = (da1_sz / 512) + 1 + diff + 1;
12731277
da1_sz = m_512_sz * 512;
12741278
}
12751279
}
@@ -1284,23 +1288,23 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
12841288
}
12851289

12861290
print_telemetry_da_stat((void *)(da1_stat + (temp_ofst - da1_off)),
1287-
tele_type, (da1->da1_stat_size) * 4, 1);
1291+
tele_type, le64_to_cpu(da1->da1_stat_size) * 4, 1);
12881292
}
12891293

12901294
/* Print the Data Area 1 Event FIFO's */
12911295
for (i = 0; i < 16 ; i++) {
12921296
if ((da1->event_fifo_da[i] == 1) && (da1->event_fifos[i].size != 0)) {
12931297
diff = 0;
1294-
da1_sz = da1->event_fifos[i].size * 4;
1295-
m_512_sz = da1->event_fifos[i].size * 4;
1296-
da1_off = da1->event_fifos[i].start * 4;
1297-
m_512_off = da1->event_fifos[i].start * 4;
1298-
temp_sz = da1->event_fifos[i].size * 4;
1299-
temp_ofst = da1->event_fifos[i].start * 4;
1298+
da1_sz = le64_to_cpu(da1->event_fifos[i].size) * 4;
1299+
m_512_sz = le64_to_cpu(da1->event_fifos[i].size) * 4;
1300+
da1_off = le64_to_cpu(da1->event_fifos[i].start) * 4;
1301+
m_512_off = le64_to_cpu(da1->event_fifos[i].start) * 4;
1302+
temp_sz = le64_to_cpu(da1->event_fifos[i].size) * 4;
1303+
temp_ofst = le64_to_cpu(da1->event_fifos[i].start) * 4;
13001304
flag = 0;
13011305

13021306
if ((da1_off % 512) > 0) {
1303-
m_512_off = (__le64) ((da1_off / 512));
1307+
m_512_off = ((da1_off / 512));
13041308
da1_off = m_512_off * 512;
13051309
diff = temp_ofst - da1_off;
13061310
flag = 1;
@@ -1310,23 +1314,25 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
13101314
da1_sz = 512;
13111315
else if ((da1_sz % 512) > 0) {
13121316
if (flag == 0) {
1313-
m_512_sz = (__le64) ((da1_sz / 512) + 1);
1317+
m_512_sz = (da1_sz / 512) + 1;
13141318
da1_sz = m_512_sz * 512;
13151319
} else {
13161320
if (diff < 512)
13171321
diff = 1;
13181322
else
13191323
diff = (diff / 512) * 512;
13201324

1321-
m_512_sz = (__le64) ((da1_sz / 512) + 1 + diff + 1);
1325+
m_512_sz = (da1_sz / 512) + 1 + diff + 1;
13221326
da1_sz = m_512_sz * 512;
13231327
}
13241328
}
13251329

13261330
char *da1_fifo = calloc(da1_sz, sizeof(char));
13271331

1332+
printf("Get DA 1 FIFO addr: %p, offset 0x%llx\n",
1333+
da1_fifo, da1_off);
13281334
err = get_telemetry_data(dev, nsid, tele_type,
1329-
(da1->event_fifos[i].size) * 4,
1335+
le64_to_cpu(da1->event_fifos[i].size) * 4,
13301336
(void *)da1_fifo, lsp, rae, da1_off);
13311337
if (err) {
13321338
printf("get_telemetry_data da1 event fifos failed, err: %d.\n",
@@ -1336,34 +1342,34 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
13361342
print_telemetry_da_fifo((void *)(da1_fifo + (temp_ofst - da1_off)),
13371343
temp_sz,
13381344
tele_type,
1339-
da1->event_fifo_da[i],
1345+
le64_to_cpu(da1->event_fifo_da[i]),
13401346
i);
13411347
}
13421348
}
13431349

13441350
/* Print the Data Area 2 Stats */
13451351
if (da1->da2_stat_size != 0) {
1346-
da1_off = (da1->da2_stat_start) * 4;
1347-
temp_ofst = (da1->da2_stat_start) * 4;
1348-
da1_sz = (da1->da2_stat_size) * 4;
1352+
da1_off = le64_to_cpu(da1->da2_stat_start) * 4;
1353+
temp_ofst = le64_to_cpu(da1->da2_stat_start) * 4;
1354+
da1_sz = le64_to_cpu(da1->da2_stat_size) * 4;
13491355
diff = 0;
13501356
flag = 0;
13511357

13521358
if (da1->da2_stat_start == 0) {
1353-
da1_off = 512 + (logheader->DataArea1LastBlock * 512);
1359+
da1_off = 512 + (le16_to_cpu(logheader->DataArea1LastBlock) * 512);
13541360
temp_ofst = 512 + (le16_to_cpu(logheader->DataArea1LastBlock) * 512);
13551361
if ((da1_off % 512) == 0) {
1356-
m_512_off = (__le64) (((da1_off) / 512));
1362+
m_512_off = ((da1_off) / 512);
13571363
da1_off = m_512_off * 512;
13581364
diff = temp_ofst - da1_off;
13591365
flag = 1;
13601366
}
13611367
} else {
13621368

13631369
if (((da1_off * 4) % 512) > 0) {
1364-
m_512_off = (__le64) ((((da1->da2_stat_start) * 4) / 512));
1370+
m_512_off = ((le64_to_cpu(da1->da2_stat_start) * 4) / 512);
13651371
da1_off = m_512_off * 512;
1366-
diff = ((da1->da2_stat_start) * 4) - da1_off;
1372+
diff = (le64_to_cpu(da1->da2_stat_start) * 4) - da1_off;
13671373
flag = 1;
13681374
}
13691375
}
@@ -1372,14 +1378,14 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
13721378
da1_sz = 512;
13731379
else if ((da1_sz % 512) > 0) {
13741380
if (flag == 0) {
1375-
m_512_sz = (__le64) ((da1->da2_stat_size / 512) + 1);
1381+
m_512_sz = (le64_to_cpu(da1->da2_stat_size) / 512) + 1;
13761382
da1_sz = m_512_sz * 512;
13771383
} else {
13781384
if (diff < 512)
13791385
diff = 1;
13801386
else
13811387
diff = (diff / 512) * 512;
1382-
m_512_sz = (__le64) ((da1->da2_stat_size / 512) + 1 + diff + 1);
1388+
m_512_sz = (le64_to_cpu(da1->da2_stat_size) / 512) + 1 + diff + 1;
13831389
da1_sz = m_512_sz * 512;
13841390
}
13851391
}
@@ -1395,24 +1401,24 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
13951401

13961402
print_telemetry_da_stat((void *)(da2_stat + (temp_ofst - da1_off)),
13971403
tele_type,
1398-
(da1->da2_stat_size) * 4,
1404+
le64_to_cpu(da1->da2_stat_size) * 4,
13991405
2);
14001406
}
14011407

14021408
/* Print the Data Area 2 Event FIFO's */
14031409
for (i = 0; i < 16 ; i++) {
14041410
if ((da1->event_fifo_da[i] == 2) && (da1->event_fifos[i].size != 0)) {
14051411
diff = 0;
1406-
da1_sz = da1->event_fifos[i].size * 4;
1407-
m_512_sz = da1->event_fifos[i].size * 4;
1408-
da1_off = da1->event_fifos[i].start * 4;
1409-
m_512_off = da1->event_fifos[i].start * 4;
1410-
temp_sz = da1->event_fifos[i].size * 4;
1411-
temp_ofst = da1->event_fifos[i].start * 4;
1412+
da1_sz = le64_to_cpu(da1->event_fifos[i].size) * 4;
1413+
m_512_sz = le64_to_cpu(da1->event_fifos[i].size) * 4;
1414+
da1_off = le64_to_cpu(da1->event_fifos[i].start) * 4;
1415+
m_512_off = le64_to_cpu(da1->event_fifos[i].start) * 4;
1416+
temp_sz = le64_to_cpu(da1->event_fifos[i].size) * 4;
1417+
temp_ofst = le64_to_cpu(da1->event_fifos[i].start) * 4;
14121418
flag = 0;
14131419

14141420
if ((da1_off % 512) > 0) {
1415-
m_512_off = (__le64) ((da1_off / 512));
1421+
m_512_off = ((da1_off / 512));
14161422
da1_off = m_512_off * 512;
14171423
diff = temp_ofst - da1_off;
14181424
flag = 1;
@@ -1422,7 +1428,7 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
14221428
da1_sz = 512;
14231429
else if ((da1_sz % 512) > 0) {
14241430
if (flag == 0) {
1425-
m_512_sz = (__le64) ((da1_sz / 512) + 1);
1431+
m_512_sz = (da1_sz / 512) + 1;
14261432
da1_sz = m_512_sz * 512;
14271433
}
14281434

@@ -1432,15 +1438,15 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
14321438
else
14331439
diff = (diff / 512) * 512;
14341440

1435-
m_512_sz = (__le64) ((da1_sz / 512) + 1 + diff + 1);
1441+
m_512_sz = (da1_sz / 512) + 1 + diff + 1;
14361442
da1_sz = m_512_sz * 512;
14371443
}
14381444
}
14391445

14401446
char *da1_fifo = calloc(da1_sz, sizeof(char));
14411447

14421448
err = get_telemetry_data(dev, nsid, tele_type,
1443-
(da1->event_fifos[i].size) * 4,
1449+
le64_to_cpu(da1->event_fifos[i].size) * 4,
14441450
(void *)da1_fifo, lsp, rae, da1_off);
14451451
if (err) {
14461452
printf("get_telemetry_data da2 event fifos failed, err: %d.\n",
@@ -1450,7 +1456,7 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
14501456
print_telemetry_da_fifo((void *)(da1_fifo + (temp_ofst - da1_off)),
14511457
temp_sz,
14521458
tele_type,
1453-
da1->event_fifo_da[i],
1459+
le64_to_cpu(da1->event_fifo_da[i]),
14541460
i);
14551461
}
14561462
}
@@ -1818,6 +1824,7 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd,
18181824
}
18191825
} else {
18201826
tele_type = TELEMETRY_TYPE_HOST; //Default Type - Host
1827+
opt.telemetry_type = "host";
18211828
nvme_show_result("Missing telemetry-type. Using default - host.\n");
18221829
}
18231830

plugins/ocp/ocp-nvme.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#if !defined(OCP_NVME) || defined(CMD_HEADER_MULTI_READ)
1212
#define OCP_NVME
1313

14-
#define OCP_PLUGIN_VERSION "2.9.0"
14+
#define OCP_PLUGIN_VERSION "2.9.1"
1515
#include "cmd.h"
1616

1717
PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION),

0 commit comments

Comments
 (0)