cregit-Linux how code gets into the kernel

Release 4.11 drivers/dma-buf/dma-fence-array.c

Directory: drivers/dma-buf
/*
 * dma-fence-array: aggregate fences to be waited together
 *
 * Copyright (C) 2016 Collabora Ltd
 * Copyright (C) 2016 Advanced Micro Devices, Inc.
 * Authors:
 *      Gustavo Padovan <gustavo@padovan.org>
 *      Christian König <christian.koenig@amd.com>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 */

#include <linux/export.h>
#include <linux/slab.h>
#include <linux/dma-fence-array.h>


static const char *dma_fence_array_get_driver_name(struct dma_fence *fence) { return "dma_fence_array"; }

Contributors

PersonTokensPropCommitsCommitProp
Gustavo Fernando Padovan1381.25%150.00%
Chris Wilson318.75%150.00%
Total16100.00%2100.00%


static const char *dma_fence_array_get_timeline_name(struct dma_fence *fence) { return "unbound"; }

Contributors

PersonTokensPropCommitsCommitProp
Gustavo Fernando Padovan1487.50%150.00%
Chris Wilson212.50%150.00%
Total16100.00%2100.00%


static void dma_fence_array_cb_func(struct dma_fence *f, struct dma_fence_cb *cb) { struct dma_fence_array_cb *array_cb = container_of(cb, struct dma_fence_array_cb, cb); struct dma_fence_array *array = array_cb->array; if (atomic_dec_and_test(&array->num_pending)) dma_fence_signal(&array->base); dma_fence_put(&array->base); }

Contributors

PersonTokensPropCommitsCommitProp
Gustavo Fernando Padovan5177.27%133.33%
Chris Wilson812.12%133.33%
Christian König710.61%133.33%
Total66100.00%3100.00%


static bool dma_fence_array_enable_signaling(struct dma_fence *fence) { struct dma_fence_array *array = to_dma_fence_array(fence); struct dma_fence_array_cb *cb = (void *)(&array[1]); unsigned i; for (i = 0; i < array->num_fences; ++i) { cb[i].array = array; /* * As we may report that the fence is signaled before all * callbacks are complete, we need to take an additional * reference count on the array so that we do not free it too * early. The core fence handling will only hold the reference * until we signal the array as complete (but that is now * insufficient). */ dma_fence_get(&array->base); if (dma_fence_add_callback(array->fences[i], &cb[i].cb, dma_fence_array_cb_func)) { dma_fence_put(&array->base); if (atomic_dec_and_test(&array->num_pending)) return false; } } return true; }

Contributors

PersonTokensPropCommitsCommitProp
Gustavo Fernando Padovan9879.03%133.33%
Christian König1713.71%133.33%
Chris Wilson97.26%133.33%
Total124100.00%3100.00%


static bool dma_fence_array_signaled(struct dma_fence *fence) { struct dma_fence_array *array = to_dma_fence_array(fence); return atomic_read(&array->num_pending) <= 0; }

Contributors

PersonTokensPropCommitsCommitProp
Gustavo Fernando Padovan2784.38%133.33%
Chris Wilson412.50%133.33%
Christian König13.12%133.33%
Total32100.00%3100.00%


static void dma_fence_array_release(struct dma_fence *fence) { struct dma_fence_array *array = to_dma_fence_array(fence); unsigned i; for (i = 0; i < array->num_fences; ++i) dma_fence_put(array->fences[i]); kfree(array->fences); dma_fence_free(fence); }

Contributors

PersonTokensPropCommitsCommitProp
Gustavo Fernando Padovan5590.16%150.00%
Chris Wilson69.84%150.00%
Total61100.00%2100.00%

const struct dma_fence_ops dma_fence_array_ops = { .get_driver_name = dma_fence_array_get_driver_name, .get_timeline_name = dma_fence_array_get_timeline_name, .enable_signaling = dma_fence_array_enable_signaling, .signaled = dma_fence_array_signaled, .wait = dma_fence_default_wait, .release = dma_fence_array_release, }; EXPORT_SYMBOL(dma_fence_array_ops); /** * dma_fence_array_create - Create a custom fence array * @num_fences: [in] number of fences to add in the array * @fences: [in] array containing the fences * @context: [in] fence context to use * @seqno: [in] sequence number to use * @signal_on_any: [in] signal on any fence in the array * * Allocate a dma_fence_array object and initialize the base fence with * dma_fence_init(). * In case of error it returns NULL. * * The caller should allocate the fences array with num_fences size * and fill it with the fences it wants to add to the object. Ownership of this * array is taken and dma_fence_put() is used on each fence on release. * * If @signal_on_any is true the fence array signals if any fence in the array * signals, otherwise it signals when all fences in the array signal. */
struct dma_fence_array *dma_fence_array_create(int num_fences, struct dma_fence **fences, u64 context, unsigned seqno, bool signal_on_any) { struct dma_fence_array *array; size_t size = sizeof(*array); /* Allocate the callback structures behind the array. */ size += num_fences * sizeof(struct dma_fence_array_cb); array = kzalloc(size, GFP_KERNEL); if (!array) return NULL; spin_lock_init(&array->lock); dma_fence_init(&array->base, &dma_fence_array_ops, &array->lock, context, seqno); array->num_fences = num_fences; atomic_set(&array->num_pending, signal_on_any ? 1 : num_fences); array->fences = fences; return array; }

Contributors

PersonTokensPropCommitsCommitProp
Gustavo Fernando Padovan11088.71%133.33%
Christian König75.65%133.33%
Chris Wilson75.65%133.33%
Total124100.00%3100.00%

EXPORT_SYMBOL(dma_fence_array_create);

Overall Contributors

PersonTokensPropCommitsCommitProp
Gustavo Fernando Padovan41383.10%250.00%
Chris Wilson5210.46%125.00%
Christian König326.44%125.00%
Total497100.00%4100.00%
Directory: drivers/dma-buf
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.