for (i = 0; i < fc->chain_length; i++) {
dma_fence_signal(fc->fences[i]);
dma_fence_put(fc->fences[i]);
}
kvfree(fc->fences);
for (i = 0; i < fc->chain_length; i++)
dma_fence_put(fc->chains[i]);
kvfree(fc->chains);
}
staticint find_seqno(void *arg)
{ struct fence_chains fc; struct dma_fence *fence; int err; int i;
err = fence_chains_init(&fc, 64, seqno_inc); if (err) return err;
fence = dma_fence_get(fc.tail);
err = dma_fence_chain_find_seqno(&fence, 0);
dma_fence_put(fence); if (err) {
pr_err("Reported %d for find_seqno(0)!\n", err); goto err;
}
for (i = 0; i < fc.chain_length; i++) {
fence = dma_fence_get(fc.tail);
err = dma_fence_chain_find_seqno(&fence, i + 1);
dma_fence_put(fence); if (err) {
pr_err("Reported %d for find_seqno(%d:%d)!\n",
err, fc.chain_length + 1, i + 1); goto err;
} if (fence != fc.chains[i]) {
pr_err("Incorrect fence reported by find_seqno(%d:%d)\n",
fc.chain_length + 1, i + 1);
err = -EINVAL; goto err;
}
dma_fence_get(fence);
err = dma_fence_chain_find_seqno(&fence, i + 1);
dma_fence_put(fence); if (err) {
pr_err("Error reported for finding self\n"); goto err;
} if (fence != fc.chains[i]) {
pr_err("Incorrect fence reported by find self\n");
err = -EINVAL; goto err;
}
dma_fence_get(fence);
err = dma_fence_chain_find_seqno(&fence, i + 2);
dma_fence_put(fence); if (!err) {
pr_err("Error not reported for future fence: find_seqno(%d:%d)!\n",
i + 1, i + 2);
err = -EINVAL; goto err;
}
dma_fence_get(fence);
err = dma_fence_chain_find_seqno(&fence, i);
dma_fence_put(fence); if (err) {
pr_err("Error reported for previous fence!\n"); goto err;
} if (i > 0 && fence != fc.chains[i - 1]) {
pr_err("Incorrect fence reported by find_seqno(%d:%d)\n",
i + 1, i);
err = -EINVAL; goto err;
}
}
err = fence_chains_init(&fc, 3, seqno_inc); if (err) return err;
dma_fence_signal(fc.fences[1]);
fence = dma_fence_get(fc.tail);
err = dma_fence_chain_find_seqno(&fence, 2);
dma_fence_put(fence); if (err) {
pr_err("Reported %d for find_seqno()!\n", err); goto err;
}
/* * We signaled the middle fence (2) of the 1-2-3 chain. The behavior * of the dma-fence-chain is to make us wait for all the fences up to * the point we want. Since fence 1 is still not signaled, this what * we should get as fence to wait upon (fence 2 being garbage * collected during the traversal of the chain).
*/ if (fence != fc.chains[0]) {
pr_err("Incorrect chain-fence.seqno:%lld reported for completed seqno:2\n",
fence ? fence->seqno : 0);
err = dma_fence_chain_find_seqno(&fence, seqno); if (err) {
pr_err("Failed to find fence seqno:%d\n",
seqno);
dma_fence_put(fence); break;
} if (!fence) goto signal;
/* * We can only find ourselves if we are on fence we were * looking for.
*/ if (fence->seqno == seqno) {
err = dma_fence_chain_find_seqno(&fence, seqno); if (err) {
pr_err("Reported an invalid fence for find-self:%d\n",
seqno);
dma_fence_put(fence); break;
}
}
ret = kthread_stop_put(threads[i]); if (ret && !err)
err = ret;
}
kfree(threads);
count = 0; for (i = 0; i < data.fc.chain_length; i++) if (dma_fence_is_signaled(data.fc.fences[i]))
count++;
pr_info("Completed %lu cycles\n", count);
err:
fence_chains_fini(&data.fc); return err;
}
staticint signal_forward(void *arg)
{ struct fence_chains fc; int err; int i;
err = fence_chains_init(&fc, 64, seqno_inc); if (err) return err;
for (i = 0; i < fc.chain_length; i++) {
dma_fence_signal(fc.fences[i]);
if (!dma_fence_is_signaled(fc.chains[i])) {
pr_err("chain[%d] not signaled!\n", i);
err = -EINVAL; goto err;
}
if (i + 1 < fc.chain_length &&
dma_fence_is_signaled(fc.chains[i + 1])) {
pr_err("chain[%d] is signaled!\n", i);
err = -EINVAL; goto err;
}
}
err:
fence_chains_fini(&fc); return err;
}
staticint signal_backward(void *arg)
{ struct fence_chains fc; int err; int i;
err = fence_chains_init(&fc, 64, seqno_inc); if (err) return err;
for (i = fc.chain_length; i--; ) {
dma_fence_signal(fc.fences[i]);
if (i > 0 && dma_fence_is_signaled(fc.chains[i])) {
pr_err("chain[%d] is signaled!\n", i);
err = -EINVAL; goto err;
}
}
for (i = 0; i < fc.chain_length; i++) { if (!dma_fence_is_signaled(fc.chains[i])) {
pr_err("chain[%d] was not signaled!\n", i);
err = -EINVAL; goto err;
}
}
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.