mirror of https://gitee.com/openkylin/linux.git
staging: unisys: visorchannel: Add peek function
According to unisys, the s_par hypervisor has a bug in which it never triggers an interrupt. That makes the visornic effectively a 2ms poll loop. In order to just have the rx thread shceduling a napi poll every 2ms, lets instead give it the chance to check the response queue for data before we schedule. This helper provides that functionality Signed-off-by: Neil Horman <nhorman@redhat.com> Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
fd93b80592
commit
fdc792cd1b
|
@ -201,6 +201,8 @@ bool visorchannel_signalremove(struct visorchannel *channel, u32 queue,
|
||||||
void *msg);
|
void *msg);
|
||||||
bool visorchannel_signalinsert(struct visorchannel *channel, u32 queue,
|
bool visorchannel_signalinsert(struct visorchannel *channel, u32 queue,
|
||||||
void *msg);
|
void *msg);
|
||||||
|
bool visorchannel_signalempty(struct visorchannel *channel, u32 queue);
|
||||||
|
|
||||||
int visorchannel_signalqueue_slots_avail(struct visorchannel *channel,
|
int visorchannel_signalqueue_slots_avail(struct visorchannel *channel,
|
||||||
u32 queue);
|
u32 queue);
|
||||||
int visorchannel_signalqueue_max_slots(struct visorchannel *channel, u32 queue);
|
int visorchannel_signalqueue_max_slots(struct visorchannel *channel, u32 queue);
|
||||||
|
|
|
@ -430,6 +430,27 @@ visorchannel_signalremove(struct visorchannel *channel, u32 queue, void *msg)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(visorchannel_signalremove);
|
EXPORT_SYMBOL_GPL(visorchannel_signalremove);
|
||||||
|
|
||||||
|
bool
|
||||||
|
visorchannel_signalempty(struct visorchannel *channel, u32 queue)
|
||||||
|
{
|
||||||
|
unsigned long flags = 0;
|
||||||
|
struct signal_queue_header sig_hdr;
|
||||||
|
bool rc = false;
|
||||||
|
|
||||||
|
if (channel->needs_lock)
|
||||||
|
spin_lock_irqsave(&channel->remove_lock, flags);
|
||||||
|
|
||||||
|
if (!sig_read_header(channel, queue, &sig_hdr))
|
||||||
|
rc = true;
|
||||||
|
if (sig_hdr.head == sig_hdr.tail)
|
||||||
|
rc = true;
|
||||||
|
if (channel->needs_lock)
|
||||||
|
spin_unlock_irqrestore(&channel->remove_lock, flags);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(visorchannel_signalempty);
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
signalinsert_inner(struct visorchannel *channel, u32 queue, void *msg)
|
signalinsert_inner(struct visorchannel *channel, u32 queue, void *msg)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue