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

Configure Feed

Select the types of activity you want to include in your feed.

drm/edid: do invalid block filtering in-place

Rewrite edid_filter_invalid_blocks() to filter invalid blocks
in-place. The main motivation is to not rely on passed in information on
invalid block count or the allocation size, which will be helpful in
follow-up work on HF-EEODB.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/a6ad5e4e7b91338c0d19d7be189af31094e65555.1656494768.git.jani.nikula@intel.com

+24 -21
+24 -21
drivers/gpu/drm/drm_edid.c
··· 2020 2020 } 2021 2021 EXPORT_SYMBOL(drm_edid_is_valid); 2022 2022 2023 - static struct edid *edid_filter_invalid_blocks(const struct edid *edid, 2024 - int invalid_blocks, 2023 + static struct edid *edid_filter_invalid_blocks(struct edid *edid, 2025 2024 size_t *alloc_size) 2026 2025 { 2027 - struct edid *new, *dest_block; 2028 - int valid_extensions = edid->extensions - invalid_blocks; 2029 - int i; 2026 + struct edid *new; 2027 + int i, valid_blocks = 0; 2030 2028 2031 - *alloc_size = edid_size_by_blocks(valid_extensions + 1); 2032 - 2033 - new = kmalloc(*alloc_size, GFP_KERNEL); 2034 - if (!new) 2035 - goto out; 2036 - 2037 - dest_block = new; 2038 2029 for (i = 0; i < edid_block_count(edid); i++) { 2039 - const void *block = edid_block_data(edid, i); 2030 + const void *src_block = edid_block_data(edid, i); 2040 2031 2041 - if (edid_block_valid(block, i == 0)) 2042 - memcpy(dest_block++, block, EDID_LENGTH); 2032 + if (edid_block_valid(src_block, i == 0)) { 2033 + void *dst_block = (void *)edid_block_data(edid, valid_blocks); 2034 + 2035 + memmove(dst_block, src_block, EDID_LENGTH); 2036 + valid_blocks++; 2037 + } 2043 2038 } 2044 2039 2045 - new->extensions = valid_extensions; 2046 - new->checksum = edid_block_compute_checksum(new); 2040 + /* We already trusted the base block to be valid here... */ 2041 + if (WARN_ON(!valid_blocks)) { 2042 + kfree(edid); 2043 + return NULL; 2044 + } 2047 2045 2048 - out: 2049 - kfree(edid); 2046 + edid->extensions = valid_blocks - 1; 2047 + edid->checksum = edid_block_compute_checksum(edid); 2048 + 2049 + *alloc_size = edid_size_by_blocks(valid_blocks); 2050 + 2051 + new = krealloc(edid, *alloc_size, GFP_KERNEL); 2052 + if (!new) 2053 + kfree(edid); 2050 2054 2051 2055 return new; 2052 2056 } ··· 2320 2316 if (invalid_blocks) { 2321 2317 connector_bad_edid(connector, edid, edid_block_count(edid)); 2322 2318 2323 - edid = edid_filter_invalid_blocks(edid, invalid_blocks, 2324 - &alloc_size); 2319 + edid = edid_filter_invalid_blocks(edid, &alloc_size); 2325 2320 } 2326 2321 2327 2322 ok: