From: Jeff Garzik <jgarzik@xxxxxxxxx> Subject: Re: [PATCH RFC 0/3] SCSI Userspace Target Date: Wed, 25 Jan 2006 12:46:49 -0500 > > As the email subject hints, the goal of the project is to push most of > > the target code to userspace. The only parts we kept in the kernel were > > for transferring data between the LLD and userpsace and the netlink > > interface. We included the relevant parts of a software iscsi target as > > an example. (snip) > One random comment: Take a look at the mmap'd ring buffer interface > provided by mmap'ing the packet socket. That's the ideal async > interface, since that's fully async, very close to hardware reality. Thanks a lot. Yes, that's really nice. We've replaced some of our netlink code with the packet socket interface. We just access the ring buffer directly with the following changes to the packet socket code. Is it OK? One more question. Is there any interface like mmap'ing the packet socket that can be used for user -> kernel communication? diff --git a/include/net/af_packet.h b/include/net/af_packet.h new file mode 100644 index 0000000..e280e7c --- /dev/null +++ b/include/net/af_packet.h @@ -0,0 +1,6 @@ +#ifndef __LINUX_NET_AFPACKET_H +#define __LINUX_NET_AFPACKET_H + +extern void *packet_frame(struct sock *sk); + +#endif diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 9db7dbd..aee86cd 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -562,6 +562,24 @@ drop: } #ifdef CONFIG_PACKET_MMAP +void *packet_frame(struct sock *sk) +{ + struct packet_sock *po; + struct tpacket_hdr *h; + int err; + + po = pkt_sk(sk); + spin_lock(&sk->sk_receive_queue.lock); + h = (struct tpacket_hdr *) packet_lookup_frame(po, po->head); + if (h->tp_status) + h = ERR_PTR(-ENOBUFS); + else + po->head = po->head != po->frame_max ? po->head+1 : 0; + spin_unlock(&sk->sk_receive_queue.lock); + return h; +} +EXPORT_SYMBOL_GPL(packet_frame); + static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) { struct sock *sk; - : send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html