pvcalls-back: set -ENOTCONN in pvcalls_conn_back_read

When a connection is closing we receive on pvcalls_sk_state_change
notification. Instead of setting the connection as closed immediately
(-ENOTCONN), let's read one more time from it: pvcalls_conn_back_read
will set the connection as closed when necessary.

That way, we avoid races between pvcalls_sk_state_change and
pvcalls_back_ioworker.

Signed-off-by: Stefano Stabellini <stefanos@xilinx.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
This commit is contained in:
Stefano Stabellini 2018-12-21 15:06:33 -08:00 committed by Boris Ostrovsky
parent d90a1ca60a
commit e6587cdbd7
1 changed files with 4 additions and 3 deletions

View File

@ -160,9 +160,10 @@ static void pvcalls_conn_back_read(void *opaque)
/* write the data, then modify the indexes */ /* write the data, then modify the indexes */
virt_wmb(); virt_wmb();
if (ret < 0) if (ret < 0) {
atomic_set(&map->read, 0);
intf->in_error = ret; intf->in_error = ret;
else } else
intf->in_prod = prod + ret; intf->in_prod = prod + ret;
/* update the indexes, then notify the other end */ /* update the indexes, then notify the other end */
virt_wmb(); virt_wmb();
@ -288,7 +289,7 @@ static void pvcalls_sk_state_change(struct sock *sock)
return; return;
intf = map->ring; intf = map->ring;
intf->in_error = -ENOTCONN; atomic_inc(&map->read);
notify_remote_via_irq(map->irq); notify_remote_via_irq(map->irq);
} }