text: // SPDX-License-Identifier: MIT
  /*
   * Copyright © 2019 Intel Corporation
   */
  
  #include "i915_active.h"
  #include "intel_context.h"
  #include "intel_context_param.h"
  #include "intel_ring.h"
  
  int intel_context_set_ring_size(struct intel_context *ce, long sz)
  {
  	int err;
  
  	if (intel_context_lock_pinned(ce))
  		return -EINTR;
  
  	err = i915_active_wait(&ce->active);
  	if (err < 0)
  		goto unlock;
  
  	if (intel_context_is_pinned(ce)) {
  		err = -EBUSY; /* In active use, come back later! */
  		goto unlock;
  	}
  
  	if (test_bit(CONTEXT_ALLOC_BIT, &ce->flags)) {
  		struct intel_ring *ring;
  
  		/* Replace the existing ringbuffer */
  		ring = intel_engine_create_ring(ce->engine, sz);
  		if (IS_ERR(ring)) {
  			err = PTR_ERR(ring);
  			goto unlock;
  		}
  
  		intel_ring_put(ce->ring);
  		ce->ring = ring;
  
  		/* Context image will be updated on next pin */
  	} else {
  		ce->ring = __intel_context_ring_size(sz);
  	}
  
  unlock:
  	intel_context_unlock_pinned(ce);
  	return err;
  }
  
  long intel_context_get_ring_size(struct intel_context *ce)
  {
  	long sz = (unsigned long)READ_ONCE(ce->ring);
  
  	if (test_bit(CONTEXT_ALLOC_BIT, &ce->flags)) {
  		if (intel_context_lock_pinned(ce))
  			return -EINTR;
  
  		sz = ce->ring->size;
  		intel_context_unlock_pinned(ce);
  	}
  
  	return sz;
  }
  