diff mbox series

[mptcp-next] mptcp: use _fast lock version in __mptcp_move_skbs

Message ID 20200902143750.28478-1-fw@strlen.de
State Accepted, archived
Delegated to: Matthieu Baerts
Headers show
Series [mptcp-next] mptcp: use _fast lock version in __mptcp_move_skbs | expand

Commit Message

Florian Westphal Sept. 2, 2020, 2:37 p.m. UTC
The function is short and won't sleep, so this can use the _fast version.

Signed-off-by: Florian Westphal <fw@strlen.de>
---
 net/mptcp/protocol.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Paolo Abeni Sept. 2, 2020, 4:16 p.m. UTC | #1
On Wed, 2020-09-02 at 16:37 +0200, Florian Westphal wrote:
> The function is short and won't sleep, so this can use the _fast version.
> 
> Signed-off-by: Florian Westphal <fw@strlen.de>
> ---
>  net/mptcp/protocol.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> index 3b621a99c8c5..0c2b506d17de 100644
> --- a/net/mptcp/protocol.c
> +++ b/net/mptcp/protocol.c
> @@ -1472,13 +1472,14 @@ static bool __mptcp_move_skbs(struct mptcp_sock *msk)
>  	__mptcp_flush_join_list(msk);
>  	do {
>  		struct sock *ssk = mptcp_subflow_recv_lookup(msk);
> +		bool slowpath;
>  
>  		if (!ssk)
>  			break;
>  
> -		lock_sock(ssk);
> +		slowpath = lock_sock_fast(ssk);
>  		done = __mptcp_move_skbs_from_subflow(msk, ssk, &moved);
> -		release_sock(ssk);
> +		unlock_sock_fast(ssk, slowpath);
>  	} while (!done);
>  
>  	if (mptcp_ofo_queue(msk) || moved > 0) {

Good catch! the patch LGTM, thanks!

Do you think it could useful do the same also in mptcp_sendmsg()
and mptcp_worker()? (since mptcp_sendmsg_frag() does not sleep, should
be possible...)

Cheers,

Paolo
Florian Westphal Sept. 2, 2020, 10:01 p.m. UTC | #2
Paolo Abeni <pabeni@redhat.com> wrote:
> On Wed, 2020-09-02 at 16:37 +0200, Florian Westphal wrote:
> > The function is short and won't sleep, so this can use the _fast version.
> > 
> > Signed-off-by: Florian Westphal <fw@strlen.de>
> > ---
> >  net/mptcp/protocol.c | 5 +++--
> >  1 file changed, 3 insertions(+), 2 deletions(-)
> > 
> > diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> > index 3b621a99c8c5..0c2b506d17de 100644
> > --- a/net/mptcp/protocol.c
> > +++ b/net/mptcp/protocol.c
> > @@ -1472,13 +1472,14 @@ static bool __mptcp_move_skbs(struct mptcp_sock *msk)
> >  	__mptcp_flush_join_list(msk);
> >  	do {
> >  		struct sock *ssk = mptcp_subflow_recv_lookup(msk);
> > +		bool slowpath;
> >  
> >  		if (!ssk)
> >  			break;
> >  
> > -		lock_sock(ssk);
> > +		slowpath = lock_sock_fast(ssk);
> >  		done = __mptcp_move_skbs_from_subflow(msk, ssk, &moved);
> > -		release_sock(ssk);
> > +		unlock_sock_fast(ssk, slowpath);
> >  	} while (!done);
> >  
> >  	if (mptcp_ofo_queue(msk) || moved > 0) {
> 
> Good catch! the patch LGTM, thanks!
> 
> Do you think it could useful do the same also in mptcp_sendmsg()
> and mptcp_worker()? (since mptcp_sendmsg_frag() does not sleep, should
> be possible...)

sendmsg path might sleep  (it copies data from userspace).

mptcp_worker might work, but I think we would need to make sure
mptcp_ext_cache_refill() uses atomic allocations for this to work.

Not sure this is a good idea.  For work queue case I think its better
to try to make it a true slowpath that isn't invoked frequently.
Paolo Abeni Sept. 3, 2020, 9:58 a.m. UTC | #3
On Thu, 2020-09-03 at 00:01 +0200, Florian Westphal wrote:
> Paolo Abeni <pabeni@redhat.com> wrote:
> > On Wed, 2020-09-02 at 16:37 +0200, Florian Westphal wrote:
> > > The function is short and won't sleep, so this can use the _fast version.
> > > 
> > > Signed-off-by: Florian Westphal <fw@strlen.de>
> > > ---
> > >  net/mptcp/protocol.c | 5 +++--
> > >  1 file changed, 3 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> > > index 3b621a99c8c5..0c2b506d17de 100644
> > > --- a/net/mptcp/protocol.c
> > > +++ b/net/mptcp/protocol.c
> > > @@ -1472,13 +1472,14 @@ static bool __mptcp_move_skbs(struct mptcp_sock *msk)
> > >  	__mptcp_flush_join_list(msk);
> > >  	do {
> > >  		struct sock *ssk = mptcp_subflow_recv_lookup(msk);
> > > +		bool slowpath;
> > >  
> > >  		if (!ssk)
> > >  			break;
> > >  
> > > -		lock_sock(ssk);
> > > +		slowpath = lock_sock_fast(ssk);
> > >  		done = __mptcp_move_skbs_from_subflow(msk, ssk, &moved);
> > > -		release_sock(ssk);
> > > +		unlock_sock_fast(ssk, slowpath);
> > >  	} while (!done);
> > >  
> > >  	if (mptcp_ofo_queue(msk) || moved > 0) {
> > 
> > Good catch! the patch LGTM, thanks!
> > 
> > Do you think it could useful do the same also in mptcp_sendmsg()
> > and mptcp_worker()? (since mptcp_sendmsg_frag() does not sleep, should
> > be possible...)
> 
> sendmsg path might sleep  (it copies data from userspace).

Whoops I missed that.

> mptcp_worker might work, but I think we would need to make sure
> mptcp_ext_cache_refill() uses atomic allocations for this to work.
> 
> Not sure this is a good idea.  For work queue case I think its better
> to try to make it a true slowpath that isn't invoked frequently.

Agreed, we really don't want to over-optimize the worker

I'm fine with this, thanks!

Paolo
Matthieu Baerts Sept. 4, 2020, 4:40 p.m. UTC | #4
Hi Florian, Paolo,

On 03/09/2020 11:58, Paolo Abeni wrote:
> On Thu, 2020-09-03 at 00:01 +0200, Florian Westphal wrote:
>> Paolo Abeni <pabeni@redhat.com> wrote:
>>> On Wed, 2020-09-02 at 16:37 +0200, Florian Westphal wrote:
>>>> The function is short and won't sleep, so this can use the _fast version.
>>>>
>>>> Signed-off-by: Florian Westphal <fw@strlen.de>

(...)
>>> Good catch! the patch LGTM, thanks!
>>>
>>> Do you think it could useful do the same also in mptcp_sendmsg()
>>> and mptcp_worker()? (since mptcp_sendmsg_frag() does not sleep, should
>>> be possible...)
>>
>> sendmsg path might sleep  (it copies data from userspace).
> 
> Whoops I missed that.
> 
>> mptcp_worker might work, but I think we would need to make sure
>> mptcp_ext_cache_refill() uses atomic allocations for this to work.
>>
>> Not sure this is a good idea.  For work queue case I think its better
>> to try to make it a true slowpath that isn't invoked frequently.
> 
> Agreed, we really don't want to over-optimize the worker
> 
> I'm fine with this, thanks!

Thank you for the patch and the review!

Just added at the end of the series!

Tests + export are in progress.

Cheers,
Matt
diff mbox series

Patch

diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 3b621a99c8c5..0c2b506d17de 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1472,13 +1472,14 @@  static bool __mptcp_move_skbs(struct mptcp_sock *msk)
 	__mptcp_flush_join_list(msk);
 	do {
 		struct sock *ssk = mptcp_subflow_recv_lookup(msk);
+		bool slowpath;
 
 		if (!ssk)
 			break;
 
-		lock_sock(ssk);
+		slowpath = lock_sock_fast(ssk);
 		done = __mptcp_move_skbs_from_subflow(msk, ssk, &moved);
-		release_sock(ssk);
+		unlock_sock_fast(ssk, slowpath);
 	} while (!done);
 
 	if (mptcp_ofo_queue(msk) || moved > 0) {