Re: [PATCH 11/13] Core Resource Allocation

2006-11-17 Thread Roland Dreier
 > I think we can use random32() or get_random_bytes().  I need to
 > re-review how this algorithm works.  Its randomizing the stag IDs so
 > they are not predictable.

I assume based on the algorithm you have now that they don't need to
be cryptographically unpredictable.  So random32() would probably be
the best thing to do (get_random_bytes() should be used sparingly,
since it depletes the kernel entropy pool).

 - R.
-
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


Re: [PATCH 11/13] Core Resource Allocation

2006-11-17 Thread Steve Wise
On Fri, 2006-11-17 at 08:54 -0800, Roland Dreier wrote:
>  > +static u32 next_random(u32 rand)
>  > +{
>  > +  u32 y, ylast;
>  > +
>  > +  y = rand;   
>  > +  ylast = y;
>  > +  y = (y * 69069) & 0x;
>  > +  y = (y & 0x8000) + (ylast & 0x7fff);
>  > +  if ((y & 1))
>  > +  y = ylast ^ (y > 1) ^ (2567483615UL);
>  > +  else
>  > +  y = ylast ^ (y > 1);
>  > +  y = y ^ (y >> 11);
>  > +  y = y ^ ((y >> 7) & 2636928640UL);
>  > +  y = y ^ ((y >> 15) & 4022730752UL);
>  > +  y = y ^ (y << 18);
>  > +  return y;
>  > +}
> 
> How about just using the kernel's random32()?
> 
> I haven't read the code really so I don't understand what's being
> randomized here, but random32() should be more than good enough for a
> typical randomized algorithm().
> 
>  - R.

I think we can use random32() or get_random_bytes().  I need to
re-review how this algorithm works.  Its randomizing the stag IDs so
they are not predictable.

Steve.



-
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


Re: [PATCH 11/13] Core Resource Allocation

2006-11-17 Thread Roland Dreier
 > +static u32 next_random(u32 rand)
 > +{
 > +u32 y, ylast;
 > +
 > +y = rand;   
 > +ylast = y;
 > +y = (y * 69069) & 0x;
 > +y = (y & 0x8000) + (ylast & 0x7fff);
 > +if ((y & 1))
 > +y = ylast ^ (y > 1) ^ (2567483615UL);
 > +else
 > +y = ylast ^ (y > 1);
 > +y = y ^ (y >> 11);
 > +y = y ^ ((y >> 7) & 2636928640UL);
 > +y = y ^ ((y >> 15) & 4022730752UL);
 > +y = y ^ (y << 18);
 > +return y;
 > +}

How about just using the kernel's random32()?

I haven't read the code really so I don't understand what's being
randomized here, but random32() should be more than good enough for a
typical randomized algorithm().

 - R.
-
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


[PATCH 11/13] Core Resource Allocation

2006-11-15 Thread Steve Wise

Core functions to carve up adapter memory, stag, qp, and cq IDs.

Signed-off-by: Steve Wise <[EMAIL PROTECTED]>
---

 drivers/infiniband/hw/cxgb3/core/cxio_resource.c |  357 ++
 drivers/infiniband/hw/cxgb3/core/cxio_resource.h |   70 
 2 files changed, 427 insertions(+), 0 deletions(-)

diff --git a/drivers/infiniband/hw/cxgb3/core/cxio_resource.c 
b/drivers/infiniband/hw/cxgb3/core/cxio_resource.c
new file mode 100644
index 000..ada44b9
--- /dev/null
+++ b/drivers/infiniband/hw/cxgb3/core/cxio_resource.c
@@ -0,0 +1,357 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *  - Redistributions of source code must retain the above
+ *copyright notice, this list of conditions and the following
+ *disclaimer.
+ *
+ *  - Redistributions in binary form must reproduce the above
+ *copyright notice, this list of conditions and the following
+ *disclaimer in the documentation and/or other materials
+ *provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+/* Crude resource management */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "cxio_resource.h"
+#include "cxio_hal.h"
+
+static struct kfifo *rhdl_fifo;
+static spinlock_t rhdl_fifo_lock;
+
+#define RANDOM_SIZE 16
+
+
+/* Loosely based on the Mersenne twister algorithm */
+static u32 next_random(u32 rand)
+{
+   u32 y, ylast;
+
+   y = rand;   
+   ylast = y;
+   y = (y * 69069) & 0x;
+   y = (y & 0x8000) + (ylast & 0x7fff);
+   if ((y & 1))
+   y = ylast ^ (y > 1) ^ (2567483615UL);
+   else
+   y = ylast ^ (y > 1);
+   y = y ^ (y >> 11);
+   y = y ^ ((y >> 7) & 2636928640UL);
+   y = y ^ ((y >> 15) & 4022730752UL);
+   y = y ^ (y << 18);
+   return y;
+}
+static int __cxio_init_resource_fifo(struct kfifo **fifo,
+  spinlock_t *fifo_lock,
+  u32 nr, u32 skip_low,
+  u32 skip_high,
+  int random)
+{
+   u32 i, j, entry = 0, idx;
+   u32 random_bytes;
+   u32 rarray[16];
+   spin_lock_init(fifo_lock);
+
+   *fifo = kfifo_alloc(nr * sizeof(u32), GFP_KERNEL, fifo_lock);
+   if (IS_ERR(*fifo))
+   return -ENOMEM;
+
+   for (i = 0; i < skip_low + skip_high; i++)
+   __kfifo_put(*fifo, (unsigned char *) &entry, sizeof(u32));
+   if (random) {
+   j = 0;
+   get_random_bytes(&random_bytes,sizeof(random_bytes));
+   for (i = 0; i < RANDOM_SIZE; i++)
+   rarray[i] = i + skip_low;
+   for (i = skip_low + RANDOM_SIZE; i < nr - skip_high; i++) {
+   if (j >= RANDOM_SIZE) {
+   j = 0;
+   random_bytes = next_random(random_bytes);
+   }
+   idx = (random_bytes >> (j * 2)) & 0xF;
+   __kfifo_put(*fifo, 
+   (unsigned char *) &rarray[idx],
+   sizeof(u32));
+   rarray[idx] = i;
+   j++;
+   }
+   for (i = 0; i < RANDOM_SIZE; i++)
+   __kfifo_put(*fifo, 
+   (unsigned char *) &rarray[i],
+   sizeof(u32));
+   } else
+   for (i = skip_low; i < nr - skip_high; i++)
+   __kfifo_put(*fifo, (unsigned char *) &i, sizeof(u32));
+
+   for (i = 0; i < skip_low + skip_high; i++)
+   kfifo_get(*fifo, (unsigned char *) &entry, sizeof(u32));
+   return 0;
+}
+
+static int cxio_init_resource_fifo(struct kfifo **fifo, spinlock_t * fifo_lock,
+  u32 nr, u32 skip_low, u32 skip_high)
+{
+   return (__cxio_init_