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

Commit e51738b0 authored by Fenglin Wu's avatar Fenglin Wu Committed by Fenglin Wu
Browse files

input: qcom-hv-haptics: try with vmalloc() if allocate custom data failed



Reallocate memory using vmalloc() for custom FIFO data if the memory
allocation using kcalloc() is failed. This may happen if the vibrator
HAL is passing down a vibration effect with a very big chunk of FIFO
data and system is running out of memory.

Change-Id: I3612208df42e46a44ca0fd43ec9b4c6ca862620e
Signed-off-by: default avatarFenglin Wu <fenglinw@codeaurora.org>
parent a0e35cc3
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/nvmem-consumer.h>
#include <linux/of.h>
@@ -2196,12 +2197,15 @@ static int haptics_load_custom_effect(struct haptics_chip *chip,
	 * Before allocating samples buffer, free the old sample
	 * buffer first if it's not been freed.
	 */
	kfree(fifo->samples);
	kvfree(fifo->samples);
	fifo->samples = kcalloc(custom_data.length, sizeof(u8), GFP_KERNEL);
	if (!fifo->samples) {
		fifo->samples = vmalloc(custom_data.length);
		if (!fifo->samples) {
			rc = -ENOMEM;
			goto unlock;
		}
	}

	if (copy_from_user(fifo->samples,
				(u8 __user *)custom_data.data,
@@ -2245,7 +2249,7 @@ static int haptics_load_custom_effect(struct haptics_chip *chip,
	mutex_unlock(&chip->play.lock);
	return 0;
cleanup:
	kfree(fifo->samples);
	kvfree(fifo->samples);
	fifo->samples = NULL;
unlock:
	mutex_unlock(&chip->play.lock);
@@ -2438,7 +2442,7 @@ static int haptics_stop_fifo_play(struct haptics_chip *chip)
		return rc;

	haptics_fifo_empty_irq_config(chip, false);
	kfree(chip->custom_effect->fifo->samples);
	kvfree(chip->custom_effect->fifo->samples);
	chip->custom_effect->fifo->samples = NULL;

	atomic_set(&chip->play.fifo_status.is_busy, 0);