这篇教程C++ virtqueue_get_buf函数代码示例写得很实用,希望能帮到您。
本文整理汇总了C++中virtqueue_get_buf函数的典型用法代码示例。如果您正苦于以下问题:C++ virtqueue_get_buf函数的具体用法?C++ virtqueue_get_buf怎么用?C++ virtqueue_get_buf使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。 在下文中一共展示了virtqueue_get_buf函数的27个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。 示例1: rpmsg_recv_done/* called when an rx buffer is used, and it's time to digest a message */static void rpmsg_recv_done(struct virtqueue *rvq){ struct virtproc_info *vrp = rvq->vdev->priv; struct device *dev = &rvq->vdev->dev; struct rpmsg_hdr *msg; unsigned int len, msgs_received = 0; int err; msg = virtqueue_get_buf(rvq, &len); if (!msg) { dev_err(dev, "uhm, incoming signal, but no used buffer ?/n"); return; } while (msg) { err = rpmsg_recv_single(vrp, dev, msg, len); if (err) break; msgs_received++; msg = virtqueue_get_buf(rvq, &len); }; dev_dbg(dev, "Received %u messages/n", msgs_received); /* tell the remote processor we added another available rx buffer */ if (msgs_received) virtqueue_kick(vrp->rvq);}
开发者ID:03199618,项目名称:linux,代码行数:31,
示例2: BalloonInterruptDpcVOIDBalloonInterruptDpc( IN WDFINTERRUPT WdfInterrupt, IN WDFOBJECT WdfDevice ){ unsigned int len; PDEVICE_CONTEXT devCtx = GetDeviceContext(WdfDevice); BOOLEAN bHostAck = FALSE; UNREFERENCED_PARAMETER( WdfInterrupt ); TraceEvents(TRACE_LEVEL_INFORMATION, DBG_DPC, "--> %s/n", __FUNCTION__); if (virtqueue_get_buf(devCtx->InfVirtQueue, &len)) { bHostAck = TRUE; } if (virtqueue_get_buf(devCtx->DefVirtQueue, &len)) { bHostAck = TRUE; } if(bHostAck) { KeSetEvent (&devCtx->HostAckEvent, IO_NO_INCREMENT, FALSE); } if (devCtx->StatVirtQueue && virtqueue_get_buf(devCtx->StatVirtQueue, &len)) { WDFREQUEST request = devCtx->PendingWriteRequest; devCtx->HandleWriteRequest = TRUE; if ((request != NULL) && (WdfRequestUnmarkCancelable(request) != STATUS_CANCELLED)) { NTSTATUS status; PVOID buffer; size_t length = 0; devCtx->PendingWriteRequest = NULL; status = WdfRequestRetrieveInputBuffer(request, 0, &buffer, &length); if (!NT_SUCCESS(status)) { length = 0; } WdfRequestCompleteWithInformation(request, status, length); } } if(devCtx->Thread) { KeSetEvent(&devCtx->WakeUpThread, 0, FALSE); }}
开发者ID:allen-junkang-fu,项目名称:kvm-guest-drivers-windows,代码行数:58,
示例3: req_donestatic void req_done(struct virtqueue *vq){ struct virtio_chan *chan = vq->vdev->priv; struct p9_fcall *rc; unsigned int len; struct p9_req_t *req; unsigned long flags; p9_debug(P9_DEBUG_TRANS, ": request done/n"); while (1) { spin_lock_irqsave(&chan->lock, flags); rc = virtqueue_get_buf(chan->vq, &len); if (rc == NULL) { spin_unlock_irqrestore(&chan->lock, flags); break; } chan->ring_bufs_avail = 1; spin_unlock_irqrestore(&chan->lock, flags); /* Wakeup if anyone waiting for VirtIO ring space. */ wake_up(chan->vc_wq); p9_debug(P9_DEBUG_TRANS, ": rc %p/n", rc); p9_debug(P9_DEBUG_TRANS, ": lookup tag %d/n", rc->tag); req = p9_tag_lookup(chan->client, rc->tag); req->status = REQ_STATUS_RCVD; p9_client_cb(chan->client, req); }}
开发者ID:AnadoluPanteri,项目名称:kernel-plus-harmattan,代码行数:28,
示例4: virtio_crypto_alg_ablkcipher_close_sessionstatic int virtio_crypto_alg_ablkcipher_close_session( struct virtio_crypto_ablkcipher_ctx *ctx, int encrypt){ struct scatterlist outhdr, status_sg, *sgs[2]; unsigned int tmp; struct virtio_crypto_destroy_session_req *destroy_session; struct virtio_crypto *vcrypto = ctx->vcrypto; int err; unsigned int num_out = 0, num_in = 0; spin_lock(&vcrypto->ctrl_lock); vcrypto->ctrl_status.status = VIRTIO_CRYPTO_ERR; /* Pad ctrl header */ vcrypto->ctrl.header.opcode = cpu_to_le32(VIRTIO_CRYPTO_CIPHER_DESTROY_SESSION); /* Set the default virtqueue id to 0 */ vcrypto->ctrl.header.queue_id = 0; destroy_session = &vcrypto->ctrl.u.destroy_session; if (encrypt) destroy_session->session_id = cpu_to_le64(ctx->enc_sess_info.session_id); else destroy_session->session_id = cpu_to_le64(ctx->dec_sess_info.session_id); sg_init_one(&outhdr, &vcrypto->ctrl, sizeof(vcrypto->ctrl)); sgs[num_out++] = &outhdr; /* Return status and session id back */ sg_init_one(&status_sg, &vcrypto->ctrl_status.status, sizeof(vcrypto->ctrl_status.status)); sgs[num_out + num_in++] = &status_sg; err = virtqueue_add_sgs(vcrypto->ctrl_vq, sgs, num_out, num_in, vcrypto, GFP_ATOMIC); if (err < 0) { spin_unlock(&vcrypto->ctrl_lock); return err; } virtqueue_kick(vcrypto->ctrl_vq); while (!virtqueue_get_buf(vcrypto->ctrl_vq, &tmp) && !virtqueue_is_broken(vcrypto->ctrl_vq)) cpu_relax(); if (vcrypto->ctrl_status.status != VIRTIO_CRYPTO_OK) { spin_unlock(&vcrypto->ctrl_lock); pr_err("virtio_crypto: Close session failed status: %u, session_id: 0x%llx/n", vcrypto->ctrl_status.status, destroy_session->session_id); return -EINVAL; } spin_unlock(&vcrypto->ctrl_lock); return 0;}
开发者ID:dznm,项目名称:linux,代码行数:60,
示例5: VIOSerialCtrlWorkHandlerVOIDVIOSerialCtrlWorkHandler( IN WDFDEVICE Device){ struct virtqueue *vq; PPORT_BUFFER buf; UINT len; NTSTATUS status = STATUS_SUCCESS; PPORTS_DEVICE pContext = GetPortsDevice(Device); TraceEvents(TRACE_LEVEL_VERBOSE, DBG_PNP, "--> %s/n", __FUNCTION__); vq = pContext->c_ivq; ASSERT(vq); WdfSpinLockAcquire(pContext->CInVqLock); while ((buf = virtqueue_get_buf(vq, &len))) { WdfSpinLockRelease(pContext->CInVqLock); buf->len = len; buf->offset = 0; VIOSerialHandleCtrlMsg(Device, buf); WdfSpinLockAcquire(pContext->CInVqLock); status = VIOSerialAddInBuf(vq, buf); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP, "%s::%d Error adding buffer to queue/n", __FUNCTION__, __LINE__); VIOSerialFreeBuffer(buf); } } TraceEvents(TRACE_LEVEL_VERBOSE, DBG_PNP, "<-- %s/n", __FUNCTION__); WdfSpinLockRelease(pContext->CInVqLock);}
开发者ID:daynix,项目名称:kvm-guest-drivers-windows,代码行数:35,
示例6: control_in_intr/* * Host sent us a control message. * Called in interrupt context! */static void control_in_intr(struct virtqueue *vq){ struct crypto_device *crdev; struct crypto_vq_buffer *buf; unsigned int len; debug("Entering/n"); crdev = vq->vdev->priv; while ((buf = virtqueue_get_buf(vq, &len))) { buf->len = len; buf->offset = 0; handle_control_message(crdev, buf); spin_lock_irq(&crdev->c_lock); if (add_inbuf(crdev->c_ivq, buf) < 0) { printk(KERN_WARNING "Error adding buffer to queue/n"); free_buf(buf); } spin_unlock_irq(&crdev->c_lock); } debug("Leaving/n");}
开发者ID:kpjim-axl,项目名称:oslab-ntua,代码行数:29,
示例7: virtblk_donestatic void virtblk_done(struct virtqueue *vq){ struct virtio_blk *vblk = vq->vdev->priv; bool req_done = false; int qid = vq->index; struct virtblk_req *vbr; unsigned long flags; unsigned int len; spin_lock_irqsave(&vblk->vqs[qid].lock, flags); do { virtqueue_disable_cb(vq); while ((vbr = virtqueue_get_buf(vblk->vqs[qid].vq, &len)) != NULL) { blk_mq_complete_request(vbr->req, vbr->req->errors); req_done = true; } if (unlikely(virtqueue_is_broken(vq))) break; } while (!virtqueue_enable_cb(vq)); /* In case queue is stopped waiting for more buffers. */ if (req_done) blk_mq_start_stopped_hw_queues(vblk->disk->queue, true); spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags);}
开发者ID:0-T-0,项目名称:ps4-linux,代码行数:25,
示例8: random_recv_donestatic void random_recv_done(struct virtqueue *vq){ /* We can get spurious callbacks, e.g. shared IRQs + virtio_pci. */ if (!virtqueue_get_buf(vq, &data_avail)) return; complete(&have_data);}
开发者ID:1N4148,项目名称:android_kernel_samsung_golden,代码行数:8,
示例9: rpmsg_recv_done/* called when an rx buffer is used, and it's time to digest a message */static void rpmsg_recv_done(struct virtqueue *rvq){ struct rpmsg_hdr *msg; unsigned int len; struct rpmsg_endpoint *ept; struct scatterlist sg; struct virtproc_info *vrp = rvq->vdev->priv; struct device *dev = &rvq->vdev->dev; int err; msg = virtqueue_get_buf(rvq, &len); if (!msg) { dev_err(dev, "uhm, incoming signal, but no used buffer ?/n"); return; } dev_dbg(dev, "From: 0x%x, To: 0x%x, Len: %d, Flags: %d, Reserved: %d/n", msg->src, msg->dst, msg->len, msg->flags, msg->reserved);#if 0 print_hex_dump(KERN_DEBUG, "rpmsg_virtio RX: ", DUMP_PREFIX_NONE, 16, 1, msg, sizeof(*msg) + msg->len, true);#endif /* * We currently use fixed-sized buffers, so trivially sanitize * the reported payload length. */ if (len > RPMSG_BUF_SIZE || msg->len > (len - sizeof(struct rpmsg_hdr))) { dev_warn(dev, "inbound msg too big: (%d, %d)/n", len, msg->len); return; } /* use the dst addr to fetch the callback of the appropriate user */ mutex_lock(&vrp->endpoints_lock); ept = idr_find(&vrp->endpoints, msg->dst); mutex_unlock(&vrp->endpoints_lock); if (ept && ept->cb) ept->cb(ept->rpdev, msg->data, msg->len, ept->priv, msg->src); else dev_warn(dev, "msg received with no recepient/n"); /* publish the real size of the buffer */ sg_init_one(&sg, msg, RPMSG_BUF_SIZE); /* add the buffer back to the remote processor's virtqueue */ err = virtqueue_add_buf(vrp->rvq, &sg, 0, 1, msg, GFP_KERNEL); if (err < 0) { dev_err(dev, "failed to add a virtqueue buffer: %d/n", err); return; } /* tell the remote processor we added another available rx buffer */ virtqueue_kick(vrp->rvq);}
开发者ID:alessandroste,项目名称:testBSP,代码行数:58,
示例10: VIOSerialReclaimConsumedBuffersVOID VIOSerialReclaimConsumedBuffers(IN PVIOSERIAL_PORT Port){ WDFREQUEST request; PSINGLE_LIST_ENTRY iter; PVOID buffer; UINT len; struct virtqueue *vq = GetOutQueue(Port); TraceEvents(TRACE_LEVEL_VERBOSE, DBG_QUEUEING, "--> %s/n", __FUNCTION__); if (vq) { while ((buffer = virtqueue_get_buf(vq, &len)) != NULL) { if (Port->PendingWriteRequest != NULL) { request = Port->PendingWriteRequest; Port->PendingWriteRequest = NULL; if (WdfRequestUnmarkCancelable(request) != STATUS_CANCELLED) { WdfRequestCompleteWithInformation(request, STATUS_SUCCESS, (size_t)WdfRequestGetInformation(request)); } else { TraceEvents(TRACE_LEVEL_INFORMATION, DBG_QUEUEING, "Request %p was cancelled./n", request); } } iter = &Port->WriteBuffersList; while (iter->Next != NULL) { PWRITE_BUFFER_ENTRY entry = CONTAINING_RECORD(iter->Next, WRITE_BUFFER_ENTRY, ListEntry); if (buffer == entry->Buffer) { iter->Next = entry->ListEntry.Next; ExFreePoolWithTag(buffer, VIOSERIAL_DRIVER_MEMORY_TAG); ExFreePoolWithTag(entry, VIOSERIAL_DRIVER_MEMORY_TAG); } else { iter = iter->Next; } }; Port->OutVqFull = FALSE; } } TraceEvents(TRACE_LEVEL_VERBOSE, DBG_QUEUEING, "<-- %s Full: %d/n", __FUNCTION__, Port->OutVqFull);}
开发者ID:bonzini,项目名称:kvm-guest-drivers-windows,代码行数:57,
示例11: random_recv_donestatic void random_recv_done(struct virtqueue *vq){ struct virtrng_info *vi = vq->vdev->priv; /* We can get spurious callbacks, e.g. shared IRQs + virtio_pci. */ if (!virtqueue_get_buf(vi->vq, &vi->data_avail)) return; complete(&vi->have_data);}
开发者ID:Anjali05,项目名称:linux,代码行数:10,
示例12: reclaim_consumed_buffers/* Free consumed buffers. */void reclaim_consumed_buffers(struct crypto_device *crdev){ void *buf; unsigned int len; debug("Entering/n"); while ((buf = virtqueue_get_buf(crdev->ovq, &len))) kfree(buf); debug("Leaving/n");}
开发者ID:antonis-m,项目名称:oslab,代码行数:11,
示例13: VIOSerialDiscardPortDataLocked// this procedure must be called with port InBuf spinlock heldVOIDVIOSerialDiscardPortDataLocked( IN PVIOSERIAL_PORT port){ struct virtqueue *vq; PPORT_BUFFER buf = NULL; UINT len; NTSTATUS status = STATUS_SUCCESS; UINT ret = 0; TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP, "--> %s/n", __FUNCTION__); vq = GetInQueue(port); if (port->InBuf) { buf = port->InBuf; } else if (vq) { buf = (PPORT_BUFFER)virtqueue_get_buf(vq, &len); } while (buf) { status = VIOSerialAddInBuf(vq, buf); if(!NT_SUCCESS(status)) { ++ret; VIOSerialFreeBuffer(buf); } buf = (PPORT_BUFFER)virtqueue_get_buf(vq, &len); } port->InBuf = NULL; if (ret > 0) { TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP, "%s::%d Error adding %u buffers back to queue/n", __FUNCTION__, __LINE__, ret); } TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP,"<-- %s/n", __FUNCTION__);}
开发者ID:beckdong,项目名称:kvm-guest-drivers-windows,代码行数:43,
示例14: random_recv_donestatic void random_recv_done(struct virtqueue *vq){ unsigned int len; /* We can get spurious callbacks, e.g. shared IRQs + virtio_pci. */ if (!virtqueue_get_buf(vq, &len)) return; data_left += len; complete(&have_data);}
开发者ID:710leo,项目名称:LVS,代码行数:11,
示例15: cfv_release_used_buf/* This is invoked whenever the remote processor completed processing * a TX msg we just sent, and the buffer is put back to the used ring. */static void cfv_release_used_buf(struct virtqueue *vq_tx){ struct cfv_info *cfv = vq_tx->vdev->priv; unsigned long flags; BUG_ON(vq_tx != cfv->vq_tx); for (;;) { unsigned int len; struct buf_info *buf_info; /* Get used buffer from used ring to recycle used descriptors */ spin_lock_irqsave(&cfv->tx_lock, flags); buf_info = virtqueue_get_buf(vq_tx, &len); spin_unlock_irqrestore(&cfv->tx_lock, flags); /* Stop looping if there are no more buffers to free */ if (!buf_info) break; free_buf_info(cfv, buf_info); /* watermark_tx indicates if we previously stopped the tx * queues. If we have enough free stots in the virtio ring, * re-establish memory reserved and open up tx queues. */ if (cfv->vq_tx->num_free <= cfv->watermark_tx) continue; /* Re-establish memory reserve */ if (cfv->reserved_mem == 0 && cfv->genpool) cfv->reserved_mem = gen_pool_alloc(cfv->genpool, cfv->reserved_size); /* Open up the tx queues */ if (cfv->reserved_mem) { cfv->watermark_tx = virtqueue_get_vring_size(cfv->vq_tx); netif_tx_wake_all_queues(cfv->ndev); /* Buffers are recycled in cfv_netdev_tx, so * disable notifications when queues are opened. */ virtqueue_disable_cb(cfv->vq_tx); ++cfv->stats.tx_flow_on; } else { /* if no memory reserve, wait for more free slots */ WARN_ON(cfv->watermark_tx > virtqueue_get_vring_size(cfv->vq_tx)); cfv->watermark_tx += virtqueue_get_vring_size(cfv->vq_tx) / 4; } }}
开发者ID:ReneNyffenegger,项目名称:linux,代码行数:57,
示例16: virtinput_recv_statusstatic void virtinput_recv_status(struct virtqueue *vq){ struct virtio_input *vi = vq->vdev->priv; struct virtio_input_event *stsbuf; unsigned long flags; unsigned int len; spin_lock_irqsave(&vi->lock, flags); while ((stsbuf = virtqueue_get_buf(vi->sts, &len)) != NULL) kfree(stsbuf); spin_unlock_irqrestore(&vi->lock, flags);}
开发者ID:Chong-Li,项目名称:cse522,代码行数:12,
示例17: send_buf/* * Send a buffer to the output virtqueue of the given crypto_device. * If nonblock is false wait until the host acknowledges the data receive. */ssize_t send_buf(struct crypto_device *crdev, void *in_buf, size_t in_count, bool nonblock){ struct scatterlist sg[1]; struct virtqueue *out_vq; ssize_t ret = 0; unsigned int len; debug("Entering/n"); out_vq = crdev->ovq; /* Discard any consumed buffers. */ reclaim_consumed_buffers(crdev); sg_init_one(sg, in_buf, in_count); /* add sg list to virtqueue and notify host */ ret = virtqueue_add_buf(out_vq, sg, 1, 0, in_buf); if (ret < 0) { debug("Oops! Error adding buffer to vqueue/n"); in_count = 0; goto done; } if (ret == 0) { printk(KERN_WARNING "ovq_full!!!!/n"); crdev->ovq_full = true; } virtqueue_kick(out_vq); if (nonblock) goto done; /* * if nonblock is false we wait until the host acknowledges it pushed * out the data we sent. */ while (!virtqueue_get_buf(out_vq, &len)) cpu_relax(); debug("Leaving/n");done: /* * We're expected to return the amount of data we wrote -- all * of it */ return in_count;}
开发者ID:dsarlis,项目名称:OSLab,代码行数:54,
示例18: tell_hoststatic void tell_host(struct virtio_balloon *vb, struct virtqueue *vq){ struct scatterlist sg; unsigned int len; sg_init_one(&sg, vb->pfns, sizeof(vb->pfns[0]) * vb->num_pfns); /* We should always be able to add one buffer to an empty queue. */ virtqueue_add_outbuf(vq, &sg, 1, vb, GFP_KERNEL); virtqueue_kick(vq); /* When host has read buffer, this completes via balloon_ack */ wait_event(vb->acked, virtqueue_get_buf(vq, &len));}
开发者ID:Chong-Li,项目名称:cse522,代码行数:14,
示例19: stats_handle_requeststatic void stats_handle_request(struct virtio_balloon *vb){ struct virtqueue *vq; struct scatterlist sg; unsigned int len, num_stats; num_stats = update_balloon_stats(vb); vq = vb->stats_vq; if (!virtqueue_get_buf(vq, &len)) return; sg_init_one(&sg, vb->stats, sizeof(vb->stats[0]) * num_stats); virtqueue_add_outbuf(vq, &sg, 1, vb, GFP_KERNEL); virtqueue_kick(vq);}
开发者ID:markus-oberhumer,项目名称:linux,代码行数:15,
示例20: send_cmd_id_stopstatic int send_cmd_id_stop(struct virtio_balloon *vb){ struct scatterlist sg; struct virtqueue *vq = vb->free_page_vq; int err, unused; /* Detach all the used buffers from the vq */ while (virtqueue_get_buf(vq, &unused)) ; sg_init_one(&sg, &vb->cmd_id_stop, sizeof(vb->cmd_id_stop)); err = virtqueue_add_outbuf(vq, &sg, 1, &vb->cmd_id_stop, GFP_KERNEL); if (!err) virtqueue_kick(vq); return err;}
开发者ID:markus-oberhumer,项目名称:linux,代码行数:16,
示例21: debug/* * Get a buffer from the ivq. * If we already have one return it. */struct crypto_vq_buffer *get_inbuf(struct crypto_device *crdev){ struct crypto_vq_buffer *buf; unsigned int len; debug("Entering/n"); if (crdev->inbuf) return crdev->inbuf; buf = virtqueue_get_buf(crdev->ivq, &len); if (buf) { buf->len = len; buf->offset = 0; } debug("Leaving/n"); return buf;}
开发者ID:antonis-m,项目名称:oslab,代码行数:21,
示例22: vq_has_data//interrupt handler//get available buffers from virtqueue and add them in liststatic void vq_has_data(struct virtqueue *vq){ unsigned int len; unsigned long flags, flags1; struct wait_struct *tmp; void *d; while((d = virtqueue_get_buf(vq, &len))) { tmp = (struct wait_struct *)kmalloc(sizeof(struct wait_struct), GFP_ATOMIC); if (!tmp) return; tmp->data = d; spin_lock_irqsave(&wait_data.lock, flags); list_add(&(tmp->list), &(wait_data.list)); spin_unlock_irqrestore(&wait_data.lock, flags); } wake_up_interruptible_all(&cudrvdata.wq);}
开发者ID:dimvass,项目名称:VGVM,代码行数:19,
示例23: get_free_page_and_sendstatic int get_free_page_and_send(struct virtio_balloon *vb){ struct virtqueue *vq = vb->free_page_vq; struct page *page; struct scatterlist sg; int err, unused; void *p; /* Detach all the used buffers from the vq */ while (virtqueue_get_buf(vq, &unused)) ; page = alloc_pages(VIRTIO_BALLOON_FREE_PAGE_ALLOC_FLAG, VIRTIO_BALLOON_FREE_PAGE_ORDER); /* * When the allocation returns NULL, it indicates that we have got all * the possible free pages, so return -EINTR to stop. */ if (!page) return -EINTR; p = page_address(page); sg_init_one(&sg, p, VIRTIO_BALLOON_FREE_PAGE_SIZE); /* There is always 1 entry reserved for the cmd id to use. */ if (vq->num_free > 1) { err = virtqueue_add_inbuf(vq, &sg, 1, p, GFP_KERNEL); if (unlikely(err)) { free_pages((unsigned long)p, VIRTIO_BALLOON_FREE_PAGE_ORDER); return err; } virtqueue_kick(vq); spin_lock_irq(&vb->free_page_list_lock); balloon_page_push(&vb->free_page_list, page); vb->num_free_page_blocks++; spin_unlock_irq(&vb->free_page_list_lock); } else { /* * The vq has no available entry to add this page block, so * just free it. */ free_pages((unsigned long)p, VIRTIO_BALLOON_FREE_PAGE_ORDER); } return 0;}
开发者ID:markus-oberhumer,项目名称:linux,代码行数:46,
示例24: VIOSerialSendCtrlMsgVOIDVIOSerialSendCtrlMsg( IN WDFDEVICE Device, IN ULONG id, IN USHORT event, IN USHORT value){ struct VirtIOBufferDescriptor sg; struct virtqueue *vq; UINT len; PPORTS_DEVICE pContext = GetPortsDevice(Device); VIRTIO_CONSOLE_CONTROL cpkt; if (!pContext->isHostMultiport) { return; } vq = pContext->c_ovq; TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP, "--> %s vq = %p/n", __FUNCTION__, vq); cpkt.id = id; cpkt.event = event; cpkt.value = value; sg.physAddr = MmGetPhysicalAddress(&cpkt); sg.length = sizeof(cpkt); WdfWaitLockAcquire(pContext->COutVqLock, NULL); if(0 <= virtqueue_add_buf(vq, &sg, 1, 0, &cpkt, NULL, 0)) { virtqueue_kick(vq); while(!virtqueue_get_buf(vq, &len)) { LARGE_INTEGER interval; interval.QuadPart = -1; KeDelayExecutionThread(KernelMode, FALSE, &interval); } } WdfWaitLockRelease(pContext->COutVqLock); TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP, "<-- %s/n", __FUNCTION__);}
开发者ID:daynix,项目名称:kvm-guest-drivers-windows,代码行数:45,
示例25: mutex_lockstatic void *get_a_tx_buf(struct virtproc_info *vrp){ unsigned int len; void *ret; mutex_lock(&vrp->tx_lock); if (vrp->last_sbuf < RPMSG_NUM_BUFS / 2) ret = vrp->sbufs + RPMSG_BUF_SIZE * vrp->last_sbuf++; else ret = virtqueue_get_buf(vrp->svq, &len); mutex_unlock(&vrp->tx_lock); return ret;}
开发者ID:mjduddin,项目名称:B14CKB1RD_kernel_m8,代码行数:18,
示例26: virtinput_recv_eventsstatic void virtinput_recv_events(struct virtqueue *vq){ struct virtio_input *vi = vq->vdev->priv; struct virtio_input_event *event; unsigned long flags; unsigned int len; spin_lock_irqsave(&vi->lock, flags); if (vi->ready) { while ((event = virtqueue_get_buf(vi->evt, &len)) != NULL) { spin_unlock_irqrestore(&vi->lock, flags); input_event(vi->idev, le16_to_cpu(event->type), le16_to_cpu(event->code), le32_to_cpu(event->value)); spin_lock_irqsave(&vi->lock, flags); virtinput_queue_evtbuf(vi, event); } virtqueue_kick(vq); } spin_unlock_irqrestore(&vi->lock, flags);}
开发者ID:Chong-Li,项目名称:cse522,代码行数:22,
示例27: VIOSerialGetInBufPVOIDVIOSerialGetInBuf( IN PVIOSERIAL_PORT port){ PPORT_BUFFER buf = NULL; struct virtqueue *vq = GetInQueue(port); UINT len; TraceEvents(TRACE_LEVEL_VERBOSE, DBG_QUEUEING, "--> %s/n", __FUNCTION__); if (vq) { buf = virtqueue_get_buf(vq, &len); if (buf) { buf->len = len; buf->offset = 0; } } TraceEvents(TRACE_LEVEL_VERBOSE, DBG_QUEUEING, "<-- %s/n", __FUNCTION__); return buf;}
开发者ID:bonzini,项目名称:kvm-guest-drivers-windows,代码行数:23,
注:本文中的virtqueue_get_buf函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 C++ virtqueue_kick函数代码示例 C++ virtio_has_feature函数代码示例 |