@@ -78,6 +78,8 @@ struct mock_event_log {
78
78
u16 clear_idx ;
79
79
u16 cur_idx ;
80
80
u16 nr_events ;
81
+ u16 nr_overflow ;
82
+ u16 overflow_reset ;
81
83
struct cxl_event_record_raw * events [CXL_TEST_EVENT_CNT_MAX ];
82
84
};
83
85
@@ -116,6 +118,7 @@ static void event_reset_log(struct mock_event_log *log)
116
118
{
117
119
log -> cur_idx = 0 ;
118
120
log -> clear_idx = 0 ;
121
+ log -> nr_overflow = log -> overflow_reset ;
119
122
}
120
123
121
124
/* Handle can never be 0 use 1 based indexing for handle */
@@ -147,8 +150,12 @@ static void mes_add_event(struct mock_event_store *mes,
147
150
return ;
148
151
149
152
log = & mes -> mock_logs [log_type ];
150
- if (WARN_ON (log -> nr_events >= CXL_TEST_EVENT_CNT_MAX ))
153
+
154
+ if ((log -> nr_events + 1 ) > CXL_TEST_EVENT_CNT_MAX ) {
155
+ log -> nr_overflow ++ ;
156
+ log -> overflow_reset = log -> nr_overflow ;
151
157
return ;
158
+ }
152
159
153
160
log -> events [log -> nr_events ] = event ;
154
161
log -> nr_events ++ ;
@@ -159,6 +166,7 @@ static int mock_get_event(struct cxl_dev_state *cxlds,
159
166
{
160
167
struct cxl_get_event_payload * pl ;
161
168
struct mock_event_log * log ;
169
+ u16 nr_overflow ;
162
170
u8 log_type ;
163
171
int i ;
164
172
@@ -191,6 +199,19 @@ static int mock_get_event(struct cxl_dev_state *cxlds,
191
199
if (!event_log_empty (log ))
192
200
pl -> flags |= CXL_GET_EVENT_FLAG_MORE_RECORDS ;
193
201
202
+ if (log -> nr_overflow ) {
203
+ u64 ns ;
204
+
205
+ pl -> flags |= CXL_GET_EVENT_FLAG_OVERFLOW ;
206
+ pl -> overflow_err_count = cpu_to_le16 (nr_overflow );
207
+ ns = ktime_get_real_ns ();
208
+ ns -= 5000000000 ; /* 5s ago */
209
+ pl -> first_overflow_timestamp = cpu_to_le64 (ns );
210
+ ns = ktime_get_real_ns ();
211
+ ns -= 1000000000 ; /* 1s ago */
212
+ pl -> last_overflow_timestamp = cpu_to_le64 (ns );
213
+ }
214
+
194
215
return 0 ;
195
216
}
196
217
@@ -231,6 +252,9 @@ static int mock_clear_event(struct cxl_dev_state *cxlds,
231
252
}
232
253
}
233
254
255
+ if (log -> nr_overflow )
256
+ log -> nr_overflow = 0 ;
257
+
234
258
/* Clear events */
235
259
log -> clear_idx += pl -> nr_recs ;
236
260
return 0 ;
@@ -353,6 +377,30 @@ static void cxl_mock_add_event_logs(struct mock_event_store *mes)
353
377
(struct cxl_event_record_raw * )& mem_module );
354
378
mes -> ev_status |= CXLDEV_EVENT_STATUS_INFO ;
355
379
380
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & maint_needed );
381
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
382
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL ,
383
+ (struct cxl_event_record_raw * )& dram );
384
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL ,
385
+ (struct cxl_event_record_raw * )& gen_media );
386
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL ,
387
+ (struct cxl_event_record_raw * )& mem_module );
388
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
389
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL ,
390
+ (struct cxl_event_record_raw * )& dram );
391
+ /* Overflow this log */
392
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
393
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
394
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
395
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
396
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
397
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
398
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
399
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
400
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
401
+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
402
+ mes -> ev_status |= CXLDEV_EVENT_STATUS_FAIL ;
403
+
356
404
mes_add_event (mes , CXL_EVENT_TYPE_FATAL , & hardware_replace );
357
405
mes_add_event (mes , CXL_EVENT_TYPE_FATAL ,
358
406
(struct cxl_event_record_raw * )& dram );
0 commit comments