Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus
* git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus: lguest: update comments to reflect LHCALL_LOAD_GDT_ENTRY. virtio: console: Prevent userspace from submitting NULL buffers virtio: console: Fix poll blocking even though there is data to read
This commit is contained in:
@@ -324,9 +324,8 @@ static void lguest_load_gdt(const struct desc_ptr *desc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For a single GDT entry which changes, we do the lazy thing: alter our GDT,
|
* For a single GDT entry which changes, we simply change our copy and
|
||||||
* then tell the Host to reload the entire thing. This operation is so rare
|
* then tell the host about it.
|
||||||
* that this naive implementation is reasonable.
|
|
||||||
*/
|
*/
|
||||||
static void lguest_write_gdt_entry(struct desc_struct *dt, int entrynum,
|
static void lguest_write_gdt_entry(struct desc_struct *dt, int entrynum,
|
||||||
const void *desc, int type)
|
const void *desc, int type)
|
||||||
@@ -338,9 +337,13 @@ static void lguest_write_gdt_entry(struct desc_struct *dt, int entrynum,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* OK, I lied. There are three "thread local storage" GDT entries which change
|
* There are three "thread local storage" GDT entries which change
|
||||||
* on every context switch (these three entries are how glibc implements
|
* on every context switch (these three entries are how glibc implements
|
||||||
* __thread variables). So we have a hypercall specifically for this case.
|
* __thread variables). As an optimization, we have a hypercall
|
||||||
|
* specifically for this case.
|
||||||
|
*
|
||||||
|
* Wouldn't it be nicer to have a general LOAD_GDT_ENTRIES hypercall
|
||||||
|
* which took a range of entries?
|
||||||
*/
|
*/
|
||||||
static void lguest_load_tls(struct thread_struct *t, unsigned int cpu)
|
static void lguest_load_tls(struct thread_struct *t, unsigned int cpu)
|
||||||
{
|
{
|
||||||
|
@@ -596,6 +596,10 @@ static ssize_t port_fops_write(struct file *filp, const char __user *ubuf,
|
|||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
bool nonblock;
|
bool nonblock;
|
||||||
|
|
||||||
|
/* Userspace could be out to fool us */
|
||||||
|
if (!count)
|
||||||
|
return 0;
|
||||||
|
|
||||||
port = filp->private_data;
|
port = filp->private_data;
|
||||||
|
|
||||||
nonblock = filp->f_flags & O_NONBLOCK;
|
nonblock = filp->f_flags & O_NONBLOCK;
|
||||||
@@ -642,7 +646,7 @@ static unsigned int port_fops_poll(struct file *filp, poll_table *wait)
|
|||||||
poll_wait(filp, &port->waitqueue, wait);
|
poll_wait(filp, &port->waitqueue, wait);
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
if (port->inbuf)
|
if (!will_read_block(port))
|
||||||
ret |= POLLIN | POLLRDNORM;
|
ret |= POLLIN | POLLRDNORM;
|
||||||
if (!will_write_block(port))
|
if (!will_write_block(port))
|
||||||
ret |= POLLOUT;
|
ret |= POLLOUT;
|
||||||
|
Reference in New Issue
Block a user