|
@@ -577,7 +577,8 @@ static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id,
|
|
|
spin_lock(&portdev->c_ovq_lock);
|
|
|
if (virtqueue_add_outbuf(vq, sg, 1, &cpkt, GFP_ATOMIC) == 0) {
|
|
|
virtqueue_kick(vq);
|
|
|
- while (!virtqueue_get_buf(vq, &len))
|
|
|
+ while (!virtqueue_get_buf(vq, &len)
|
|
|
+ && !virtqueue_is_broken(vq))
|
|
|
cpu_relax();
|
|
|
}
|
|
|
spin_unlock(&portdev->c_ovq_lock);
|
|
@@ -650,7 +651,8 @@ static ssize_t __send_to_port(struct port *port, struct scatterlist *sg,
|
|
|
* we need to kmalloc a GFP_ATOMIC buffer each time the
|
|
|
* console driver writes something out.
|
|
|
*/
|
|
|
- while (!virtqueue_get_buf(out_vq, &len))
|
|
|
+ while (!virtqueue_get_buf(out_vq, &len)
|
|
|
+ && !virtqueue_is_broken(out_vq))
|
|
|
cpu_relax();
|
|
|
done:
|
|
|
spin_unlock_irqrestore(&port->outvq_lock, flags);
|