linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] HID: fix few non-DMA capable HID transfers
@ 2016-11-21 10:48 Benjamin Tissoires
  2016-11-21 10:48 ` [PATCH 1/4] HID: cp2112: make transfer buffers DMA capable Benjamin Tissoires
                   ` (4 more replies)
  0 siblings, 5 replies; 12+ messages in thread
From: Benjamin Tissoires @ 2016-11-21 10:48 UTC (permalink / raw)
  To: Jiri Kosina; +Cc: linux-input, linux-kernel

Hi Jiri,

While playing a little bit with the CP2112 (for hid-rmi I must confess), I
realized that kernel v4.9 now enforces DMA capable buffers when calling
hid_hw_raw_request(). Kernel v4.8 works fine (but gives a stacktrace the first
time), but v4.9 doesn't.

So I gave a check of all the other drivers in the HID tree, and it looks like
only 4 drivers are not properly allocating their buffers.

I'd say this is v4.9 material but I was not able to test magicmouse and lg.
If this doesn't qualifies for 4.9-rc7, I think we should add the stable@ stamp,
given that the chance this will break hid-rmi is huge (cp2112 is not so much an
issue, given it's a devel board).

Cheers,
Benjamin



Benjamin Tissoires (4):
  HID: cp2112: make transfer buffers DMA capable
  HID: lg: make transfer buffers DMA capable
  HID: magicmouse: make transfer buffers DMA capable
  HID: rmi: make transfer buffers DMA capable

 drivers/hid/hid-cp2112.c     | 115 +++++++++++++++++++++++++++++--------------
 drivers/hid/hid-lg.c         |  12 +++--
 drivers/hid/hid-magicmouse.c |  12 ++++-
 drivers/hid/hid-rmi.c        |  10 +++-
 4 files changed, 106 insertions(+), 43 deletions(-)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/4] HID: cp2112: make transfer buffers DMA capable
  2016-11-21 10:48 [PATCH 0/4] HID: fix few non-DMA capable HID transfers Benjamin Tissoires
@ 2016-11-21 10:48 ` Benjamin Tissoires
  2016-11-21 10:48 ` [PATCH 2/4] HID: lg: " Benjamin Tissoires
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Benjamin Tissoires @ 2016-11-21 10:48 UTC (permalink / raw)
  To: Jiri Kosina; +Cc: linux-input, linux-kernel

Kernel v4.9 strictly enforces DMA capable buffers, so we need to remove
buffers allocated on the stack.

Use a spinlock to prevent concurrent accesses to the buffer.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
---
 drivers/hid/hid-cp2112.c | 115 ++++++++++++++++++++++++++++++++---------------
 1 file changed, 79 insertions(+), 36 deletions(-)

diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c
index 086d8a5..60d3020 100644
--- a/drivers/hid/hid-cp2112.c
+++ b/drivers/hid/hid-cp2112.c
@@ -32,6 +32,11 @@
 #include <linux/usb/ch9.h>
 #include "hid-ids.h"
 
+#define CP2112_REPORT_MAX_LENGTH		64
+#define CP2112_GPIO_CONFIG_LENGTH		5
+#define CP2112_GPIO_GET_LENGTH			2
+#define CP2112_GPIO_SET_LENGTH			3
+
 enum {
 	CP2112_GPIO_CONFIG		= 0x02,
 	CP2112_GPIO_GET			= 0x03,
@@ -161,6 +166,8 @@ struct cp2112_device {
 	atomic_t read_avail;
 	atomic_t xfer_avail;
 	struct gpio_chip gc;
+	u8 *in_out_buffer;
+	spinlock_t lock;
 };
 
 static int gpio_push_pull = 0xFF;
@@ -171,62 +178,86 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
 {
 	struct cp2112_device *dev = gpiochip_get_data(chip);
 	struct hid_device *hdev = dev->hdev;
-	u8 buf[5];
+	u8 *buf = dev->in_out_buffer;
+	unsigned long flags;
 	int ret;
 
+	spin_lock_irqsave(&dev->lock, flags);
+
 	ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
-				       sizeof(buf), HID_FEATURE_REPORT,
-				       HID_REQ_GET_REPORT);
-	if (ret != sizeof(buf)) {
+				 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
+				 HID_REQ_GET_REPORT);
+	if (ret != CP2112_GPIO_CONFIG_LENGTH) {
 		hid_err(hdev, "error requesting GPIO config: %d\n", ret);
-		return ret;
+		goto exit;
 	}
 
 	buf[1] &= ~(1 << offset);
 	buf[2] = gpio_push_pull;
 
-	ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, sizeof(buf),
-				 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
+	ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
+				 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
+				 HID_REQ_SET_REPORT);
 	if (ret < 0) {
 		hid_err(hdev, "error setting GPIO config: %d\n", ret);
-		return ret;
+		goto exit;
 	}
 
-	return 0;
+	ret = 0;
+
+exit:
+	spin_unlock_irqrestore(&dev->lock, flags);
+	return ret <= 0 ? ret : -EIO;
 }
 
 static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
 {
 	struct cp2112_device *dev = gpiochip_get_data(chip);
 	struct hid_device *hdev = dev->hdev;
-	u8 buf[3];
+	u8 *buf = dev->in_out_buffer;
+	unsigned long flags;
 	int ret;
 
+	spin_lock_irqsave(&dev->lock, flags);
+
 	buf[0] = CP2112_GPIO_SET;
 	buf[1] = value ? 0xff : 0;
 	buf[2] = 1 << offset;
 
-	ret = hid_hw_raw_request(hdev, CP2112_GPIO_SET, buf, sizeof(buf),
-				 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
+	ret = hid_hw_raw_request(hdev, CP2112_GPIO_SET, buf,
+				 CP2112_GPIO_SET_LENGTH, HID_FEATURE_REPORT,
+				 HID_REQ_SET_REPORT);
 	if (ret < 0)
 		hid_err(hdev, "error setting GPIO values: %d\n", ret);
+
+	spin_unlock_irqrestore(&dev->lock, flags);
 }
 
 static int cp2112_gpio_get(struct gpio_chip *chip, unsigned offset)
 {
 	struct cp2112_device *dev = gpiochip_get_data(chip);
 	struct hid_device *hdev = dev->hdev;
-	u8 buf[2];
+	u8 *buf = dev->in_out_buffer;
+	unsigned long flags;
 	int ret;
 
-	ret = hid_hw_raw_request(hdev, CP2112_GPIO_GET, buf, sizeof(buf),
-				       HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
-	if (ret != sizeof(buf)) {
+	spin_lock_irqsave(&dev->lock, flags);
+
+	ret = hid_hw_raw_request(hdev, CP2112_GPIO_GET, buf,
+				 CP2112_GPIO_GET_LENGTH, HID_FEATURE_REPORT,
+				 HID_REQ_GET_REPORT);
+	if (ret != CP2112_GPIO_GET_LENGTH) {
 		hid_err(hdev, "error requesting GPIO values: %d\n", ret);
-		return ret;
+		ret = ret < 0 ? ret : -EIO;
+		goto exit;
 	}
 
-	return (buf[1] >> offset) & 1;
+	ret = (buf[1] >> offset) & 1;
+
+exit:
+	spin_unlock_irqrestore(&dev->lock, flags);
+
+	return ret;
 }
 
 static int cp2112_gpio_direction_output(struct gpio_chip *chip,
@@ -234,27 +265,33 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip,
 {
 	struct cp2112_device *dev = gpiochip_get_data(chip);
 	struct hid_device *hdev = dev->hdev;
-	u8 buf[5];
+	u8 *buf = dev->in_out_buffer;
+	unsigned long flags;
 	int ret;
 
+	spin_lock_irqsave(&dev->lock, flags);
+
 	ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
-				       sizeof(buf), HID_FEATURE_REPORT,
-				       HID_REQ_GET_REPORT);
-	if (ret != sizeof(buf)) {
+				 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
+				 HID_REQ_GET_REPORT);
+	if (ret != CP2112_GPIO_CONFIG_LENGTH) {
 		hid_err(hdev, "error requesting GPIO config: %d\n", ret);
-		return ret;
+		goto fail;
 	}
 
 	buf[1] |= 1 << offset;
 	buf[2] = gpio_push_pull;
 
-	ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, sizeof(buf),
-				 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
+	ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
+				 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
+				 HID_REQ_SET_REPORT);
 	if (ret < 0) {
 		hid_err(hdev, "error setting GPIO config: %d\n", ret);
-		return ret;
+		goto fail;
 	}
 
+	spin_unlock_irqrestore(&dev->lock, flags);
+
 	/*
 	 * Set gpio value when output direction is already set,
 	 * as specified in AN495, Rev. 0.2, cpt. 4.4
@@ -262,6 +299,10 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip,
 	cp2112_gpio_set(chip, offset, value);
 
 	return 0;
+
+fail:
+	spin_unlock_irqrestore(&dev->lock, flags);
+	return ret < 0 ? ret : -EIO;
 }
 
 static int cp2112_hid_get(struct hid_device *hdev, unsigned char report_number,
@@ -1007,6 +1048,17 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
 	struct cp2112_smbus_config_report config;
 	int ret;
 
+	dev = devm_kzalloc(&hdev->dev, sizeof(*dev), GFP_KERNEL);
+	if (!dev)
+		return -ENOMEM;
+
+	dev->in_out_buffer = devm_kzalloc(&hdev->dev, CP2112_REPORT_MAX_LENGTH,
+					  GFP_KERNEL);
+	if (!dev->in_out_buffer)
+		return -ENOMEM;
+
+	spin_lock_init(&dev->lock);
+
 	ret = hid_parse(hdev);
 	if (ret) {
 		hid_err(hdev, "parse failed\n");
@@ -1063,12 +1115,6 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
 		goto err_power_normal;
 	}
 
-	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-	if (!dev) {
-		ret = -ENOMEM;
-		goto err_power_normal;
-	}
-
 	hid_set_drvdata(hdev, (void *)dev);
 	dev->hdev		= hdev;
 	dev->adap.owner		= THIS_MODULE;
@@ -1087,7 +1133,7 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
 
 	if (ret) {
 		hid_err(hdev, "error registering i2c adapter\n");
-		goto err_free_dev;
+		goto err_power_normal;
 	}
 
 	hid_dbg(hdev, "adapter registered\n");
@@ -1123,8 +1169,6 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
 	gpiochip_remove(&dev->gc);
 err_free_i2c:
 	i2c_del_adapter(&dev->adap);
-err_free_dev:
-	kfree(dev);
 err_power_normal:
 	hid_hw_power(hdev, PM_HINT_NORMAL);
 err_hid_close:
@@ -1149,7 +1193,6 @@ static void cp2112_remove(struct hid_device *hdev)
 	 */
 	hid_hw_close(hdev);
 	hid_hw_stop(hdev);
-	kfree(dev);
 }
 
 static int cp2112_raw_event(struct hid_device *hdev, struct hid_report *report,
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/4] HID: lg: make transfer buffers DMA capable
  2016-11-21 10:48 [PATCH 0/4] HID: fix few non-DMA capable HID transfers Benjamin Tissoires
  2016-11-21 10:48 ` [PATCH 1/4] HID: cp2112: make transfer buffers DMA capable Benjamin Tissoires
@ 2016-11-21 10:48 ` Benjamin Tissoires
  2016-11-21 12:05   ` [PATCH] HID: lg: fix noderef.cocci warnings kbuild test robot
  2016-11-21 12:05   ` [PATCH 2/4] HID: lg: make transfer buffers DMA capable kbuild test robot
  2016-11-21 10:48 ` [PATCH 3/4] HID: magicmouse: " Benjamin Tissoires
                   ` (2 subsequent siblings)
  4 siblings, 2 replies; 12+ messages in thread
From: Benjamin Tissoires @ 2016-11-21 10:48 UTC (permalink / raw)
  To: Jiri Kosina; +Cc: linux-input, linux-kernel

Kernel v4.9 strictly enforces DMA capable buffers, so we need to remove
buffers allocated on the stack.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
---
 drivers/hid/hid-lg.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
index 76f644d..d4c72a5 100644
--- a/drivers/hid/hid-lg.c
+++ b/drivers/hid/hid-lg.c
@@ -756,11 +756,16 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
 
 	/* Setup wireless link with Logitech Wii wheel */
 	if (hdev->product == USB_DEVICE_ID_LOGITECH_WII_WHEEL) {
-		unsigned char buf[] = { 0x00, 0xAF,  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+		const unsigned char cbuf[] = { 0x00, 0xAF,  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+		u8 *buf = kmemdup(cbuf, sizeof(cbuf), GFP_KERNEL);
 
-		ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
-					HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
+		if (!buf) {
+			ret = -ENOMEM;
+			goto err_free;
+		}
 
+		ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(cbuf),
+					HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
 		if (ret >= 0) {
 			/* insert a little delay of 10 jiffies ~ 40ms */
 			wait_queue_head_t wait;
@@ -775,6 +780,7 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
 			ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
 					HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
 		}
+		kfree(buf);
 	}
 
 	if (drv_data->quirks & LG_FF)
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/4] HID: magicmouse: make transfer buffers DMA capable
  2016-11-21 10:48 [PATCH 0/4] HID: fix few non-DMA capable HID transfers Benjamin Tissoires
  2016-11-21 10:48 ` [PATCH 1/4] HID: cp2112: make transfer buffers DMA capable Benjamin Tissoires
  2016-11-21 10:48 ` [PATCH 2/4] HID: lg: " Benjamin Tissoires
@ 2016-11-21 10:48 ` Benjamin Tissoires
  2016-11-21 10:48 ` [PATCH 4/4] HID: rmi: " Benjamin Tissoires
  2016-11-23 16:44 ` [PATCH 0/4] HID: fix few non-DMA capable HID transfers Jiri Kosina
  4 siblings, 0 replies; 12+ messages in thread
From: Benjamin Tissoires @ 2016-11-21 10:48 UTC (permalink / raw)
  To: Jiri Kosina; +Cc: linux-input, linux-kernel

Kernel v4.9 strictly enforces DMA capable buffers, so we need to remove
buffers allocated on the stack.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
---
 drivers/hid/hid-magicmouse.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c
index d6fa496..20b40ad 100644
--- a/drivers/hid/hid-magicmouse.c
+++ b/drivers/hid/hid-magicmouse.c
@@ -493,7 +493,8 @@ static int magicmouse_input_configured(struct hid_device *hdev,
 static int magicmouse_probe(struct hid_device *hdev,
 	const struct hid_device_id *id)
 {
-	__u8 feature[] = { 0xd7, 0x01 };
+	const u8 feature[] = { 0xd7, 0x01 };
+	u8 *buf;
 	struct magicmouse_sc *msc;
 	struct hid_report *report;
 	int ret;
@@ -544,6 +545,12 @@ static int magicmouse_probe(struct hid_device *hdev,
 	}
 	report->size = 6;
 
+	buf = kmemdup(feature, sizeof(feature), GFP_KERNEL);
+	if (!buf) {
+		ret = -ENOMEM;
+		goto err_stop_hw;
+	}
+
 	/*
 	 * Some devices repond with 'invalid report id' when feature
 	 * report switching it into multitouch mode is sent to it.
@@ -552,8 +559,9 @@ static int magicmouse_probe(struct hid_device *hdev,
 	 * but there seems to be no other way of switching the mode.
 	 * Thus the super-ugly hacky success check below.
 	 */
-	ret = hid_hw_raw_request(hdev, feature[0], feature, sizeof(feature),
+	ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(feature),
 				HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
+	kfree(buf);
 	if (ret != -EIO && ret != sizeof(feature)) {
 		hid_err(hdev, "unable to request touch data (%d)\n", ret);
 		goto err_stop_hw;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 4/4] HID: rmi: make transfer buffers DMA capable
  2016-11-21 10:48 [PATCH 0/4] HID: fix few non-DMA capable HID transfers Benjamin Tissoires
                   ` (2 preceding siblings ...)
  2016-11-21 10:48 ` [PATCH 3/4] HID: magicmouse: " Benjamin Tissoires
@ 2016-11-21 10:48 ` Benjamin Tissoires
  2016-11-23 16:44 ` [PATCH 0/4] HID: fix few non-DMA capable HID transfers Jiri Kosina
  4 siblings, 0 replies; 12+ messages in thread
From: Benjamin Tissoires @ 2016-11-21 10:48 UTC (permalink / raw)
  To: Jiri Kosina; +Cc: linux-input, linux-kernel

Kernel v4.9 strictly enforces DMA capable buffers, so we need to remove
buffers allocated on the stack.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
---
 drivers/hid/hid-rmi.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c
index 9cd2ca3..be89bcb 100644
--- a/drivers/hid/hid-rmi.c
+++ b/drivers/hid/hid-rmi.c
@@ -188,10 +188,16 @@ static int rmi_set_page(struct hid_device *hdev, u8 page)
 static int rmi_set_mode(struct hid_device *hdev, u8 mode)
 {
 	int ret;
-	u8 txbuf[2] = {RMI_SET_RMI_MODE_REPORT_ID, mode};
+	const u8 txbuf[2] = {RMI_SET_RMI_MODE_REPORT_ID, mode};
+	u8 *buf;
 
-	ret = hid_hw_raw_request(hdev, RMI_SET_RMI_MODE_REPORT_ID, txbuf,
+	buf = kmemdup(txbuf, sizeof(txbuf), GFP_KERNEL);
+	if (!buf)
+		return -ENOMEM;
+
+	ret = hid_hw_raw_request(hdev, RMI_SET_RMI_MODE_REPORT_ID, buf,
 			sizeof(txbuf), HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
+	kfree(buf);
 	if (ret < 0) {
 		dev_err(&hdev->dev, "unable to set rmi mode to %d (%d)\n", mode,
 			ret);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/4] HID: lg: make transfer buffers DMA capable
  2016-11-21 10:48 ` [PATCH 2/4] HID: lg: " Benjamin Tissoires
  2016-11-21 12:05   ` [PATCH] HID: lg: fix noderef.cocci warnings kbuild test robot
@ 2016-11-21 12:05   ` kbuild test robot
  1 sibling, 0 replies; 12+ messages in thread
From: kbuild test robot @ 2016-11-21 12:05 UTC (permalink / raw)
  To: Benjamin Tissoires; +Cc: kbuild-all, Jiri Kosina, linux-input, linux-kernel

Hi Benjamin,

[auto build test WARNING on hid/for-next]
[also build test WARNING on v4.9-rc6 next-20161117]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Benjamin-Tissoires/HID-fix-few-non-DMA-capable-HID-transfers/20161121-185330
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git for-next


coccinelle warnings: (new ones prefixed by >>)

>> drivers/hid/hid-lg.c:780:47-53: ERROR: application of sizeof to pointer

Please review and possibly fold the followup patch.

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] HID: lg: fix noderef.cocci warnings
  2016-11-21 10:48 ` [PATCH 2/4] HID: lg: " Benjamin Tissoires
@ 2016-11-21 12:05   ` kbuild test robot
  2016-11-21 14:17     ` Benjamin Tissoires
  2016-11-21 12:05   ` [PATCH 2/4] HID: lg: make transfer buffers DMA capable kbuild test robot
  1 sibling, 1 reply; 12+ messages in thread
From: kbuild test robot @ 2016-11-21 12:05 UTC (permalink / raw)
  To: Benjamin Tissoires; +Cc: kbuild-all, Jiri Kosina, linux-input, linux-kernel

drivers/hid/hid-lg.c:780:47-53: ERROR: application of sizeof to pointer

 sizeof when applied to a pointer typed expression gives the size of
 the pointer

Generated by: scripts/coccinelle/misc/noderef.cocci

CC: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
---

 hid-lg.c |    6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

--- a/drivers/hid/hid-lg.c
+++ b/drivers/hid/hid-lg.c
@@ -777,8 +777,10 @@ static int lg_probe(struct hid_device *h
 			buf[1] = 0xB2;
 			get_random_bytes(&buf[2], 2);
 
-			ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
-					HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
+			ret = hid_hw_raw_request(hdev, buf[0], buf,
+						 sizeof(*buf),
+						 HID_FEATURE_REPORT,
+						 HID_REQ_SET_REPORT);
 		}
 		kfree(buf);
 	}

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] HID: lg: fix noderef.cocci warnings
  2016-11-21 12:05   ` [PATCH] HID: lg: fix noderef.cocci warnings kbuild test robot
@ 2016-11-21 14:17     ` Benjamin Tissoires
  2016-11-22 10:44       ` Jiri Kosina
  0 siblings, 1 reply; 12+ messages in thread
From: Benjamin Tissoires @ 2016-11-21 14:17 UTC (permalink / raw)
  To: kbuild test robot; +Cc: kbuild-all, Jiri Kosina, linux-input, linux-kernel

On Nov 21 2016 or thereabouts, kbuild test robot wrote:
> drivers/hid/hid-lg.c:780:47-53: ERROR: application of sizeof to pointer
> 
>  sizeof when applied to a pointer typed expression gives the size of
>  the pointer
> 
> Generated by: scripts/coccinelle/misc/noderef.cocci
> 
> CC: Benjamin Tissoires <benjamin.tissoires@redhat.com>
> Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
> ---
> 
>  hid-lg.c |    6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> --- a/drivers/hid/hid-lg.c
> +++ b/drivers/hid/hid-lg.c
> @@ -777,8 +777,10 @@ static int lg_probe(struct hid_device *h
>  			buf[1] = 0xB2;
>  			get_random_bytes(&buf[2], 2);
>  
> -			ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
> -					HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
> +			ret = hid_hw_raw_request(hdev, buf[0], buf,
> +						 sizeof(*buf),

This is wrong. I messed up and should have used "sizeof(cbuf)", but the
coccinelle script failed at detecting the correct solution (I guess it
couldn't).

Jiri, do you want me to send a v2 of the series or will you just amend
the patch while applying?

Cheers,
Benjamin

> +						 HID_FEATURE_REPORT,
> +						 HID_REQ_SET_REPORT);
>  		}
>  		kfree(buf);
>  	}

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] HID: lg: fix noderef.cocci warnings
  2016-11-21 14:17     ` Benjamin Tissoires
@ 2016-11-22 10:44       ` Jiri Kosina
  2016-11-23  2:22         ` Fengguang Wu
  0 siblings, 1 reply; 12+ messages in thread
From: Jiri Kosina @ 2016-11-22 10:44 UTC (permalink / raw)
  To: Benjamin Tissoires
  Cc: kbuild test robot, kbuild-all, linux-input, linux-kernel

On Mon, 21 Nov 2016, Benjamin Tissoires wrote:

> > Generated by: scripts/coccinelle/misc/noderef.cocci
> > 
> > CC: Benjamin Tissoires <benjamin.tissoires@redhat.com>
> > Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
> > ---
> > 
> >  hid-lg.c |    6 ++++--
> >  1 file changed, 4 insertions(+), 2 deletions(-)
> > 
> > --- a/drivers/hid/hid-lg.c
> > +++ b/drivers/hid/hid-lg.c
> > @@ -777,8 +777,10 @@ static int lg_probe(struct hid_device *h
> >  			buf[1] = 0xB2;
> >  			get_random_bytes(&buf[2], 2);
> >  
> > -			ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
> > -					HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
> > +			ret = hid_hw_raw_request(hdev, buf[0], buf,
> > +						 sizeof(*buf),
> 
> This is wrong. I messed up and should have used "sizeof(cbuf)", but the
> coccinelle script failed at detecting the correct solution (I guess it
> couldn't).

Fengguang, is there anything that could be done to improve this?

> Jiri, do you want me to send a v2 of the series or will you just amend 
> the patch while applying?

I'll fix that up, no worries. Thanks,

-- 
Jiri Kosina
SUSE Labs

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] HID: lg: fix noderef.cocci warnings
  2016-11-22 10:44       ` Jiri Kosina
@ 2016-11-23  2:22         ` Fengguang Wu
  2016-11-23  7:03           ` Julia Lawall
  0 siblings, 1 reply; 12+ messages in thread
From: Fengguang Wu @ 2016-11-23  2:22 UTC (permalink / raw)
  To: Jiri Kosina
  Cc: Benjamin Tissoires, kbuild-all, linux-input, linux-kernel,
	Julia Lawall, Gilles Muller

On Tue, Nov 22, 2016 at 11:44:34AM +0100, Jiri Kosina wrote:
>On Mon, 21 Nov 2016, Benjamin Tissoires wrote:
>
>> > Generated by: scripts/coccinelle/misc/noderef.cocci
>> >
>> > CC: Benjamin Tissoires <benjamin.tissoires@redhat.com>
>> > Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
>> > ---
>> >
>> >  hid-lg.c |    6 ++++--
>> >  1 file changed, 4 insertions(+), 2 deletions(-)
>> >
>> > --- a/drivers/hid/hid-lg.c
>> > +++ b/drivers/hid/hid-lg.c
>> > @@ -777,8 +777,10 @@ static int lg_probe(struct hid_device *h
>> >  			buf[1] = 0xB2;
>> >  			get_random_bytes(&buf[2], 2);
>> >
>> > -			ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf),
>> > -					HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
>> > +			ret = hid_hw_raw_request(hdev, buf[0], buf,
>> > +						 sizeof(*buf),
>>
>> This is wrong. I messed up and should have used "sizeof(cbuf)", but the
>> coccinelle script failed at detecting the correct solution (I guess it
>> couldn't).
>
>Fengguang, is there anything that could be done to improve this?

CC Julie and Gilles. I'm not sure if the coccinelle script could be
made that smart. :)

>> Jiri, do you want me to send a v2 of the series or will you just amend
>> the patch while applying?
>
>I'll fix that up, no worries. Thanks,
>
>-- 
>Jiri Kosina
>SUSE Labs

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] HID: lg: fix noderef.cocci warnings
  2016-11-23  2:22         ` Fengguang Wu
@ 2016-11-23  7:03           ` Julia Lawall
  0 siblings, 0 replies; 12+ messages in thread
From: Julia Lawall @ 2016-11-23  7:03 UTC (permalink / raw)
  To: Fengguang Wu
  Cc: Jiri Kosina, Benjamin Tissoires, kbuild-all, linux-input,
	linux-kernel, Gilles Muller



On Wed, 23 Nov 2016, Fengguang Wu wrote:

> On Tue, Nov 22, 2016 at 11:44:34AM +0100, Jiri Kosina wrote:
> > On Mon, 21 Nov 2016, Benjamin Tissoires wrote:
> >
> > > > Generated by: scripts/coccinelle/misc/noderef.cocci
> > > >
> > > > CC: Benjamin Tissoires <benjamin.tissoires@redhat.com>
> > > > Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
> > > > ---
> > > >
> > > >  hid-lg.c |    6 ++++--
> > > >  1 file changed, 4 insertions(+), 2 deletions(-)
> > > >
> > > > --- a/drivers/hid/hid-lg.c
> > > > +++ b/drivers/hid/hid-lg.c
> > > > @@ -777,8 +777,10 @@ static int lg_probe(struct hid_device *h
> > > >  			buf[1] = 0xB2;
> > > >  			get_random_bytes(&buf[2], 2);
> > > >
> > > > -			ret = hid_hw_raw_request(hdev, buf[0], buf,
> > > sizeof(buf),
> > > > -					HID_FEATURE_REPORT,
> > > HID_REQ_SET_REPORT);
> > > > +			ret = hid_hw_raw_request(hdev, buf[0], buf,
> > > > +						 sizeof(*buf),
> > >
> > > This is wrong. I messed up and should have used "sizeof(cbuf)", but the
> > > coccinelle script failed at detecting the correct solution (I guess it
> > > couldn't).
> >
> > Fengguang, is there anything that could be done to improve this?
>
> CC Julie and Gilles. I'm not sure if the coccinelle script could be
> made that smart. :)

Thanks for forwarding.  From looking at the code snippet, I have the
impression that if it were possible, it would require an interprocedural
analysis, and the cost would outweigh the benefit.  Basically, I don't see
any cbuf nearby.

julia


> > > Jiri, do you want me to send a v2 of the series or will you just amend
> > > the patch while applying?
> >
> > I'll fix that up, no worries. Thanks,
> >
> > --
> > Jiri Kosina
> > SUSE Labs
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 0/4] HID: fix few non-DMA capable HID transfers
  2016-11-21 10:48 [PATCH 0/4] HID: fix few non-DMA capable HID transfers Benjamin Tissoires
                   ` (3 preceding siblings ...)
  2016-11-21 10:48 ` [PATCH 4/4] HID: rmi: " Benjamin Tissoires
@ 2016-11-23 16:44 ` Jiri Kosina
  4 siblings, 0 replies; 12+ messages in thread
From: Jiri Kosina @ 2016-11-23 16:44 UTC (permalink / raw)
  To: Benjamin Tissoires; +Cc: linux-input, linux-kernel

On Mon, 21 Nov 2016, Benjamin Tissoires wrote:

> While playing a little bit with the CP2112 (for hid-rmi I must confess), I
> realized that kernel v4.9 now enforces DMA capable buffers when calling
> hid_hw_raw_request(). Kernel v4.8 works fine (but gives a stacktrace the first
> time), but v4.9 doesn't.
> 
> So I gave a check of all the other drivers in the HID tree, and it looks like
> only 4 drivers are not properly allocating their buffers.
> 
> I'd say this is v4.9 material but I was not able to test magicmouse and lg.
> If this doesn't qualifies for 4.9-rc7, I think we should add the stable@ stamp,
> given that the chance this will break hid-rmi is huge (cp2112 is not so much an
> issue, given it's a devel board).

Thanks for fixing this up. Applied to for-4.9/upstream-fixes.

-- 
Jiri Kosina
SUSE Labs

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2016-11-23 16:44 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-21 10:48 [PATCH 0/4] HID: fix few non-DMA capable HID transfers Benjamin Tissoires
2016-11-21 10:48 ` [PATCH 1/4] HID: cp2112: make transfer buffers DMA capable Benjamin Tissoires
2016-11-21 10:48 ` [PATCH 2/4] HID: lg: " Benjamin Tissoires
2016-11-21 12:05   ` [PATCH] HID: lg: fix noderef.cocci warnings kbuild test robot
2016-11-21 14:17     ` Benjamin Tissoires
2016-11-22 10:44       ` Jiri Kosina
2016-11-23  2:22         ` Fengguang Wu
2016-11-23  7:03           ` Julia Lawall
2016-11-21 12:05   ` [PATCH 2/4] HID: lg: make transfer buffers DMA capable kbuild test robot
2016-11-21 10:48 ` [PATCH 3/4] HID: magicmouse: " Benjamin Tissoires
2016-11-21 10:48 ` [PATCH 4/4] HID: rmi: " Benjamin Tissoires
2016-11-23 16:44 ` [PATCH 0/4] HID: fix few non-DMA capable HID transfers Jiri Kosina

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).