linux/net/rds
Sowmini Varadhan b21dd4506b rds: tcp: Sequence teardown of listen and acceptor sockets to avoid races
Commit a93d01f577 ("RDS: TCP: avoid bad page reference in
rds_tcp_listen_data_ready") added the function
rds_tcp_listen_sock_def_readable()  to handle the case when a
partially set-up acceptor socket drops into rds_tcp_listen_data_ready().
However, if the listen socket (rtn->rds_tcp_listen_sock) is itself going
through a tear-down via rds_tcp_listen_stop(), the (*ready)() will be
null and we would hit a panic  of the form
  BUG: unable to handle kernel NULL pointer dereference at   (null)
  IP:           (null)
   :
  ? rds_tcp_listen_data_ready+0x59/0xb0 [rds_tcp]
  tcp_data_queue+0x39d/0x5b0
  tcp_rcv_established+0x2e5/0x660
  tcp_v4_do_rcv+0x122/0x220
  tcp_v4_rcv+0x8b7/0x980
    :
In the above case, it is not fatal to encounter a NULL value for
ready- we should just drop the packet and let the flush of the
acceptor thread finish gracefully.

In general, the tear-down sequence for listen() and accept() socket
that is ensured by this commit is:
     rtn->rds_tcp_listen_sock = NULL; /* prevent any new accepts */
     In rds_tcp_listen_stop():
         serialize with, and prevent, further callbacks using lock_sock()
         flush rds_wq
         flush acceptor workq
         sock_release(listen socket)

Signed-off-by: Sowmini Varadhan <sowmini.varadhan@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2017-03-07 14:09:59 -08:00
..
af_rds.c RDS: validate the requested traces user input against max supported 2017-01-06 22:14:26 -05:00
bind.c RDS: log the address on bind failure 2017-01-02 14:02:39 -08:00
cong.c RDS: split out connection specific state from rds_connection to rds_conn_path 2016-06-14 23:50:41 -07:00
connection.c rds: tcp: Take explicit refcounts on struct net 2017-03-07 14:09:59 -08:00
ib_cm.c RDS: IB: fix panic due to handlers running post teardown 2017-01-02 14:02:55 -08:00
ib_fmr.c RDS: IB: move FMR code to its own file 2016-03-02 14:13:18 -05:00
ib_frmr.c RDS: IB: split the mr registration and invalidation path 2017-01-02 14:02:47 -08:00
ib_mr.h rds: ib: add the static type to the variables 2017-03-01 09:50:58 -08:00
ib_rdma.c RDS: split out connection specific state from rds_connection to rds_conn_path 2016-06-14 23:50:41 -07:00
ib_recv.c RDS: add receive message trace used by application 2017-01-02 14:02:59 -08:00
ib_ring.c
ib_send.c rds:Remove unnecessary ib_ring unalloc 2017-02-17 15:19:51 -05:00
ib_stats.c RDS: IB: add few useful cache stasts 2017-01-02 14:02:51 -08:00
ib_sysctl.c
ib.c rds: remove unnecessary returned value check 2017-03-03 09:51:22 -08:00
ib.h This is a tree wide change and has been kept separate for that reason. 2017-02-25 13:45:43 -08:00
info.c
info.h
Kconfig RDS: Drop stale iWARP RDMA transport 2016-03-02 14:13:17 -05:00
loop.c RDS: TCP: Hooks to set up a single connection path 2016-07-01 16:45:17 -04:00
loop.h
Makefile rds: debug messages are enabled by default 2016-10-29 15:55:57 -04:00
message.c RDS: TCP: Track peer's connection generation number 2016-11-17 13:35:18 -05:00
page.c rds: remove dead code 2016-12-26 21:35:39 -05:00
rdma_transport.c RDS: RDMA: start rdma listening after init 2017-01-02 14:02:45 -08:00
rdma_transport.h RDS: Drop stale iWARP RDMA transport 2016-03-02 14:13:17 -05:00
rdma.c RDS: make message size limit compliant with spec 2017-01-02 14:02:57 -08:00
rds_single_path.h RDS: split out connection specific state from rds_connection to rds_conn_path 2016-06-14 23:50:41 -07:00
rds.h rds: tcp: Take explicit refcounts on struct net 2017-03-07 14:09:59 -08:00
recv.c RDS: add receive message trace used by application 2017-01-02 14:02:59 -08:00
send.c RDS: make message size limit compliant with spec 2017-01-02 14:02:57 -08:00
stats.c
sysctl.c net: rds: fix coding style issues 2016-06-18 21:34:09 -07:00
tcp_connect.c RDS: TCP: Force every connection to be initiated by numerically smaller IP address 2016-11-17 13:35:18 -05:00
tcp_listen.c rds: tcp: Sequence teardown of listen and acceptor sockets to avoid races 2017-03-07 14:09:59 -08:00
tcp_recv.c RDS: add receive message trace used by application 2017-01-02 14:02:59 -08:00
tcp_send.c RDS: TCP: set RDS_FLAG_RETRANSMITTED in cp_retrans list 2016-11-17 13:35:18 -05:00
tcp_stats.c
tcp.c rds: tcp: Sequence teardown of listen and acceptor sockets to avoid races 2017-03-07 14:09:59 -08:00
tcp.h rds: tcp: Sequence teardown of listen and acceptor sockets to avoid races 2017-03-07 14:09:59 -08:00
threads.c rds: Remove duplicate prefix from rds_conn_path_error use 2016-10-17 11:07:22 -04:00
transport.c rds: remove unnecessary returned value check 2017-03-03 09:51:22 -08:00