Short summary of fixes pull:
amd: - track colorop changes correctly amdxdna: - fix possible leak of mm_struct colorop: - make lut interpolation mutable - track colorop updates correctly ivpu: - fix integer truncation vc4: - fix leak in krealloc() error handling virtio: - fix dma_fence ref-count leak -----BEGIN PGP SIGNATURE----- iQFPBAABCgA5FiEEchf7rIzpz2NEoWjlaA3BHVMLeiMFAmorv5QbFIAAAAAABAAO bWFudTIsMi41KzEuMTIsMiwyAAoJEGgNwR1TC3ojwYMH/iwAK01HiLXYmevOHphW bWcxEg4b1vvNUgDZJLP3Edob+OW+81CyO+/VE9jzB+BJ/eN1v7El6EBnrVXh2Bk+ vuywPmqpqADLtHS8cNuUa12Q0nIi5A3yR9G5r1xvcuzhQgjJcEN7v7MjhvEKUjwI Bs8xmplGdO8wpHoxNSTmiluDN34ekf2QK2zk68hDie4z3hhyVgV/E6swfbr6jXR+ 7BjhwV8nF3kB0awvRcQwScmGEqTq653SPI2Fco6oXFmlTBc4tR0qcNyUENCoam4n BGpi7VPoqeKrKkQ6qdVUBxtztpMZwoffCWlfCAyr2oWUtYKMwdyyFaj5xrQGDlZl iBQ= =GN7d -----END PGP SIGNATURE----- Merge tag 'drm-misc-fixes-2026-06-12' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes Short summary of fixes pull: amd: - track colorop changes correctly amdxdna: - fix possible leak of mm_struct colorop: - make lut interpolation mutable - track colorop updates correctly ivpu: - fix integer truncation vc4: - fix leak in krealloc() error handling virtio: - fix dma_fence ref-count leak Signed-off-by: Dave Airlie <airlied@redhat.com> From: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patch.msgid.link/20260612081418.GA17001@2a02-2455-9062-2500-e496-5a17-62ba-545e.dyn6.pyur.net
This commit is contained in:
commit
7c62657a10
11 changed files with 111 additions and 48 deletions
|
|
@ -999,6 +999,7 @@ again:
|
|||
|
||||
if (ret == -EBUSY) {
|
||||
amdxdna_umap_put(mapp);
|
||||
mmput(mm);
|
||||
goto again;
|
||||
}
|
||||
|
||||
|
|
@ -1009,11 +1010,13 @@ again:
|
|||
if (mmu_interval_read_retry(&mapp->notifier, mapp->range.notifier_seq)) {
|
||||
up_write(&xdna->notifier_lock);
|
||||
amdxdna_umap_put(mapp);
|
||||
mmput(mm);
|
||||
goto again;
|
||||
}
|
||||
mapp->invalid = false;
|
||||
up_write(&xdna->notifier_lock);
|
||||
amdxdna_umap_put(mapp);
|
||||
mmput(mm);
|
||||
goto again;
|
||||
|
||||
put_mm:
|
||||
|
|
|
|||
|
|
@ -276,7 +276,7 @@ int ivpu_ipc_receive(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons,
|
|||
if (ipc_buf)
|
||||
memcpy(ipc_buf, rx_msg->ipc_hdr, sizeof(*ipc_buf));
|
||||
if (rx_msg->jsm_msg) {
|
||||
u32 size = min_t(int, rx_msg->ipc_hdr->data_size, sizeof(*jsm_msg));
|
||||
u32 size = min(rx_msg->ipc_hdr->data_size, sizeof(*jsm_msg));
|
||||
|
||||
if (rx_msg->jsm_msg->result != VPU_JSM_STATUS_SUCCESS) {
|
||||
ivpu_err(vdev, "IPC resp result error: %d\n", rx_msg->jsm_msg->result);
|
||||
|
|
|
|||
|
|
@ -10083,7 +10083,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
|
|||
continue;
|
||||
|
||||
bundle->surface_updates[planes_count].surface = dc_plane;
|
||||
if (new_pcrtc_state->color_mgmt_changed) {
|
||||
if (new_pcrtc_state->color_mgmt_changed || new_plane_state->color_mgmt_changed) {
|
||||
bundle->surface_updates[planes_count].gamma = &dc_plane->gamma_correction;
|
||||
bundle->surface_updates[planes_count].in_transfer_func = &dc_plane->in_transfer_func;
|
||||
bundle->surface_updates[planes_count].gamut_remap_matrix = &dc_plane->gamut_remap_matrix;
|
||||
|
|
@ -11824,6 +11824,10 @@ static bool should_reset_plane(struct drm_atomic_state *state,
|
|||
if (new_crtc_state->color_mgmt_changed)
|
||||
return true;
|
||||
|
||||
/* Plane color pipeline or its colorop changes. */
|
||||
if (new_plane_state->color_mgmt_changed)
|
||||
return true;
|
||||
|
||||
/*
|
||||
* On zpos change, planes need to be reordered by removing and re-adding
|
||||
* them one by one to the dc state, in order of descending zpos.
|
||||
|
|
|
|||
|
|
@ -830,7 +830,7 @@ static void drm_atomic_colorop_print_state(struct drm_printer *p,
|
|||
case DRM_COLOROP_1D_LUT:
|
||||
drm_printf(p, "\tsize=%d\n", colorop->size);
|
||||
drm_printf(p, "\tinterpolation=%s\n",
|
||||
drm_get_colorop_lut1d_interpolation_name(colorop->lut1d_interpolation));
|
||||
drm_get_colorop_lut1d_interpolation_name(state->lut1d_interpolation));
|
||||
drm_printf(p, "\tdata blob id=%d\n", state->data ? state->data->base.id : 0);
|
||||
break;
|
||||
case DRM_COLOROP_CTM_3X4:
|
||||
|
|
@ -842,7 +842,7 @@ static void drm_atomic_colorop_print_state(struct drm_printer *p,
|
|||
case DRM_COLOROP_3D_LUT:
|
||||
drm_printf(p, "\tsize=%d\n", colorop->size);
|
||||
drm_printf(p, "\tinterpolation=%s\n",
|
||||
drm_get_colorop_lut3d_interpolation_name(colorop->lut3d_interpolation));
|
||||
drm_get_colorop_lut3d_interpolation_name(state->lut3d_interpolation));
|
||||
drm_printf(p, "\tdata blob id=%d\n", state->data ? state->data->base.id : 0);
|
||||
break;
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -265,13 +265,19 @@ EXPORT_SYMBOL(drm_atomic_set_fb_for_plane);
|
|||
*
|
||||
* Helper function to select the color pipeline on a plane by setting
|
||||
* it to the first drm_colorop element of the pipeline.
|
||||
*
|
||||
* Return: true if plane color pipeline value changed, false otherwise.
|
||||
*/
|
||||
void
|
||||
bool
|
||||
drm_atomic_set_colorop_for_plane(struct drm_plane_state *plane_state,
|
||||
struct drm_colorop *colorop)
|
||||
{
|
||||
struct drm_plane *plane = plane_state->plane;
|
||||
|
||||
/* Color pipeline didn't change */
|
||||
if (plane_state->color_pipeline == colorop)
|
||||
return false;
|
||||
|
||||
if (colorop)
|
||||
drm_dbg_atomic(plane->dev,
|
||||
"Set [COLOROP:%d] for [PLANE:%d:%s] state %p\n",
|
||||
|
|
@ -283,6 +289,8 @@ drm_atomic_set_colorop_for_plane(struct drm_plane_state *plane_state,
|
|||
plane->base.id, plane->name, plane_state);
|
||||
|
||||
plane_state->color_pipeline = colorop;
|
||||
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_atomic_set_colorop_for_plane);
|
||||
|
||||
|
|
@ -604,7 +612,7 @@ static int drm_atomic_plane_set_property(struct drm_plane *plane,
|
|||
if (val && !colorop)
|
||||
return -EACCES;
|
||||
|
||||
drm_atomic_set_colorop_for_plane(state, colorop);
|
||||
state->color_mgmt_changed |= drm_atomic_set_colorop_for_plane(state, colorop);
|
||||
} else if (property == config->prop_fb_damage_clips) {
|
||||
ret = drm_property_replace_blob_from_id(dev,
|
||||
&state->fb_damage_clips,
|
||||
|
|
@ -713,11 +721,11 @@ drm_atomic_plane_get_property(struct drm_plane *plane,
|
|||
static int drm_atomic_color_set_data_property(struct drm_colorop *colorop,
|
||||
struct drm_colorop_state *state,
|
||||
struct drm_property *property,
|
||||
uint64_t val)
|
||||
uint64_t val,
|
||||
bool *replaced)
|
||||
{
|
||||
ssize_t elem_size = -1;
|
||||
ssize_t size = -1;
|
||||
bool replaced = false;
|
||||
|
||||
switch (colorop->type) {
|
||||
case DRM_COLOROP_1D_LUT:
|
||||
|
|
@ -739,28 +747,45 @@ static int drm_atomic_color_set_data_property(struct drm_colorop *colorop,
|
|||
&state->data,
|
||||
val,
|
||||
-1, size, elem_size,
|
||||
&replaced);
|
||||
replaced);
|
||||
}
|
||||
|
||||
static int drm_atomic_colorop_set_property(struct drm_colorop *colorop,
|
||||
struct drm_colorop_state *state,
|
||||
struct drm_file *file_priv,
|
||||
struct drm_property *property,
|
||||
uint64_t val)
|
||||
uint64_t val,
|
||||
bool *replaced)
|
||||
{
|
||||
if (property == colorop->bypass_property) {
|
||||
state->bypass = val;
|
||||
if (state->bypass != val) {
|
||||
state->bypass = val;
|
||||
*replaced = true;
|
||||
}
|
||||
} else if (property == colorop->lut1d_interpolation_property) {
|
||||
colorop->lut1d_interpolation = val;
|
||||
if (state->lut1d_interpolation != val) {
|
||||
state->lut1d_interpolation = val;
|
||||
*replaced = true;
|
||||
}
|
||||
} else if (property == colorop->curve_1d_type_property) {
|
||||
state->curve_1d_type = val;
|
||||
if (state->curve_1d_type != val) {
|
||||
state->curve_1d_type = val;
|
||||
*replaced = true;
|
||||
}
|
||||
} else if (property == colorop->multiplier_property) {
|
||||
state->multiplier = val;
|
||||
if (state->multiplier != val) {
|
||||
state->multiplier = val;
|
||||
*replaced = true;
|
||||
}
|
||||
} else if (property == colorop->lut3d_interpolation_property) {
|
||||
colorop->lut3d_interpolation = val;
|
||||
if (state->lut3d_interpolation != val) {
|
||||
state->lut3d_interpolation = val;
|
||||
*replaced = true;
|
||||
}
|
||||
} else if (property == colorop->data_property) {
|
||||
return drm_atomic_color_set_data_property(colorop, state,
|
||||
property, val);
|
||||
property, val,
|
||||
replaced);
|
||||
} else {
|
||||
drm_dbg_atomic(colorop->dev,
|
||||
"[COLOROP:%d:%d] unknown property [PROP:%d:%s]\n",
|
||||
|
|
@ -782,7 +807,7 @@ drm_atomic_colorop_get_property(struct drm_colorop *colorop,
|
|||
else if (property == colorop->bypass_property)
|
||||
*val = state->bypass;
|
||||
else if (property == colorop->lut1d_interpolation_property)
|
||||
*val = colorop->lut1d_interpolation;
|
||||
*val = state->lut1d_interpolation;
|
||||
else if (property == colorop->curve_1d_type_property)
|
||||
*val = state->curve_1d_type;
|
||||
else if (property == colorop->multiplier_property)
|
||||
|
|
@ -790,7 +815,7 @@ drm_atomic_colorop_get_property(struct drm_colorop *colorop,
|
|||
else if (property == colorop->size_property)
|
||||
*val = colorop->size;
|
||||
else if (property == colorop->lut3d_interpolation_property)
|
||||
*val = colorop->lut3d_interpolation;
|
||||
*val = state->lut3d_interpolation;
|
||||
else if (property == colorop->data_property)
|
||||
*val = (state->data) ? state->data->base.id : 0;
|
||||
else
|
||||
|
|
@ -1275,8 +1300,10 @@ int drm_atomic_set_property(struct drm_atomic_state *state,
|
|||
break;
|
||||
}
|
||||
case DRM_MODE_OBJECT_COLOROP: {
|
||||
struct drm_plane_state *plane_state;
|
||||
struct drm_colorop *colorop = obj_to_colorop(obj);
|
||||
struct drm_colorop_state *colorop_state;
|
||||
bool replaced = false;
|
||||
|
||||
colorop_state = drm_atomic_get_colorop_state(state, colorop);
|
||||
if (IS_ERR(colorop_state)) {
|
||||
|
|
@ -1285,7 +1312,18 @@ int drm_atomic_set_property(struct drm_atomic_state *state,
|
|||
}
|
||||
|
||||
ret = drm_atomic_colorop_set_property(colorop, colorop_state,
|
||||
file_priv, prop, prop_value);
|
||||
file_priv, prop, prop_value,
|
||||
&replaced);
|
||||
if (ret || !replaced)
|
||||
break;
|
||||
|
||||
plane_state = drm_atomic_get_plane_state(state, colorop->plane);
|
||||
if (IS_ERR(plane_state)) {
|
||||
ret = PTR_ERR(plane_state);
|
||||
break;
|
||||
}
|
||||
plane_state->color_mgmt_changed |= replaced;
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -342,7 +342,6 @@ int drm_plane_colorop_curve_1d_lut_init(struct drm_device *dev, struct drm_color
|
|||
|
||||
colorop->lut1d_interpolation_property = prop;
|
||||
drm_object_attach_property(&colorop->base, prop, interpolation);
|
||||
colorop->lut1d_interpolation = interpolation;
|
||||
|
||||
/* data */
|
||||
ret = drm_colorop_create_data_prop(dev, colorop);
|
||||
|
|
@ -442,7 +441,6 @@ int drm_plane_colorop_3dlut_init(struct drm_device *dev, struct drm_colorop *col
|
|||
|
||||
colorop->lut3d_interpolation_property = prop;
|
||||
drm_object_attach_property(&colorop->base, prop, interpolation);
|
||||
colorop->lut3d_interpolation = interpolation;
|
||||
|
||||
/* data */
|
||||
ret = drm_colorop_create_data_prop(dev, colorop);
|
||||
|
|
@ -521,6 +519,20 @@ static void __drm_colorop_state_reset(struct drm_colorop_state *colorop_state,
|
|||
&val);
|
||||
colorop_state->curve_1d_type = val;
|
||||
}
|
||||
|
||||
if (colorop->lut1d_interpolation_property) {
|
||||
if (!drm_object_property_get_default_value(&colorop->base,
|
||||
colorop->lut1d_interpolation_property,
|
||||
&val))
|
||||
colorop_state->lut1d_interpolation = val;
|
||||
}
|
||||
|
||||
if (colorop->lut3d_interpolation_property) {
|
||||
if (!drm_object_property_get_default_value(&colorop->base,
|
||||
colorop->lut3d_interpolation_property,
|
||||
&val))
|
||||
colorop_state->lut3d_interpolation = val;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -290,15 +290,16 @@ static bool require_uniform_address_uniform(struct vc4_validated_shader_info *va
|
|||
{
|
||||
uint32_t o = validated_shader->num_uniform_addr_offsets;
|
||||
uint32_t num_uniforms = validated_shader->uniforms_size / 4;
|
||||
u32 *offsets;
|
||||
|
||||
validated_shader->uniform_addr_offsets =
|
||||
krealloc(validated_shader->uniform_addr_offsets,
|
||||
(o + 1) *
|
||||
sizeof(*validated_shader->uniform_addr_offsets),
|
||||
GFP_KERNEL);
|
||||
if (!validated_shader->uniform_addr_offsets)
|
||||
offsets = krealloc_array(validated_shader->uniform_addr_offsets,
|
||||
o + 1,
|
||||
sizeof(*validated_shader->uniform_addr_offsets),
|
||||
GFP_KERNEL);
|
||||
if (!offsets)
|
||||
return false;
|
||||
|
||||
validated_shader->uniform_addr_offsets = offsets;
|
||||
validated_shader->uniform_addr_offsets[o] = num_uniforms;
|
||||
validated_shader->num_uniform_addr_offsets++;
|
||||
|
||||
|
|
|
|||
|
|
@ -124,7 +124,10 @@ static void virtio_gpu_remove(struct virtio_device *vdev)
|
|||
struct drm_device *dev = vdev->priv;
|
||||
|
||||
drm_dev_unplug(dev);
|
||||
drm_atomic_helper_shutdown(dev);
|
||||
|
||||
if (drm_core_check_feature(dev, DRIVER_ATOMIC))
|
||||
drm_atomic_helper_shutdown(dev);
|
||||
|
||||
virtio_gpu_deinit(dev);
|
||||
drm_dev_put(dev);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,8 +65,10 @@ static int virtio_gpu_dma_fence_wait(struct virtio_gpu_submit *submit,
|
|||
|
||||
dma_fence_unwrap_for_each(f, &itr, fence) {
|
||||
err = virtio_gpu_do_fence_wait(submit, f);
|
||||
if (err)
|
||||
if (err) {
|
||||
dma_fence_put(itr.chain);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@
|
|||
#ifndef DRM_ATOMIC_UAPI_H_
|
||||
#define DRM_ATOMIC_UAPI_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct drm_crtc_state;
|
||||
struct drm_display_mode;
|
||||
struct drm_property_blob;
|
||||
|
|
@ -50,7 +52,7 @@ drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state,
|
|||
struct drm_crtc *crtc);
|
||||
void drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state,
|
||||
struct drm_framebuffer *fb);
|
||||
void drm_atomic_set_colorop_for_plane(struct drm_plane_state *plane_state,
|
||||
bool drm_atomic_set_colorop_for_plane(struct drm_plane_state *plane_state,
|
||||
struct drm_colorop *colorop);
|
||||
int __must_check
|
||||
drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
|
||||
|
|
|
|||
|
|
@ -183,6 +183,20 @@ struct drm_colorop_state {
|
|||
*/
|
||||
struct drm_property_blob *data;
|
||||
|
||||
/**
|
||||
* @lut1d_interpolation:
|
||||
*
|
||||
* Interpolation for DRM_COLOROP_1D_LUT
|
||||
*/
|
||||
enum drm_colorop_lut1d_interpolation_type lut1d_interpolation;
|
||||
|
||||
/**
|
||||
* @lut3d_interpolation:
|
||||
*
|
||||
* Interpolation for DRM_COLOROP_3D_LUT
|
||||
*/
|
||||
enum drm_colorop_lut3d_interpolation_type lut3d_interpolation;
|
||||
|
||||
/** @state: backpointer to global drm_atomic_state */
|
||||
struct drm_atomic_state *state;
|
||||
};
|
||||
|
|
@ -306,26 +320,10 @@ struct drm_colorop {
|
|||
*/
|
||||
uint32_t size;
|
||||
|
||||
/**
|
||||
* @lut1d_interpolation:
|
||||
*
|
||||
* Read-only
|
||||
* Interpolation for DRM_COLOROP_1D_LUT
|
||||
*/
|
||||
enum drm_colorop_lut1d_interpolation_type lut1d_interpolation;
|
||||
|
||||
/**
|
||||
* @lut3d_interpolation:
|
||||
*
|
||||
* Read-only
|
||||
* Interpolation for DRM_COLOROP_3D_LUT
|
||||
*/
|
||||
enum drm_colorop_lut3d_interpolation_type lut3d_interpolation;
|
||||
|
||||
/**
|
||||
* @lut1d_interpolation_property:
|
||||
*
|
||||
* Read-only property for DRM_COLOROP_1D_LUT interpolation
|
||||
* Property for DRM_COLOROP_1D_LUT interpolation
|
||||
*/
|
||||
struct drm_property *lut1d_interpolation_property;
|
||||
|
||||
|
|
@ -353,7 +351,7 @@ struct drm_colorop {
|
|||
/**
|
||||
* @lut3d_interpolation_property:
|
||||
*
|
||||
* Read-only property for DRM_COLOROP_3D_LUT interpolation
|
||||
* Property for DRM_COLOROP_3D_LUT interpolation
|
||||
*/
|
||||
struct drm_property *lut3d_interpolation_property;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue