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]);
+       struct dma_fence_array_cb *cb = array->callbacks;
        unsigned i;
 
        for (i = 0; i < array->num_fences; ++i) {
                                               bool signal_on_any)
 {
        struct dma_fence_array *array;
-       size_t size = sizeof(*array);
 
        WARN_ON(!num_fences || !fences);
 
-       /* Allocate the callback structures behind the array. */
-       size += num_fences * sizeof(struct dma_fence_array_cb);
-       array = kzalloc(size, GFP_KERNEL);
+       array = kzalloc(struct_size(array, callbacks, num_fences), GFP_KERNEL);
        if (!array)
                return NULL;
 
+       array->num_fences = num_fences;
+
        spin_lock_init(&array->lock);
        dma_fence_init(&array->base, &dma_fence_array_ops, &array->lock,
                       context, seqno);
        init_irq_work(&array->work, irq_dma_fence_array_work);
 
-       array->num_fences = num_fences;
        atomic_set(&array->num_pending, signal_on_any ? 1 : num_fences);
        array->fences = fences;
 
 
  * @num_pending: fences in the array still pending
  * @fences: array of the fences
  * @work: internal irq_work function
+ * @callbacks: array of callback helpers
  */
 struct dma_fence_array {
        struct dma_fence base;
        struct dma_fence **fences;
 
        struct irq_work work;
+
+       struct dma_fence_array_cb callbacks[] __counted_by(num_fences);
 };
 
 /**