/* * SPDX-License-Identifier: MIT * * Copyright © 2016 Intel Corporation */ #include <linux/dma-fence-array.h> #include <linux/dma-fence-chain.h> #include <linux/jiffies.h> #include "gt/intel_engine.h" #include "gt/intel_rps.h" #include "i915_gem_ioctls.h" #include "i915_gem_object.h" static long i915_gem_object_wait_fence(struct dma_fence *fence, unsigned int flags, long timeout) { … } static void i915_gem_object_boost(struct dma_resv *resv, unsigned int flags) { … } static long i915_gem_object_wait_reservation(struct dma_resv *resv, unsigned int flags, long timeout) { … } static void fence_set_priority(struct dma_fence *fence, const struct i915_sched_attr *attr) { … } static inline bool __dma_fence_is_chain(const struct dma_fence *fence) { … } void i915_gem_fence_wait_priority(struct dma_fence *fence, const struct i915_sched_attr *attr) { … } int i915_gem_object_wait_priority(struct drm_i915_gem_object *obj, unsigned int flags, const struct i915_sched_attr *attr) { … } /** * i915_gem_object_wait - Waits for rendering to the object to be completed * @obj: i915 gem object * @flags: how to wait (under a lock, for all rendering or just for writes etc) * @timeout: how long to wait */ int i915_gem_object_wait(struct drm_i915_gem_object *obj, unsigned int flags, long timeout) { … } static inline unsigned long nsecs_to_jiffies_timeout(const u64 n) { … } static unsigned long to_wait_timeout(s64 timeout_ns) { … } /** * i915_gem_wait_ioctl - implements DRM_IOCTL_I915_GEM_WAIT * @dev: drm device pointer * @data: ioctl data blob * @file: drm file pointer * * Returns 0 if successful, else an error is returned with the remaining time in * the timeout parameter. * -ETIME: object is still busy after timeout * -ERESTARTSYS: signal interrupted the wait * -ENONENT: object doesn't exist * Also possible, but rare: * -EAGAIN: incomplete, restart syscall * -ENOMEM: damn * -ENODEV: Internal IRQ fail * -E?: The add request failed * * The wait ioctl with a timeout of 0 reimplements the busy ioctl. With any * non-zero timeout parameter the wait ioctl will wait for the given number of * nanoseconds on an object becoming unbusy. Since the wait itself does so * without holding struct_mutex the object may become re-busied before this * function completes. A similar but shorter * race condition exists in the busy * ioctl */ int i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file) { … } /** * i915_gem_object_wait_migration - Sync an accelerated migration operation * @obj: The migrating object. * @flags: waiting flags. Currently supports only I915_WAIT_INTERRUPTIBLE. * * Wait for any pending async migration operation on the object, * whether it's explicitly (i915_gem_object_migrate()) or implicitly * (swapin, initial clearing) initiated. * * Return: 0 if successful, -ERESTARTSYS if a signal was hit during waiting. */ int i915_gem_object_wait_migration(struct drm_i915_gem_object *obj, unsigned int flags) { … }