b.a.t.m.a.n.lists.open-mesh.org archive mirror
 help / color / mirror / Atom feed
From: Sven Eckelmann <sven.eckelmann@gmx.de>
To: greg@kroah.com
Cc: b.a.t.m.a.n@lists.open-mesh.net
Subject: [B.A.T.M.A.N.] [PATCH 05/21] Staging: batman-adv: Calculate hamming weight using optimized kernel functions
Date: Sun,  5 Sep 2010 01:58:22 +0200	[thread overview]
Message-ID: <1283644718-653-6-git-send-email-sven.eckelmann@gmx.de> (raw)
In-Reply-To: <1283644718-653-1-git-send-email-sven.eckelmann@gmx.de>

The Kernighan algorithm is not able to calculate the number of set bits
in parallel and the compiler cannot replace it with optimized
instructions.

The kernel provides specialised functions for each cpu which can either
use a software implementation or hardware instruction depending on the
target cpu.

Reported-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sven Eckelmann <sven.eckelmann@gmx.de>
---
 drivers/staging/batman-adv/TODO       |    1 -
 drivers/staging/batman-adv/bitarray.c |   15 +++++----------
 drivers/staging/batman-adv/bitarray.h |    3 ++-
 3 files changed, 7 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/batman-adv/TODO b/drivers/staging/batman-adv/TODO
index 9c5aea2..d8bf845 100644
--- a/drivers/staging/batman-adv/TODO
+++ b/drivers/staging/batman-adv/TODO
@@ -1,4 +1,3 @@
- * Use hweight* for hamming weight calculation
  * Save/cache packets direktly as skb instead of using a normal memory region
    and copying it in a skb using send_raw_packet and similar functions
  * Request a new review
diff --git a/drivers/staging/batman-adv/bitarray.c b/drivers/staging/batman-adv/bitarray.c
index dd4193c..9dbaf1e 100644
--- a/drivers/staging/batman-adv/bitarray.c
+++ b/drivers/staging/batman-adv/bitarray.c
@@ -22,6 +22,8 @@
 #include "main.h"
 #include "bitarray.h"
 
+#include <linux/bitops.h>
+
 /* returns true if the corresponding bit in the given seq_bits indicates true
  * and curr_seqno is within range of last_seqno */
 uint8_t get_bit_status(TYPE_OF_WORD *seq_bits, uint32_t last_seqno,
@@ -187,21 +189,14 @@ char bit_get_packet(TYPE_OF_WORD *seq_bits, int32_t seq_num_diff,
 }
 
 /* count the hamming weight, how many good packets did we receive? just count
- * the 1's. The inner loop uses the Kernighan algorithm, see
- * http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan
+ * the 1's.
  */
 int bit_packet_count(TYPE_OF_WORD *seq_bits)
 {
 	int i, hamming = 0;
-	TYPE_OF_WORD word;
 
-	for (i = 0; i < NUM_WORDS; i++) {
-		word = seq_bits[i];
+	for (i = 0; i < NUM_WORDS; i++)
+		hamming += hweight_long(seq_bits[i]);
 
-		while (word) {
-			word &= word-1;
-			hamming++;
-		}
-	}
 	return hamming;
 }
diff --git a/drivers/staging/batman-adv/bitarray.h b/drivers/staging/batman-adv/bitarray.h
index 01897d6..c0c1730 100644
--- a/drivers/staging/batman-adv/bitarray.h
+++ b/drivers/staging/batman-adv/bitarray.h
@@ -22,7 +22,8 @@
 #ifndef _NET_BATMAN_ADV_BITARRAY_H_
 #define _NET_BATMAN_ADV_BITARRAY_H_
 
-/* you should choose something big, if you don't want to waste cpu */
+/* you should choose something big, if you don't want to waste cpu
+ * and keep the type in sync with bit_packet_count */
 #define TYPE_OF_WORD unsigned long
 #define WORD_BIT_SIZE (sizeof(TYPE_OF_WORD) * 8)
 
-- 
1.7.1


  parent reply	other threads:[~2010-09-04 23:58 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-04 23:58 [B.A.T.M.A.N.] Staging: batman-adv for 2.6.37 (1) Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 01/21] Revert: "Staging: batman-adv: Adding netfilter-bridge hooks" Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 02/21] Staging: batman-adv: Remove CHANGELOG Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 03/21] Staging: batman-adv: Start new development cycle Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 04/21] Staging: batman-adv: Count Ethernet header for incoming packets Sven Eckelmann
2010-09-04 23:58 ` Sven Eckelmann [this message]
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 06/21] Staging: batman-adv: move queue counters into bat_priv Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 07/21] Staging: batman-adv: refactoring unicast payload code Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 08/21] Staging: batman-adv: layer2 unicast packet fragmentation Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 09/21] Staging: batman-adv: Directly prepare icmp packets in socket buffer Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 10/21] Staging: batman-adv: register the batman-adv packet type per interface Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 11/21] Staging: batman-adv: Keep header writable and unshared Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 12/21] Staging: batman-adv: Only clone skb data for multiple broadcasts Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 13/21] Staging: batman-adv: Aggregate batman packets directly in skb Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 14/21] Staging: batman-adv: Prepare vis packets directly inside a skb Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 15/21] Staging: batman-adv: Create copy of skb with pre-allocated headroom Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 16/21] Staging: batman-adv: Provide full headers and packets as linear skb Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 17/21] Staging: batman-adv: attach each hard-interface to a soft-interface Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 18/21] Staging: batman-adv: multiple mesh clouds Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 19/21] Staging: batman-adv: Remove duplicate of attached device name Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 20/21] Staging: batman-adv: Don't inform about dropped packets in nodebug Sven Eckelmann
2010-09-04 23:58 ` [B.A.T.M.A.N.] [PATCH 21/21] Staging: batman-adv: Update mtu of bat device by changing mtu of slave device Sven Eckelmann
2010-09-05  7:33 ` [B.A.T.M.A.N.] Staging: batman-adv for 2.6.37 (1) Greg KH

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=1283644718-653-6-git-send-email-sven.eckelmann@gmx.de \
    --to=sven.eckelmann@gmx.de \
    --cc=b.a.t.m.a.n@lists.open-mesh.net \
    --cc=b.a.t.m.a.n@lists.open-mesh.org \
    --cc=greg@kroah.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).