On Wed, Feb 08, 2006 at 02:26:32PM +0900, FUJITA Tomonori ([EMAIL PROTECTED]) 
wrote:
> Mike Christie and I've developed the SCSI Userspace target
> framework. Target LLDs (for Fibre channel, iSCSI HBAs, etc) pass SCSI
> commands to SCSI commands to the user-space daemon. The daemon
> executes the commands and sends the results back to the LLDs.
> 
> Please refer scsi-ml for further details.
> 
> http://thread.gmane.org/gmane.linux.scsi/22409
> 
> We need efficient kernel and user-space communication interface and
> used netlink. Jeff Garzik suggested the packet socket mmap'd ring
> buffer.
> 
> The mmap'd ring buffer is really nice, but we want to access directly
> the ring buffer withough going through the networking stack to avoid
> memory allocation and overhead.

Depending on calling context, it can be not sufficient to leave sofirqs
enabled in that function.
 
> Signed-off-by: FUJITA Tomonori <[EMAIL PROTECTED]>
> Signed-off-by: Mike Christie <[EMAIL PROTECTED]>
> ---
> 
>  include/net/af_packet.h |    6 ++++++
>  net/packet/af_packet.c  |   17 +++++++++++++++++
>  2 files changed, 23 insertions(+), 0 deletions(-)
>  create mode 100644 include/net/af_packet.h
> 
> c627f3a1da6e5e7e9e46d58401adcf168ea45787
> diff --git a/include/net/af_packet.h b/include/net/af_packet.h
> new file mode 100644
> index 0000000..5a75e07
> --- /dev/null
> +++ b/include/net/af_packet.h
> @@ -0,0 +1,6 @@
> +#ifndef __LINUX_NET_AFPACKET_H
> +#define __LINUX_NET_AFPACKET_H
> +
> +extern struct tpacket_hdr *packet_socket_frame(struct sock *sk);
> +
> +#endif
> diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
> index 9db7dbd..b5fbd74 100644
> --- a/net/packet/af_packet.c
> +++ b/net/packet/af_packet.c
> @@ -562,6 +562,23 @@ drop:
>  }
>  
>  #ifdef CONFIG_PACKET_MMAP
> +struct tpacket_hdr *packet_socket_frame(struct sock *sk)
> +{
> +     struct packet_sock *po;
> +     struct tpacket_hdr *h;
> +
> +     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_socket_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;
> -- 
> 1.1.3

-- 
        Evgeniy Polyakov
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to