Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915/gem: Reduce ctx->engines_mutex for get_engines()

Take a snapshot of the ctx->engines, so we can avoid taking the
ctx->engines_mutex for a mere read in get_engines().

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Andi Shyti <andi.shyti@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210114135612.13210-4-chris@chris-wilson.co.uk

+8 -31
+8 -31
drivers/gpu/drm/i915/gem/i915_gem_context.c
··· 1843 1843 return 0; 1844 1844 } 1845 1845 1846 - static struct i915_gem_engines * 1847 - __copy_engines(struct i915_gem_engines *e) 1848 - { 1849 - struct i915_gem_engines *copy; 1850 - unsigned int n; 1851 - 1852 - copy = alloc_engines(e->num_engines); 1853 - if (!copy) 1854 - return ERR_PTR(-ENOMEM); 1855 - 1856 - for (n = 0; n < e->num_engines; n++) { 1857 - if (e->engines[n]) 1858 - copy->engines[n] = intel_context_get(e->engines[n]); 1859 - else 1860 - copy->engines[n] = NULL; 1861 - } 1862 - copy->num_engines = n; 1863 - 1864 - return copy; 1865 - } 1866 - 1867 1846 static int 1868 1847 get_engines(struct i915_gem_context *ctx, 1869 1848 struct drm_i915_gem_context_param *args) ··· 1850 1871 struct i915_context_param_engines __user *user; 1851 1872 struct i915_gem_engines *e; 1852 1873 size_t n, count, size; 1874 + bool user_engines; 1853 1875 int err = 0; 1854 1876 1855 - err = mutex_lock_interruptible(&ctx->engines_mutex); 1856 - if (err) 1857 - return err; 1877 + e = __context_engines_await(ctx, &user_engines); 1878 + if (!e) 1879 + return -ENOENT; 1858 1880 1859 - e = NULL; 1860 - if (i915_gem_context_user_engines(ctx)) 1861 - e = __copy_engines(i915_gem_context_engines(ctx)); 1862 - mutex_unlock(&ctx->engines_mutex); 1863 - if (IS_ERR_OR_NULL(e)) { 1881 + if (!user_engines) { 1882 + i915_sw_fence_complete(&e->fence); 1864 1883 args->size = 0; 1865 - return PTR_ERR_OR_ZERO(e); 1884 + return 0; 1866 1885 } 1867 1886 1868 1887 count = e->num_engines; ··· 1911 1934 args->size = size; 1912 1935 1913 1936 err_free: 1914 - free_engines(e); 1937 + i915_sw_fence_complete(&e->fence); 1915 1938 return err; 1916 1939 } 1917 1940