Lines Matching refs:cxt

321 	struct psz_context *cxt = &pstore_zone_cxt;
324 if (cxt->ppsz)
325 ret |= psz_flush_dirty_zone(cxt->ppsz);
326 if (cxt->cpsz)
327 ret |= psz_flush_dirty_zone(cxt->cpsz);
328 if (cxt->kpszs)
329 ret |= psz_flush_dirty_zones(cxt->kpszs, cxt->kmsg_max_cnt);
330 if (cxt->fpszs)
331 ret |= psz_flush_dirty_zones(cxt->fpszs, cxt->ftrace_max_cnt);
332 if (cxt->bpsz)
333 ret |= psz_flush_dirty_zone(cxt->bpsz);
334 if (ret && cxt->pstore_zone_info)
338 static int psz_kmsg_recover_data(struct psz_context *cxt)
340 struct pstore_zone_info *info = cxt->pstore_zone_info;
349 for (i = 0; i < cxt->kmsg_max_cnt; i++) {
350 zone = cxt->kpszs[i];
354 unsigned int wcnt = cxt->kmsg_write_cnt;
355 struct pstore_zone *new = cxt->kpszs[wcnt];
364 cxt->kmsg_write_cnt = (wcnt + 1) % cxt->kmsg_max_cnt;
377 static int psz_kmsg_recover_meta(struct psz_context *cxt)
379 struct pstore_zone_info *info = cxt->pstore_zone_info;
397 for (i = 0; i < cxt->kmsg_max_cnt; i++) {
398 zone = cxt->kpszs[i];
438 cxt->kmsg_write_cnt = (i + 1) % cxt->kmsg_max_cnt;
442 cxt->oops_counter =
443 max(cxt->oops_counter, hdr->counter);
445 cxt->panic_counter =
446 max(cxt->panic_counter, hdr->counter);
466 static int psz_kmsg_recover(struct psz_context *cxt)
470 if (!cxt->kpszs)
473 ret = psz_kmsg_recover_meta(cxt);
477 ret = psz_kmsg_recover_data(cxt);
487 static int psz_recover_zone(struct psz_context *cxt, struct pstore_zone *zone)
489 struct pstore_zone_info *info = cxt->pstore_zone_info;
574 static int psz_recover_zones(struct psz_context *cxt,
588 ret = psz_recover_zone(cxt, zone);
601 * @cxt: the context of pstore/zone
607 static inline int psz_recovery(struct psz_context *cxt)
611 if (atomic_read(&cxt->recovered))
614 ret = psz_kmsg_recover(cxt);
618 ret = psz_recover_zone(cxt, cxt->ppsz);
622 ret = psz_recover_zone(cxt, cxt->cpsz);
626 ret = psz_recover_zone(cxt, cxt->bpsz);
630 ret = psz_recover_zones(cxt, cxt->fpszs, cxt->ftrace_max_cnt);
637 atomic_set(&cxt->recovered, 1);
644 struct psz_context *cxt = psi->data;
646 cxt->kmsg_read_cnt = 0;
647 cxt->pmsg_read_cnt = 0;
648 cxt->console_read_cnt = 0;
649 cxt->ftrace_read_cnt = 0;
650 cxt->blackbox_read_cnt = 0;
668 static inline int psz_kmsg_erase(struct psz_context *cxt,
685 if (cxt->pstore_zone_info->erase)
686 return cxt->pstore_zone_info->erase(size, zone->off);
691 static inline int psz_record_erase(struct psz_context *cxt,
712 struct psz_context *cxt = record->psi->data;
716 if (record->id >= cxt->kmsg_max_cnt)
718 return psz_kmsg_erase(cxt, cxt->kpszs[record->id], record);
720 return psz_record_erase(cxt, cxt->ppsz);
722 return psz_record_erase(cxt, cxt->cpsz);
724 if (record->id >= cxt->ftrace_max_cnt)
726 return psz_record_erase(cxt, cxt->fpszs[record->id]);
728 return psz_record_erase(cxt, cxt->bpsz);
736 struct psz_context *cxt = record->psi->data;
747 hdr->counter = ++cxt->oops_counter;
749 hdr->counter = ++cxt->panic_counter;
756 * start at cxt->kmsg_write_cnt.
758 static inline int notrace psz_kmsg_write_record(struct psz_context *cxt,
765 for (i = 0; i < cxt->kmsg_max_cnt; i++) {
769 zonenum = (cxt->kmsg_write_cnt + i) % cxt->kmsg_max_cnt;
770 zone = cxt->kpszs[zonenum];
790 cxt->kmsg_write_cnt = zonenum + 1;
791 cxt->kmsg_write_cnt %= cxt->kmsg_max_cnt;
808 static int notrace psz_kmsg_write(struct psz_context *cxt,
822 if (!cxt->kpszs)
825 ret = psz_kmsg_write_record(cxt, record);
887 struct psz_context *cxt = record->psi->data;
891 atomic_set(&cxt->on_panic, 1);
902 return psz_kmsg_write(cxt, record);
904 return psz_record_write(cxt->cpsz, record);
906 return psz_record_write(cxt->ppsz, record);
910 if (!cxt->fpszs)
912 return psz_record_write(cxt->fpszs[zonenum], record);
915 return psz_record_write(cxt->bpsz, record);
921 static struct pstore_zone *psz_read_next_zone(struct psz_context *cxt)
925 while (cxt->kmsg_read_cnt < cxt->kmsg_max_cnt) {
926 zone = cxt->kpszs[cxt->kmsg_read_cnt++];
931 if (cxt->ftrace_read_cnt < cxt->ftrace_max_cnt)
937 return cxt->fpszs[cxt->ftrace_read_cnt++];
939 if (cxt->pmsg_read_cnt == 0) {
940 cxt->pmsg_read_cnt++;
941 zone = cxt->ppsz;
946 if (cxt->console_read_cnt == 0) {
947 cxt->console_read_cnt++;
948 zone = cxt->cpsz;
953 if (cxt->blackbox_read_cnt == 0) {
954 cxt->blackbox_read_cnt++;
955 zone = cxt->bpsz;
1024 struct psz_context *cxt;
1044 cxt = record->psi->data;
1045 if (cxt->ftrace_read_cnt < cxt->ftrace_max_cnt)
1080 struct psz_context *cxt = record->psi->data;
1087 ret = psz_recovery(cxt);
1092 zone = psz_read_next_zone(cxt);
1100 record->id = cxt->kmsg_read_cnt - 1;
1161 static void psz_free_all_zones(struct psz_context *cxt)
1163 if (cxt->kpszs)
1164 psz_free_zones(&cxt->kpszs, &cxt->kmsg_max_cnt);
1165 if (cxt->ppsz)
1166 psz_free_zone(&cxt->ppsz);
1167 if (cxt->cpsz)
1168 psz_free_zone(&cxt->cpsz);
1169 if (cxt->fpszs)
1170 psz_free_zones(&cxt->fpszs, &cxt->ftrace_max_cnt);
1171 if (cxt->bpsz)
1172 psz_free_zone(&cxt->bpsz);
1259 static int psz_alloc_zones(struct psz_context *cxt)
1261 struct pstore_zone_info *info = cxt->pstore_zone_info;
1267 cxt->ppsz = psz_init_zone(PSTORE_TYPE_PMSG, &off, info->pmsg_size);
1268 if (IS_ERR(cxt->ppsz)) {
1269 err = PTR_ERR(cxt->ppsz);
1270 cxt->ppsz = NULL;
1275 cxt->cpsz = psz_init_zone(PSTORE_TYPE_CONSOLE, &off,
1277 if (IS_ERR(cxt->cpsz)) {
1278 err = PTR_ERR(cxt->cpsz);
1279 cxt->cpsz = NULL;
1284 cxt->fpszs = psz_init_zones(PSTORE_TYPE_FTRACE, &off,
1287 &cxt->ftrace_max_cnt);
1288 if (IS_ERR(cxt->fpszs)) {
1289 err = PTR_ERR(cxt->fpszs);
1290 cxt->fpszs = NULL;
1295 cxt->bpsz = psz_init_zone(PSTORE_TYPE_BLACKBOX, &off,
1297 if (IS_ERR(cxt->bpsz)) {
1298 err = PTR_ERR(cxt->bpsz);
1299 cxt->bpsz = NULL;
1303 cxt->kpszs = psz_init_zones(PSTORE_TYPE_DMESG, &off,
1305 info->kmsg_size, &cxt->kmsg_max_cnt);
1306 if (IS_ERR(cxt->kpszs)) {
1307 err = PTR_ERR(cxt->kpszs);
1308 cxt->kpszs = NULL;
1314 psz_free_all_zones(cxt);
1330 struct psz_context *cxt = &pstore_zone_cxt;
1377 mutex_lock(&cxt->pstore_zone_info_lock);
1378 if (cxt->pstore_zone_info) {
1380 cxt->pstore_zone_info->name, info->name);
1381 mutex_unlock(&cxt->pstore_zone_info_lock);
1384 cxt->pstore_zone_info = info;
1394 err = psz_alloc_zones(cxt);
1401 cxt->pstore.bufsize = cxt->kpszs[0]->buffer_size -
1403 cxt->pstore.buf = kzalloc(cxt->pstore.bufsize, GFP_KERNEL);
1404 if (!cxt->pstore.buf) {
1409 cxt->pstore.data = cxt;
1412 cxt->pstore.max_reason = info->max_reason;
1413 cxt->pstore.name = info->name;
1415 cxt->pstore.flags |= PSTORE_FLAGS_DMESG;
1417 kmsg_dump_reason_str(cxt->pstore.max_reason));
1418 if (cxt->pstore_zone_info->panic_write)
1423 cxt->pstore.flags |= PSTORE_FLAGS_PMSG;
1427 cxt->pstore.flags |= PSTORE_FLAGS_CONSOLE;
1431 cxt->pstore.flags |= PSTORE_FLAGS_FTRACE;
1435 cxt->pstore.flags |= PSTORE_FLAGS_BLACKBOX;
1440 err = pstore_register(&cxt->pstore);
1450 kfree(cxt->pstore.buf);
1451 cxt->pstore.buf = NULL;
1452 cxt->pstore.bufsize = 0;
1453 psz_free_all_zones(cxt);
1468 struct psz_context *cxt = &pstore_zone_cxt;
1470 mutex_lock(&cxt->pstore_zone_info_lock);
1471 if (!cxt->pstore_zone_info) {
1472 mutex_unlock(&cxt->pstore_zone_info_lock);
1477 pstore_unregister(&cxt->pstore);
1484 kfree(cxt->pstore.buf);
1485 cxt->pstore.buf = NULL;
1486 cxt->pstore.bufsize = 0;
1487 cxt->pstore_zone_info = NULL;
1489 psz_free_all_zones(cxt);
1492 cxt->oops_counter = 0;
1493 cxt->panic_counter = 0;
1494 atomic_set(&cxt->recovered, 0);
1495 atomic_set(&cxt->on_panic, 0);
1497 mutex_unlock(&cxt->pstore_zone_info_lock);