Files
ubports_kernel_google_msm/include/linux
Eric Dumazet bbaffaca48 rcu: Introduce hlist_nulls variant of hlist
hlist uses NULL value to finish a chain.

hlist_nulls variant use the low order bit set to 1 to signal an end-of-list marker.

This allows to store many different end markers, so that some RCU lockless
algos (used in TCP/UDP stack for example) can save some memory barriers in
fast paths.

Two new files are added :

include/linux/list_nulls.h
  - mimics hlist part of include/linux/list.h, derived to hlist_nulls variant

include/linux/rculist_nulls.h
  - mimics hlist part of include/linux/rculist.h, derived to hlist_nulls variant

   Only four helpers are declared for the moment :

     hlist_nulls_del_init_rcu(), hlist_nulls_del_rcu(),
     hlist_nulls_add_head_rcu() and hlist_nulls_for_each_entry_rcu()

prefetches() were removed, since an end of list is not anymore NULL value.
prefetches() could trigger useless (and possibly dangerous) memory transactions.

Example of use (extracted from __udp4_lib_lookup())

	struct sock *sk, *result;
        struct hlist_nulls_node *node;
        unsigned short hnum = ntohs(dport);
        unsigned int hash = udp_hashfn(net, hnum);
        struct udp_hslot *hslot = &udptable->hash[hash];
        int score, badness;

        rcu_read_lock();
begin:
        result = NULL;
        badness = -1;
        sk_nulls_for_each_rcu(sk, node, &hslot->head) {
                score = compute_score(sk, net, saddr, hnum, sport,
                                      daddr, dport, dif);
                if (score > badness) {
                        result = sk;
                        badness = score;
                }
        }
        /*
         * if the nulls value we got at the end of this lookup is
         * not the expected one, we must restart lookup.
         * We probably met an item that was moved to another chain.
         */
        if (get_nulls_value(node) != hash)
                goto begin;

        if (result) {
                if (unlikely(!atomic_inc_not_zero(&result->sk_refcnt)))
                        result = NULL;
                else if (unlikely(compute_score(result, net, saddr, hnum, sport,
                                  daddr, dport, dif) < badness)) {
                        sock_put(result);
                        goto begin;
                }
        }
        rcu_read_unlock();
        return result;

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: David S. Miller <davem@davemloft.net>
2008-11-16 19:37:55 -08:00
..
2008-10-22 01:19:37 +02:00
2008-10-13 21:51:51 +01:00
2008-10-30 11:38:47 -07:00
2008-10-31 00:56:49 -07:00
2008-09-12 16:30:20 -07:00
2008-10-20 11:01:52 -07:00
2008-08-12 10:13:38 +10:00
2008-10-16 11:21:51 -07:00
2008-07-24 10:47:24 -07:00
2008-10-20 08:52:42 -07:00
2008-11-06 08:41:55 +01:00
2008-10-20 08:52:32 -07:00
2008-10-30 11:38:45 -07:00
2008-10-16 11:21:32 -07:00
2008-07-25 10:53:33 -07:00
2008-10-14 10:35:08 +02:00
2008-07-20 17:12:38 -07:00
2008-07-22 17:30:57 -07:00
2008-11-12 00:47:26 -08:00
2008-08-28 11:49:15 -05:00
2008-07-21 12:00:37 +01:00
2008-10-18 14:29:15 +01:00
2008-10-16 16:53:13 +02:00
2008-10-12 12:05:55 +02:00
2008-07-24 10:47:29 -07:00
2008-08-20 13:19:51 -07:00
2008-10-08 19:44:18 -04:00
2008-08-12 16:07:31 -07:00
2008-07-26 20:53:20 -04:00
2008-10-30 11:38:45 -07:00
2008-10-23 16:00:24 +02:00
2008-10-16 16:08:57 +02:00
2008-07-20 17:12:36 -07:00
2008-09-22 07:29:31 +01:00
2008-10-16 11:21:40 -07:00
2008-07-20 17:12:36 -07:00
2008-10-14 23:51:02 +02:00
2008-07-31 18:45:41 +02:00
2008-08-08 15:13:27 +01:00
2008-10-22 20:21:33 +02:00
2008-10-16 11:21:38 -07:00
2008-07-25 10:53:42 -07:00
2008-10-09 11:59:55 -07:00
2008-08-02 18:36:10 +01:00
2008-10-07 15:34:37 -07:00
2008-10-29 22:02:09 +01:00
2008-10-18 14:29:15 +01:00
2008-11-03 18:21:45 +01:00
2008-10-15 14:24:08 +02:00
2008-10-18 14:05:18 +02:00
2008-07-20 17:12:37 -07:00
2008-10-12 11:44:37 -07:00
2008-07-24 10:47:17 -07:00
2008-10-28 14:22:15 +02:00
2008-07-23 09:49:56 +01:00
2008-10-20 22:34:12 +01:00
2008-10-14 10:35:08 +02:00
2008-09-01 09:47:16 +02:00
2008-08-11 15:25:07 +02:00
2008-10-13 09:47:43 +11:00
2008-10-09 08:56:06 +02:00
2008-07-27 01:56:38 +02:00
2008-07-27 01:54:58 +02:00
2008-08-02 16:28:50 +02:00
2008-10-20 08:52:31 -07:00
2008-10-20 08:52:30 -07:00
2008-07-28 16:30:21 -07:00
2008-10-22 10:00:23 +11:00
2008-11-06 15:41:21 -08:00
2008-08-26 10:37:20 -07:00
2008-10-01 07:03:24 -07:00
2008-10-17 13:06:45 -04:00
2008-10-20 08:52:32 -07:00
2008-10-20 08:50:26 -07:00
2008-10-16 11:21:49 -07:00
2008-10-22 16:42:43 -07:00
2008-10-08 16:38:41 -07:00
2008-11-07 22:56:00 -08:00
2008-08-05 14:33:50 -07:00
2008-10-23 00:11:07 -04:00
2008-10-23 18:54:05 +04:00
2008-10-20 08:52:39 -07:00
2008-10-16 11:21:46 -07:00
2008-10-16 11:21:46 -07:00
2008-10-02 15:53:13 -07:00
2008-07-25 10:53:29 -07:00
2008-08-22 16:29:57 -04:00
2008-10-20 08:52:40 -07:00
2008-09-22 19:51:15 -07:00
2008-10-30 11:38:47 -07:00
2008-07-25 10:53:42 -07:00
2008-07-24 08:31:21 -04:00
2008-10-31 19:02:14 -04:00
2008-08-05 09:28:47 +03:00
2008-07-25 10:53:30 -07:00
2008-09-09 17:41:42 +02:00
2008-08-11 09:30:24 +02:00
2008-07-20 17:12:37 -07:00
2008-11-02 10:15:07 -08:00
2008-10-20 08:52:31 -07:00
2008-10-16 11:21:47 -07:00
2008-10-07 14:43:06 -07:00
2008-10-13 09:51:40 -07:00
2008-11-07 16:09:23 +01:00
2008-09-05 14:39:38 -07:00
2008-07-20 17:12:34 -07:00
2008-10-17 14:41:02 -07:00
2008-07-21 15:15:55 -07:00
2008-10-16 11:21:31 -07:00
2008-09-17 16:54:23 +01:00