cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

i915_sw_fence_work.h (1716B)


      1/* SPDX-License-Identifier: MIT */
      2
      3/*
      4 * Copyright © 2019 Intel Corporation
      5 */
      6
      7#ifndef I915_SW_FENCE_WORK_H
      8#define I915_SW_FENCE_WORK_H
      9
     10#include <linux/dma-fence.h>
     11#include <linux/spinlock.h>
     12#include <linux/workqueue.h>
     13
     14#include "i915_sw_fence.h"
     15
     16struct dma_fence_work;
     17
     18struct dma_fence_work_ops {
     19	const char *name;
     20	void (*work)(struct dma_fence_work *f);
     21	void (*release)(struct dma_fence_work *f);
     22};
     23
     24struct dma_fence_work {
     25	struct dma_fence dma;
     26	spinlock_t lock;
     27
     28	struct i915_sw_fence chain;
     29	struct i915_sw_dma_fence_cb cb;
     30
     31	struct work_struct work;
     32	const struct dma_fence_work_ops *ops;
     33};
     34
     35enum {
     36	DMA_FENCE_WORK_IMM = DMA_FENCE_FLAG_USER_BITS,
     37};
     38
     39void dma_fence_work_init(struct dma_fence_work *f,
     40			 const struct dma_fence_work_ops *ops);
     41int dma_fence_work_chain(struct dma_fence_work *f, struct dma_fence *signal);
     42
     43static inline void dma_fence_work_commit(struct dma_fence_work *f)
     44{
     45	i915_sw_fence_commit(&f->chain);
     46}
     47
     48/**
     49 * dma_fence_work_commit_imm: Commit the fence, and if possible execute locally.
     50 * @f: the fenced worker
     51 *
     52 * Instead of always scheduling a worker to execute the callback (see
     53 * dma_fence_work_commit()), we try to execute the callback immediately in
     54 * the local context. It is required that the fence be committed before it
     55 * is published, and that no other threads try to tamper with the number
     56 * of asynchronous waits on the fence (or else the callback will be
     57 * executed in the wrong context, i.e. not the callers).
     58 */
     59static inline void dma_fence_work_commit_imm(struct dma_fence_work *f)
     60{
     61	if (atomic_read(&f->chain.pending) <= 1)
     62		__set_bit(DMA_FENCE_WORK_IMM, &f->dma.flags);
     63
     64	dma_fence_work_commit(f);
     65}
     66
     67#endif /* I915_SW_FENCE_WORK_H */