Skip to content

Commit abb1738

Browse files
eivindj-nordicrlubos
authored andcommitted
lib: nrf_modem: fixes for flash trace backend
Fixes for trace flash backend. Signed-off-by: Eivind Jølsgard <[email protected]>
1 parent 369f230 commit abb1738

File tree

2 files changed

+51
-16
lines changed

2 files changed

+51
-16
lines changed

lib/nrf_modem_lib/nrf_modem_lib_trace.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,10 @@ static int trace_fragment_write(struct nrf_modem_trace_data *frag)
261261
}
262262

263263
if (ret < 0) {
264-
LOG_ERR("trace_backend.write failed with err: %d", ret);
264+
if (ret != -ENOSPC) {
265+
LOG_ERR("trace_backend.write failed with err: %d", ret);
266+
}
267+
265268
return ret;
266269
}
267270

@@ -315,6 +318,7 @@ void trace_thread_handler(void)
315318
}
316319

317320
for (int i = 0; i < n_frags; i++) {
321+
retry:
318322
err = trace_fragment_write(&frags[i]);
319323
switch (err) {
320324
case 0:
@@ -329,8 +333,7 @@ void trace_thread_handler(void)
329333
k_sem_give(&trace_done_sem);
330334
k_sem_take(&trace_clear_sem, K_FOREVER);
331335
/* Try the same fragment again */
332-
i--;
333-
continue;
336+
goto retry;
334337

335338
case -ENOSR:
336339
if (k_sem_take(&modem_trace_level_sem, K_NO_WAIT) != 0) {
@@ -348,8 +351,7 @@ void trace_thread_handler(void)
348351
k_sem_give(&modem_trace_level_sem);
349352

350353
/* Try the same fragment again */
351-
i--;
352-
continue;
354+
goto retry;
353355

354356
default:
355357
/* Irrecoverable error */
@@ -497,7 +499,12 @@ int nrf_modem_lib_trace_read(uint8_t *buf, size_t len)
497499
UPDATE_TRACE_BYTES_READ(read);
498500
/* Traces are read, we can attempt to write more. */
499501
has_space = true;
502+
/* Flash backend needs to wait for a sector to be cleared and will give the semaphore instead.
503+
* This should be cleaned up with a separate API, but we declare the semaphore as extern for now.
504+
*/
505+
#if !defined(CONFIG_NRF_MODEM_LIB_TRACE_BACKEND_FLASH)
500506
k_sem_give(&trace_clear_sem);
507+
#endif
501508
}
502509

503510
return read;

lib/nrf_modem_lib/trace_backends/flash/flash.c

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ static struct fcb trace_fcb = {
3636
.f_flags = FCB_FLAGS_CRC_DISABLED,
3737
};
3838

39+
/* Flash backend needs to wait for a sector to be cleared and will give the semaphore instead.
40+
* This should be cleaned up with a separate API, but we declare the semaphore as extern for now.
41+
*/
42+
extern struct k_sem trace_clear_sem;
43+
3944
/* Store in __noinit RAM to perserve in warm boot. */
4045
static __noinit uint32_t magic;
4146
static __noinit size_t read_offset;
@@ -116,8 +121,10 @@ static int buffer_flush_to_flash(void)
116121
}
117122

118123
if (err) {
119-
LOG_ERR("fcb_append failed, err %d", err);
120-
err = -ENOSPC;
124+
if (err != -ENOSPC) {
125+
LOG_ERR("fcb_append failed, err %d", err);
126+
}
127+
121128
goto out;
122129
}
123130
}
@@ -189,14 +196,16 @@ int trace_backend_init(trace_backend_processed_cb trace_processed_cb)
189196

190197
/* After a cold boot the magic will contain random values. */
191198
if (magic != TRACE_MAGIC_INITIALIZED) {
192-
LOG_DBG("Initializing");
199+
LOG_DBG("Trace magic not found, initializing");
193200
read_offset = 0;
194201
trace_bytes_unread = 0;
195202
flash_buf_written = 0;
196203
memset(&loc, 0, sizeof(loc));
197204
sector = NULL;
198205
magic = TRACE_MAGIC_INITIALIZED;
199206
trace_flash_erase();
207+
} else {
208+
LOG_DBG("Trace magic found, skipping initialization");
200209
}
201210

202211
uint32_t f_sector_cnt = sizeof(trace_flash_sectors) / sizeof(struct flash_sector);
@@ -266,6 +275,7 @@ static int read_from_offset(void *buf, size_t len)
266275
int trace_backend_read(void *buf, size_t len)
267276
{
268277
int err;
278+
size_t ret;
269279
size_t to_read = 0;
270280

271281
if (!is_initialized) {
@@ -314,25 +324,32 @@ int trace_backend_read(void *buf, size_t len)
314324
err = read_from_offset(buf, len);
315325

316326
out:
327+
ret = err;
328+
317329
/* Erase if done with previous sector. */
318330
if (sector && (sector != loc.fe_sector)) {
319331
err = fcb_rotate(&trace_fcb);
320332
if (err) {
333+
LOG_ERR("Failed to erase read sector, err %d", err);
321334
k_sem_give(&fcb_sem);
322-
return err;
335+
/* Return what we have read */
336+
return ret;
323337
}
338+
339+
k_sem_give(&trace_clear_sem);
324340
}
325341

326342
sector = loc.fe_sector;
327343

328344
k_sem_give(&fcb_sem);
329-
return err;
345+
return ret;
330346
}
331347

332348
static int stream_write(const void *buf, size_t len)
333349
{
334350
int ret;
335351
int written;
352+
size_t written_total = 0;
336353
size_t bytes_left = len;
337354
const uint8_t *bytes = buf;
338355

@@ -342,36 +359,47 @@ static int stream_write(const void *buf, size_t len)
342359

343360
while (bytes_left) {
344361
written = buffer_append(&bytes[len - bytes_left], bytes_left);
345-
if (written != bytes_left) {
362+
written_total += written;
363+
364+
if (flash_buf_written >= sizeof(flash_buf)) {
346365
ret = buffer_flush_to_flash();
347366
if (ret) {
348367
LOG_ERR("buffer_flush_to_flash error %d", ret);
368+
if (written_total) {
369+
ret = trace_processed_callback(written);
370+
if (ret < 0) {
371+
LOG_ERR("trace_processed_callback failed: %d", ret);
372+
return ret;
373+
}
374+
return written_total;
375+
}
349376
return ret;
350377
}
351378
}
352379
if (written > 0) {
353380
bytes_left -= written;
354381
ret = trace_processed_callback(written);
355382
if (ret < 0) {
356-
LOG_ERR("trace_processed_callback failed: %d", ret);
383+
LOG_ERR("trace_processed_callback 2 failed: %d", ret);
357384
return ret;
358385
}
359386
}
360387
}
361388

362-
return 0;
389+
return written_total;
363390
}
364391

365392
int trace_backend_write(const void *data, size_t len)
366393
{
367394
int write_ret = stream_write(data, len);
368395

369396
if (write_ret < 0) {
370-
LOG_ERR("write failed: %d", write_ret);
371-
return write_ret;
397+
if (write_ret != -ENOSPC) {
398+
LOG_ERR("write failed: %d", write_ret);
399+
}
372400
}
373401

374-
return (int)len;
402+
return write_ret;
375403
}
376404

377405
int trace_backend_clear(void)

0 commit comments

Comments
 (0)