hi, All
        thanks for reading. Below is my trigger.

----------------------------------------
#define WARN(x) do{             \
        KLOG_ERROR("XINHUI",x); \
}while(0)

int main()
{
        KLOG_ERROR("XINHUI", "hello world :)\n");
        long fp[4];
        int i = 0;
        int next[4]={1,2,3,0};

        do{
                char path[64] = "dev/tty30";
                path[strlen(path) - 1] = '0' + i;

                fp[i] = open(path, O_RDWR);
                if (fp[i] == -1){
                        WARN("mlk tty open fails\n");
                        return 0;
                }
        }while(++i < 4);

        i = 0;
        do{
                int p = 21;
                int ret = ioctl(fp[i], TIOCSETD , &p);
                if (ret != 0) {
                        WARN("mlk tty ioctl fails\n");
                }
                i = next[i];
        }while(1);
/* never run here, just ctrl^C */

        return 0 ;
}
----------------------------------------

without this patch, running my own tests.

my result:

PROCRANK:
.....
RAM: 1993076K total, 147968K free, 708K buffers, 108340K cached, 332K shmem, 
1092232K slab
AWESOME!

cat /proc/slabinfo
.....
kmalloc-2048      509700 509700   2048   16    8 : tunables    0    0    0 : 
slabdata  32285  32285      0
.....
AWESOME!!

thanks,

xinhui

于 2014年07月28日 16:14, xinhui.pan 写道:
> If gsmld_attach_gsm fails, the gsm is not used anymore.
> tty core will not call gsmld_close to do the cleanup work.
> tty core just restore to the tty old ldisc.
> That always causes memory leak.
> 
> Signed-off-by: xinhui.pan <xinhuix....@intel.com>
> Reported-by: Peter Hurley <pe...@hurleysoftware.com>
> ---
>  drivers/tty/n_gsm.c |    9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c
> index 81e7ccb..6cb1a6d 100644
> --- a/drivers/tty/n_gsm.c
> +++ b/drivers/tty/n_gsm.c
> @@ -2368,6 +2368,7 @@ static void gsmld_close(struct tty_struct *tty)
>  static int gsmld_open(struct tty_struct *tty)
>  {
>       struct gsm_mux *gsm;
> +     int ret;
>  
>       if (tty->ops->write == NULL)
>               return -EINVAL;
> @@ -2382,7 +2383,13 @@ static int gsmld_open(struct tty_struct *tty)
>  
>       /* Attach the initial passive connection */
>       gsm->encoding = 1;
> -     return gsmld_attach_gsm(tty, gsm);
> +
> +     ret = gsmld_attach_gsm(tty, gsm);
> +     if (ret != 0) {
> +             gsm_cleanup_mux(gsm);
> +             mux_put(gsm);
> +     }
> +     return ret;
>  }
>  
>  /**
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to