Skip to content

Commit a158255

Browse files
jeff-lien-sndkdwsuse
authored andcommitted
linux: Add size and data area parm to nvme_get_telemetry_log
This is necessary to support the retrieval of data area 4. Signed-off-by: Jeff Lien <[email protected]>
1 parent 3f0b379 commit a158255

3 files changed

Lines changed: 95 additions & 34 deletions

File tree

examples/telemetry-listen.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ static int open_uevent(nvme_ctrl_t c)
3838
static void save_telemetry(nvme_ctrl_t c)
3939
{
4040
char buf[0x1000];
41-
__u32 log_size;
41+
size_t log_size;
4242
int ret, fd;
4343
struct nvme_telemetry_log *log;
4444
time_t s;
4545

4646
/* Clear the log (rae == false) at the end to see new telemetry events later */
47-
ret = nvme_get_ctrl_telemetry(nvme_ctrl_get_fd(c), false, &log);
47+
ret = nvme_get_ctrl_telemetry(nvme_ctrl_get_fd(c), false, &log, NVME_TELEMETRY_DA_3, &log_size);
4848
if (ret)
4949
return;
5050

@@ -67,7 +67,7 @@ static void save_telemetry(nvme_ctrl_t c)
6767
if (ret < 0)
6868
printf("failed to write telemetry log\n");
6969
else
70-
printf("telemetry log save as %s, wrote:%d size:%d\n", buf,
70+
printf("telemetry log save as %s, wrote:%d size:%ld\n", buf,
7171
ret, log_size);
7272
close(fd);
7373
free(log);

src/nvme/linux.c

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -176,16 +176,19 @@ int nvme_get_log_page_padded(int fd, __u32 nsid, __u8 log_id, bool rae,
176176
}
177177

178178
static int nvme_get_telemetry_log(int fd, bool create, bool ctrl, bool rae,
179-
struct nvme_telemetry_log **buf)
179+
struct nvme_telemetry_log **buf, enum nvme_telemetry_da da,
180+
size_t *size)
180181
{
181182
static const __u32 xfer = NVME_LOG_TELEM_BLOCK_SIZE;
182183

183184
struct nvme_telemetry_log *telem;
184185
enum nvme_cmd_get_log_lid lid;
186+
struct nvme_id_ctrl id_ctrl;
185187
void *log, *tmp;
186-
__u32 size;
187188
int err;
188189

190+
*size = 0;
191+
189192
log = malloc(xfer);
190193
if (!log) {
191194
errno = ENOMEM;
@@ -212,17 +215,46 @@ static int nvme_get_telemetry_log(int fd, bool create, bool ctrl, bool rae,
212215
return 0;
213216
}
214217

215-
/* dalb3 >= dalb2 >= dalb1 */
216-
size = (le16_to_cpu(telem->dalb3) + 1) * xfer;
217-
tmp = realloc(log, size);
218+
switch (da) {
219+
case NVME_TELEMETRY_DA_1:
220+
case NVME_TELEMETRY_DA_2:
221+
case NVME_TELEMETRY_DA_3:
222+
/* dalb3 >= dalb2 >= dalb1 */
223+
*size = (le16_to_cpu(telem->dalb3) + 1) * xfer;
224+
break;
225+
case NVME_TELEMETRY_DA_4:
226+
err = nvme_identify_ctrl(fd, &id_ctrl);
227+
if (err) {
228+
perror("identify-ctrl");
229+
errno = EINVAL;
230+
goto free;
231+
}
232+
233+
if (id_ctrl.lpa & 0x40) {
234+
*size = (le32_to_cpu(telem->dalb4) + 1) * xfer;
235+
} else {
236+
fprintf(stderr, "Data area 4 unsupported, bit 6 of Log Page Attributes not set\n");
237+
errno = EINVAL;
238+
err = -1;
239+
goto free;
240+
}
241+
break;
242+
default:
243+
fprintf(stderr, "Invalid data area parameter - %d\n", da);
244+
errno = EINVAL;
245+
err = -1;
246+
goto free;
247+
}
248+
249+
tmp = realloc(log, *size);
218250
if (!tmp) {
219251
errno = ENOMEM;
220252
err = -1;
221253
goto free;
222254
}
223255
log = tmp;
224256

225-
err = nvme_get_log_page_padded(fd, NVME_NSID_NONE, lid, rae, size,
257+
err = nvme_get_log_page_padded(fd, NVME_NSID_NONE, lid, rae, (__u32)*size,
226258
(void *)log);
227259
if (!err) {
228260
*buf = log;
@@ -233,19 +265,22 @@ static int nvme_get_telemetry_log(int fd, bool create, bool ctrl, bool rae,
233265
return err;
234266
}
235267

236-
int nvme_get_ctrl_telemetry(int fd, bool rae, struct nvme_telemetry_log **log)
268+
int nvme_get_ctrl_telemetry(int fd, bool rae, struct nvme_telemetry_log **log,
269+
enum nvme_telemetry_da da, size_t *size)
237270
{
238-
return nvme_get_telemetry_log(fd, false, true, rae, log);
271+
return nvme_get_telemetry_log(fd, false, true, rae, log, da, size);
239272
}
240273

241-
int nvme_get_host_telemetry(int fd, struct nvme_telemetry_log **log)
274+
int nvme_get_host_telemetry(int fd, struct nvme_telemetry_log **log,
275+
enum nvme_telemetry_da da, size_t *size)
242276
{
243-
return nvme_get_telemetry_log(fd, false, false, false, log);
277+
return nvme_get_telemetry_log(fd, false, false, false, log, da, size);
244278
}
245279

246-
int nvme_get_new_host_telemetry(int fd, struct nvme_telemetry_log **log)
280+
int nvme_get_new_host_telemetry(int fd, struct nvme_telemetry_log **log,
281+
enum nvme_telemetry_da da, size_t *size)
247282
{
248-
return nvme_get_telemetry_log(fd, true, false, false, log);
283+
return nvme_get_telemetry_log(fd, true, false, false, log, da, size);
249284
}
250285

251286
int nvme_get_lba_status_log(int fd, bool rae, struct nvme_lba_status_log **log)

src/nvme/linux.h

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
*/
2121

2222
/**
23-
* nvme_fw_download_seq() -
23+
* nvme_fw_download_seq() - firmware download sequence
2424
* @fd: File descriptor of nvme device
2525
* @size: Total size of the firmware image to transfer
2626
* @xfer: Maximum size to send with each partial transfer
@@ -34,47 +34,70 @@ int nvme_fw_download_seq(int fd, __u32 size, __u32 xfer, __u32 offset,
3434
void *buf);
3535

3636
/**
37-
* nvme_get_ctrl_telemetry() -
37+
* enum nvme_telemetry_da - Telemetry Log Data Area
38+
* @NVME_TELEMETRY_DA_1: Data Area 1
39+
* @NVME_TELEMETRY_DA_2: Data Area 2
40+
* @NVME_TELEMETRY_DA_3: Data Area 3
41+
* @NVME_TELEMETRY_DA_4: Data Area 4
42+
*/
43+
enum nvme_telemetry_da {
44+
NVME_TELEMETRY_DA_1 = 1,
45+
NVME_TELEMETRY_DA_2 = 2,
46+
NVME_TELEMETRY_DA_3 = 3,
47+
NVME_TELEMETRY_DA_4 = 4,
48+
};
49+
50+
/**
51+
* nvme_get_ctrl_telemetry() - get controller telemetry log
3852
* @fd: File descriptor of nvme device
3953
* @rae: Retain asynchronous events
40-
* @log: On success, set to the value of the allocated and retreived log.
54+
* @log: On success, set to the value of the allocated and retrieved log.
55+
* @da: log page data area, valid values: &enum nvme_telemetry_da
56+
* @size: Ptr to the telemetry log size, so it can be returned
4157
*
4258
* The total size allocated can be calculated as:
43-
* (&struct nvme_telemetry_log.dalb3 + 1) * %NVME_LOG_TELEM_BLOCK_SIZE.
59+
* (nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
4460
*
4561
* Return: The nvme command status if a response was received (see
4662
* &enum nvme_status_field) or -1 with errno set otherwise.
4763
*/
48-
int nvme_get_ctrl_telemetry(int fd, bool rae, struct nvme_telemetry_log **log);
64+
int nvme_get_ctrl_telemetry(int fd, bool rae, struct nvme_telemetry_log **log,
65+
enum nvme_telemetry_da da, size_t *size);
4966

5067
/**
51-
* nvme_get_host_telemetry() -
52-
* @fd: File descriptor of nvme device
53-
* @log: On success, set to the value of the allocated and retreived log.
68+
* nvme_get_host_telemetry() - get host telemetry log
69+
* @fd: File descriptor of nvme device
70+
* @log: On success, set to the value of the allocated and retrieved log.
71+
* @da: log page data area, valid values: &enum nvme_telemetry_da
72+
* @size: Ptr to the telemetry log size, so it can be returned
5473
*
5574
* The total size allocated can be calculated as:
56-
* (&struct nvme_telemetry_log.dalb3 + 1) * %NVME_LOG_TELEM_BLOCK_SIZE.
75+
* (nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
5776
*
5877
* Return: The nvme command status if a response was received (see
5978
* &enum nvme_status_field) or -1 with errno set otherwise.
6079
*/
61-
int nvme_get_host_telemetry(int fd, struct nvme_telemetry_log **log);
80+
int nvme_get_host_telemetry(int fd, struct nvme_telemetry_log **log,
81+
enum nvme_telemetry_da da, size_t *size);
6282

6383
/**
64-
* nvme_get_new_host_telemetry() -
65-
* @fd: File descriptor of nvme device
66-
* @log: On success, set to the value of the allocated and retreived log.
84+
* nvme_get_new_host_telemetry() - get new host telemetry log
85+
* @fd: File descriptor of nvme device
86+
* @log: On success, set to the value of the allocated and retrieved log.
87+
* @da: log page data area, valid values: &enum nvme_telemetry_da
88+
* @size: Ptr to the telemetry log size, so it can be returned
6789
*
6890
* The total size allocated can be calculated as:
69-
* (&struct nvme_telemetry_log.dalb3 + 1) * %NVME_LOG_TELEM_BLOCK_SIZE.
91+
* (nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
7092
*
7193
* Return: The nvme command status if a response was received (see
7294
* &enum nvme_status_field) or -1 with errno set otherwise.
7395
*/
74-
int nvme_get_new_host_telemetry(int fd, struct nvme_telemetry_log **log);
96+
int nvme_get_new_host_telemetry(int fd, struct nvme_telemetry_log **log,
97+
enum nvme_telemetry_da da, size_t *size);
7598

7699
/**
77-
* nvme_get_log_page() -
100+
* nvme_get_log_page() - get log page data
78101
* @fd: File descriptor of nvme device
79102
* @nsid: Namespace Identifier, if applicable.
80103
* @log_id: Log Identifier, see &enum nvme_cmd_get_log_lid.
@@ -90,7 +113,7 @@ int nvme_get_log_page(int fd, __u32 nsid, __u8 log_id, bool rae,
90113
__u32 xfer_len, __u32 data_len, void *data);
91114

92115
/**
93-
* nvme_get_log_page_padded() -
116+
* nvme_get_log_page_padded() - get log page data with 4k xfer length
94117
* @fd: File descriptor of nvme device
95118
* @nsid: Namespace Identifier, if applicable.
96119
* @log_id: Log Identifier, see &enum nvme_cmd_get_log_lid.
@@ -99,7 +122,7 @@ int nvme_get_log_page(int fd, __u32 nsid, __u8 log_id, bool rae,
99122
* @data: User address of at least &data_len to store the log.
100123
*
101124
* Calls nvme_get_log_page() with a default 4k transfer length, as that is
102-
* guarnateed by the protocol to be a safe transfer size.
125+
* guaranteed by the protocol to be a safe transfer size.
103126
*
104127
* Return: The nvme command status if a response was received (see
105128
* &enum nvme_status_field) or -1 with errno set otherwise.
@@ -133,6 +156,9 @@ int nvme_get_logical_block_size(int fd, __u32 nsid, int *blksize);
133156
* @fd: File descriptor of the nvme device
134157
* @rae: Retain asynchronous events
135158
* @log: On success, set to the value of the allocated and retreived log.
159+
*
160+
* Return: The nvme command status if a response was received (see
161+
* &enum nvme_status_field) or -1 with errno set otherwise.
136162
*/
137163
int nvme_get_lba_status_log(int fd, bool rae, struct nvme_lba_status_log **log);
138164

@@ -190,7 +216,7 @@ enum nvme_hmac_alg {
190216
* nvme_gen_dhchap_key() - DH-HMAC-CHAP key generation
191217
* @hostnqn: Host NVMe Qualified Name
192218
* @hmac: HMAC algorithm
193-
* @key_len: Output key lenght
219+
* @key_len: Output key length
194220
* @secret: Secret to used for digest
195221
* @key: Generated DH-HMAC-CHAP key
196222
*

0 commit comments

Comments
 (0)