Lines Matching refs:q
52 static inline u16 macvtap16_to_cpu(struct macvtap_queue *q, __virtio16 val) in macvtap16_to_cpu() argument
54 return __virtio16_to_cpu(q->flags & MACVTAP_VNET_LE, val); in macvtap16_to_cpu()
57 static inline __virtio16 cpu_to_macvtap16(struct macvtap_queue *q, u16 val) in cpu_to_macvtap16() argument
59 return __cpu_to_virtio16(q->flags & MACVTAP_VNET_LE, val); in cpu_to_macvtap16()
110 struct macvtap_queue *q) in macvtap_enable_queue() argument
117 if (q->enabled) in macvtap_enable_queue()
121 rcu_assign_pointer(vlan->taps[vlan->numvtaps], q); in macvtap_enable_queue()
122 q->queue_index = vlan->numvtaps; in macvtap_enable_queue()
123 q->enabled = true; in macvtap_enable_queue()
132 struct macvtap_queue *q) in macvtap_set_queue() argument
139 rcu_assign_pointer(q->vlan, vlan); in macvtap_set_queue()
140 rcu_assign_pointer(vlan->taps[vlan->numvtaps], q); in macvtap_set_queue()
141 sock_hold(&q->sk); in macvtap_set_queue()
143 q->file = file; in macvtap_set_queue()
144 q->queue_index = vlan->numvtaps; in macvtap_set_queue()
145 q->enabled = true; in macvtap_set_queue()
146 file->private_data = q; in macvtap_set_queue()
147 list_add_tail(&q->next, &vlan->queue_list); in macvtap_set_queue()
155 static int macvtap_disable_queue(struct macvtap_queue *q) in macvtap_disable_queue() argument
161 if (!q->enabled) in macvtap_disable_queue()
164 vlan = rtnl_dereference(q->vlan); in macvtap_disable_queue()
167 int index = q->queue_index; in macvtap_disable_queue()
174 q->enabled = false; in macvtap_disable_queue()
190 static void macvtap_put_queue(struct macvtap_queue *q) in macvtap_put_queue() argument
195 vlan = rtnl_dereference(q->vlan); in macvtap_put_queue()
198 if (q->enabled) in macvtap_put_queue()
199 BUG_ON(macvtap_disable_queue(q)); in macvtap_put_queue()
202 RCU_INIT_POINTER(q->vlan, NULL); in macvtap_put_queue()
203 sock_put(&q->sk); in macvtap_put_queue()
204 list_del_init(&q->next); in macvtap_put_queue()
210 sock_put(&q->sk); in macvtap_put_queue()
266 struct macvtap_queue *q, *tmp, *qlist[MAX_MACVTAP_QUEUES]; in macvtap_del_queues() local
270 list_for_each_entry_safe(q, tmp, &vlan->queue_list, next) { in macvtap_del_queues()
271 list_del_init(&q->next); in macvtap_del_queues()
272 qlist[j++] = q; in macvtap_del_queues()
273 RCU_INIT_POINTER(q->vlan, NULL); in macvtap_del_queues()
274 if (q->enabled) in macvtap_del_queues()
294 struct macvtap_queue *q; in macvtap_handle_frame() local
301 q = macvtap_get_queue(dev, skb); in macvtap_handle_frame()
302 if (!q) in macvtap_handle_frame()
305 if (skb_queue_len(&q->sk.sk_receive_queue) >= dev->tx_queue_len) in macvtap_handle_frame()
314 if (q->flags & IFF_VNET_HDR) in macvtap_handle_frame()
323 skb_queue_tail(&q->sk.sk_receive_queue, skb); in macvtap_handle_frame()
332 skb_queue_tail(&q->sk.sk_receive_queue, segs); in macvtap_handle_frame()
345 skb_queue_tail(&q->sk.sk_receive_queue, skb); in macvtap_handle_frame()
349 wake_up_interruptible_poll(sk_sleep(&q->sk), POLLIN | POLLRDNORM | POLLRDBAND); in macvtap_handle_frame()
469 struct macvtap_queue *q; in macvtap_open() local
478 q = (struct macvtap_queue *)sk_alloc(net, AF_UNSPEC, GFP_KERNEL, in macvtap_open()
480 if (!q) in macvtap_open()
483 RCU_INIT_POINTER(q->sock.wq, &q->wq); in macvtap_open()
484 init_waitqueue_head(&q->wq.wait); in macvtap_open()
485 q->sock.type = SOCK_RAW; in macvtap_open()
486 q->sock.state = SS_CONNECTED; in macvtap_open()
487 q->sock.file = file; in macvtap_open()
488 q->sock.ops = &macvtap_socket_ops; in macvtap_open()
489 sock_init_data(&q->sock, &q->sk); in macvtap_open()
490 q->sk.sk_write_space = macvtap_sock_write_space; in macvtap_open()
491 q->sk.sk_destruct = macvtap_sock_destruct; in macvtap_open()
492 q->flags = IFF_VNET_HDR | IFF_NO_PI | IFF_TAP; in macvtap_open()
493 q->vnet_hdr_sz = sizeof(struct virtio_net_hdr); in macvtap_open()
503 sock_set_flag(&q->sk, SOCK_ZEROCOPY); in macvtap_open()
505 err = macvtap_set_queue(dev, file, q); in macvtap_open()
507 sock_put(&q->sk); in macvtap_open()
519 struct macvtap_queue *q = file->private_data; in macvtap_release() local
520 macvtap_put_queue(q); in macvtap_release()
526 struct macvtap_queue *q = file->private_data; in macvtap_poll() local
529 if (!q) in macvtap_poll()
533 poll_wait(file, &q->wq.wait, wait); in macvtap_poll()
535 if (!skb_queue_empty(&q->sk.sk_receive_queue)) in macvtap_poll()
538 if (sock_writeable(&q->sk) || in macvtap_poll()
539 (!test_and_set_bit(SOCK_ASYNC_NOSPACE, &q->sock.flags) && in macvtap_poll()
540 sock_writeable(&q->sk))) in macvtap_poll()
574 static int macvtap_skb_from_vnet_hdr(struct macvtap_queue *q, in macvtap_skb_from_vnet_hdr() argument
602 if (!skb_partial_csum_set(skb, macvtap16_to_cpu(q, vnet_hdr->csum_start), in macvtap_skb_from_vnet_hdr()
603 macvtap16_to_cpu(q, vnet_hdr->csum_offset))) in macvtap_skb_from_vnet_hdr()
608 skb_shinfo(skb)->gso_size = macvtap16_to_cpu(q, vnet_hdr->gso_size); in macvtap_skb_from_vnet_hdr()
618 static void macvtap_skb_to_vnet_hdr(struct macvtap_queue *q, in macvtap_skb_to_vnet_hdr() argument
628 vnet_hdr->hdr_len = cpu_to_macvtap16(q, skb_headlen(skb)); in macvtap_skb_to_vnet_hdr()
629 vnet_hdr->gso_size = cpu_to_macvtap16(q, sinfo->gso_size); in macvtap_skb_to_vnet_hdr()
646 vnet_hdr->csum_start = cpu_to_macvtap16(q, in macvtap_skb_to_vnet_hdr()
649 vnet_hdr->csum_start = cpu_to_macvtap16(q, in macvtap_skb_to_vnet_hdr()
651 vnet_hdr->csum_offset = cpu_to_macvtap16(q, skb->csum_offset); in macvtap_skb_to_vnet_hdr()
661 static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, in macvtap_get_user() argument
677 if (q->flags & IFF_VNET_HDR) { in macvtap_get_user()
678 vnet_hdr_len = q->vnet_hdr_sz; in macvtap_get_user()
691 macvtap16_to_cpu(q, vnet_hdr.csum_start) + in macvtap_get_user()
692 macvtap16_to_cpu(q, vnet_hdr.csum_offset) + 2 > in macvtap_get_user()
693 macvtap16_to_cpu(q, vnet_hdr.hdr_len)) in macvtap_get_user()
694 vnet_hdr.hdr_len = cpu_to_macvtap16(q, in macvtap_get_user()
695 macvtap16_to_cpu(q, vnet_hdr.csum_start) + in macvtap_get_user()
696 macvtap16_to_cpu(q, vnet_hdr.csum_offset) + 2); in macvtap_get_user()
698 if (macvtap16_to_cpu(q, vnet_hdr.hdr_len) > len) in macvtap_get_user()
706 if (m && m->msg_control && sock_flag(&q->sk, SOCK_ZEROCOPY)) { in macvtap_get_user()
710 macvtap16_to_cpu(q, vnet_hdr.hdr_len) : GOODCOPY_LEN; in macvtap_get_user()
722 if (macvtap16_to_cpu(q, vnet_hdr.hdr_len) > good_linear) in macvtap_get_user()
725 linear = macvtap16_to_cpu(q, vnet_hdr.hdr_len); in macvtap_get_user()
728 skb = macvtap_alloc_skb(&q->sk, MACVTAP_RESERVE, copylen, in macvtap_get_user()
751 err = macvtap_skb_from_vnet_hdr(q, skb, &vnet_hdr); in macvtap_get_user()
759 vlan = rcu_dereference(q->vlan); in macvtap_get_user()
781 vlan = rcu_dereference(q->vlan); in macvtap_get_user()
792 struct macvtap_queue *q = file->private_data; in macvtap_write_iter() local
794 return macvtap_get_user(q, NULL, from, file->f_flags & O_NONBLOCK); in macvtap_write_iter()
798 static ssize_t macvtap_put_user(struct macvtap_queue *q, in macvtap_put_user() argument
807 if (q->flags & IFF_VNET_HDR) { in macvtap_put_user()
809 vnet_hdr_len = q->vnet_hdr_sz; in macvtap_put_user()
813 macvtap_skb_to_vnet_hdr(q, skb, &vnet_hdr); in macvtap_put_user()
851 static ssize_t macvtap_do_read(struct macvtap_queue *q, in macvtap_do_read() argument
864 prepare_to_wait(sk_sleep(&q->sk), &wait, in macvtap_do_read()
868 skb = skb_dequeue(&q->sk.sk_receive_queue); in macvtap_do_read()
883 ret = macvtap_put_user(q, skb, to); in macvtap_do_read()
890 finish_wait(sk_sleep(&q->sk), &wait); in macvtap_do_read()
897 struct macvtap_queue *q = file->private_data; in macvtap_read_iter() local
900 ret = macvtap_do_read(q, to, file->f_flags & O_NONBLOCK); in macvtap_read_iter()
907 static struct macvlan_dev *macvtap_get_vlan(struct macvtap_queue *q) in macvtap_get_vlan() argument
912 vlan = rtnl_dereference(q->vlan); in macvtap_get_vlan()
926 struct macvtap_queue *q = file->private_data; in macvtap_ioctl_set_queue() local
930 vlan = macvtap_get_vlan(q); in macvtap_ioctl_set_queue()
935 ret = macvtap_enable_queue(vlan->dev, file, q); in macvtap_ioctl_set_queue()
937 ret = macvtap_disable_queue(q); in macvtap_ioctl_set_queue()
945 static int set_offload(struct macvtap_queue *q, unsigned long arg) in set_offload() argument
951 vlan = rtnl_dereference(q->vlan); in set_offload()
1002 struct macvtap_queue *q = file->private_data; in macvtap_ioctl() local
1022 q->flags = (q->flags & ~MACVTAP_FEATURES) | u; in macvtap_ioctl()
1028 vlan = macvtap_get_vlan(q); in macvtap_ioctl()
1035 u = q->flags; in macvtap_ioctl()
1060 q->sk.sk_sndbuf = s; in macvtap_ioctl()
1064 s = q->vnet_hdr_sz; in macvtap_ioctl()
1075 q->vnet_hdr_sz = s; in macvtap_ioctl()
1079 s = !!(q->flags & MACVTAP_VNET_LE); in macvtap_ioctl()
1088 q->flags |= MACVTAP_VNET_LE; in macvtap_ioctl()
1090 q->flags &= ~MACVTAP_VNET_LE; in macvtap_ioctl()
1100 ret = set_offload(q, arg); in macvtap_ioctl()
1134 struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock); in macvtap_sendmsg() local
1135 return macvtap_get_user(q, m, &m->msg_iter, m->msg_flags & MSG_DONTWAIT); in macvtap_sendmsg()
1141 struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock); in macvtap_recvmsg() local
1145 ret = macvtap_do_read(q, &m->msg_iter, flags & MSG_DONTWAIT); in macvtap_recvmsg()
1165 struct macvtap_queue *q; in macvtap_get_socket() local
1168 q = file->private_data; in macvtap_get_socket()
1169 if (!q) in macvtap_get_socket()
1171 return &q->sock; in macvtap_get_socket()