Message ID | 1681912409-25248-4-git-send-email-quic_sarannya@quicinc.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | rpmsg signaling/flowcontrol patches | expand |
Hi Sarannya, kernel test robot noticed the following build errors: [auto build test ERROR on v6.3-rc7] [also build test ERROR on linus/master next-20230418] [cannot apply to remoteproc/rpmsg-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Sarannya-S/rpmsg-core-Add-signal-API-support/20230419-220040 patch link: https://lore.kernel.org/r/1681912409-25248-4-git-send-email-quic_sarannya%40quicinc.com patch subject: [PATCH V6 3/3] rpmsg: char: Add RPMSG GET/SET FLOWCONTROL IOCTL support config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20230420/202304200018.ik0k7dKN-lkp@intel.com/config) compiler: m68k-linux-gcc (GCC) 12.1.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/4f765ede8c129f07c522ef4a7c6aee27cb466be6 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Sarannya-S/rpmsg-core-Add-signal-API-support/20230419-220040 git checkout 4f765ede8c129f07c522ef4a7c6aee27cb466be6 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k SHELL=/bin/bash drivers/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> | Link: https://lore.kernel.org/oe-kbuild-all/202304200018.ik0k7dKN-lkp@intel.com/ All error/warnings (new ones prefixed by >>): drivers/rpmsg/rpmsg_char.c: In function 'rpmsg_eptdev_ioctl': >> drivers/rpmsg/rpmsg_char.c:334:23: error: too few arguments to function 'rpmsg_set_flow_control' 334 | ret = rpmsg_set_flow_control(eptdev->ept, set); | ^~~~~~~~~~~~~~~~~~~~~~ In file included from drivers/rpmsg/rpmsg_char.c:23: include/linux/rpmsg.h:200:5: note: declared here 200 | int rpmsg_set_flow_control(struct rpmsg_endpoint *ept, bool enable, u32 dst); | ^~~~~~~~~~~~~~~~~~~~~~ >> drivers/rpmsg/rpmsg_char.c:321:13: warning: variable 'val' set but not used [-Wunused-but-set-variable] 321 | u32 val; | ^~~ vim +/rpmsg_set_flow_control +334 drivers/rpmsg/rpmsg_char.c 314 315 static long rpmsg_eptdev_ioctl(struct file *fp, unsigned int cmd, 316 unsigned long arg) 317 { 318 struct rpmsg_eptdev *eptdev = fp->private_data; 319 320 bool set; > 321 u32 val; 322 int ret; 323 324 switch (cmd) { 325 case RPMSG_GET_OUTGOING_FLOWCONTROL: 326 eptdev->remote_flow_updated = false; 327 ret = put_user(eptdev->remote_flow, (int __user *)arg); 328 break; 329 case RPMSG_SET_INCOMING_FLOWCONTROL: 330 ret = get_user(val, (int __user *)arg); 331 if (ret) 332 break; 333 set = !!arg; > 334 ret = rpmsg_set_flow_control(eptdev->ept, set); 335 break; 336 case RPMSG_DESTROY_EPT_IOCTL: 337 /* Don't allow to destroy a default endpoint. */ 338 if (eptdev->default_ept) { 339 ret = -EINVAL; 340 break; 341 } 342 ret = rpmsg_chrdev_eptdev_destroy(&eptdev->dev, NULL); 343 break; 344 default: 345 ret = -EINVAL; 346 } 347 348 return ret; 349 } 350
diff --git a/drivers/rpmsg/rpmsg_char.c b/drivers/rpmsg/rpmsg_char.c index a271fce..97f80f4 100644 --- a/drivers/rpmsg/rpmsg_char.c +++ b/drivers/rpmsg/rpmsg_char.c @@ -23,6 +23,7 @@ #include <linux/rpmsg.h> #include <linux/skbuff.h> #include <linux/slab.h> +#include <linux/termios.h> #include <linux/uaccess.h> #include <uapi/linux/rpmsg.h> @@ -68,6 +69,8 @@ struct rpmsg_eptdev { struct sk_buff_head queue; wait_queue_head_t readq; + bool remote_flow; + bool remote_flow_updated; }; int rpmsg_chrdev_eptdev_destroy(struct device *dev, void *data) @@ -116,6 +119,18 @@ static int rpmsg_ept_cb(struct rpmsg_device *rpdev, void *buf, int len, return 0; } +static int rpmsg_ept_flow_cb(struct rpmsg_device *rpdev, void *priv, bool enable) +{ + struct rpmsg_eptdev *eptdev = priv; + + eptdev->remote_flow = enable; + eptdev->remote_flow_updated = true; + + wake_up_interruptible(&eptdev->readq); + + return 0; +} + static int rpmsg_eptdev_open(struct inode *inode, struct file *filp) { struct rpmsg_eptdev *eptdev = cdev_to_eptdev(inode->i_cdev); @@ -152,6 +167,7 @@ static int rpmsg_eptdev_open(struct inode *inode, struct file *filp) return -EINVAL; } + ept->flow_cb = rpmsg_ept_flow_cb; eptdev->ept = ept; filp->private_data = eptdev; mutex_unlock(&eptdev->ept_lock); @@ -172,6 +188,7 @@ static int rpmsg_eptdev_release(struct inode *inode, struct file *filp) eptdev->ept = NULL; } mutex_unlock(&eptdev->ept_lock); + eptdev->remote_flow_updated = false; /* Discard all SKBs */ skb_queue_purge(&eptdev->queue); @@ -285,6 +302,9 @@ static __poll_t rpmsg_eptdev_poll(struct file *filp, poll_table *wait) if (!skb_queue_empty(&eptdev->queue)) mask |= EPOLLIN | EPOLLRDNORM; + if (eptdev->remote_flow_updated) + mask |= EPOLLPRI; + mutex_lock(&eptdev->ept_lock); mask |= rpmsg_poll(eptdev->ept, filp, wait); mutex_unlock(&eptdev->ept_lock); @@ -297,14 +317,35 @@ static long rpmsg_eptdev_ioctl(struct file *fp, unsigned int cmd, { struct rpmsg_eptdev *eptdev = fp->private_data; - if (cmd != RPMSG_DESTROY_EPT_IOCTL) - return -EINVAL; + bool set; + u32 val; + int ret; - /* Don't allow to destroy a default endpoint. */ - if (eptdev->default_ept) - return -EINVAL; + switch (cmd) { + case RPMSG_GET_OUTGOING_FLOWCONTROL: + eptdev->remote_flow_updated = false; + ret = put_user(eptdev->remote_flow, (int __user *)arg); + break; + case RPMSG_SET_INCOMING_FLOWCONTROL: + ret = get_user(val, (int __user *)arg); + if (ret) + break; + set = !!arg; + ret = rpmsg_set_flow_control(eptdev->ept, set); + break; + case RPMSG_DESTROY_EPT_IOCTL: + /* Don't allow to destroy a default endpoint. */ + if (eptdev->default_ept) { + ret = -EINVAL; + break; + } + ret = rpmsg_chrdev_eptdev_destroy(&eptdev->dev, NULL); + break; + default: + ret = -EINVAL; + } - return rpmsg_chrdev_eptdev_destroy(&eptdev->dev, NULL); + return ret; } static const struct file_operations rpmsg_eptdev_fops = { diff --git a/include/uapi/linux/rpmsg.h b/include/uapi/linux/rpmsg.h index 1637e68..c955e27 100644 --- a/include/uapi/linux/rpmsg.h +++ b/include/uapi/linux/rpmsg.h @@ -10,7 +10,6 @@ #include <linux/types.h> #define RPMSG_ADDR_ANY 0xFFFFFFFF - /** * struct rpmsg_endpoint_info - endpoint info representation * @name: name of service @@ -43,4 +42,14 @@ struct rpmsg_endpoint_info { */ #define RPMSG_RELEASE_DEV_IOCTL _IOW(0xb5, 0x4, struct rpmsg_endpoint_info) +/** + * Set the flow control for the remote rpmsg char device. + */ +#define RPMSG_GET_OUTGOING_FLOWCONTROL _IOW(0xb5, 0x5, struct rpmsg_endpoint_info) + +/** + * Set the flow control for the local rpmsg char device. + */ +#define RPMSG_SET_INCOMING_FLOWCONTROL _IOW(0xb5, 0x6, struct rpmsg_endpoint_info) + #endif