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:
parent
d90a1ca60a
commit
e6587cdbd7
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue