Lines Matching defs:fp
92 #define FP_SLEEP_CHANNEL(fp) (void*)(fp)
93 #define FP_PAUSE_CHANNEL(fp) __DEVOLATILE(void*, &fp->fp_setting)
110 * fp entries garbage list; outstanding entries are cleaned up in the
171 struct fail_point *fe_parent; /**< backpointer to fp */
190 /* Get a ref on an fp's fp_setting */
192 struct fail_point *fp);
194 static inline void fail_point_setting_release_ref(struct fail_point *fp);
205 /* Append fp setting to garbage list */
208 /* Swap fp's setting with fp_setting_new */
210 fail_point_swap_settings(struct fail_point *fp,
215 static inline void fail_point_eval_swap_out(struct fail_point *fp,
219 fail_point_is_off(struct fail_point *fp)
227 fp_setting = fail_point_setting_get_ref(fp);
237 fail_point_setting_release_ref(fp);
244 fail_point_setting_new(struct fail_point *fp)
249 fs_new->fs_parent = fp;
299 /* Get a ref on an fp's fp_setting */
301 fail_point_setting_get_ref(struct fail_point *fp)
306 atomic_add_acq_32(&fp->fp_ref_cnt, 1);
307 fp_setting = fp->fp_setting;
314 fail_point_setting_release_ref(struct fail_point *fp)
317 KASSERT(&fp->fp_ref_cnt > 0, ("Attempting to deref w/no refs"));
318 atomic_subtract_rel_32(&fp->fp_ref_cnt, 1);
321 /* Append fp entries to fp garbage list */
332 /* Swap fp's entries with fp_setting_new */
334 fail_point_swap_settings(struct fail_point *fp,
339 fp_setting_old = fp->fp_setting;
340 fp->fp_setting = fp_setting_new;
346 fail_point_eval_swap_out(struct fail_point *fp,
351 if (fp->fp_setting == fp_setting)
352 fail_point_swap_settings(fp, NULL);
390 fail_point_drain(struct fail_point *fp, int expected_ref)
394 entries = fail_point_swap_settings(fp, NULL);
400 while (fp->fp_ref_cnt > expected_ref) {
401 wakeup(FP_PAUSE_CHANNEL(fp));
402 tsleep(&fp, PWAIT, "fail_point_drain", hz / 100);
404 if (fp->fp_callout)
405 callout_drain(fp->fp_callout);
406 fail_point_swap_settings(fp, entries);
410 fail_point_pause(struct fail_point *fp, enum fail_point_return_code *pret,
414 if (fp->fp_pre_sleep_fn)
415 fp->fp_pre_sleep_fn(fp->fp_pre_sleep_arg);
417 msleep_spin(FP_PAUSE_CHANNEL(fp), mtx_sleep, "failpt", 0);
419 if (fp->fp_post_sleep_fn)
420 fp->fp_post_sleep_fn(fp->fp_post_sleep_arg);
424 fail_point_sleep(struct fail_point *fp, int msecs,
433 if (!(fp->fp_flags & FAIL_POINT_USE_TIMEOUT_PATH)) {
434 if (fp->fp_pre_sleep_fn)
435 fp->fp_pre_sleep_fn(fp->fp_pre_sleep_arg);
437 tsleep(FP_SLEEP_CHANNEL(fp), PWAIT, "failpt", timo);
439 if (fp->fp_post_sleep_fn)
440 fp->fp_post_sleep_fn(fp->fp_post_sleep_arg);
442 if (fp->fp_pre_sleep_fn)
443 fp->fp_pre_sleep_fn(fp->fp_pre_sleep_arg);
445 callout_reset(fp->fp_callout, timo,
446 fp->fp_post_sleep_fn, fp->fp_post_sleep_arg);
466 fail_point_init(struct fail_point *fp, const char *fmt, ...)
472 fp->fp_setting = NULL;
473 fp->fp_flags = 0;
486 fp->fp_name = name;
487 fp->fp_location = "";
488 fp->fp_flags |= FAIL_POINT_DYNAMIC_NAME;
489 fp->fp_pre_sleep_fn = NULL;
490 fp->fp_pre_sleep_arg = NULL;
491 fp->fp_post_sleep_fn = NULL;
492 fp->fp_post_sleep_arg = NULL;
496 fail_point_alloc_callout(struct fail_point *fp)
503 if (fp->fp_callout != NULL)
505 fp->fp_callout = fp_malloc(sizeof(*fp->fp_callout), M_WAITOK);
506 callout_init(fp->fp_callout, CALLOUT_MPSAFE);
512 * function, nor shall you call this multiple times for a given fp.
516 fail_point_destroy(struct fail_point *fp)
519 fail_point_drain(fp, 0);
521 if ((fp->fp_flags & FAIL_POINT_DYNAMIC_NAME) != 0) {
522 fp_free(__DECONST(void *, fp->fp_name));
523 fp->fp_name = NULL;
525 fp->fp_flags = 0;
526 if (fp->fp_callout) {
527 fp_free(fp->fp_callout);
528 fp->fp_callout = NULL;
544 fail_point_eval_nontrivial(struct fail_point *fp, int *return_value)
558 fp_setting = fail_point_setting_get_ref(fp);
592 panic("fail point %s panicking", fp->fp_name);
603 fp->fp_name);
608 printf("fail point %s executing\n", fp->fp_name);
615 fail_point_sleep(fp, msecs, &ret);
628 fail_point_pause(fp, &ret, &fp_setting->feq_mtx);
649 if (fail_point_is_off(fp))
650 fail_point_eval_swap_out(fp, fp_setting);
653 fail_point_setting_release_ref(fp);
662 fail_point_get(struct fail_point *fp, struct sbuf *sb,
679 fp_setting = fail_point_setting_get_ref(fp);
693 fail_point_setting_release_ref(fp);
734 sleepq_sbuf_print_stacks(sb, FP_SLEEP_CHANNEL(fp), 0,
744 sleepq_sbuf_print_stacks(sb, FP_PAUSE_CHANNEL(fp), 0,
759 fail_point_set(struct fail_point *fp, char *buf)
776 fail_point_setting_get_ref(fp);
777 entries = fail_point_setting_new(fp);
820 } else if (ent->fe_type == FAIL_POINT_SLEEP && (fp->fp_flags &
836 entries = fail_point_swap_settings(fp, NULL);
838 wakeup(FP_PAUSE_CHANNEL(fp));
841 wakeup(FP_PAUSE_CHANNEL(fp));
842 fail_point_swap_settings(fp, entries);
849 fp->fp_name, fp->fp_location, buf);
852 fp->fp_name, fp->fp_location, buf);
855 fail_point_setting_release_ref(fp);
867 struct fail_point *fp;
874 fp = arg1;
901 error = fail_point_set(fp, buf);
908 fail_point_get(fp, &sb, false);
923 struct fail_point *fp;
926 fp = arg1;
935 fail_point_get(fp, &sb, true);