From: kbuild test robot <lkp@intel.com> Cc: kbuild-all@01.org, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Arnd Bergmann <arnd@arndb.de>, Sujeev Dias <sdias@codeaurora.org>, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Tony Truong <truong@codeaurora.org> Subject: Re: [PATCH v1 4/4] mhi_bus: dev: uci: add user space interface driver Date: Sat, 28 Apr 2018 09:03:54 +0800 [thread overview] Message-ID: <201804280844.K9kqpUZI%fengguang.wu@intel.com> (raw) In-Reply-To: <1524795811-21399-5-git-send-email-sdias@codeaurora.org> [-- Attachment #1: Type: text/plain, Size: 19534 bytes --] Hi Sujeev, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING on v4.17-rc2 next-20180426] [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/Sujeev-Dias/mhi_bus-core-Add-support-for-MHI-host-interface/20180428-065959 config: i386-allmodconfig (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386 All warnings (new ones prefixed by >>): In file included from drivers/bus/mhi/devices/mhi_uci.c:26:0: include/linux/mhi.h:658:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'int' static inlint int mhi_force_rddm_mode(struct mhi_controller *mhi_cntrl) ^~~ In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: drivers/bus/mhi/devices/mhi_uci.c: In function 'mhi_queue_inbound': >> include/linux/kern_levels.h:5:18: warning: format '%ld' expects argument of type 'long int', but argument 5 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:114:3: note: in expansion of macro 'MSG_VERB' MSG_VERB("Allocated buf %d of %d size %ld\n", i, nr_trbs, mtu); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:114:43: note: format string is defined here MSG_VERB("Allocated buf %d of %d size %ld\n", i, nr_trbs, mtu); ~~^ %d In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: drivers/bus/mhi/devices/mhi_uci.c: In function 'mhi_uci_write': include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:243:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Enter: to xfer:%lu bytes\n", count); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:243:29: note: format string is defined here MSG_VERB("Enter: to xfer:%lu bytes\n", count); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:89:4: note: in expansion of macro 'pr_err' pr_err("[E][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:266:4: note: in expansion of macro 'MSG_ERR' MSG_ERR("Failed to allocate memory %lu\n", xfer_size); ^~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:266:41: note: format string is defined here MSG_ERR("Failed to allocate memory %lu\n", xfer_size); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:295:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Exit: Number of bytes xferred:%lu\n", bytes_xfered); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:295:44: note: format string is defined here MSG_VERB("Exit: Number of bytes xferred:%lu\n", bytes_xfered); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: drivers/bus/mhi/devices/mhi_uci.c: In function 'mhi_uci_read': include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:321:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Client provided buf len:%lu\n", count); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:321:38: note: format string is defined here MSG_VERB("Client provided buf len:%lu\n", count); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:376:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:376:21: note: format string is defined here MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 4 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:376:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:376:28: note: format string is defined here MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:400:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Returning %lu bytes\n", to_copy); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:400:24: note: format string is defined here MSG_VERB("Returning %lu bytes\n", to_copy); ~~^ %u vim +/pr_err +73 drivers/bus/mhi/devices/mhi_uci.c 70 71 #define MSG_VERB(fmt, ...) do { \ 72 if (msg_lvl <= MHI_MSG_LVL_VERBOSE) \ > 73 pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ 74 } while (0) 75 76 #else 77 78 #define MSG_VERB(fmt, ...) 79 80 #endif 81 82 #define MSG_LOG(fmt, ...) do { \ 83 if (msg_lvl <= MHI_MSG_LVL_INFO) \ 84 pr_err("[I][%s] " fmt, __func__, ##__VA_ARGS__); \ 85 } while (0) 86 87 #define MSG_ERR(fmt, ...) do { \ 88 if (msg_lvl <= MHI_MSG_LVL_ERROR) \ > 89 pr_err("[E][%s] " fmt, __func__, ##__VA_ARGS__); \ 90 } while (0) 91 92 #define MAX_UCI_DEVICES (64) 93 94 static DECLARE_BITMAP(uci_minors, MAX_UCI_DEVICES); 95 static struct mhi_uci_drv mhi_uci_drv; 96 97 static int mhi_queue_inbound(struct uci_dev *uci_dev) 98 { 99 struct mhi_device *mhi_dev = uci_dev->mhi_dev; 100 int nr_trbs = mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE); 101 size_t mtu = uci_dev->mtu; 102 void *buf; 103 struct uci_buf *uci_buf; 104 int ret = -EIO, i; 105 106 for (i = 0; i < nr_trbs; i++) { 107 buf = kmalloc(mtu + sizeof(*uci_buf), GFP_KERNEL); 108 if (!buf) 109 return -ENOMEM; 110 111 uci_buf = buf + mtu; 112 uci_buf->data = buf; 113 > 114 MSG_VERB("Allocated buf %d of %d size %ld\n", i, nr_trbs, mtu); 115 116 ret = mhi_queue_transfer(mhi_dev, DMA_FROM_DEVICE, buf, mtu, 117 MHI_EOT); 118 if (ret) { 119 kfree(buf); 120 MSG_ERR("Failed to queue buffer %d\n", i); 121 return ret; 122 } 123 } 124 125 return ret; 126 } 127 128 static long mhi_uci_ioctl(struct file *file, 129 unsigned int cmd, 130 unsigned long arg) 131 { 132 struct uci_dev *uci_dev = file->private_data; 133 struct mhi_device *mhi_dev = uci_dev->mhi_dev; 134 long ret = -ERESTARTSYS; 135 136 mutex_lock(&uci_dev->mutex); 137 if (uci_dev->enabled) 138 ret = mhi_ioctl(mhi_dev, cmd, arg); 139 mutex_unlock(&uci_dev->mutex); 140 141 return ret; 142 } 143 144 static int mhi_uci_release(struct inode *inode, struct file *file) 145 { 146 struct uci_dev *uci_dev = file->private_data; 147 148 mutex_lock(&uci_dev->mutex); 149 uci_dev->ref_count--; 150 if (!uci_dev->ref_count) { 151 struct uci_buf *itr, *tmp; 152 struct uci_chan *uci_chan; 153 154 MSG_LOG("Last client left, closing node\n"); 155 156 if (uci_dev->enabled) 157 mhi_unprepare_from_transfer(uci_dev->mhi_dev); 158 159 /* clean inbound channel */ 160 uci_chan = &uci_dev->dl_chan; 161 list_for_each_entry_safe(itr, tmp, &uci_chan->pending, node) { 162 list_del(&itr->node); 163 kfree(itr->data); 164 } 165 if (uci_chan->cur_buf) 166 kfree(uci_chan->cur_buf->data); 167 168 uci_chan->cur_buf = NULL; 169 170 if (!uci_dev->enabled) { 171 MSG_LOG("Node is deleted, freeing dev node\n"); 172 mutex_unlock(&uci_dev->mutex); 173 mutex_destroy(&uci_dev->mutex); 174 clear_bit(MINOR(uci_dev->devt), uci_minors); 175 kfree(uci_dev); 176 return 0; 177 } 178 } 179 180 mutex_unlock(&uci_dev->mutex); 181 182 MSG_LOG("exit: ref_count:%d\n", uci_dev->ref_count); 183 184 return 0; 185 } 186 187 static unsigned int mhi_uci_poll(struct file *file, poll_table *wait) 188 { 189 struct uci_dev *uci_dev = file->private_data; 190 struct mhi_device *mhi_dev = uci_dev->mhi_dev; 191 struct uci_chan *uci_chan; 192 unsigned int mask = 0; 193 194 poll_wait(file, &uci_dev->dl_chan.wq, wait); 195 poll_wait(file, &uci_dev->ul_chan.wq, wait); 196 197 uci_chan = &uci_dev->dl_chan; 198 spin_lock_bh(&uci_chan->lock); 199 if (!uci_dev->enabled) { 200 mask = POLLERR; 201 } else if (!list_empty(&uci_chan->pending) || uci_chan->cur_buf) { 202 MSG_VERB("Client can read from node\n"); 203 mask |= POLLIN | POLLRDNORM; 204 } 205 spin_unlock_bh(&uci_chan->lock); 206 207 uci_chan = &uci_dev->ul_chan; 208 spin_lock_bh(&uci_chan->lock); 209 if (!uci_dev->enabled) { 210 mask |= POLLERR; 211 } else if (mhi_get_no_free_descriptors(mhi_dev, DMA_TO_DEVICE) > 0) { 212 MSG_VERB("Client can write to node\n"); 213 mask |= POLLOUT | POLLWRNORM; 214 } 215 spin_unlock_bh(&uci_chan->lock); 216 217 MSG_LOG("Client attempted to poll, returning mask 0x%x\n", mask); 218 219 return mask; 220 } 221 222 static ssize_t mhi_uci_write(struct file *file, 223 const char __user *buf, 224 size_t count, 225 loff_t *offp) 226 { 227 struct uci_dev *uci_dev = file->private_data; 228 struct mhi_device *mhi_dev = uci_dev->mhi_dev; 229 struct uci_chan *uci_chan = &uci_dev->ul_chan; 230 size_t bytes_xfered = 0; 231 int ret; 232 233 if (!buf || !count) 234 return -EINVAL; 235 236 /* confirm channel is active */ 237 spin_lock_bh(&uci_chan->lock); 238 if (!uci_dev->enabled) { 239 spin_unlock_bh(&uci_chan->lock); 240 return -ERESTARTSYS; 241 } 242 243 MSG_VERB("Enter: to xfer:%lu bytes\n", count); 244 245 while (count) { 246 size_t xfer_size; 247 void *kbuf; 248 enum MHI_FLAGS flags; 249 250 spin_unlock_bh(&uci_chan->lock); 251 252 /* wait for free descriptors */ 253 ret = wait_event_interruptible(uci_chan->wq, 254 (!uci_dev->enabled) || 255 mhi_get_no_free_descriptors 256 (mhi_dev, DMA_TO_DEVICE) > 0); 257 258 if (ret == -ERESTARTSYS) { 259 MSG_LOG("Exit signal caught for node\n"); 260 return -ERESTARTSYS; 261 } 262 263 xfer_size = min_t(size_t, count, uci_dev->mtu); 264 kbuf = kmalloc(xfer_size, GFP_KERNEL); 265 if (!kbuf) { > 266 MSG_ERR("Failed to allocate memory %lu\n", xfer_size); 267 return -ENOMEM; 268 } 269 270 ret = copy_from_user(kbuf, buf, xfer_size); 271 if (unlikely(ret)) { 272 kfree(kbuf); 273 return ret; 274 } 275 276 spin_lock_bh(&uci_chan->lock); 277 flags = (count - xfer_size) ? MHI_EOB : MHI_EOT; 278 if (uci_dev->enabled) 279 ret = mhi_queue_transfer(mhi_dev, DMA_TO_DEVICE, kbuf, 280 xfer_size, flags); 281 else 282 ret = -ERESTARTSYS; 283 284 if (ret) { 285 kfree(kbuf); 286 goto sys_interrupt; 287 } 288 289 bytes_xfered += xfer_size; 290 count -= xfer_size; 291 buf += xfer_size; 292 } 293 294 spin_unlock_bh(&uci_chan->lock); 295 MSG_VERB("Exit: Number of bytes xferred:%lu\n", bytes_xfered); 296 297 return bytes_xfered; 298 299 sys_interrupt: 300 spin_unlock_bh(&uci_chan->lock); 301 302 return ret; 303 } 304 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 62952 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: kbuild test robot <lkp@intel.com> To: Sujeev Dias <sdias@codeaurora.org> Cc: kbuild-all@01.org, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Arnd Bergmann <arnd@arndb.de>, Sujeev Dias <sdias@codeaurora.org>, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Tony Truong <truong@codeaurora.org> Subject: Re: [PATCH v1 4/4] mhi_bus: dev: uci: add user space interface driver Date: Sat, 28 Apr 2018 09:03:54 +0800 [thread overview] Message-ID: <201804280844.K9kqpUZI%fengguang.wu@intel.com> (raw) In-Reply-To: <1524795811-21399-5-git-send-email-sdias@codeaurora.org> [-- Attachment #1: Type: text/plain, Size: 19534 bytes --] Hi Sujeev, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING on v4.17-rc2 next-20180426] [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/Sujeev-Dias/mhi_bus-core-Add-support-for-MHI-host-interface/20180428-065959 config: i386-allmodconfig (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386 All warnings (new ones prefixed by >>): In file included from drivers/bus/mhi/devices/mhi_uci.c:26:0: include/linux/mhi.h:658:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'int' static inlint int mhi_force_rddm_mode(struct mhi_controller *mhi_cntrl) ^~~ In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: drivers/bus/mhi/devices/mhi_uci.c: In function 'mhi_queue_inbound': >> include/linux/kern_levels.h:5:18: warning: format '%ld' expects argument of type 'long int', but argument 5 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:114:3: note: in expansion of macro 'MSG_VERB' MSG_VERB("Allocated buf %d of %d size %ld\n", i, nr_trbs, mtu); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:114:43: note: format string is defined here MSG_VERB("Allocated buf %d of %d size %ld\n", i, nr_trbs, mtu); ~~^ %d In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: drivers/bus/mhi/devices/mhi_uci.c: In function 'mhi_uci_write': include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:243:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Enter: to xfer:%lu bytes\n", count); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:243:29: note: format string is defined here MSG_VERB("Enter: to xfer:%lu bytes\n", count); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:89:4: note: in expansion of macro 'pr_err' pr_err("[E][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:266:4: note: in expansion of macro 'MSG_ERR' MSG_ERR("Failed to allocate memory %lu\n", xfer_size); ^~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:266:41: note: format string is defined here MSG_ERR("Failed to allocate memory %lu\n", xfer_size); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:295:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Exit: Number of bytes xferred:%lu\n", bytes_xfered); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:295:44: note: format string is defined here MSG_VERB("Exit: Number of bytes xferred:%lu\n", bytes_xfered); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: drivers/bus/mhi/devices/mhi_uci.c: In function 'mhi_uci_read': include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:321:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Client provided buf len:%lu\n", count); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:321:38: note: format string is defined here MSG_VERB("Client provided buf len:%lu\n", count); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:376:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:376:21: note: format string is defined here MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 4 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:376:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:376:28: note: format string is defined here MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:400:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Returning %lu bytes\n", to_copy); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:400:24: note: format string is defined here MSG_VERB("Returning %lu bytes\n", to_copy); ~~^ %u vim +/pr_err +73 drivers/bus/mhi/devices/mhi_uci.c 70 71 #define MSG_VERB(fmt, ...) do { \ 72 if (msg_lvl <= MHI_MSG_LVL_VERBOSE) \ > 73 pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ 74 } while (0) 75 76 #else 77 78 #define MSG_VERB(fmt, ...) 79 80 #endif 81 82 #define MSG_LOG(fmt, ...) do { \ 83 if (msg_lvl <= MHI_MSG_LVL_INFO) \ 84 pr_err("[I][%s] " fmt, __func__, ##__VA_ARGS__); \ 85 } while (0) 86 87 #define MSG_ERR(fmt, ...) do { \ 88 if (msg_lvl <= MHI_MSG_LVL_ERROR) \ > 89 pr_err("[E][%s] " fmt, __func__, ##__VA_ARGS__); \ 90 } while (0) 91 92 #define MAX_UCI_DEVICES (64) 93 94 static DECLARE_BITMAP(uci_minors, MAX_UCI_DEVICES); 95 static struct mhi_uci_drv mhi_uci_drv; 96 97 static int mhi_queue_inbound(struct uci_dev *uci_dev) 98 { 99 struct mhi_device *mhi_dev = uci_dev->mhi_dev; 100 int nr_trbs = mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE); 101 size_t mtu = uci_dev->mtu; 102 void *buf; 103 struct uci_buf *uci_buf; 104 int ret = -EIO, i; 105 106 for (i = 0; i < nr_trbs; i++) { 107 buf = kmalloc(mtu + sizeof(*uci_buf), GFP_KERNEL); 108 if (!buf) 109 return -ENOMEM; 110 111 uci_buf = buf + mtu; 112 uci_buf->data = buf; 113 > 114 MSG_VERB("Allocated buf %d of %d size %ld\n", i, nr_trbs, mtu); 115 116 ret = mhi_queue_transfer(mhi_dev, DMA_FROM_DEVICE, buf, mtu, 117 MHI_EOT); 118 if (ret) { 119 kfree(buf); 120 MSG_ERR("Failed to queue buffer %d\n", i); 121 return ret; 122 } 123 } 124 125 return ret; 126 } 127 128 static long mhi_uci_ioctl(struct file *file, 129 unsigned int cmd, 130 unsigned long arg) 131 { 132 struct uci_dev *uci_dev = file->private_data; 133 struct mhi_device *mhi_dev = uci_dev->mhi_dev; 134 long ret = -ERESTARTSYS; 135 136 mutex_lock(&uci_dev->mutex); 137 if (uci_dev->enabled) 138 ret = mhi_ioctl(mhi_dev, cmd, arg); 139 mutex_unlock(&uci_dev->mutex); 140 141 return ret; 142 } 143 144 static int mhi_uci_release(struct inode *inode, struct file *file) 145 { 146 struct uci_dev *uci_dev = file->private_data; 147 148 mutex_lock(&uci_dev->mutex); 149 uci_dev->ref_count--; 150 if (!uci_dev->ref_count) { 151 struct uci_buf *itr, *tmp; 152 struct uci_chan *uci_chan; 153 154 MSG_LOG("Last client left, closing node\n"); 155 156 if (uci_dev->enabled) 157 mhi_unprepare_from_transfer(uci_dev->mhi_dev); 158 159 /* clean inbound channel */ 160 uci_chan = &uci_dev->dl_chan; 161 list_for_each_entry_safe(itr, tmp, &uci_chan->pending, node) { 162 list_del(&itr->node); 163 kfree(itr->data); 164 } 165 if (uci_chan->cur_buf) 166 kfree(uci_chan->cur_buf->data); 167 168 uci_chan->cur_buf = NULL; 169 170 if (!uci_dev->enabled) { 171 MSG_LOG("Node is deleted, freeing dev node\n"); 172 mutex_unlock(&uci_dev->mutex); 173 mutex_destroy(&uci_dev->mutex); 174 clear_bit(MINOR(uci_dev->devt), uci_minors); 175 kfree(uci_dev); 176 return 0; 177 } 178 } 179 180 mutex_unlock(&uci_dev->mutex); 181 182 MSG_LOG("exit: ref_count:%d\n", uci_dev->ref_count); 183 184 return 0; 185 } 186 187 static unsigned int mhi_uci_poll(struct file *file, poll_table *wait) 188 { 189 struct uci_dev *uci_dev = file->private_data; 190 struct mhi_device *mhi_dev = uci_dev->mhi_dev; 191 struct uci_chan *uci_chan; 192 unsigned int mask = 0; 193 194 poll_wait(file, &uci_dev->dl_chan.wq, wait); 195 poll_wait(file, &uci_dev->ul_chan.wq, wait); 196 197 uci_chan = &uci_dev->dl_chan; 198 spin_lock_bh(&uci_chan->lock); 199 if (!uci_dev->enabled) { 200 mask = POLLERR; 201 } else if (!list_empty(&uci_chan->pending) || uci_chan->cur_buf) { 202 MSG_VERB("Client can read from node\n"); 203 mask |= POLLIN | POLLRDNORM; 204 } 205 spin_unlock_bh(&uci_chan->lock); 206 207 uci_chan = &uci_dev->ul_chan; 208 spin_lock_bh(&uci_chan->lock); 209 if (!uci_dev->enabled) { 210 mask |= POLLERR; 211 } else if (mhi_get_no_free_descriptors(mhi_dev, DMA_TO_DEVICE) > 0) { 212 MSG_VERB("Client can write to node\n"); 213 mask |= POLLOUT | POLLWRNORM; 214 } 215 spin_unlock_bh(&uci_chan->lock); 216 217 MSG_LOG("Client attempted to poll, returning mask 0x%x\n", mask); 218 219 return mask; 220 } 221 222 static ssize_t mhi_uci_write(struct file *file, 223 const char __user *buf, 224 size_t count, 225 loff_t *offp) 226 { 227 struct uci_dev *uci_dev = file->private_data; 228 struct mhi_device *mhi_dev = uci_dev->mhi_dev; 229 struct uci_chan *uci_chan = &uci_dev->ul_chan; 230 size_t bytes_xfered = 0; 231 int ret; 232 233 if (!buf || !count) 234 return -EINVAL; 235 236 /* confirm channel is active */ 237 spin_lock_bh(&uci_chan->lock); 238 if (!uci_dev->enabled) { 239 spin_unlock_bh(&uci_chan->lock); 240 return -ERESTARTSYS; 241 } 242 243 MSG_VERB("Enter: to xfer:%lu bytes\n", count); 244 245 while (count) { 246 size_t xfer_size; 247 void *kbuf; 248 enum MHI_FLAGS flags; 249 250 spin_unlock_bh(&uci_chan->lock); 251 252 /* wait for free descriptors */ 253 ret = wait_event_interruptible(uci_chan->wq, 254 (!uci_dev->enabled) || 255 mhi_get_no_free_descriptors 256 (mhi_dev, DMA_TO_DEVICE) > 0); 257 258 if (ret == -ERESTARTSYS) { 259 MSG_LOG("Exit signal caught for node\n"); 260 return -ERESTARTSYS; 261 } 262 263 xfer_size = min_t(size_t, count, uci_dev->mtu); 264 kbuf = kmalloc(xfer_size, GFP_KERNEL); 265 if (!kbuf) { > 266 MSG_ERR("Failed to allocate memory %lu\n", xfer_size); 267 return -ENOMEM; 268 } 269 270 ret = copy_from_user(kbuf, buf, xfer_size); 271 if (unlikely(ret)) { 272 kfree(kbuf); 273 return ret; 274 } 275 276 spin_lock_bh(&uci_chan->lock); 277 flags = (count - xfer_size) ? MHI_EOB : MHI_EOT; 278 if (uci_dev->enabled) 279 ret = mhi_queue_transfer(mhi_dev, DMA_TO_DEVICE, kbuf, 280 xfer_size, flags); 281 else 282 ret = -ERESTARTSYS; 283 284 if (ret) { 285 kfree(kbuf); 286 goto sys_interrupt; 287 } 288 289 bytes_xfered += xfer_size; 290 count -= xfer_size; 291 buf += xfer_size; 292 } 293 294 spin_unlock_bh(&uci_chan->lock); 295 MSG_VERB("Exit: Number of bytes xferred:%lu\n", bytes_xfered); 296 297 return bytes_xfered; 298 299 sys_interrupt: 300 spin_unlock_bh(&uci_chan->lock); 301 302 return ret; 303 } 304 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 62952 bytes --]
next prev parent reply other threads:[~2018-04-28 1:03 UTC|newest] Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-04-27 2:23 MHI initial design review Sujeev Dias 2018-04-27 2:23 ` [PATCH v1 1/4] mhi_bus: core: Add support for MHI host interface Sujeev Dias 2018-04-27 7:22 ` Greg Kroah-Hartman 2018-04-28 14:28 ` Sujeev Dias 2018-04-28 15:50 ` Greg Kroah-Hartman 2018-04-27 7:23 ` Greg Kroah-Hartman 2018-04-27 12:18 ` Arnd Bergmann 2018-04-28 16:08 ` Sujeev Dias 2018-04-28 0:28 ` kbuild test robot 2018-04-28 0:28 ` kbuild test robot 2018-04-28 2:52 ` kbuild test robot 2018-04-28 2:52 ` kbuild test robot 2018-05-03 19:21 ` Pavel Machek 2018-05-04 3:05 ` Sujeev Dias 2018-06-22 23:03 ` Randy Dunlap 2018-04-27 2:23 ` [PATCH v1 2/4] mhi_bus: controller: MHI support for QCOM modems Sujeev Dias 2018-04-27 11:32 ` Arnd Bergmann 2018-04-28 15:40 ` Sujeev Dias 2018-04-28 3:05 ` kbuild test robot 2018-04-28 3:05 ` kbuild test robot 2018-04-28 3:12 ` kbuild test robot 2018-04-28 3:12 ` kbuild test robot 2018-04-27 2:23 ` [PATCH v1 3/4] mhi_bus: dev: netdev: add network interface driver Sujeev Dias 2018-04-27 11:19 ` Arnd Bergmann 2018-04-28 15:25 ` Sujeev Dias 2018-04-27 2:23 ` [PATCH v1 4/4] mhi_bus: dev: uci: add user space " Sujeev Dias 2018-04-27 11:36 ` Arnd Bergmann 2018-04-28 1:03 ` kbuild test robot [this message] 2018-04-28 1:03 ` kbuild test robot 2018-04-28 5:16 ` [PATCH] mhi_bus: dev: uci: fix semicolon.cocci warnings kbuild test robot 2018-04-28 5:16 ` kbuild test robot 2018-04-28 5:16 ` [PATCH v1 4/4] mhi_bus: dev: uci: add user space interface driver kbuild test robot 2018-04-28 5:16 ` kbuild test robot 2018-07-09 20:08 ` MHI code review Sujeev Dias 2018-07-09 20:08 ` [PATCH v2 1/7] mhi_bus: core: initial checkin for modem host interface bus driver Sujeev Dias 2018-07-09 20:50 ` Greg Kroah-Hartman 2018-07-09 20:52 ` Greg Kroah-Hartman 2018-07-10 6:36 ` Greg Kroah-Hartman 2018-07-11 19:30 ` Rob Herring 2018-08-09 18:39 ` Randy Dunlap 2018-07-09 20:08 ` [PATCH v2 2/7] mhi_bus: core: add power management support Sujeev Dias 2018-07-09 20:08 ` [PATCH v2 3/7] mhi_bus: core: add support for data transfer Sujeev Dias 2018-07-10 6:29 ` Greg Kroah-Hartman 2018-07-09 20:08 ` [PATCH v2 4/7] mhi_bus: core: add support for handling ioctl cmds Sujeev Dias 2018-07-09 20:08 ` [PATCH v2 5/7] mhi_bus: core: add support to get external modem time Sujeev Dias 2018-07-11 19:32 ` Rob Herring 2018-08-09 20:17 ` Randy Dunlap 2018-07-09 20:08 ` [PATCH v2 6/7] mhi_bus: controller: MHI support for QCOM modems Sujeev Dias 2018-07-11 19:36 ` Rob Herring 2018-07-09 20:08 ` [PATCH v2 7/7] mhi_bus: dev: uci: add user space interface driver Sujeev Dias 2019-04-30 15:10 ` MHI code review Daniele Palmas 2019-06-12 17:54 ` Sujeev Dias 2019-06-12 20:58 ` Daniele Palmas 2019-06-12 18:00 ` Sujeev Dias
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=201804280844.K9kqpUZI%fengguang.wu@intel.com \ --to=lkp@intel.com \ --cc=arnd@arndb.de \ --cc=gregkh@linuxfoundation.org \ --cc=kbuild-all@01.org \ --cc=linux-arm-msm@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=sdias@codeaurora.org \ --cc=truong@codeaurora.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.