From: Sasha Levin <levinsasha928@gmail.com>
To: Matthias Diener <matthias.diener@mdiener.org>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5] hashtable: introduce a small and naive hashtable
Date: Sun, 16 Sep 2012 13:30:26 +0200 [thread overview]
Message-ID: <5055B852.4010906@gmail.com> (raw)
In-Reply-To: <CAKBUcnA4b8HaV3-20C8QXXgFXW4ZDfOc6SvYCFsA3mtdyEd89Q@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 1746 bytes --]
On 09/16/2012 01:08 AM, Matthias Diener wrote:
> Sasha Levin (levinsasha928 <at> gmail.com) wrote:
>> On Sat, Sep 15, 2012 at 5:14 PM, Mathieu Desnoyers
>> <mathieu.desnoyers <at> efficios.com> wrote:
>>> * Sasha Levin (levinsasha928 <at> gmail.com) wrote:
> [...]
>>>> +#define hash_init(hashtable) \
>>>> +({ \
>>>> + int __i; \
>>>> + \
>>>> + for (__i = 0; __i < HASH_BITS(hashtable); __i++) \
>>>
>>> I think this fails to initialize the whole table. You'd need
>>>
>>> HASH_BITS -> HASH_SIZE
>>
>> Right.
>>
>> Unfortunately it's pretty hard catching something like this :/
>>
>>> Which brings the following question: how did you test this code ? It
>>> would be nice to have a small test module along with this patchset that
>>> stress-tests this simple hash table in various configurations (on stack,
>>> in data, etc).
>>
>> I do two things:
>>
>> - A small userspace test (since this header works just fine from
>> userspace as well).
>
>
> It would be interesting to run some experiments with this hashtable in
> userspace.
> Could you post the test code here?
Sure, I've attached the test code. There are 2 things to remember it:
1. The code looks like crap :) I've never intended it to be seen by others.
2. It should be used in the context of "sanitized" kernel headers so it could
be included directly. I usually work in the directory of lkvm, and compile this
code using:
gcc -Iinclude/ -I../../include/ -O0 -ggdb hashtest.c
[-- Attachment #2: hashtest.c --]
[-- Type: text/x-csrc, Size: 1352 bytes --]
#define BITS_PER_LONG 64
#include <linux/kernel.h>
#include <linux/hashtable.h>
#include <kvm/util.h>
#include <linux/log2.h>
#include <assert.h>
struct my_data {
int x;
struct hlist_node node;
};
static DECLARE_HASHTABLE(test, 10);
static struct my_data *values[1000000];
struct my_data *get_data(int v)
{
struct my_data *p;
struct hlist_node *n;
hash_for_each_possible(test, p, n, node, v)
if (p->x == v)
return p;
return NULL;
}
bool verify(int i)
{
if (values[i] == NULL && get_data(i))
printf("No data, but found at %p (%d)\n", get_data(i), i);
if (values[i])
return get_data(i) ? true : false;
else
return get_data(i) ? false : true;
}
int main(void)
{
int i;
hash_init(test);
printf("Empty? %d\n", hash_empty(test));
while (1) {
for (i = 0; i < ARRAY_SIZE(values); i++) {
int r = rand() % 3;
if (i % 10000 == 0) {
printf("\r%d ...", i);
fflush(stdout);
}
switch (r) {
case 0:
assert(verify(i));
if (values[i])
break;
values[i] = malloc(sizeof(values[i]));
values[i]->x = i;
hash_add(test, &values[i]->node, i);
assert(verify(i));
break;
case 1:
assert(verify(i));
break;
case 2:
assert(verify(i));
if (values[i]) {
hash_del(&values[i]->node);
free(values[i]);
values[i] = NULL;
}
assert(verify(i));
break;
}
}
}
return 0;
}
next prev parent reply other threads:[~2012-09-16 11:30 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-15 23:08 [PATCH v5] hashtable: introduce a small and naive hashtable Matthias Diener
2012-09-16 11:30 ` Sasha Levin [this message]
-- strict thread matches above, loose matches on Subject: below --
2012-09-15 9:53 Sasha Levin
2012-09-15 15:14 ` Mathieu Desnoyers
2012-09-15 15:47 ` Sasha Levin
2012-09-16 19:33 ` Mathieu Desnoyers
2012-09-16 19:48 ` Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5055B852.4010906@gmail.com \
--to=levinsasha928@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=matthias.diener@mdiener.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.