Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
Pull virtio updates from Michael Tsirkin: "virtio: virtio 1.0 support, misc patches This adds a lot of infrastructure for virtio 1.0 support. Notable missing pieces: virtio pci, virtio balloon (needs spec extension), vhost scsi. Plus, there are some minor fixes in a couple of places. Note: some net drivers are affected by these patches. David said he's fine with merging these patches through my tree. Rusty's on vacation, he acked using my tree for these, too" * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost: (70 commits) virtio_ccw: finalize_features error handling virtio_ccw: future-proof finalize_features virtio_pci: rename virtio_pci -> virtio_pci_common virtio_pci: update file descriptions and copyright virtio_pci: split out legacy device support virtio_pci: setup config vector indirectly virtio_pci: setup vqs indirectly virtio_pci: delete vqs indirectly virtio_pci: use priv for vq notification virtio_pci: free up vq->priv virtio_pci: fix coding style for structs virtio_pci: add isr field virtio: drop legacy_only driver flag virtio_balloon: drop legacy_only driver flag virtio_ccw: rev 1 devices set VIRTIO_F_VERSION_1 virtio: allow finalize_features to fail virtio_ccw: legacy: don't negotiate rev 1/features virtio: add API to detect legacy devices virtio_console: fix sparse warnings vhost: remove unnecessary forward declarations in vhost.h ...
This commit is contained in:
@@ -355,7 +355,7 @@ static inline bool use_multiport(struct ports_device *portdev)
|
||||
*/
|
||||
if (!portdev->vdev)
|
||||
return 0;
|
||||
return portdev->vdev->features[0] & (1 << VIRTIO_CONSOLE_F_MULTIPORT);
|
||||
return __virtio_test_bit(portdev->vdev, VIRTIO_CONSOLE_F_MULTIPORT);
|
||||
}
|
||||
|
||||
static DEFINE_SPINLOCK(dma_bufs_lock);
|
||||
@@ -566,9 +566,9 @@ static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id,
|
||||
if (!use_multiport(portdev))
|
||||
return 0;
|
||||
|
||||
cpkt.id = port_id;
|
||||
cpkt.event = event;
|
||||
cpkt.value = value;
|
||||
cpkt.id = cpu_to_virtio32(portdev->vdev, port_id);
|
||||
cpkt.event = cpu_to_virtio16(portdev->vdev, event);
|
||||
cpkt.value = cpu_to_virtio16(portdev->vdev, value);
|
||||
|
||||
vq = portdev->c_ovq;
|
||||
|
||||
@@ -669,8 +669,8 @@ done:
|
||||
* Give out the data that's requested from the buffer that we have
|
||||
* queued up.
|
||||
*/
|
||||
static ssize_t fill_readbuf(struct port *port, char *out_buf, size_t out_count,
|
||||
bool to_user)
|
||||
static ssize_t fill_readbuf(struct port *port, char __user *out_buf,
|
||||
size_t out_count, bool to_user)
|
||||
{
|
||||
struct port_buffer *buf;
|
||||
unsigned long flags;
|
||||
@@ -688,7 +688,8 @@ static ssize_t fill_readbuf(struct port *port, char *out_buf, size_t out_count,
|
||||
if (ret)
|
||||
return -EFAULT;
|
||||
} else {
|
||||
memcpy(out_buf, buf->buf + buf->offset, out_count);
|
||||
memcpy((__force char *)out_buf, buf->buf + buf->offset,
|
||||
out_count);
|
||||
}
|
||||
|
||||
buf->offset += out_count;
|
||||
@@ -1162,7 +1163,7 @@ static int get_chars(u32 vtermno, char *buf, int count)
|
||||
/* If we don't have an input queue yet, we can't get input. */
|
||||
BUG_ON(!port->in_vq);
|
||||
|
||||
return fill_readbuf(port, buf, count, false);
|
||||
return fill_readbuf(port, (__force char __user *)buf, count, false);
|
||||
}
|
||||
|
||||
static void resize_console(struct port *port)
|
||||
@@ -1602,7 +1603,8 @@ static void unplug_port(struct port *port)
|
||||
}
|
||||
|
||||
/* Any private messages that the Host and Guest want to share */
|
||||
static void handle_control_message(struct ports_device *portdev,
|
||||
static void handle_control_message(struct virtio_device *vdev,
|
||||
struct ports_device *portdev,
|
||||
struct port_buffer *buf)
|
||||
{
|
||||
struct virtio_console_control *cpkt;
|
||||
@@ -1612,15 +1614,16 @@ static void handle_control_message(struct ports_device *portdev,
|
||||
|
||||
cpkt = (struct virtio_console_control *)(buf->buf + buf->offset);
|
||||
|
||||
port = find_port_by_id(portdev, cpkt->id);
|
||||
if (!port && cpkt->event != VIRTIO_CONSOLE_PORT_ADD) {
|
||||
port = find_port_by_id(portdev, virtio32_to_cpu(vdev, cpkt->id));
|
||||
if (!port &&
|
||||
cpkt->event != cpu_to_virtio16(vdev, VIRTIO_CONSOLE_PORT_ADD)) {
|
||||
/* No valid header at start of buffer. Drop it. */
|
||||
dev_dbg(&portdev->vdev->dev,
|
||||
"Invalid index %u in control packet\n", cpkt->id);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (cpkt->event) {
|
||||
switch (virtio16_to_cpu(vdev, cpkt->event)) {
|
||||
case VIRTIO_CONSOLE_PORT_ADD:
|
||||
if (port) {
|
||||
dev_dbg(&portdev->vdev->dev,
|
||||
@@ -1628,13 +1631,15 @@ static void handle_control_message(struct ports_device *portdev,
|
||||
send_control_msg(port, VIRTIO_CONSOLE_PORT_READY, 1);
|
||||
break;
|
||||
}
|
||||
if (cpkt->id >= portdev->config.max_nr_ports) {
|
||||
if (virtio32_to_cpu(vdev, cpkt->id) >=
|
||||
portdev->config.max_nr_ports) {
|
||||
dev_warn(&portdev->vdev->dev,
|
||||
"Request for adding port with out-of-bound id %u, max. supported id: %u\n",
|
||||
"Request for adding port with "
|
||||
"out-of-bound id %u, max. supported id: %u\n",
|
||||
cpkt->id, portdev->config.max_nr_ports - 1);
|
||||
break;
|
||||
}
|
||||
add_port(portdev, cpkt->id);
|
||||
add_port(portdev, virtio32_to_cpu(vdev, cpkt->id));
|
||||
break;
|
||||
case VIRTIO_CONSOLE_PORT_REMOVE:
|
||||
unplug_port(port);
|
||||
@@ -1670,7 +1675,7 @@ static void handle_control_message(struct ports_device *portdev,
|
||||
break;
|
||||
}
|
||||
case VIRTIO_CONSOLE_PORT_OPEN:
|
||||
port->host_connected = cpkt->value;
|
||||
port->host_connected = virtio16_to_cpu(vdev, cpkt->value);
|
||||
wake_up_interruptible(&port->waitqueue);
|
||||
/*
|
||||
* If the host port got closed and the host had any
|
||||
@@ -1752,7 +1757,7 @@ static void control_work_handler(struct work_struct *work)
|
||||
buf->len = len;
|
||||
buf->offset = 0;
|
||||
|
||||
handle_control_message(portdev, buf);
|
||||
handle_control_message(vq->vdev, portdev, buf);
|
||||
|
||||
spin_lock(&portdev->c_ivq_lock);
|
||||
if (add_inbuf(portdev->c_ivq, buf) < 0) {
|
||||
|
||||
Reference in New Issue
Block a user