2005-04-01 03:58:55

by Roland Dreier

[permalink] [raw]
Subject: [PATCH][1/3] IPoIB: set skb->mac.raw on receive

From: Hal Rosenstock <[email protected]>

Set skb->mac.raw on receive. This fixes crashes when this is
dereferenced, for example by netfilter or when PF_PACKET is used.

Signed-off-by: Hal Rosenstock <[email protected]>
Signed-off-by: Roland Dreier <[email protected]>

--- linux-export.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2005-03-31 19:07:06.912605203 -0800
+++ linux-export/drivers/infiniband/ulp/ipoib/ipoib_ib.c 2005-03-31 19:23:30.599053347 -0800
@@ -201,7 +201,7 @@
if (wc->slid != priv->local_lid ||
wc->src_qp != priv->qp->qp_num) {
skb->protocol = ((struct ipoib_header *) skb->data)->proto;
-
+ skb->mac.raw = skb->data;
skb_pull(skb, IPOIB_ENCAP_LEN);

dev->last_rx = jiffies;


2005-04-01 03:59:01

by Roland Dreier

[permalink] [raw]
Subject: [PATCH][2/3] IPoIB: fix static rate calculation

Correct and simplify calculation of static rate. We need to round up
the quotient of (local_rate - path_rate) / path_rate. To round up we
add (path_rate - 1) to the numerator, so the quotient simplifies to
(local_rate - 1) / path_rate.

No idea how I came up with the old formula.

Signed-off-by: Roland Dreier <[email protected]>

--- linux-export.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2005-03-31 19:06:47.984714505 -0800
+++ linux-export/drivers/infiniband/ulp/ipoib/ipoib_main.c 2005-03-31 19:26:39.094134171 -0800
@@ -302,11 +302,10 @@
.sl = pathrec->sl,
.port_num = priv->port
};
+ int path_rate = ib_sa_rate_enum_to_int(pathrec->rate);

- if (ib_sa_rate_enum_to_int(pathrec->rate) > 0)
- av.static_rate = (2 * priv->local_rate -
- ib_sa_rate_enum_to_int(pathrec->rate) - 1) /
- (priv->local_rate ? priv->local_rate : 1);
+ if (path_rate > 0 && priv->local_rate > path_rate)
+ av.static_rate = (priv->local_rate - 1) / path_rate;

ipoib_dbg(priv, "static_rate %d for local port %dX, path %dX\n",
av.static_rate, priv->local_rate,
--- linux-export.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2005-03-31 19:07:01.877698296 -0800
+++ linux-export/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2005-03-31 19:26:03.861782487 -0800
@@ -258,13 +258,12 @@
.traffic_class = mcast->mcmember.traffic_class
}
};
+ int path_rate = ib_sa_rate_enum_to_int(mcast->mcmember.rate);

av.grh.dgid = mcast->mcmember.mgid;

- if (ib_sa_rate_enum_to_int(mcast->mcmember.rate) > 0)
- av.static_rate = (2 * priv->local_rate -
- ib_sa_rate_enum_to_int(mcast->mcmember.rate) - 1) /
- (priv->local_rate ? priv->local_rate : 1);
+ if (path_rate > 0 && priv->local_rate > path_rate)
+ av.static_rate = (priv->local_rate - 1) / path_rate;

ipoib_dbg_mcast(priv, "static_rate %d for local port %dX, mcmember %dX\n",
av.static_rate, priv->local_rate,

2005-04-01 04:01:04

by Roland Dreier

[permalink] [raw]
Subject: [PATCH][3/3] IPoIB: convert to debugfs

Convert IPoIB to use debugfs instead of its own custom debugging filesystem.

Signed-off-by: Roland Dreier <[email protected]>

--- linux-export.orig/drivers/infiniband/ulp/ipoib/ipoib_fs.c 2005-03-31 19:07:14.463965782 -0800
+++ linux-export/drivers/infiniband/ulp/ipoib/ipoib_fs.c 2005-03-31 19:31:28.624283013 -0800
@@ -32,19 +32,16 @@
* $Id: ipoib_fs.c 1389 2004-12-27 22:56:47Z roland $
*/

-#include <linux/pagemap.h>
+#include <linux/err.h>
#include <linux/seq_file.h>

-#include "ipoib.h"
+struct file_operations;

-enum {
- IPOIB_MAGIC = 0x49504942 /* "IPIB" */
-};
+#include <linux/debugfs.h>
+
+#include "ipoib.h"

-static DECLARE_MUTEX(ipoib_fs_mutex);
static struct dentry *ipoib_root;
-static struct super_block *ipoib_sb;
-static LIST_HEAD(ipoib_device_list);

static void *ipoib_mcg_seq_start(struct seq_file *file, loff_t *pos)
{
@@ -145,143 +142,34 @@
.release = seq_release
};

-static struct inode *ipoib_get_inode(void)
-{
- struct inode *inode = new_inode(ipoib_sb);
-
- if (inode) {
- inode->i_mode = S_IFREG | S_IRUGO;
- inode->i_uid = 0;
- inode->i_gid = 0;
- inode->i_blksize = PAGE_CACHE_SIZE;
- inode->i_blocks = 0;
- inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
- inode->i_fop = &ipoib_fops;
- }
-
- return inode;
-}
-
-static int __ipoib_create_debug_file(struct net_device *dev)
+int ipoib_create_debug_file(struct net_device *dev)
{
struct ipoib_dev_priv *priv = netdev_priv(dev);
- struct dentry *dentry;
- struct inode *inode;
char name[IFNAMSIZ + sizeof "_mcg"];

snprintf(name, sizeof name, "%s_mcg", dev->name);

- dentry = d_alloc_name(ipoib_root, name);
- if (!dentry)
- return -ENOMEM;
-
- inode = ipoib_get_inode();
- if (!inode) {
- dput(dentry);
- return -ENOMEM;
- }
-
- inode->u.generic_ip = dev;
- priv->mcg_dentry = dentry;
-
- d_add(dentry, inode);
-
- return 0;
-}
-
-int ipoib_create_debug_file(struct net_device *dev)
-{
- struct ipoib_dev_priv *priv = netdev_priv(dev);
-
- down(&ipoib_fs_mutex);
-
- list_add_tail(&priv->fs_list, &ipoib_device_list);
-
- if (!ipoib_sb) {
- up(&ipoib_fs_mutex);
- return 0;
- }
-
- up(&ipoib_fs_mutex);
+ priv->mcg_dentry = debugfs_create_file(name, S_IFREG | S_IRUGO,
+ ipoib_root, dev, &ipoib_fops);

- return __ipoib_create_debug_file(dev);
+ return priv->mcg_dentry ? 0 : -ENOMEM;
}

void ipoib_delete_debug_file(struct net_device *dev)
{
struct ipoib_dev_priv *priv = netdev_priv(dev);

- down(&ipoib_fs_mutex);
- list_del(&priv->fs_list);
- if (!ipoib_sb) {
- up(&ipoib_fs_mutex);
- return;
- }
- up(&ipoib_fs_mutex);
-
- if (priv->mcg_dentry) {
- d_drop(priv->mcg_dentry);
- simple_unlink(ipoib_root->d_inode, priv->mcg_dentry);
- }
-}
-
-static int ipoib_fill_super(struct super_block *sb, void *data, int silent)
-{
- static struct tree_descr ipoib_files[] = {
- { "" }
- };
- struct ipoib_dev_priv *priv;
- int ret;
-
- ret = simple_fill_super(sb, IPOIB_MAGIC, ipoib_files);
- if (ret)
- return ret;
-
- ipoib_root = sb->s_root;
-
- down(&ipoib_fs_mutex);
-
- ipoib_sb = sb;
-
- list_for_each_entry(priv, &ipoib_device_list, fs_list) {
- ret = __ipoib_create_debug_file(priv->dev);
- if (ret)
- break;
- }
-
- up(&ipoib_fs_mutex);
-
- return ret;
-}
-
-static struct super_block *ipoib_get_sb(struct file_system_type *fs_type,
- int flags, const char *dev_name, void *data)
-{
- return get_sb_single(fs_type, flags, data, ipoib_fill_super);
+ if (priv->mcg_dentry)
+ debugfs_remove(priv->mcg_dentry);
}

-static void ipoib_kill_sb(struct super_block *sb)
-{
- down(&ipoib_fs_mutex);
- ipoib_sb = NULL;
- up(&ipoib_fs_mutex);
-
- kill_litter_super(sb);
-}
-
-static struct file_system_type ipoib_fs_type = {
- .owner = THIS_MODULE,
- .name = "ipoib_debugfs",
- .get_sb = ipoib_get_sb,
- .kill_sb = ipoib_kill_sb,
-};
-
int ipoib_register_debugfs(void)
{
- return register_filesystem(&ipoib_fs_type);
+ ipoib_root = debugfs_create_dir("ipoib", NULL);
+ return ipoib_root ? 0 : -ENOMEM;
}

void ipoib_unregister_debugfs(void)
{
- unregister_filesystem(&ipoib_fs_type);
+ debugfs_remove(ipoib_root);
}
--- linux-export.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c 2005-03-31 19:26:39.094134171 -0800
+++ linux-export/drivers/infiniband/ulp/ipoib/ipoib_main.c 2005-03-31 19:30:51.117424929 -0800
@@ -1082,19 +1082,19 @@

return 0;

-err_fs:
- ipoib_unregister_debugfs();
-
err_wq:
destroy_workqueue(ipoib_workqueue);

+err_fs:
+ ipoib_unregister_debugfs();
+
return ret;
}

static void __exit ipoib_cleanup_module(void)
{
- ipoib_unregister_debugfs();
ib_unregister_client(&ipoib_client);
+ ipoib_unregister_debugfs();
destroy_workqueue(ipoib_workqueue);
}


2005-04-01 04:18:54

by David Miller

[permalink] [raw]
Subject: Re: [PATCH][1/3] IPoIB: set skb->mac.raw on receive


Roland, [email protected] CC:'ing either Jeff Garzik and
myself, please.

2005-04-01 04:46:30

by Roland Dreier

[permalink] [raw]
Subject: Re: [PATCH][1/3] IPoIB: set skb->mac.raw on receive

David> Roland, [email protected] CC:'ing either Jeff Garzik and
David> myself, please.

Sorry, will do next time around, unless you'd like me to resend this
batch as well. All 3 patches are pretty trivial, though. The biggest
one is just deleting a lot of code by switching to debugfs.

- R.

2005-04-01 17:53:55

by Roland Dreier

[permalink] [raw]
Subject: [PATCH][4/3] IPoIB: document conversion to debugfs

Update IPoIB documentation now that multicast debugging files have
moved from ipoibdebugfs to debugfs.

Signed-off-by: Roland Dreier <[email protected]>

--- linux-export.orig/Documentation/infiniband/ipoib.txt 2005-03-31 19:07:01.000000000 -0800
+++ linux-export/Documentation/infiniband/ipoib.txt 2005-04-01 09:43:27.122520190 -0800
@@ -32,14 +32,13 @@
mcast_debug_level to 1. These parameters can be controlled at
runtime through files in /sys/module/ib_ipoib/.

- CONFIG_INFINIBAND_IPOIB_DEBUG also enables the "ipoib_debugfs"
+ CONFIG_INFINIBAND_IPOIB_DEBUG also enables files in the debugfs
virtual filesystem. By mounting this filesystem, for example with

- mkdir -p /ipoib_debugfs
- mount -t ipoib_debugfs none /ipoib_debufs
+ mount -t debugfs none /sys/kernel/debug

- it is possible to get statistics about multicast groups from the
- files /ipoib_debugfs/ib0_mcg and so on.
+ it is possible to get statistics about munlticast groups from the
+ files /sys/kernel/debug/ipoib/ib0_mcg and so on.

The performance impact of this option is negligible, so it
is safe to enable this option with debug_level set to 0 for normal