@@ -1913,6 +1913,8 @@ void i915_gem_track_fb(struct drm_i915_gem_object *old,
* an emission time with seqnos for tracking how far ahead of the GPU we are.
*/
struct drm_i915_gem_request {
+ struct kref ref;
+
/** On Which ring this request was generated */
struct intel_engine_cs *ring;
@@ -1942,6 +1944,20 @@ struct drm_i915_gem_request {
struct list_head client_list;
};
+void i915_gem_request_free(struct kref *req_ref);
+
+static inline void
+i915_gem_request_reference(struct drm_i915_gem_request *req)
+{
+ kref_get(&req->ref);
+}
+
+static inline void
+i915_gem_request_unreference(struct drm_i915_gem_request *req)
+{
+ kref_put(&req->ref, i915_gem_request_free);
+}
+
struct drm_i915_file_private {
struct drm_i915_private *dev_priv;
struct drm_file *file;
@@ -2379,6 +2379,8 @@ int __i915_add_request(struct intel_engine_cs *ring,
return ret;
}
+ i915_gem_request_reference(request);
+
request->seqno = intel_ring_get_seqno(ring);
request->ring = ring;
request->head = request_start;
@@ -2495,12 +2497,22 @@ static void i915_set_reset_status(struct drm_i915_private *dev_priv,
static void i915_gem_free_request(struct drm_i915_gem_request *request)
{
list_del(&request->list);
- i915_gem_request_remove_from_client(request);
- if (request->ctx)
- i915_gem_context_unreference(request->ctx);
+ i915_gem_request_unreference(request);
+}
+
+void i915_gem_request_free(struct kref *req_ref)
+{
+ struct drm_i915_gem_request *req = container_of(req_ref,
+ typeof(*req), ref);
+
+ /*list_del(&req->list);*/
+ i915_gem_request_remove_from_client(req);
+
+ if (req->ctx)
+ i915_gem_context_unreference(req->ctx);
- kfree(request);
+ kfree(req);
}
struct drm_i915_gem_request *
@@ -814,6 +814,8 @@ static int logical_ring_alloc_seqno(struct intel_engine_cs *ring,
if (request == NULL)
return -ENOMEM;
+ kref_init(&request->ref);
+
ret = i915_gem_get_seqno(ring->dev, &ring->outstanding_lazy_seqno);
if (ret) {
kfree(request);
@@ -2019,6 +2019,8 @@ intel_ring_alloc_seqno(struct intel_engine_cs *ring)
if (request == NULL)
return -ENOMEM;
+ kref_init(&request->ref);
+
ret = i915_gem_get_seqno(ring->dev, &ring->outstanding_lazy_seqno);
if (ret) {
kfree(request);