Quoting Matthew Auld (2020-11-27 12:06:08) > +int > +i915_gem_create_ioctl(struct drm_device *dev, void *data, > + struct drm_file *file) > +{ > + struct drm_i915_private *i915 = to_i915(dev); > + struct create_ext ext_data = { .i915 = i915 }; > + struct drm_i915_gem_create_ext *args = data; > + int ret; > + > + i915_gem_flush_free_objects(i915); > + > + ret = i915_user_extensions(u64_to_user_ptr(args->extensions), > + create_extensions, > + ARRAY_SIZE(create_extensions), > + &ext_data); > + if (ret) > + goto err_free; > + > + if (!ext_data.placements) { > + struct intel_memory_region **placements; > + enum intel_memory_type mem_type = INTEL_MEMORY_SYSTEM; > + > + placements = kmalloc(sizeof(struct intel_memory_region *), > + GFP_KERNEL); > + if (!placements) > + return -ENOMEM; > + > + placements[0] = intel_memory_region_by_type(i915, mem_type); > + > + ext_data.placements = placements; > + ext_data.n_placements = 1; > + } > + > + ret = i915_gem_create(file, > + ext_data.placements, > + ext_data.n_placements, > + &args->size, &args->handle); > + if (!ret) > + return 0; Applying the extensions has to happen after creating the vanilla object. It literally is the equivalent of applying the setparam ioctl to a fresh object. Look at the PXP series for how badly wrong this goes if you try it this way around. -Chris _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel