Merge tag 'rpmsg-v4.20' of git://github.com/andersson/remoteproc
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 30 Oct 2018 00:10:03 +0000 (17:10 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 30 Oct 2018 00:10:03 +0000 (17:10 -0700)
Pull rpmsg updates from Bjorn Andersson:
 "This migrates rpmsg_char to use read/write_iter to allow being
  operated using aio, removes the message size alignment requirements
  from glink, closes a potential memory leak in SMD and switches to
  %pOFn for printing device_node names"

* tag 'rpmsg-v4.20' of git://github.com/andersson/remoteproc:
  rpmsg: glink: smem: Support rx peak for size less than 4 bytes
  rpmsg: smd: fix memory leak on channel create
  rpmsg: glink: Remove chunk size word align warning
  rpmsg: Convert to using %pOFn instead of device_node.name
  rpmsg: char: Migrate to iter versions of read and write

drivers/rpmsg/qcom_glink_native.c
drivers/rpmsg/qcom_glink_smem.c
drivers/rpmsg/qcom_smd.c
drivers/rpmsg/rpmsg_char.c

index e2ce4e638258b7a64de8e9f41e6167f09aaf8c74..f46c787733e8ac6ac63cf5eca85a40cad0665272 100644 (file)
@@ -792,9 +792,6 @@ static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail)
                return -EAGAIN;
        }
 
-       if (WARN(chunk_size % 4, "Incoming data must be word aligned\n"))
-               return -EINVAL;
-
        rcid = le16_to_cpu(hdr.msg.param1);
        spin_lock_irqsave(&glink->idr_lock, flags);
        channel = idr_find(&glink->rcids, rcid);
index 2b5cf279095403f9ab54ffac2db194d4445b2503..64a5ce324c7f7e52b740db8a86d62ed84c3111e7 100644 (file)
@@ -89,15 +89,11 @@ static void glink_smem_rx_peak(struct qcom_glink_pipe *np,
                tail -= pipe->native.length;
 
        len = min_t(size_t, count, pipe->native.length - tail);
-       if (len) {
-               __ioread32_copy(data, pipe->fifo + tail,
-                               len / sizeof(u32));
-       }
+       if (len)
+               memcpy_fromio(data, pipe->fifo + tail, len);
 
-       if (len != count) {
-               __ioread32_copy(data + len, pipe->fifo,
-                               (count - len) / sizeof(u32));
-       }
+       if (len != count)
+               memcpy_fromio(data + len, pipe->fifo, (count - len));
 }
 
 static void glink_smem_rx_advance(struct qcom_glink_pipe *np,
@@ -205,7 +201,7 @@ struct qcom_glink *qcom_glink_smem_register(struct device *parent,
        dev->parent = parent;
        dev->of_node = node;
        dev->release = qcom_glink_smem_release;
-       dev_set_name(dev, "%s:%s", node->parent->name, node->name);
+       dev_set_name(dev, "%pOFn:%pOFn", node->parent, node);
        ret = device_register(dev);
        if (ret) {
                pr_err("failed to register glink edge\n");
index 8da83a4ebadc32143ec2950f3fda2a922f86812c..4abbeea782fa426b92d1f6103a3bf28f789cc3e3 100644 (file)
@@ -1122,8 +1122,10 @@ static struct qcom_smd_channel *qcom_smd_create_channel(struct qcom_smd_edge *ed
 
        channel->edge = edge;
        channel->name = kstrdup(name, GFP_KERNEL);
-       if (!channel->name)
-               return ERR_PTR(-ENOMEM);
+       if (!channel->name) {
+               ret = -ENOMEM;
+               goto free_channel;
+       }
 
        spin_lock_init(&channel->tx_lock);
        spin_lock_init(&channel->recv_lock);
@@ -1173,6 +1175,7 @@ static struct qcom_smd_channel *qcom_smd_create_channel(struct qcom_smd_edge *ed
 
 free_name_and_channel:
        kfree(channel->name);
+free_channel:
        kfree(channel);
 
        return ERR_PTR(ret);
@@ -1454,7 +1457,7 @@ struct qcom_smd_edge *qcom_smd_register_edge(struct device *parent,
        edge->dev.release = qcom_smd_edge_release;
        edge->dev.of_node = node;
        edge->dev.groups = qcom_smd_edge_groups;
-       dev_set_name(&edge->dev, "%s:%s", dev_name(parent), node->name);
+       dev_set_name(&edge->dev, "%s:%pOFn", dev_name(parent), node);
        ret = device_register(&edge->dev);
        if (ret) {
                pr_err("failed to register smd edge\n");
index a76b963a7e50f31e919c9e476de8d2161fad390f..eea5ebbb5119a85eb12b1ca550ea93b75ed88c8f 100644 (file)
@@ -167,9 +167,9 @@ static int rpmsg_eptdev_release(struct inode *inode, struct file *filp)
        return 0;
 }
 
-static ssize_t rpmsg_eptdev_read(struct file *filp, char __user *buf,
-                                size_t len, loff_t *f_pos)
+static ssize_t rpmsg_eptdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
 {
+       struct file *filp = iocb->ki_filp;
        struct rpmsg_eptdev *eptdev = filp->private_data;
        unsigned long flags;
        struct sk_buff *skb;
@@ -205,8 +205,8 @@ static ssize_t rpmsg_eptdev_read(struct file *filp, char __user *buf,
        if (!skb)
                return -EFAULT;
 
-       use = min_t(size_t, len, skb->len);
-       if (copy_to_user(buf, skb->data, use))
+       use = min_t(size_t, iov_iter_count(to), skb->len);
+       if (copy_to_iter(skb->data, use, to) != use)
                use = -EFAULT;
 
        kfree_skb(skb);
@@ -214,16 +214,21 @@ static ssize_t rpmsg_eptdev_read(struct file *filp, char __user *buf,
        return use;
 }
 
-static ssize_t rpmsg_eptdev_write(struct file *filp, const char __user *buf,
-                                 size_t len, loff_t *f_pos)
+static ssize_t rpmsg_eptdev_write_iter(struct kiocb *iocb,
+                                      struct iov_iter *from)
 {
+       struct file *filp = iocb->ki_filp;
        struct rpmsg_eptdev *eptdev = filp->private_data;
+       size_t len = iov_iter_count(from);
        void *kbuf;
        int ret;
 
-       kbuf = memdup_user(buf, len);
-       if (IS_ERR(kbuf))
-               return PTR_ERR(kbuf);
+       kbuf = kzalloc(len, GFP_KERNEL);
+       if (!kbuf)
+               return -ENOMEM;
+
+       if (!copy_from_iter_full(kbuf, len, from))
+               return -EFAULT;
 
        if (mutex_lock_interruptible(&eptdev->ept_lock)) {
                ret = -ERESTARTSYS;
@@ -281,8 +286,8 @@ static const struct file_operations rpmsg_eptdev_fops = {
        .owner = THIS_MODULE,
        .open = rpmsg_eptdev_open,
        .release = rpmsg_eptdev_release,
-       .read = rpmsg_eptdev_read,
-       .write = rpmsg_eptdev_write,
+       .read_iter = rpmsg_eptdev_read_iter,
+       .write_iter = rpmsg_eptdev_write_iter,
        .poll = rpmsg_eptdev_poll,
        .unlocked_ioctl = rpmsg_eptdev_ioctl,
        .compat_ioctl = rpmsg_eptdev_ioctl,