<feed xmlns='http://www.w3.org/2005/Atom'>
<title>linux/net/openvswitch/flow.c, branch v3.16</title>
<subtitle>Mirror of https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/
</subtitle>
<id>https://git.shady.money/linux/atom?h=v3.16</id>
<link rel='self' href='https://git.shady.money/linux/atom?h=v3.16'/>
<link rel='alternate' type='text/html' href='https://git.shady.money/linux/'/>
<updated>2014-06-29T21:10:51Z</updated>
<entry>
<title>openvswitch: Fix tracking of flags seen in TCP flows.</title>
<updated>2014-06-29T21:10:51Z</updated>
<author>
<name>Ben Pfaff</name>
<email>blp@nicira.com</email>
</author>
<published>2014-05-06T23:48:38Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/linux/commit/?id=ad55200734c65a3ec5d0c39d6ea904008baea536'/>
<id>urn:sha1:ad55200734c65a3ec5d0c39d6ea904008baea536</id>
<content type='text'>
Flow statistics need to take into account the TCP flags from the packet
currently being processed (in 'key'), not the TCP flags matched by the
flow found in the kernel flow table (in 'flow').

This bug made the Open vSwitch userspace fin_timeout action have no effect
in many cases.
This bug is introduced by commit 88d73f6c411ac2f0578 (openvswitch: Use
TCP flags in the flow key for stats.)

Reported-by: Len Gao &lt;leng@vmware.com&gt;
Signed-off-by: Ben Pfaff &lt;blp@nicira.com&gt;
Acked-by: Jarno Rajahalme &lt;jrajahalme@nicira.com&gt;
Acked-by: Jesse Gross &lt;jesse@nicira.com&gt;
Signed-off-by: Pravin B Shelar &lt;pshelar@nicira.com&gt;
</content>
</entry>
<entry>
<title>openvswitch: Fix ovs_flow_stats_get/clear RCU dereference.</title>
<updated>2014-05-22T23:27:35Z</updated>
<author>
<name>Jarno Rajahalme</name>
<email>jrajahalme@nicira.com</email>
</author>
<published>2014-05-05T21:17:28Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/linux/commit/?id=86ec8dbae27e5fa2b5d54f10f77286d9ef55732a'/>
<id>urn:sha1:86ec8dbae27e5fa2b5d54f10f77286d9ef55732a</id>
<content type='text'>
For ovs_flow_stats_get() using ovsl_dereference() was wrong, since
flow dumps call this with RCU read lock.

ovs_flow_stats_clear() is always called with ovs_mutex, so can use
ovsl_dereference().

Also, make the ovs_flow_stats_get() 'flow' argument const to make
later patches cleaner.

Signed-off-by: Jarno Rajahalme &lt;jrajahalme@nicira.com&gt;
Signed-off-by: Pravin B Shelar &lt;pshelar@nicira.com&gt;
</content>
</entry>
<entry>
<title>openvswitch: Clarify locking.</title>
<updated>2014-05-22T23:27:34Z</updated>
<author>
<name>Jarno Rajahalme</name>
<email>jrajahalme@nicira.com</email>
</author>
<published>2014-05-05T18:32:17Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/linux/commit/?id=bb6f9a708d4067713afae2e9eb2637f6b4c01ecb'/>
<id>urn:sha1:bb6f9a708d4067713afae2e9eb2637f6b4c01ecb</id>
<content type='text'>
Remove unnecessary locking from functions that are always called with
appropriate locking.

Signed-off-by: Jarno Rajahalme &lt;jrajahalme@nicira.com&gt;
Signed-off-by: Thomas Graf &lt;tgraf@redhat.com&gt;
Signed-off-by: Pravin B Shelar &lt;pshelar@nicira.com&gt;
</content>
</entry>
<entry>
<title>openvswitch: Compact sw_flow_key.</title>
<updated>2014-05-22T23:27:34Z</updated>
<author>
<name>Jarno Rajahalme</name>
<email>jrajahalme@nicira.com</email>
</author>
<published>2014-05-05T16:54:49Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/linux/commit/?id=1139e241ec436b9e9610c7a33ac5c6657f87fda1'/>
<id>urn:sha1:1139e241ec436b9e9610c7a33ac5c6657f87fda1</id>
<content type='text'>
Minimize padding in sw_flow_key and move 'tp' top the main struct.
These changes simplify code when accessing the transport port numbers
and the tcp flags, and makes the sw_flow_key 8 bytes smaller on 64-bit
systems (128-&gt;120 bytes).  These changes also make the keys for IPv4
packets to fit in one cache line.

There is a valid concern for safety of packing the struct
ovs_key_ipv4_tunnel, as it would be possible to take the address of
the tun_id member as a __be64 * which could result in unaligned access
in some systems. However:

- sw_flow_key itself is 64-bit aligned, so the tun_id within is
  always
  64-bit aligned.
- We never make arrays of ovs_key_ipv4_tunnel (which would force
  every
  second tun_key to be misaligned).
- We never take the address of the tun_id in to a __be64 *.
- Whereever we use struct ovs_key_ipv4_tunnel outside the
  sw_flow_key,
  it is in stack (on tunnel input functions), where compiler has full
  control of the alignment.

Signed-off-by: Jarno Rajahalme &lt;jrajahalme@nicira.com&gt;
Signed-off-by: Pravin B Shelar &lt;pshelar@nicira.com&gt;
</content>
</entry>
<entry>
<title>openvswitch: Use TCP flags in the flow key for stats.</title>
<updated>2014-05-16T20:40:29Z</updated>
<author>
<name>Jarno Rajahalme</name>
<email>jrajahalme@nicira.com</email>
</author>
<published>2014-03-27T19:51:49Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/linux/commit/?id=88d73f6c411ac2f057829b93b3cf202ee551f6cb'/>
<id>urn:sha1:88d73f6c411ac2f057829b93b3cf202ee551f6cb</id>
<content type='text'>
We already extract the TCP flags for the key, might as well use that
for stats.

Signed-off-by: Jarno Rajahalme &lt;jrajahalme@nicira.com&gt;
Acked-by: Pravin B Shelar &lt;pshelar@nicira.com&gt;
Signed-off-by: Jesse Gross &lt;jesse@nicira.com&gt;
</content>
</entry>
<entry>
<title>openvswitch: Per NUMA node flow stats.</title>
<updated>2014-05-16T20:40:29Z</updated>
<author>
<name>Jarno Rajahalme</name>
<email>jrajahalme@nicira.com</email>
</author>
<published>2014-03-27T19:42:54Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/linux/commit/?id=63e7959c4b9bd6f791061c460a22d9ee32ae2240'/>
<id>urn:sha1:63e7959c4b9bd6f791061c460a22d9ee32ae2240</id>
<content type='text'>
Keep kernel flow stats for each NUMA node rather than each (logical)
CPU.  This avoids using the per-CPU allocator and removes most of the
kernel-side OVS locking overhead otherwise on the top of perf reports
and allows OVS to scale better with higher number of threads.

With 9 handlers and 4 revalidators netperf TCP_CRR test flow setup
rate doubles on a server with two hyper-threaded physical CPUs (16
logical cores each) compared to the current OVS master.  Tested with
non-trivial flow table with a TCP port match rule forcing all new
connections with unique port numbers to OVS userspace.  The IP
addresses are still wildcarded, so the kernel flows are not considered
as exact match 5-tuple flows.  This type of flows can be expected to
appear in large numbers as the result of more effective wildcarding
made possible by improvements in OVS userspace flow classifier.

Perf results for this test (master):

Events: 305K cycles
+   8.43%     ovs-vswitchd  [kernel.kallsyms]   [k] mutex_spin_on_owner
+   5.64%     ovs-vswitchd  [kernel.kallsyms]   [k] __ticket_spin_lock
+   4.75%     ovs-vswitchd  ovs-vswitchd        [.] find_match_wc
+   3.32%     ovs-vswitchd  libpthread-2.15.so  [.] pthread_mutex_lock
+   2.61%     ovs-vswitchd  [kernel.kallsyms]   [k] pcpu_alloc_area
+   2.19%     ovs-vswitchd  ovs-vswitchd        [.] flow_hash_in_minimask_range
+   2.03%          swapper  [kernel.kallsyms]   [k] intel_idle
+   1.84%     ovs-vswitchd  libpthread-2.15.so  [.] pthread_mutex_unlock
+   1.64%     ovs-vswitchd  ovs-vswitchd        [.] classifier_lookup
+   1.58%     ovs-vswitchd  libc-2.15.so        [.] 0x7f4e6
+   1.07%     ovs-vswitchd  [kernel.kallsyms]   [k] memset
+   1.03%          netperf  [kernel.kallsyms]   [k] __ticket_spin_lock
+   0.92%          swapper  [kernel.kallsyms]   [k] __ticket_spin_lock
...

And after this patch:

Events: 356K cycles
+   6.85%     ovs-vswitchd  ovs-vswitchd        [.] find_match_wc
+   4.63%     ovs-vswitchd  libpthread-2.15.so  [.] pthread_mutex_lock
+   3.06%     ovs-vswitchd  [kernel.kallsyms]   [k] __ticket_spin_lock
+   2.81%     ovs-vswitchd  ovs-vswitchd        [.] flow_hash_in_minimask_range
+   2.51%     ovs-vswitchd  libpthread-2.15.so  [.] pthread_mutex_unlock
+   2.27%     ovs-vswitchd  ovs-vswitchd        [.] classifier_lookup
+   1.84%     ovs-vswitchd  libc-2.15.so        [.] 0x15d30f
+   1.74%     ovs-vswitchd  [kernel.kallsyms]   [k] mutex_spin_on_owner
+   1.47%          swapper  [kernel.kallsyms]   [k] intel_idle
+   1.34%     ovs-vswitchd  ovs-vswitchd        [.] flow_hash_in_minimask
+   1.33%     ovs-vswitchd  ovs-vswitchd        [.] rule_actions_unref
+   1.16%     ovs-vswitchd  ovs-vswitchd        [.] hindex_node_with_hash
+   1.16%     ovs-vswitchd  ovs-vswitchd        [.] do_xlate_actions
+   1.09%     ovs-vswitchd  ovs-vswitchd        [.] ofproto_rule_ref
+   1.01%          netperf  [kernel.kallsyms]   [k] __ticket_spin_lock
...

There is a small increase in kernel spinlock overhead due to the same
spinlock being shared between multiple cores of the same physical CPU,
but that is barely visible in the netperf TCP_CRR test performance
(maybe ~1% performance drop, hard to tell exactly due to variance in
the test results), when testing for kernel module throughput (with no
userspace activity, handful of kernel flows).

On flow setup, a single stats instance is allocated (for the NUMA node
0).  As CPUs from multiple NUMA nodes start updating stats, new
NUMA-node specific stats instances are allocated.  This allocation on
the packet processing code path is made to never block or look for
emergency memory pools, minimizing the allocation latency.  If the
allocation fails, the existing preallocated stats instance is used.
Also, if only CPUs from one NUMA-node are updating the preallocated
stats instance, no additional stats instances are allocated.  This
eliminates the need to pre-allocate stats instances that will not be
used, also relieving the stats reader from the burden of reading stats
that are never used.

Signed-off-by: Jarno Rajahalme &lt;jrajahalme@nicira.com&gt;
Acked-by: Pravin B Shelar &lt;pshelar@nicira.com&gt;
Signed-off-by: Jesse Gross &lt;jesse@nicira.com&gt;
</content>
</entry>
<entry>
<title>openvswitch: Remove 5-tuple optimization.</title>
<updated>2014-05-16T20:40:29Z</updated>
<author>
<name>Jarno Rajahalme</name>
<email>jrajahalme@nicira.com</email>
</author>
<published>2014-03-27T19:35:23Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/linux/commit/?id=23dabf88abb48a866fdb19ee08ebcf1ddd9b1840'/>
<id>urn:sha1:23dabf88abb48a866fdb19ee08ebcf1ddd9b1840</id>
<content type='text'>
The 5-tuple optimization becomes unnecessary with a later per-NUMA
node stats patch.  Remove it first to make the changes easier to
grasp.

Signed-off-by: Jarno Rajahalme &lt;jrajahalme@nicira.com&gt;
Signed-off-by: Jesse Gross &lt;jesse@nicira.com&gt;
</content>
</entry>
<entry>
<title>openvswitch: Use ether_addr_copy</title>
<updated>2014-05-16T20:40:29Z</updated>
<author>
<name>Joe Perches</name>
<email>joe@perches.com</email>
</author>
<published>2014-02-18T19:15:45Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/linux/commit/?id=8c63ff09bddf944ab0033fea97aacfadfffa76de'/>
<id>urn:sha1:8c63ff09bddf944ab0033fea97aacfadfffa76de</id>
<content type='text'>
It's slightly smaller/faster for some architectures.

Signed-off-by: Joe Perches &lt;joe@perches.com&gt;
Signed-off-by: Jesse Gross &lt;jesse@nicira.com&gt;
</content>
</entry>
<entry>
<title>openvswitch: fix a possible deadlock and lockdep warning</title>
<updated>2014-03-28T20:41:53Z</updated>
<author>
<name>Flavio Leitner</name>
<email>fbl@redhat.com</email>
</author>
<published>2014-03-27T14:05:34Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/linux/commit/?id=4f647e0a3c37b8d5086214128614a136064110c3'/>
<id>urn:sha1:4f647e0a3c37b8d5086214128614a136064110c3</id>
<content type='text'>
There are two problematic situations.

A deadlock can happen when is_percpu is false because it can get
interrupted while holding the spinlock. Then it executes
ovs_flow_stats_update() in softirq context which tries to get
the same lock.

The second sitation is that when is_percpu is true, the code
correctly disables BH but only for the local CPU, so the
following can happen when locking the remote CPU without
disabling BH:

       CPU#0                            CPU#1
  ovs_flow_stats_get()
   stats_read()
 +-&gt;spin_lock remote CPU#1        ovs_flow_stats_get()
 |  &lt;interrupted&gt;                  stats_read()
 |  ...                       +--&gt;  spin_lock remote CPU#0
 |                            |     &lt;interrupted&gt;
 |  ovs_flow_stats_update()   |     ...
 |   spin_lock local CPU#0 &lt;--+     ovs_flow_stats_update()
 +---------------------------------- spin_lock local CPU#1

This patch disables BH for both cases fixing the deadlocks.
Acked-by: Jesse Gross &lt;jesse@nicira.com&gt;

=================================
[ INFO: inconsistent lock state ]
3.14.0-rc8-00007-g632b06a #1 Tainted: G          I
---------------------------------
inconsistent {SOFTIRQ-ON-W} -&gt; {IN-SOFTIRQ-W} usage.
swapper/0/0 [HC0[0]:SC1[5]:HE1:SE0] takes:
(&amp;(&amp;cpu_stats-&gt;lock)-&gt;rlock){+.?...}, at: [&lt;ffffffffa05dd8a1&gt;] ovs_flow_stats_update+0x51/0xd0 [openvswitch]
{SOFTIRQ-ON-W} state was registered at:
[&lt;ffffffff810f973f&gt;] __lock_acquire+0x68f/0x1c40
[&lt;ffffffff810fb4e2&gt;] lock_acquire+0xa2/0x1d0
[&lt;ffffffff817d8d9e&gt;] _raw_spin_lock+0x3e/0x80
[&lt;ffffffffa05dd9e4&gt;] ovs_flow_stats_get+0xc4/0x1e0 [openvswitch]
[&lt;ffffffffa05da855&gt;] ovs_flow_cmd_fill_info+0x185/0x360 [openvswitch]
[&lt;ffffffffa05daf05&gt;] ovs_flow_cmd_build_info.constprop.27+0x55/0x90 [openvswitch]
[&lt;ffffffffa05db41d&gt;] ovs_flow_cmd_new_or_set+0x4dd/0x570 [openvswitch]
[&lt;ffffffff816c245d&gt;] genl_family_rcv_msg+0x1cd/0x3f0
[&lt;ffffffff816c270e&gt;] genl_rcv_msg+0x8e/0xd0
[&lt;ffffffff816c0239&gt;] netlink_rcv_skb+0xa9/0xc0
[&lt;ffffffff816c0798&gt;] genl_rcv+0x28/0x40
[&lt;ffffffff816bf830&gt;] netlink_unicast+0x100/0x1e0
[&lt;ffffffff816bfc57&gt;] netlink_sendmsg+0x347/0x770
[&lt;ffffffff81668e9c&gt;] sock_sendmsg+0x9c/0xe0
[&lt;ffffffff816692d9&gt;] ___sys_sendmsg+0x3a9/0x3c0
[&lt;ffffffff8166a911&gt;] __sys_sendmsg+0x51/0x90
[&lt;ffffffff8166a962&gt;] SyS_sendmsg+0x12/0x20
[&lt;ffffffff817e3ce9&gt;] system_call_fastpath+0x16/0x1b
irq event stamp: 1740726
hardirqs last  enabled at (1740726): [&lt;ffffffff8175d5e0&gt;] ip6_finish_output2+0x4f0/0x840
hardirqs last disabled at (1740725): [&lt;ffffffff8175d59b&gt;] ip6_finish_output2+0x4ab/0x840
softirqs last  enabled at (1740674): [&lt;ffffffff8109be12&gt;] _local_bh_enable+0x22/0x50
softirqs last disabled at (1740675): [&lt;ffffffff8109db05&gt;] irq_exit+0xc5/0xd0

other info that might help us debug this:
 Possible unsafe locking scenario:

       CPU0
       ----
  lock(&amp;(&amp;cpu_stats-&gt;lock)-&gt;rlock);
  &lt;Interrupt&gt;
    lock(&amp;(&amp;cpu_stats-&gt;lock)-&gt;rlock);

 *** DEADLOCK ***

5 locks held by swapper/0/0:
 #0:  (((&amp;ifa-&gt;dad_timer))){+.-...}, at: [&lt;ffffffff810a7155&gt;] call_timer_fn+0x5/0x320
 #1:  (rcu_read_lock){.+.+..}, at: [&lt;ffffffff81788a55&gt;] mld_sendpack+0x5/0x4a0
 #2:  (rcu_read_lock_bh){.+....}, at: [&lt;ffffffff8175d149&gt;] ip6_finish_output2+0x59/0x840
 #3:  (rcu_read_lock_bh){.+....}, at: [&lt;ffffffff8168ba75&gt;] __dev_queue_xmit+0x5/0x9b0
 #4:  (rcu_read_lock){.+.+..}, at: [&lt;ffffffffa05e41b5&gt;] internal_dev_xmit+0x5/0x110 [openvswitch]

stack backtrace:
CPU: 0 PID: 0 Comm: swapper/0 Tainted: G          I  3.14.0-rc8-00007-g632b06a #1
Hardware name:                  /DX58SO, BIOS SOX5810J.86A.5599.2012.0529.2218 05/29/2012
 0000000000000000 0fcf20709903df0c ffff88042d603808 ffffffff817cfe3c
 ffffffff81c134c0 ffff88042d603858 ffffffff817cb6da 0000000000000005
 ffffffff00000001 ffff880400000000 0000000000000006 ffffffff81c134c0
Call Trace:
 &lt;IRQ&gt;  [&lt;ffffffff817cfe3c&gt;] dump_stack+0x4d/0x66
 [&lt;ffffffff817cb6da&gt;] print_usage_bug+0x1f4/0x205
 [&lt;ffffffff810f7f10&gt;] ? check_usage_backwards+0x180/0x180
 [&lt;ffffffff810f8963&gt;] mark_lock+0x223/0x2b0
 [&lt;ffffffff810f96d3&gt;] __lock_acquire+0x623/0x1c40
 [&lt;ffffffff810f5707&gt;] ? __lock_is_held+0x57/0x80
 [&lt;ffffffffa05e26c6&gt;] ? masked_flow_lookup+0x236/0x250 [openvswitch]
 [&lt;ffffffff810fb4e2&gt;] lock_acquire+0xa2/0x1d0
 [&lt;ffffffffa05dd8a1&gt;] ? ovs_flow_stats_update+0x51/0xd0 [openvswitch]
 [&lt;ffffffff817d8d9e&gt;] _raw_spin_lock+0x3e/0x80
 [&lt;ffffffffa05dd8a1&gt;] ? ovs_flow_stats_update+0x51/0xd0 [openvswitch]
 [&lt;ffffffffa05dd8a1&gt;] ovs_flow_stats_update+0x51/0xd0 [openvswitch]
 [&lt;ffffffffa05dcc64&gt;] ovs_dp_process_received_packet+0x84/0x120 [openvswitch]
 [&lt;ffffffff810f93f7&gt;] ? __lock_acquire+0x347/0x1c40
 [&lt;ffffffffa05e3bea&gt;] ovs_vport_receive+0x2a/0x30 [openvswitch]
 [&lt;ffffffffa05e4218&gt;] internal_dev_xmit+0x68/0x110 [openvswitch]
 [&lt;ffffffffa05e41b5&gt;] ? internal_dev_xmit+0x5/0x110 [openvswitch]
 [&lt;ffffffff8168b4a6&gt;] dev_hard_start_xmit+0x2e6/0x8b0
 [&lt;ffffffff8168be87&gt;] __dev_queue_xmit+0x417/0x9b0
 [&lt;ffffffff8168ba75&gt;] ? __dev_queue_xmit+0x5/0x9b0
 [&lt;ffffffff8175d5e0&gt;] ? ip6_finish_output2+0x4f0/0x840
 [&lt;ffffffff8168c430&gt;] dev_queue_xmit+0x10/0x20
 [&lt;ffffffff8175d641&gt;] ip6_finish_output2+0x551/0x840
 [&lt;ffffffff8176128a&gt;] ? ip6_finish_output+0x9a/0x220
 [&lt;ffffffff8176128a&gt;] ip6_finish_output+0x9a/0x220
 [&lt;ffffffff8176145f&gt;] ip6_output+0x4f/0x1f0
 [&lt;ffffffff81788c29&gt;] mld_sendpack+0x1d9/0x4a0
 [&lt;ffffffff817895b8&gt;] mld_send_initial_cr.part.32+0x88/0xa0
 [&lt;ffffffff817691b0&gt;] ? addrconf_dad_completed+0x220/0x220
 [&lt;ffffffff8178e301&gt;] ipv6_mc_dad_complete+0x31/0x50
 [&lt;ffffffff817690d7&gt;] addrconf_dad_completed+0x147/0x220
 [&lt;ffffffff817691b0&gt;] ? addrconf_dad_completed+0x220/0x220
 [&lt;ffffffff8176934f&gt;] addrconf_dad_timer+0x19f/0x1c0
 [&lt;ffffffff810a71e9&gt;] call_timer_fn+0x99/0x320
 [&lt;ffffffff810a7155&gt;] ? call_timer_fn+0x5/0x320
 [&lt;ffffffff817691b0&gt;] ? addrconf_dad_completed+0x220/0x220
 [&lt;ffffffff810a76c4&gt;] run_timer_softirq+0x254/0x3b0
 [&lt;ffffffff8109d47d&gt;] __do_softirq+0x12d/0x480

Signed-off-by: Flavio Leitner &lt;fbl@redhat.com&gt;
Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
</content>
</entry>
<entry>
<title>openvswitch: Correctly report flow used times for first 5 minutes after boot.</title>
<updated>2014-03-20T17:45:21Z</updated>
<author>
<name>Ben Pfaff</name>
<email>blp@nicira.com</email>
</author>
<published>2014-03-20T17:45:21Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/linux/commit/?id=f9b8c4c8baded129535d82d74df8e87a7a369f54'/>
<id>urn:sha1:f9b8c4c8baded129535d82d74df8e87a7a369f54</id>
<content type='text'>
The kernel starts out its "jiffies" timer as 5 minutes below zero, as
shown in include/linux/jiffies.h:

  /*
   * Have the 32 bit jiffies value wrap 5 minutes after boot
   * so jiffies wrap bugs show up earlier.
   */
  #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))

The loop in ovs_flow_stats_get() starts out with 'used' set to 0, then
takes any "later" time.  This means that for the first five minutes after
boot, flows will always be reported as never used, since 0 is greater than
any time already seen.

Signed-off-by: Ben Pfaff &lt;blp@nicira.com&gt;
Acked-by: Pravin B Shelar &lt;pshelar@nicira.com&gt;
Signed-off-by: Jesse Gross &lt;jesse@nicira.com&gt;
</content>
</entry>
</feed>
