Commit 0a715535 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'drm-fixes-2023-01-06' of git://anongit.freedesktop.org/drm/drm

Pull drm fixes from Daniel Vetter:
 "Still not much, but more than last week. Dave should be back next week
  from the beaching.

  drivers:
   - i915-gvt fixes
   - amdgpu/kfd fixes
   - panfrost bo refcounting fix
   - meson afbc corruption fix
   - imx plane width fix

  core:
   - drm/sched fixes
   - drm/mm kunit test fix
   - dma-buf export error handling fixes"

* tag 'drm-fixes-2023-01-06' of git://anongit.freedesktop.org/drm/drm:
  Revert "drm/amd/display: Enable Freesync Video Mode by default"
  drm/i915/gvt: fix double free bug in split_2MB_gtt_entry
  drm/i915/gvt: use atomic operations to change the vGPU status
  drm/i915/gvt: fix vgpu debugfs clean in remove
  drm/i915/gvt: fix gvt debugfs destroy
  drm/i915: unpin on error in intel_vgpu_shadow_mm_pin()
  drm/amd/display: Uninitialized variables causing 4k60 UCLK to stay at DPM1 and not DPM0
  drm/amdkfd: Fix kernel warning during topology setup
  drm/scheduler: Fix lockup in drm_sched_entity_kill()
  drm/imx: ipuv3-plane: Fix overlay plane width
  drm/scheduler: Fix lockup in drm_sched_entity_kill()
  drm/virtio: Fix memory leak in virtio_gpu_object_create()
  drm/meson: Reduce the FIFO lines held when AFBC is not used
  drm/tests: reduce drm_mm_test stack usage
  drm/panfrost: Fix GEM handle creation ref-counting
  drm/plane-helper: Add the missing declaration of drm_atomic_state
  dma-buf: fix dma_buf_export init order v2
parents 1382999a 5193326c
Loading
Loading
Loading
Loading
+2 −5
Original line number Original line Diff line number Diff line
@@ -168,14 +168,11 @@ void dma_buf_uninit_sysfs_statistics(void)
	kset_unregister(dma_buf_stats_kset);
	kset_unregister(dma_buf_stats_kset);
}
}


int dma_buf_stats_setup(struct dma_buf *dmabuf)
int dma_buf_stats_setup(struct dma_buf *dmabuf, struct file *file)
{
{
	struct dma_buf_sysfs_entry *sysfs_entry;
	struct dma_buf_sysfs_entry *sysfs_entry;
	int ret;
	int ret;


	if (!dmabuf || !dmabuf->file)
		return -EINVAL;

	if (!dmabuf->exp_name) {
	if (!dmabuf->exp_name) {
		pr_err("exporter name must not be empty if stats needed\n");
		pr_err("exporter name must not be empty if stats needed\n");
		return -EINVAL;
		return -EINVAL;
@@ -192,7 +189,7 @@ int dma_buf_stats_setup(struct dma_buf *dmabuf)


	/* create the directory for buffer stats */
	/* create the directory for buffer stats */
	ret = kobject_init_and_add(&sysfs_entry->kobj, &dma_buf_ktype, NULL,
	ret = kobject_init_and_add(&sysfs_entry->kobj, &dma_buf_ktype, NULL,
				   "%lu", file_inode(dmabuf->file)->i_ino);
				   "%lu", file_inode(file)->i_ino);
	if (ret)
	if (ret)
		goto err_sysfs_dmabuf;
		goto err_sysfs_dmabuf;


+2 −2
Original line number Original line Diff line number Diff line
@@ -13,7 +13,7 @@
int dma_buf_init_sysfs_statistics(void);
int dma_buf_init_sysfs_statistics(void);
void dma_buf_uninit_sysfs_statistics(void);
void dma_buf_uninit_sysfs_statistics(void);


int dma_buf_stats_setup(struct dma_buf *dmabuf);
int dma_buf_stats_setup(struct dma_buf *dmabuf, struct file *file);


void dma_buf_stats_teardown(struct dma_buf *dmabuf);
void dma_buf_stats_teardown(struct dma_buf *dmabuf);
#else
#else
@@ -25,7 +25,7 @@ static inline int dma_buf_init_sysfs_statistics(void)


static inline void dma_buf_uninit_sysfs_statistics(void) {}
static inline void dma_buf_uninit_sysfs_statistics(void) {}


static inline int dma_buf_stats_setup(struct dma_buf *dmabuf)
static inline int dma_buf_stats_setup(struct dma_buf *dmabuf, struct file *file)
{
{
	return 0;
	return 0;
}
}
+38 −44
Original line number Original line Diff line number Diff line
@@ -95,10 +95,11 @@ static int dma_buf_file_release(struct inode *inode, struct file *file)
		return -EINVAL;
		return -EINVAL;


	dmabuf = file->private_data;
	dmabuf = file->private_data;

	if (dmabuf) {
		mutex_lock(&db_list.lock);
		mutex_lock(&db_list.lock);
		list_del(&dmabuf->list_node);
		list_del(&dmabuf->list_node);
		mutex_unlock(&db_list.lock);
		mutex_unlock(&db_list.lock);
	}


	return 0;
	return 0;
}
}
@@ -528,17 +529,17 @@ static inline int is_dma_buf_file(struct file *file)
	return file->f_op == &dma_buf_fops;
	return file->f_op == &dma_buf_fops;
}
}


static struct file *dma_buf_getfile(struct dma_buf *dmabuf, int flags)
static struct file *dma_buf_getfile(size_t size, int flags)
{
{
	static atomic64_t dmabuf_inode = ATOMIC64_INIT(0);
	static atomic64_t dmabuf_inode = ATOMIC64_INIT(0);
	struct file *file;
	struct inode *inode = alloc_anon_inode(dma_buf_mnt->mnt_sb);
	struct inode *inode = alloc_anon_inode(dma_buf_mnt->mnt_sb);
	struct file *file;


	if (IS_ERR(inode))
	if (IS_ERR(inode))
		return ERR_CAST(inode);
		return ERR_CAST(inode);


	inode->i_size = dmabuf->size;
	inode->i_size = size;
	inode_set_bytes(inode, dmabuf->size);
	inode_set_bytes(inode, size);


	/*
	/*
	 * The ->i_ino acquired from get_next_ino() is not unique thus
	 * The ->i_ino acquired from get_next_ino() is not unique thus
@@ -552,8 +553,6 @@ static struct file *dma_buf_getfile(struct dma_buf *dmabuf, int flags)
				 flags, &dma_buf_fops);
				 flags, &dma_buf_fops);
	if (IS_ERR(file))
	if (IS_ERR(file))
		goto err_alloc_file;
		goto err_alloc_file;
	file->private_data = dmabuf;
	file->f_path.dentry->d_fsdata = dmabuf;


	return file;
	return file;


@@ -619,19 +618,11 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
	size_t alloc_size = sizeof(struct dma_buf);
	size_t alloc_size = sizeof(struct dma_buf);
	int ret;
	int ret;


	if (!exp_info->resv)
	if (WARN_ON(!exp_info->priv || !exp_info->ops
		alloc_size += sizeof(struct dma_resv);
	else
		/* prevent &dma_buf[1] == dma_buf->resv */
		alloc_size += 1;

	if (WARN_ON(!exp_info->priv
			  || !exp_info->ops
		    || !exp_info->ops->map_dma_buf
		    || !exp_info->ops->map_dma_buf
		    || !exp_info->ops->unmap_dma_buf
		    || !exp_info->ops->unmap_dma_buf
			  || !exp_info->ops->release)) {
		    || !exp_info->ops->release))
		return ERR_PTR(-EINVAL);
		return ERR_PTR(-EINVAL);
	}


	if (WARN_ON(exp_info->ops->cache_sgt_mapping &&
	if (WARN_ON(exp_info->ops->cache_sgt_mapping &&
		    (exp_info->ops->pin || exp_info->ops->unpin)))
		    (exp_info->ops->pin || exp_info->ops->unpin)))
@@ -643,10 +634,21 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
	if (!try_module_get(exp_info->owner))
	if (!try_module_get(exp_info->owner))
		return ERR_PTR(-ENOENT);
		return ERR_PTR(-ENOENT);


	file = dma_buf_getfile(exp_info->size, exp_info->flags);
	if (IS_ERR(file)) {
		ret = PTR_ERR(file);
		goto err_module;
	}

	if (!exp_info->resv)
		alloc_size += sizeof(struct dma_resv);
	else
		/* prevent &dma_buf[1] == dma_buf->resv */
		alloc_size += 1;
	dmabuf = kzalloc(alloc_size, GFP_KERNEL);
	dmabuf = kzalloc(alloc_size, GFP_KERNEL);
	if (!dmabuf) {
	if (!dmabuf) {
		ret = -ENOMEM;
		ret = -ENOMEM;
		goto err_module;
		goto err_file;
	}
	}


	dmabuf->priv = exp_info->priv;
	dmabuf->priv = exp_info->priv;
@@ -658,43 +660,35 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
	init_waitqueue_head(&dmabuf->poll);
	init_waitqueue_head(&dmabuf->poll);
	dmabuf->cb_in.poll = dmabuf->cb_out.poll = &dmabuf->poll;
	dmabuf->cb_in.poll = dmabuf->cb_out.poll = &dmabuf->poll;
	dmabuf->cb_in.active = dmabuf->cb_out.active = 0;
	dmabuf->cb_in.active = dmabuf->cb_out.active = 0;
	INIT_LIST_HEAD(&dmabuf->attachments);


	if (!resv) {
	if (!resv) {
		resv = (struct dma_resv *)&dmabuf[1];
		dmabuf->resv = (struct dma_resv *)&dmabuf[1];
		dma_resv_init(resv);
		dma_resv_init(dmabuf->resv);
	}
	} else {
		dmabuf->resv = resv;
		dmabuf->resv = resv;
	}


	file = dma_buf_getfile(dmabuf, exp_info->flags);
	ret = dma_buf_stats_setup(dmabuf, file);
	if (IS_ERR(file)) {
	if (ret)
		ret = PTR_ERR(file);
		goto err_dmabuf;
		goto err_dmabuf;
	}


	file->private_data = dmabuf;
	file->f_path.dentry->d_fsdata = dmabuf;
	dmabuf->file = file;
	dmabuf->file = file;


	INIT_LIST_HEAD(&dmabuf->attachments);

	mutex_lock(&db_list.lock);
	mutex_lock(&db_list.lock);
	list_add(&dmabuf->list_node, &db_list.head);
	list_add(&dmabuf->list_node, &db_list.head);
	mutex_unlock(&db_list.lock);
	mutex_unlock(&db_list.lock);


	ret = dma_buf_stats_setup(dmabuf);
	if (ret)
		goto err_sysfs;

	return dmabuf;
	return dmabuf;


err_sysfs:
	/*
	 * Set file->f_path.dentry->d_fsdata to NULL so that when
	 * dma_buf_release() gets invoked by dentry_ops, it exits
	 * early before calling the release() dma_buf op.
	 */
	file->f_path.dentry->d_fsdata = NULL;
	fput(file);
err_dmabuf:
err_dmabuf:
	if (!resv)
		dma_resv_fini(dmabuf->resv);
	kfree(dmabuf);
	kfree(dmabuf);
err_file:
	fput(file);
err_module:
err_module:
	module_put(exp_info->owner);
	module_put(exp_info->owner);
	return ERR_PTR(ret);
	return ERR_PTR(ret);
+1 −0
Original line number Original line Diff line number Diff line
@@ -195,6 +195,7 @@ extern int amdgpu_emu_mode;
extern uint amdgpu_smu_memory_pool_size;
extern uint amdgpu_smu_memory_pool_size;
extern int amdgpu_smu_pptable_id;
extern int amdgpu_smu_pptable_id;
extern uint amdgpu_dc_feature_mask;
extern uint amdgpu_dc_feature_mask;
extern uint amdgpu_freesync_vid_mode;
extern uint amdgpu_dc_debug_mask;
extern uint amdgpu_dc_debug_mask;
extern uint amdgpu_dc_visual_confirm;
extern uint amdgpu_dc_visual_confirm;
extern uint amdgpu_dm_abm_level;
extern uint amdgpu_dm_abm_level;
+27 −0
Original line number Original line Diff line number Diff line
@@ -181,6 +181,7 @@ int amdgpu_mes_kiq;
int amdgpu_noretry = -1;
int amdgpu_noretry = -1;
int amdgpu_force_asic_type = -1;
int amdgpu_force_asic_type = -1;
int amdgpu_tmz = -1; /* auto */
int amdgpu_tmz = -1; /* auto */
uint amdgpu_freesync_vid_mode;
int amdgpu_reset_method = -1; /* auto */
int amdgpu_reset_method = -1; /* auto */
int amdgpu_num_kcq = -1;
int amdgpu_num_kcq = -1;
int amdgpu_smartshift_bias;
int amdgpu_smartshift_bias;
@@ -879,6 +880,32 @@ module_param_named(backlight, amdgpu_backlight, bint, 0444);
MODULE_PARM_DESC(tmz, "Enable TMZ feature (-1 = auto (default), 0 = off, 1 = on)");
MODULE_PARM_DESC(tmz, "Enable TMZ feature (-1 = auto (default), 0 = off, 1 = on)");
module_param_named(tmz, amdgpu_tmz, int, 0444);
module_param_named(tmz, amdgpu_tmz, int, 0444);


/**
 * DOC: freesync_video (uint)
 * Enable the optimization to adjust front porch timing to achieve seamless
 * mode change experience when setting a freesync supported mode for which full
 * modeset is not needed.
 *
 * The Display Core will add a set of modes derived from the base FreeSync
 * video mode into the corresponding connector's mode list based on commonly
 * used refresh rates and VRR range of the connected display, when users enable
 * this feature. From the userspace perspective, they can see a seamless mode
 * change experience when the change between different refresh rates under the
 * same resolution. Additionally, userspace applications such as Video playback
 * can read this modeset list and change the refresh rate based on the video
 * frame rate. Finally, the userspace can also derive an appropriate mode for a
 * particular refresh rate based on the FreeSync Mode and add it to the
 * connector's mode list.
 *
 * Note: This is an experimental feature.
 *
 * The default value: 0 (off).
 */
MODULE_PARM_DESC(
	freesync_video,
	"Enable freesync modesetting optimization feature (0 = off (default), 1 = on)");
module_param_named(freesync_video, amdgpu_freesync_vid_mode, uint, 0444);

/**
/**
 * DOC: reset_method (int)
 * DOC: reset_method (int)
 * GPU reset method (-1 = auto (default), 0 = legacy, 1 = mode0, 2 = mode1, 3 = mode2, 4 = baco)
 * GPU reset method (-1 = auto (default), 0 = legacy, 1 = mode0, 2 = mode1, 3 = mode2, 4 = baco)
Loading