Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit da2048b7 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

Revert "media: vivid: shut up warnings due to a non-trivial logic"

0day kernel testing robot got the below dmesg and the first bad commit is

https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
commit 3354b54f

[  248.847809] BUG: unable to handle kernel paging request at ffffc90000393131

[  248.848015] Call Trace:
[  248.848015]  ? vivid_dev_release+0xc0/0xc0
[  248.848015]  ? acpi_dev_pm_attach+0x27/0xd0

This reverts commit 3354b54f.
parent 8179de98
Loading
Loading
Loading
Loading
+2 −19
Original line number Original line Diff line number Diff line
@@ -647,7 +647,6 @@ static int vivid_create_instance(struct platform_device *pdev, int inst)
	unsigned node_type = node_types[inst];
	unsigned node_type = node_types[inst];
	unsigned int allocator = allocators[inst];
	unsigned int allocator = allocators[inst];
	v4l2_std_id tvnorms_cap = 0, tvnorms_out = 0;
	v4l2_std_id tvnorms_cap = 0, tvnorms_out = 0;
	char *strings_base;
	int ret;
	int ret;
	int i;
	int i;


@@ -860,33 +859,17 @@ static int vivid_create_instance(struct platform_device *pdev, int inst)
	/* create a string array containing the names of all the preset timings */
	/* create a string array containing the names of all the preset timings */
	while (v4l2_dv_timings_presets[dev->query_dv_timings_size].bt.width)
	while (v4l2_dv_timings_presets[dev->query_dv_timings_size].bt.width)
		dev->query_dv_timings_size++;
		dev->query_dv_timings_size++;

	/*
	 * In order to save one allocation and an extra free, let's optimize
	 * the allocation here: we'll use the first elements of the
	 * dev->query_dv_timings_qmenu to store the timing strings pointer,
	 * adding an extra space there to a store a string up to 32 bytes.
	 * So, instead of allocating an array with size of:
	 * 	dev->query_dv_timings_size * (sizeof(void *)
	 * it will allocate:
	 * 	dev->query_dv_timings_size * (sizeof(void *) +
	 *	dev->query_dv_timings_size * 32
	 */
	dev->query_dv_timings_qmenu = kmalloc_array(dev->query_dv_timings_size,
	dev->query_dv_timings_qmenu = kmalloc_array(dev->query_dv_timings_size,
						    (sizeof(void *) + 32),
						    (sizeof(void *) + 32),
						    GFP_KERNEL);
						    GFP_KERNEL);
	if (dev->query_dv_timings_qmenu == NULL)
	if (dev->query_dv_timings_qmenu == NULL)
		goto free_dev;
		goto free_dev;

	/* Sets strings_base to be after the space to store the pointers */
	strings_base = ((char *)&dev->query_dv_timings_qmenu)
		       + dev->query_dv_timings_size * sizeof(void *);

	for (i = 0; i < dev->query_dv_timings_size; i++) {
	for (i = 0; i < dev->query_dv_timings_size; i++) {
		const struct v4l2_bt_timings *bt = &v4l2_dv_timings_presets[i].bt;
		const struct v4l2_bt_timings *bt = &v4l2_dv_timings_presets[i].bt;
		char *p = strings_base + i * 32;
		char *p = (char *)&dev->query_dv_timings_qmenu[dev->query_dv_timings_size];
		u32 htot, vtot;
		u32 htot, vtot;


		p += i * 32;
		dev->query_dv_timings_qmenu[i] = p;
		dev->query_dv_timings_qmenu[i] = p;


		htot = V4L2_DV_BT_FRAME_WIDTH(bt);
		htot = V4L2_DV_BT_FRAME_WIDTH(bt);