Re: [PATCH v4 1/8] bluetooth: /proc/net/ entries for bluetooth protocols

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



* Gustavo Padovan <gustavo@xxxxxxxxxxx> [2012-07-24 21:12:14 -0300]:

> Hi Masatake,
> 
> * Masatake YAMATO <yamato@xxxxxxxxxx> [2012-07-16 22:20:18 +0900]:
> 
> > (I resend this mail becasue I got some troubles in mail sending.
> >  Andrei, [PATCH v4 [2-8]/8] are the same as [PATCH v3 [2-8]/8]. So
> >  I send [PATCH v4 1/8] only here. If I should the rest of v4 patches,
> >  please, let me know that.)
> 
> Please keep this kind of information after the --- line, so git am
> automatically skip this when applying, otherwise I have to edit the commit
> message by hand.
> 
> > 
> > lsof command can tell the type of socket processes are using.
> > Internal lsof uses inode numbers on socket fs to resolve the type of
> > sockets. Files under /proc/net/, such as tcp, udp, unix, etc provides
> > such inode information.
> > 
> > Unfortunately bluetooth related protocols don't provide such inode
> > information. This patch series introduces /proc/net files for the protocols.
> > 
> > This patch against af_bluetooth.c provides facility to the implementation
> > of protocols. This patch extends bt_sock_list and introduces two exported
> > function bt_procfs_init, bt_procfs_cleanup.
> > 
> > The type bt_sock_list is already used in some of implementation of
> > protocols. bt_procfs_init prepare seq_operations which converts
> > protocol own bt_sock_list data to protocol own proc entry when the
> > entry is accessed.
> > 
> > What I, lsof user, need is just inode number of bluetooth
> > socket. However, people may want more information. The bt_procfs_init
> > takes a function pointer for customizing the show handler of
> > seq_operations.
> > 
> > In v4 patch, __acquires and __releases attributes are added to suppress
> > sparse warning. Suggested by Andrei Emeltchenko.
> > 
> > Signed-off-by: Masatake YAMATO <yamato@xxxxxxxxxx>
> > ---
> >  include/net/bluetooth/bluetooth.h |   10 +++
> >  net/bluetooth/af_bluetooth.c      |  138 +++++++++++++++++++++++++++++++++++++
> >  2 files changed, 148 insertions(+)
> 
> Patch has been applied to bluetooth-next, however I had to fix a minor
> issue...
> 
> > 
> > diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
> > index 565d4be..ede0369 100644
> > --- a/include/net/bluetooth/bluetooth.h
> > +++ b/include/net/bluetooth/bluetooth.h
> > @@ -27,6 +27,7 @@
> >  
> >  #include <linux/poll.h>
> >  #include <net/sock.h>
> > +#include <linux/seq_file.h>
> >  
> >  #ifndef AF_BLUETOOTH
> >  #define AF_BLUETOOTH	31
> > @@ -202,6 +203,10 @@ enum {
> >  struct bt_sock_list {
> >  	struct hlist_head head;
> >  	rwlock_t          lock;
> > +#ifdef CONFIG_PROC_FS
> > +        struct file_operations   fops;
> > +        int (* custom_seq_show)(struct seq_file *, void *);
> > +#endif
> >  };
> >  
> >  int  bt_sock_register(int proto, const struct net_proto_family *ops);
> > @@ -292,6 +297,11 @@ extern void hci_sock_cleanup(void);
> >  extern int bt_sysfs_init(void);
> >  extern void bt_sysfs_cleanup(void);
> >  
> > +extern int  bt_procfs_init(struct module* module, struct net *net, const char *name,
> > +			   struct bt_sock_list* sk_list,
> > +			   int (* seq_show)(struct seq_file *, void *));
> > +extern void bt_procfs_cleanup(struct net *net, const char *name);
> > +
> >  extern struct dentry *bt_debugfs;
> >  
> >  int l2cap_init(void);
> > diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c
> > index f7db579..f76cf2f 100644
> > --- a/net/bluetooth/af_bluetooth.c
> > +++ b/net/bluetooth/af_bluetooth.c
> > @@ -532,6 +532,144 @@ int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
> >  }
> >  EXPORT_SYMBOL(bt_sock_wait_state);
> >  
> > +#ifdef CONFIG_PROC_FS
> > +struct bt_seq_state {
> > +	struct bt_sock_list *l;
> > +};
> > +
> > +static void *bt_seq_start(struct seq_file *seq, loff_t *pos)
> > +	__acquires(seq->private->l->lock)
> > +{
> > +	struct bt_seq_state *s = seq->private;
> > +	struct bt_sock_list *l = s->l;
> > +
> > +	read_lock(&l->lock);
> > +	return seq_hlist_start_head(&l->head, *pos);
> > +}
> > +
> > +static void *bt_seq_next(struct seq_file *seq, void *v, loff_t *pos)
> > +{
> > +	struct bt_seq_state *s = seq->private;
> > +	struct bt_sock_list *l = s->l;
> > +
> > +	return seq_hlist_next(v, &l->head, pos);
> > +}
> > +
> > +static void bt_seq_stop(struct seq_file *seq, void *v)
> > +	__releases(seq->private->l->lock)
> > +{
> > +	struct bt_seq_state *s = seq->private;
> > +	struct bt_sock_list *l = s->l;
> > +
> > +	read_unlock(&l->lock);
> > +}
> > +
> > +static int bt_seq_show(struct seq_file *seq, void *v)
> > +{
> > +	struct sock *sk;
> > +	struct bt_sock *bt;
> > +	struct bt_seq_state *s = seq->private;
> > +	struct bt_sock_list *l = s->l;
> > +	bdaddr_t src_baswapped, dst_baswapped;
> > +
> > +	if (v == SEQ_START_TOKEN) {
> > +		seq_puts(seq ,"sk               RefCnt Rmem   Wmem   User   Inode  Src Dst Parent");
> > +
> > +		if (l->custom_seq_show) {
> > +			seq_putc(seq, ' ');
> > +			l->custom_seq_show(seq, v);
> > +		}
> > +
> > +		seq_putc(seq, '\n');
> > +	} else {
> > +		sk = sk_entry(v);
> > +		bt = bt_sk(sk);
> > +		baswap(&src_baswapped, &bt->src);
> > +		baswap(&dst_baswapped, &bt->dst);
> > +
> > +		seq_printf(seq, "%pK %-6d %-6u %-6u %-6u %-6lu %pM %pM %-6lu",
> > +			   sk,
> > +			   atomic_read(&sk->sk_refcnt),
> > +			   sk_rmem_alloc_get(sk),
> > +			   sk_wmem_alloc_get(sk),
> > +			   sock_i_uid(sk),
> > +			   sock_i_ino(sk),
> > +			   &src_baswapped,
> > +			   &dst_baswapped,
> > +			   bt->parent? sock_i_ino(bt->parent): 0LU);
> > +
> > +		if (l->custom_seq_show) {
> > +			seq_putc(seq, ' ');
> > +			l->custom_seq_show(seq, v);
> > +		}
> > +
> > +		seq_putc(seq, '\n');
> > +	}
> > +	return 0;
> > +}
> > +
> > +static struct seq_operations bt_seq_ops = {
> > +	.start = bt_seq_start,
> > +	.next  = bt_seq_next,
> > +	.stop  = bt_seq_stop,
> > +	.show  = bt_seq_show,
> > +};
> > +
> > +static int bt_seq_open(struct inode *inode, struct file *file)
> > +{
> > +	struct bt_sock_list *sk_list;
> > +	struct bt_seq_state *s;
> > +
> > +	sk_list = PDE(inode)->data;
> > +	s = __seq_open_private(file, &bt_seq_ops,
> > +			       sizeof(struct bt_seq_state));
> > +	if (s == NULL)
> > +		return -ENOMEM;
> > +
> > +	s->l = sk_list;
> > +	return 0;
> > +}
> > +
> > +int bt_procfs_init(struct module* module, struct net *net, const char *name, struct bt_sock_list* sk_list,
> > +		   int (* seq_show)(struct seq_file *, void *))
> 
> ... the identation here is a bit wrong, I fixed it. Thanks for doing this
> work.

I reverted this patch, it is not building.

	Gustavo

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux