On 05/17/2016 07:44 PM, Eric Dumazet wrote:
> iscsi_sw_tcp_data_ready() and iscsi_sw_tcp_state_change() were
> using read_lock(&sk->sk_callback_lock) which is fine if caller
> disabled BH.
> 
> TCP stack no longer has this requirement and can run from
> process context.
> 
> Use read_lock_bh() variant to restore previous assumption.
> 
> Ideally this code could use RCU instead...
> 
> Fixes: 5413d1babe8f ("net: do not block BH while processing socket backlog")
> Fixes: d41a69f1d390 ("tcp: make tcp_sendmsg() aware of socket backlog")
> Signed-off-by: Eric Dumazet <eduma...@google.com>
> Cc: Mike Christie <micha...@cs.wisc.edu>
> Cc: Venkatesh Srinivas <venkate...@google.com>
> ---
>  drivers/scsi/iscsi_tcp.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
> index 2e4c82f8329c..ace4f1f41b8e 100644
> --- a/drivers/scsi/iscsi_tcp.c
> +++ b/drivers/scsi/iscsi_tcp.c
> @@ -131,10 +131,10 @@ static void iscsi_sw_tcp_data_ready(struct sock *sk)
>       struct iscsi_tcp_conn *tcp_conn;
>       read_descriptor_t rd_desc;
>  
> -     read_lock(&sk->sk_callback_lock);
> +     read_lock_bh(&sk->sk_callback_lock);
>       conn = sk->sk_user_data;
>       if (!conn) {
> -             read_unlock(&sk->sk_callback_lock);
> +             read_unlock_bh(&sk->sk_callback_lock);
>               return;
>       }
>       tcp_conn = conn->dd_data;
> @@ -154,7 +154,7 @@ static void iscsi_sw_tcp_data_ready(struct sock *sk)
>       /* If we had to (atomically) map a highmem page,
>        * unmap it now. */
>       iscsi_tcp_segment_unmap(&tcp_conn->in.segment);
> -     read_unlock(&sk->sk_callback_lock);
> +     read_unlock_bh(&sk->sk_callback_lock);
>  }
>  
>  static void iscsi_sw_tcp_state_change(struct sock *sk)
> @@ -165,10 +165,10 @@ static void iscsi_sw_tcp_state_change(struct sock *sk)
>       struct iscsi_session *session;
>       void (*old_state_change)(struct sock *);
>  
> -     read_lock(&sk->sk_callback_lock);
> +     read_lock_bh(&sk->sk_callback_lock);
>       conn = sk->sk_user_data;
>       if (!conn) {
> -             read_unlock(&sk->sk_callback_lock);
> +             read_unlock_bh(&sk->sk_callback_lock);
>               return;
>       }
>       session = conn->session;
> @@ -179,7 +179,7 @@ static void iscsi_sw_tcp_state_change(struct sock *sk)
>       tcp_sw_conn = tcp_conn->dd_data;
>       old_state_change = tcp_sw_conn->old_state_change;
>  
> -     read_unlock(&sk->sk_callback_lock);
> +     read_unlock_bh(&sk->sk_callback_lock);
>  
>       old_state_change(sk);
>  }
> 

Reviewed and tested. Thanks

Acked-by: Mike Christie <micha...@cs.wisc.edu>

Reply via email to