#ifndef HASH_H #define HASH_H /* Hash table implementation from the GIT project. */ /* Copyright 2008 (C) Linus Torvalds, GPL version 2 */ /* * These are some simple generic hash table helper functions. * Not necessarily suitable for all users, but good for things * where you want to just keep track of a list of things, and * have a good hash to use on them. * * It keeps the hash table at roughly 50-75% free, so the memory * cost of the hash table itself is roughly * * 3 * 2*sizeof(void *) * nr_of_objects * * bytes. * * FIXME: on 64-bit architectures, we waste memory. It would be * good to have just 32-bit pointers, requiring a special allocator * for hashed entries or something. */ #include #define alloc_nr(x) (((x) + 16) * 3 / 2) #define INSERT_HASH_PROTOS(ops, table) \ do { \ void **pos = insert_hash((ops).key, &(ops), &(table)); \ /* We already had an entry there? */ \ if (pos) { \ (ops).next = *pos; \ *pos = &(ops); \ } \ } while (0) struct hash_table_entry { unsigned int hash; void *ptr; }; struct hash_table { unsigned int size, nr; struct hash_table_entry *array; }; extern void *lookup_hash(unsigned int hash, const struct hash_table *table); extern void **insert_hash(unsigned int hash, void *ptr, struct hash_table *table); extern void *remove_hash(unsigned int hash, void *ptr, void *ptr_next, struct hash_table *table); extern int for_each_hash(const struct hash_table *table, int (*fn)(void *)); extern int for_each_hash_int(const struct hash_table *table, int (*fn)(void *, int), int arg); extern void free_hash(struct hash_table *table); static inline void init_hash(struct hash_table *table) { table->size = 0; table->nr = 0; table->array = NULL; } static inline unsigned char icase_hash(unsigned char c) { return c & ~((c & 0x40) >> 1); } static inline unsigned int hash_name(const char *name, int namelen) { unsigned int hash = 0x123; do { unsigned char c = *name++; c = icase_hash(c); hash = hash * 101 + c; } while (--namelen); return hash; } #endif /* HASH_H */ a href='/cgit.cgi/linux/net-next.git/diff/?h=nds-private-remove&id=57480b98af696795ab0daff0a6ed572172060a0f'>diff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-02-03 11:10:06 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2017-02-03 11:10:06 -0800
commit57480b98af696795ab0daff0a6ed572172060a0f (patch)
tree4a4df2ed5431196ba2f085979753367cfa1b98d4
parent2d47b8aac7ba697ffe05f839a3b4c3c628b4e430 (diff)
parenta0615a16f7d0ceb5804d295203c302d496d8ee91 (diff)
Merge tag 'powerpc-4.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
Pull powerpc fixes from Michael Ellerman: "The main change is we're reverting the initial stack protector support we merged this cycle. It turns out to not work on toolchains built with libc support, and fixing it will be need to wait for another release. And the rest are all fairly minor: - Some pasemi machines were not booting due to a missing error check in prom_find_boot_cpu() - In EEH we were checking a pointer rather than the bool it pointed to - The clang build was broken by a BUILD_BUG_ON() we added. - The radix (Power9 only) version of map_kernel_page() was broken if our memory size was a multiple of 2MB, which it generally isn't Thanks to: Darren Stevens, Gavin Shan, Reza Arbab" * tag 'powerpc-4.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: powerpc/mm: Use the correct pointer when setting a 2MB pte powerpc: Fix build failure with clang due to BUILD_BUG_ON() powerpc: Revert the initial stack protector support powerpc/eeh: Fix wrong flag passed to eeh_unfreeze_pe() powerpc: Add missing error check to prom_find_boot_cpu()