Re: [PATCH v2] tty: serial: qcom_geni_serial: Fix softlock

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Ryan,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on tty/tty-testing]
[also build test WARNING on v4.20-rc4 next-20181129]
[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/Ryan-Case/tty-serial-qcom_geni_serial-Fix-softlock/20181129-174407
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git tty-testing
config: mips-allyesconfig (attached as .config)
compiler: mips-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=7.2.0 make.cross ARCH=mips 

All warnings (new ones prefixed by >>):

   In file included from include/linux/clk.h:16:0,
                    from drivers/tty/serial/qcom_geni_serial.c:8:
   drivers/tty/serial/qcom_geni_serial.c: In function 'qcom_geni_serial_handle_tx':
   include/linux/kernel.h:845:29: warning: comparison of distinct pointer types lacks a cast
      (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
                                ^
   include/linux/kernel.h:859:4: note: in expansion of macro '__typecheck'
      (__typecheck(x, y) && __no_side_effects(x, y))
       ^~~~~~~~~~~
   include/linux/kernel.h:869:24: note: in expansion of macro '__safe_cmp'
     __builtin_choose_expr(__safe_cmp(x, y), \
                           ^~~~~~~~~~
   include/linux/kernel.h:878:19: note: in expansion of macro '__careful_cmp'
    #define min(x, y) __careful_cmp(x, y, <)
                      ^~~~~~~~~~~~~
   include/linux/kernel.h:893:23: note: in expansion of macro 'min'
    #define min3(x, y, z) min((typeof(x))min(x, y), z)
                          ^~~
>> drivers/tty/serial/qcom_geni_serial.c:746:10: note: in expansion of macro 'min3'
     chunk = min3(avail, pending, (UART_XMIT_SIZE - tail));
             ^~~~

vim +/min3 +746 drivers/tty/serial/qcom_geni_serial.c

   714	
   715	static void qcom_geni_serial_handle_tx(struct uart_port *uport, bool done,
   716			bool active)
   717	{
   718		struct qcom_geni_serial_port *port = to_dev_port(uport, uport);
   719		struct circ_buf *xmit = &uport->state->xmit;
   720		size_t avail;
   721		size_t remaining;
   722		size_t pending;
   723		int i;
   724		u32 status;
   725		unsigned int chunk;
   726		int tail;
   727	
   728		status = readl_relaxed(uport->membase + SE_GENI_TX_FIFO_STATUS);
   729	
   730		/* Complete the current tx command before taking newly added data */
   731		if (active)
   732			pending = port->tx_remaining;
   733		else
   734			pending = uart_circ_chars_pending(xmit);
   735	
   736		/* All data has been transmitted and acknowledged as received */
   737		if (!pending && !status && done) {
   738			qcom_geni_serial_stop_tx(uport);
   739			goto out_write_wakeup;
   740		}
   741	
   742		avail = port->tx_fifo_depth - (status & TX_FIFO_WC);
   743		avail *= port->tx_bytes_pw;
   744	
   745		tail = xmit->tail;
 > 746		chunk = min3(avail, pending, (UART_XMIT_SIZE - tail));
   747		if (!chunk)
   748			goto out_write_wakeup;
   749	
   750		if (!port->tx_remaining) {
   751			qcom_geni_serial_setup_tx(uport, pending);
   752			port->tx_remaining = pending;
   753		}
   754	
   755		remaining = chunk;
   756		for (i = 0; i < chunk; ) {
   757			unsigned int tx_bytes;
   758			u8 buf[sizeof(u32)];
   759			int c;
   760	
   761			memset(buf, 0, ARRAY_SIZE(buf));
   762			tx_bytes = min_t(size_t, remaining, port->tx_bytes_pw);
   763			for (c = 0; c < tx_bytes ; c++)
   764				buf[c] = xmit->buf[tail + c];
   765	
   766			iowrite32_rep(uport->membase + SE_GENI_TX_FIFOn, buf, 1);
   767	
   768			i += tx_bytes;
   769			tail += tx_bytes;
   770			uport->icount.tx += tx_bytes;
   771			remaining -= tx_bytes;
   772			port->tx_remaining -= tx_bytes;
   773		}
   774	
   775		xmit->tail = tail & (UART_XMIT_SIZE - 1);
   776	out_write_wakeup:
   777		if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
   778			uart_write_wakeup(uport);
   779	}
   780	

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

Attachment: .config.gz
Description: application/gzip


[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux PPP]     [Linux FS]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Linmodem]     [Device Mapper]     [Linux Kernel for ARM]

  Powered by Linux