From: Xin Long <lucien.xin@gmail.com> To: Michal Kubecek <mkubecek@suse.cz> Cc: network dev <netdev@vger.kernel.org>, linux-sctp@vger.kernel.org, LKML <linux-kernel@vger.kernel.org>, Vlad Yasevich <vyasevich@gmail.com>, Neil Horman <nhorman@tuxdriver.com>, Gang He <ghe@suse.com>, GuoQing Jiang <gqjiang@suse.com> Subject: Re: non-blocking connect for kernel SCTP sockets Date: Wed, 2 May 2018 17:46:23 +0800 [thread overview] Message-ID: <CADvbK_fT5qYmOKHgBf6KWyuRcDUT3Fa8DyMQkN75C8PFkPKLXw@mail.gmail.com> (raw) In-Reply-To: <20180502090639.j55mnclmkzdts6xb@unicorn.suse.cz> On Wed, May 2, 2018 at 5:06 PM, Michal Kubecek <mkubecek@suse.cz> wrote: > Hello, > > while investigating a bug, we noticed that DLM tries to connect an SCTP > socket in non-blocking mode using > > result = sock->ops->connect(sock, (struct sockaddr *)&daddr, addr_len, > O_NONBLOCK); > > which does not work. The reason is that inet_dgram_connect() cannot pass > its flags argument to sctp_connect() so that __sctp_connect() which does > the actual waiting resorts to checking sk->sk_socket->file->f_flags > instead. As the socket used by DLM is a kernel socket with no associated > file, it ends up blocking. > > TCP doesn't suffer from this problem as for TCP, the waiting is done in > inet_stream_connect() which has the flags argument. I also checked other > proto::connect handlers and sctp_connect() seems to be the only one with > this kind of problem. > > This could be worked around in DLM and further experiments indicate > current DLM code wouldn't actually handle the non-blocking connect > properly. But I still feel ignoring the flags argument is rather a trap > that should be fixed. It is a bug, https://bugzilla.redhat.com/show_bug.cgi?id=1251530 We have the fix which also includes some cleanup, and needs to do more testing. > > I have prepared a series adding flags argument to proto::connect and > using it in sctp_connect() and __sctp_connect(). But I'm not sure if > it's not too big hammer to address issue only affecting one handler. > So my question is: would such generic approach be preferred or should we, > rather make SCTP work the way TCP does, i.e. move the waiting from, > proto::connect() to proto_ops::connect()? This would require introducing > inet_seqpacket_connect() as inet_dgram_connect() is primarily intended > for use with UDP.) We don't fix it in the generic proto::connect, which will afftect many other places. We're replacing only sctp's proto_ops::connect with sctp_connect and leave its proto::connect as NULL, so that it can get this flags param without touching the generic struct and code.
WARNING: multiple messages have this Message-ID (diff)
From: Xin Long <lucien.xin@gmail.com> To: Michal Kubecek <mkubecek@suse.cz> Cc: network dev <netdev@vger.kernel.org>, linux-sctp@vger.kernel.org, LKML <linux-kernel@vger.kernel.org>, Vlad Yasevich <vyasevich@gmail.com>, Neil Horman <nhorman@tuxdriver.com>, Gang He <ghe@suse.com>, GuoQing Jiang <gqjiang@suse.com> Subject: Re: non-blocking connect for kernel SCTP sockets Date: Wed, 02 May 2018 09:46:23 +0000 [thread overview] Message-ID: <CADvbK_fT5qYmOKHgBf6KWyuRcDUT3Fa8DyMQkN75C8PFkPKLXw@mail.gmail.com> (raw) In-Reply-To: <20180502090639.j55mnclmkzdts6xb@unicorn.suse.cz> On Wed, May 2, 2018 at 5:06 PM, Michal Kubecek <mkubecek@suse.cz> wrote: > Hello, > > while investigating a bug, we noticed that DLM tries to connect an SCTP > socket in non-blocking mode using > > result = sock->ops->connect(sock, (struct sockaddr *)&daddr, addr_len, > O_NONBLOCK); > > which does not work. The reason is that inet_dgram_connect() cannot pass > its flags argument to sctp_connect() so that __sctp_connect() which does > the actual waiting resorts to checking sk->sk_socket->file->f_flags > instead. As the socket used by DLM is a kernel socket with no associated > file, it ends up blocking. > > TCP doesn't suffer from this problem as for TCP, the waiting is done in > inet_stream_connect() which has the flags argument. I also checked other > proto::connect handlers and sctp_connect() seems to be the only one with > this kind of problem. > > This could be worked around in DLM and further experiments indicate > current DLM code wouldn't actually handle the non-blocking connect > properly. But I still feel ignoring the flags argument is rather a trap > that should be fixed. It is a bug, https://bugzilla.redhat.com/show_bug.cgi?id\x1251530 We have the fix which also includes some cleanup, and needs to do more testing. > > I have prepared a series adding flags argument to proto::connect and > using it in sctp_connect() and __sctp_connect(). But I'm not sure if > it's not too big hammer to address issue only affecting one handler. > So my question is: would such generic approach be preferred or should we, > rather make SCTP work the way TCP does, i.e. move the waiting from, > proto::connect() to proto_ops::connect()? This would require introducing > inet_seqpacket_connect() as inet_dgram_connect() is primarily intended > for use with UDP.) We don't fix it in the generic proto::connect, which will afftect many other places. We're replacing only sctp's proto_ops::connect with sctp_connect and leave its proto::connect as NULL, so that it can get this flags param without touching the generic struct and code.
next prev parent reply other threads:[~2018-05-02 9:46 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-05-02 9:06 non-blocking connect for kernel SCTP sockets Michal Kubecek 2018-05-02 9:06 ` Michal Kubecek 2018-05-02 9:46 ` Xin Long [this message] 2018-05-02 9:46 ` Xin Long 2018-05-02 12:32 ` Michal Kubecek 2018-05-02 12:32 ` Michal Kubecek 2018-05-02 13:36 ` Marcelo Ricardo Leitner 2018-05-02 13:36 ` Marcelo Ricardo Leitner
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=CADvbK_fT5qYmOKHgBf6KWyuRcDUT3Fa8DyMQkN75C8PFkPKLXw@mail.gmail.com \ --to=lucien.xin@gmail.com \ --cc=ghe@suse.com \ --cc=gqjiang@suse.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-sctp@vger.kernel.org \ --cc=mkubecek@suse.cz \ --cc=netdev@vger.kernel.org \ --cc=nhorman@tuxdriver.com \ --cc=vyasevich@gmail.com \ /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.