Lines Matching refs:chan
107 struct virtio_chan *chan = client->trans;
110 if (chan)
111 chan->inuse = false;
130 struct virtio_chan *chan = vq->vdev->priv;
138 spin_lock_irqsave(&chan->lock, flags);
139 while ((req = virtqueue_get_buf(chan->vq, &len)) != NULL) {
140 if (!chan->ring_bufs_avail) {
141 chan->ring_bufs_avail = 1;
147 p9_client_cb(chan->client, req, REQ_STATUS_RCVD);
150 spin_unlock_irqrestore(&chan->lock, flags);
153 wake_up(chan->vc_wq);
260 struct virtio_chan *chan = client->trans;
267 spin_lock_irqsave(&chan->lock, flags);
271 out = pack_sg_list(chan->sg, 0,
274 sgs[out_sgs++] = chan->sg;
276 in = pack_sg_list(chan->sg, out,
279 sgs[out_sgs + in_sgs++] = chan->sg + out;
281 err = virtqueue_add_sgs(chan->vq, sgs, out_sgs, in_sgs, req,
285 chan->ring_bufs_avail = 0;
286 spin_unlock_irqrestore(&chan->lock, flags);
287 err = wait_event_killable(*chan->vc_wq,
288 chan->ring_bufs_avail);
295 spin_unlock_irqrestore(&chan->lock, flags);
301 virtqueue_kick(chan->vq);
302 spin_unlock_irqrestore(&chan->lock, flags);
308 static int p9_get_mapped_pages(struct virtio_chan *chan,
327 if (atomic_read(&vp_pinned) >= chan->p9_max_pages) {
329 (atomic_read(&vp_pinned) < chan->p9_max_pages));
429 struct virtio_chan *chan = client->trans;
439 int n = p9_get_mapped_pages(chan, &out_pages, uodata,
458 int n = p9_get_mapped_pages(chan, &in_pages, uidata,
473 spin_lock_irqsave(&chan->lock, flags);
478 out = pack_sg_list(chan->sg, 0,
482 sgs[out_sgs++] = chan->sg;
485 sgs[out_sgs++] = chan->sg + out;
486 out += pack_sg_list_p(chan->sg, out, VIRTQUEUE_NUM,
497 in = pack_sg_list(chan->sg, out,
500 sgs[out_sgs + in_sgs++] = chan->sg + out;
503 sgs[out_sgs + in_sgs++] = chan->sg + out + in;
504 pack_sg_list_p(chan->sg, out + in, VIRTQUEUE_NUM,
509 err = virtqueue_add_sgs(chan->vq, sgs, out_sgs, in_sgs, req,
513 chan->ring_bufs_avail = 0;
514 spin_unlock_irqrestore(&chan->lock, flags);
515 err = wait_event_killable(*chan->vc_wq,
516 chan->ring_bufs_avail);
523 spin_unlock_irqrestore(&chan->lock, flags);
530 virtqueue_kick(chan->vq);
531 spin_unlock_irqrestore(&chan->lock, flags);
569 struct virtio_chan *chan;
574 chan = vdev->priv;
575 tag_len = strlen(chan->tag);
577 memcpy(buf, chan->tag, tag_len + 1);
597 struct virtio_chan *chan;
605 chan = kmalloc(sizeof(struct virtio_chan), GFP_KERNEL);
606 if (!chan) {
612 chan->vdev = vdev;
615 chan->vq = virtio_find_single_vq(vdev, req_done, "requests");
616 if (IS_ERR(chan->vq)) {
617 err = PTR_ERR(chan->vq);
620 chan->vq->vdev->priv = chan;
621 spin_lock_init(&chan->lock);
623 sg_init_table(chan->sg, VIRTQUEUE_NUM);
625 chan->inuse = false;
640 chan->tag = tag;
645 chan->vc_wq = kmalloc(sizeof(wait_queue_head_t), GFP_KERNEL);
646 if (!chan->vc_wq) {
650 init_waitqueue_head(chan->vc_wq);
651 chan->ring_bufs_avail = 1;
653 chan->p9_max_pages = nr_free_buffer_pages()/4;
658 list_add_tail(&chan->chan_list, &virtio_chan_list);
673 kfree(chan);
696 struct virtio_chan *chan;
704 list_for_each_entry(chan, &virtio_chan_list, chan_list) {
705 if (!strcmp(devname, chan->tag)) {
706 if (!chan->inuse) {
707 chan->inuse = true;
721 client->trans = (void *)chan;
723 chan->client = client;
736 struct virtio_chan *chan = vdev->priv;
742 list_del(&chan->chan_list);
746 while (chan->inuse) {
764 kfree(chan->tag);
765 kfree(chan->vc_wq);
766 kfree(chan);