/* Submit requests and inject errors forcing G2H to be dropped */ for (i = 0; i < 3; ++i) {
ce = intel_context_create(engine); if (IS_ERR(ce)) {
ret = PTR_ERR(ce);
gt_err(gt, "Failed to create context %d: %pe\n", i, ce); goto err;
}
/* GT will not idle if G2H are lost */
ret = intel_gt_wait_for_idle(gt, HZ); if (ret < 0) {
gt_err(gt, "GT failed to idle: %pe\n", ERR_PTR(ret)); goto err;
}
err: for (i = 0; i < 3; ++i) if (last[i])
i915_request_put(last[i]);
intel_runtime_pm_put(gt->uncore->rpm, wakeref);
/* Create spinner to block requests in below loop */
ce[context_index] = intel_context_create(engine); if (IS_ERR(ce[context_index])) {
ret = PTR_ERR(ce[context_index]);
guc_err(guc, "Failed to create context: %pe\n", ce[context_index]);
ce[context_index] = NULL; goto err_wakeref;
}
ret = igt_spinner_init(&spin, engine->gt); if (ret) {
guc_err(guc, "Failed to create spinner: %pe\n", ERR_PTR(ret)); goto err_contexts;
}
spin_rq = igt_spinner_create_request(&spin, ce[context_index],
MI_ARB_CHECK); if (IS_ERR(spin_rq)) {
ret = PTR_ERR(spin_rq);
guc_err(guc, "Failed to create spinner request: %pe\n", spin_rq); goto err_contexts;
}
ret = request_add_spin(spin_rq, &spin); if (ret) {
guc_err(guc, "Failed to add Spinner request: %pe\n", ERR_PTR(ret)); goto err_spin_rq;
}
/* Use all guc_ids */ while (ret != -EAGAIN) {
ce[++context_index] = intel_context_create(engine); if (IS_ERR(ce[context_index])) {
ret = PTR_ERR(ce[context_index]);
guc_err(guc, "Failed to create context: %pe\n", ce[context_index]);
ce[context_index--] = NULL; goto err_spin_rq;
}
rq = nop_user_request(ce[context_index], spin_rq); if (IS_ERR(rq)) {
ret = PTR_ERR(rq);
rq = NULL; if ((ret != -EAGAIN) || !last) {
guc_err(guc, "Failed to create %srequest %d: %pe\n",
last ? "" : "first ", context_index, ERR_PTR(ret)); goto err_spin_rq;
}
} else { if (last)
i915_request_put(last);
last = rq;
}
}
/* Release blocked requests */
igt_spinner_end(&spin);
ret = intel_selftest_wait_for_rq(spin_rq); if (ret) {
guc_err(guc, "Spin request failed to complete: %pe\n", ERR_PTR(ret));
i915_request_put(last); goto err_spin_rq;
}
i915_request_put(spin_rq);
igt_spinner_fini(&spin);
spin_rq = NULL;
/* Wait for last request */
ret = i915_request_wait(last, 0, HZ * 30);
i915_request_put(last); if (ret < 0) {
guc_err(guc, "Last request failed to complete: %pe\n", ERR_PTR(ret)); goto err_spin_rq;
}
/* Try to steal guc_id */
rq = nop_user_request(ce[context_index], NULL); if (IS_ERR(rq)) {
ret = PTR_ERR(rq);
guc_err(guc, "Failed to steal guc_id %d: %pe\n", context_index, rq); goto err_spin_rq;
}
/* Wait for request with stolen guc_id */
ret = i915_request_wait(rq, 0, HZ);
i915_request_put(rq); if (ret < 0) {
guc_err(guc, "Request with stolen guc_id failed to complete: %pe\n", ERR_PTR(ret)); goto err_spin_rq;
}
/* Wait for idle */
ret = intel_gt_wait_for_idle(gt, HZ * 30); if (ret < 0) {
guc_err(guc, "GT failed to idle: %pe\n", ERR_PTR(ret)); goto err_spin_rq;
}
/* Verify a guc_id was stolen */ if (guc->number_guc_id_stolen == number_guc_id_stolen) {
guc_err(guc, "No guc_id was stolen");
ret = -EINVAL;
} else {
ret = 0;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.