[ovs-dev,2/2] checkpatch: Speed up checking when spell checking not enabled.

Message ID 20181101150632.32493-2-blp@ovn.org
State New
Headers show
Series
  • [ovs-dev,1/2] checkpatch: Add explicit test for mailing list as author.
Related show

Commit Message

Ben Pfaff Nov. 1, 2018, 3:06 p.m.
On my machine it takes almost a second for enchant to read its dictionary.
This time is wasted when spell checking is not enabled.  This commit makes
checkpatch read the dictionary only when it will be used.

Signed-off-by: Ben Pfaff <blp@ovn.org>
---
 utilities/checkpatch.py | 117 +++++++++++++++++++++++++-----------------------
 1 file changed, 62 insertions(+), 55 deletions(-)

Comments

Yifeng Sun Nov. 2, 2018, 8:17 p.m. | #1
Looks good to me, thanks.

Reviewed-by: Yifeng Sun <pkusunyifeng@gmail.com>

On Thu, Nov 1, 2018 at 8:07 AM Ben Pfaff <blp@ovn.org> wrote:

> On my machine it takes almost a second for enchant to read its dictionary.
> This time is wasted when spell checking is not enabled.  This commit makes
> checkpatch read the dictionary only when it will be used.
>
> Signed-off-by: Ben Pfaff <blp@ovn.org>
> ---
>  utilities/checkpatch.py | 117
> +++++++++++++++++++++++++-----------------------
>  1 file changed, 62 insertions(+), 55 deletions(-)
>
> diff --git a/utilities/checkpatch.py b/utilities/checkpatch.py
> index 54aa4b6346db..8bbda78989c4 100755
> --- a/utilities/checkpatch.py
> +++ b/utilities/checkpatch.py
> @@ -21,59 +21,6 @@ import os
>  import re
>  import sys
>
> -try:
> -    import enchant
> -
> -    extra_keywords = ['ovs', 'vswitch', 'vswitchd', 'ovs-vswitchd',
> 'netdev',
> -                      'selinux', 'ovs-ctl', 'dpctl', 'ofctl',
> 'openvswitch',
> -                      'dpdk', 'hugepage', 'hugepages', 'pmd', 'upcall',
> -                      'vhost', 'rx', 'tx', 'vhostuser', 'openflow',
> 'qsort',
> -                      'rxq', 'txq', 'perf', 'stats', 'struct', 'int',
> -                      'char', 'bool', 'upcalls', 'nicira', 'bitmask',
> 'ipv4',
> -                      'ipv6', 'tcp', 'tcp4', 'tcpv4', 'udp', 'udp4',
> 'udpv4',
> -                      'icmp', 'icmp4', 'icmpv6', 'vlan', 'vxlan', 'cksum',
> -                      'csum', 'checksum', 'ofproto', 'numa', 'mempool',
> -                      'mempools', 'mbuf', 'mbufs', 'hmap', 'cmap', 'smap',
> -                      'dhcpv4', 'dhcp', 'dhcpv6', 'opts', 'metadata',
> -                      'geneve', 'mutex', 'netdev', 'netdevs', 'subtable',
> -                      'virtio', 'qos', 'policer', 'datapath', 'tunctl',
> -                      'attr', 'ethernet', 'ether', 'defrag', 'defragment',
> -                      'loopback', 'sflow', 'acl', 'initializer', 'recirc',
> -                      'xlated', 'unclosed', 'netlink', 'msec', 'usec',
> -                      'nsec', 'ms', 'us', 'ns', 'kilobits', 'kbps',
> -                      'kilobytes', 'megabytes', 'mbps', 'gigabytes',
> 'gbps',
> -                      'megabits', 'gigabits', 'pkts', 'tuple', 'miniflow',
> -                      'megaflow', 'conntrack', 'vlans', 'vxlans', 'arg',
> -                      'tpid', 'xbundle', 'xbundles', 'mbundle',
> 'mbundles',
> -                      'netflow', 'localnet', 'odp', 'pre', 'dst', 'dest',
> -                      'src', 'ethertype', 'cvlan', 'ips', 'msg', 'msgs',
> -                      'liveness', 'userspace', 'eventmask', 'datapaths',
> -                      'slowpath', 'fastpath', 'multicast', 'unicast',
> -                      'revalidation', 'namespace', 'qdisc', 'uuid',
> 'ofport',
> -                      'subnet', 'revalidation', 'revalidator',
> 'revalidate',
> -                      'l2', 'l3', 'l4', 'openssl', 'mtu', 'ifindex',
> 'enum',
> -                      'enums', 'http', 'https', 'num', 'vconn', 'vconns',
> -                      'conn', 'nat', 'memset', 'memcmp', 'strcmp',
> -                      'strcasecmp', 'tc', 'ufid', 'api', 'ofpbuf',
> 'ofpbufs',
> -                      'hashmaps', 'hashmap', 'deref', 'dereference', 'hw',
> -                      'prio', 'sendmmsg', 'sendmsg', 'malloc', 'free',
> 'alloc',
> -                      'pid', 'ppid', 'pgid', 'uid', 'gid', 'sid', 'utime',
> -                      'stime', 'cutime', 'cstime', 'vsize', 'rss',
> 'rsslim',
> -                      'whcan', 'gtime', 'eip', 'rip', 'cgtime', 'dbg',
> 'gw',
> -                      'sbrec', 'bfd', 'sizeof', 'pmds', 'nic', 'nics',
> 'hwol',
> -                      'encap', 'decap', 'tlv', 'tlvs', 'decapsulation',
> 'fd',
> -                      'cacheline', 'xlate', 'skiplist', 'idl',
> 'comparator',
> -                      'natting', 'alg', 'pasv', 'epasv', 'wildcard',
> 'nated',
> -                      'amd64', 'x86_64', 'recirculation']
> -
> -    spell_check_dict = enchant.Dict("en_US")
> -    for kw in extra_keywords:
> -        spell_check_dict.add(kw)
> -
> -    no_spellcheck = False
> -except:
> -    no_spellcheck = True
> -
>  RETURN_CHECK_INITIAL_STATE = 0
>  RETURN_CHECK_STATE_WITH_RETURN = 1
>  RETURN_CHECK_AWAITING_BRACE = 2
> @@ -86,6 +33,66 @@ total_line = 0
>  colors = False
>  spellcheck_comments = False
>  quiet = False
> +spell_check_dict = None
> +
> +
> +def open_spell_check_dict():
> +    import enchant
> +
> +    try:
> +        extra_keywords = ['ovs', 'vswitch', 'vswitchd', 'ovs-vswitchd',
> +                          'netdev', 'selinux', 'ovs-ctl', 'dpctl',
> 'ofctl',
> +                          'openvswitch', 'dpdk', 'hugepage', 'hugepages',
> +                          'pmd', 'upcall', 'vhost', 'rx', 'tx',
> 'vhostuser',
> +                          'openflow', 'qsort', 'rxq', 'txq', 'perf',
> 'stats',
> +                          'struct', 'int', 'char', 'bool', 'upcalls',
> 'nicira',
> +                          'bitmask', 'ipv4', 'ipv6', 'tcp', 'tcp4',
> 'tcpv4',
> +                          'udp', 'udp4', 'udpv4', 'icmp', 'icmp4',
> 'icmpv6',
> +                          'vlan', 'vxlan', 'cksum', 'csum', 'checksum',
> +                          'ofproto', 'numa', 'mempool', 'mempools',
> 'mbuf',
> +                          'mbufs', 'hmap', 'cmap', 'smap', 'dhcpv4',
> 'dhcp',
> +                          'dhcpv6', 'opts', 'metadata', 'geneve', 'mutex',
> +                          'netdev', 'netdevs', 'subtable', 'virtio',
> 'qos',
> +                          'policer', 'datapath', 'tunctl', 'attr',
> 'ethernet',
> +                          'ether', 'defrag', 'defragment', 'loopback',
> 'sflow',
> +                          'acl', 'initializer', 'recirc', 'xlated',
> 'unclosed',
> +                          'netlink', 'msec', 'usec', 'nsec', 'ms', 'us',
> 'ns',
> +                          'kilobits', 'kbps', 'kilobytes', 'megabytes',
> 'mbps',
> +                          'gigabytes', 'gbps', 'megabits', 'gigabits',
> 'pkts',
> +                          'tuple', 'miniflow', 'megaflow', 'conntrack',
> +                          'vlans', 'vxlans', 'arg', 'tpid', 'xbundle',
> +                          'xbundles', 'mbundle', 'mbundles', 'netflow',
> +                          'localnet', 'odp', 'pre', 'dst', 'dest', 'src',
> +                          'ethertype', 'cvlan', 'ips', 'msg', 'msgs',
> +                          'liveness', 'userspace', 'eventmask',
> 'datapaths',
> +                          'slowpath', 'fastpath', 'multicast', 'unicast',
> +                          'revalidation', 'namespace', 'qdisc', 'uuid',
> +                          'ofport', 'subnet', 'revalidation',
> 'revalidator',
> +                          'revalidate', 'l2', 'l3', 'l4', 'openssl',
> 'mtu',
> +                          'ifindex', 'enum', 'enums', 'http', 'https',
> 'num',
> +                          'vconn', 'vconns', 'conn', 'nat', 'memset',
> 'memcmp',
> +                          'strcmp', 'strcasecmp', 'tc', 'ufid', 'api',
> +                          'ofpbuf', 'ofpbufs', 'hashmaps', 'hashmap',
> 'deref',
> +                          'dereference', 'hw', 'prio', 'sendmmsg',
> 'sendmsg',
> +                          'malloc', 'free', 'alloc', 'pid', 'ppid',
> 'pgid',
> +                          'uid', 'gid', 'sid', 'utime', 'stime', 'cutime',
> +                          'cstime', 'vsize', 'rss', 'rsslim', 'whcan',
> 'gtime',
> +                          'eip', 'rip', 'cgtime', 'dbg', 'gw', 'sbrec',
> 'bfd',
> +                          'sizeof', 'pmds', 'nic', 'nics', 'hwol',
> 'encap',
> +                          'decap', 'tlv', 'tlvs', 'decapsulation', 'fd',
> +                          'cacheline', 'xlate', 'skiplist', 'idl',
> +                          'comparator', 'natting', 'alg', 'pasv', 'epasv',
> +                          'wildcard', 'nated', 'amd64', 'x86_64',
> +                          'recirculation']
> +
> +        global spell_check_dict
> +        spell_check_dict = enchant.Dict("en_US")
> +        for kw in extra_keywords:
> +            spell_check_dict.add(kw)
> +
> +        return True
> +    except:
> +        return False
>
>
>  def get_color_end():
> @@ -359,7 +366,7 @@ def filter_comments(current_line, keep=False):
>
>
>  def check_comment_spelling(line):
> -    if no_spellcheck or not spellcheck_comments:
> +    if not spell_check_dict or not spellcheck_comments:
>          return False
>
>      comment_words = filter_comments(line, True).replace(':', ' ').split('
> ')
> @@ -919,7 +926,7 @@ if __name__ == '__main__':
>          elif o in ("-f", "--check-file"):
>              checking_file = True
>          elif o in ("-S", "--spellcheck-comments"):
> -            if no_spellcheck:
> +            if not open_spell_check_dict():
>                  print("WARNING: The enchant library isn't availble.")
>                  print("         Please install python enchant.")
>              else:
> --
> 2.16.1
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
Ben Pfaff Nov. 2, 2018, 8:42 p.m. | #2
Thanks for the patches, I applied this to master.

On Fri, Nov 02, 2018 at 01:17:25PM -0700, Yifeng Sun wrote:
> Looks good to me, thanks.
> 
> Reviewed-by: Yifeng Sun <pkusunyifeng@gmail.com>
> 
> On Thu, Nov 1, 2018 at 8:07 AM Ben Pfaff <blp@ovn.org> wrote:
> 
> > On my machine it takes almost a second for enchant to read its dictionary.
> > This time is wasted when spell checking is not enabled.  This commit makes
> > checkpatch read the dictionary only when it will be used.
> >
> > Signed-off-by: Ben Pfaff <blp@ovn.org>
> > ---
> >  utilities/checkpatch.py | 117
> > +++++++++++++++++++++++++-----------------------
> >  1 file changed, 62 insertions(+), 55 deletions(-)
> >
> > diff --git a/utilities/checkpatch.py b/utilities/checkpatch.py
> > index 54aa4b6346db..8bbda78989c4 100755
> > --- a/utilities/checkpatch.py
> > +++ b/utilities/checkpatch.py
> > @@ -21,59 +21,6 @@ import os
> >  import re
> >  import sys
> >
> > -try:
> > -    import enchant
> > -
> > -    extra_keywords = ['ovs', 'vswitch', 'vswitchd', 'ovs-vswitchd',
> > 'netdev',
> > -                      'selinux', 'ovs-ctl', 'dpctl', 'ofctl',
> > 'openvswitch',
> > -                      'dpdk', 'hugepage', 'hugepages', 'pmd', 'upcall',
> > -                      'vhost', 'rx', 'tx', 'vhostuser', 'openflow',
> > 'qsort',
> > -                      'rxq', 'txq', 'perf', 'stats', 'struct', 'int',
> > -                      'char', 'bool', 'upcalls', 'nicira', 'bitmask',
> > 'ipv4',
> > -                      'ipv6', 'tcp', 'tcp4', 'tcpv4', 'udp', 'udp4',
> > 'udpv4',
> > -                      'icmp', 'icmp4', 'icmpv6', 'vlan', 'vxlan', 'cksum',
> > -                      'csum', 'checksum', 'ofproto', 'numa', 'mempool',
> > -                      'mempools', 'mbuf', 'mbufs', 'hmap', 'cmap', 'smap',
> > -                      'dhcpv4', 'dhcp', 'dhcpv6', 'opts', 'metadata',
> > -                      'geneve', 'mutex', 'netdev', 'netdevs', 'subtable',
> > -                      'virtio', 'qos', 'policer', 'datapath', 'tunctl',
> > -                      'attr', 'ethernet', 'ether', 'defrag', 'defragment',
> > -                      'loopback', 'sflow', 'acl', 'initializer', 'recirc',
> > -                      'xlated', 'unclosed', 'netlink', 'msec', 'usec',
> > -                      'nsec', 'ms', 'us', 'ns', 'kilobits', 'kbps',
> > -                      'kilobytes', 'megabytes', 'mbps', 'gigabytes',
> > 'gbps',
> > -                      'megabits', 'gigabits', 'pkts', 'tuple', 'miniflow',
> > -                      'megaflow', 'conntrack', 'vlans', 'vxlans', 'arg',
> > -                      'tpid', 'xbundle', 'xbundles', 'mbundle',
> > 'mbundles',
> > -                      'netflow', 'localnet', 'odp', 'pre', 'dst', 'dest',
> > -                      'src', 'ethertype', 'cvlan', 'ips', 'msg', 'msgs',
> > -                      'liveness', 'userspace', 'eventmask', 'datapaths',
> > -                      'slowpath', 'fastpath', 'multicast', 'unicast',
> > -                      'revalidation', 'namespace', 'qdisc', 'uuid',
> > 'ofport',
> > -                      'subnet', 'revalidation', 'revalidator',
> > 'revalidate',
> > -                      'l2', 'l3', 'l4', 'openssl', 'mtu', 'ifindex',
> > 'enum',
> > -                      'enums', 'http', 'https', 'num', 'vconn', 'vconns',
> > -                      'conn', 'nat', 'memset', 'memcmp', 'strcmp',
> > -                      'strcasecmp', 'tc', 'ufid', 'api', 'ofpbuf',
> > 'ofpbufs',
> > -                      'hashmaps', 'hashmap', 'deref', 'dereference', 'hw',
> > -                      'prio', 'sendmmsg', 'sendmsg', 'malloc', 'free',
> > 'alloc',
> > -                      'pid', 'ppid', 'pgid', 'uid', 'gid', 'sid', 'utime',
> > -                      'stime', 'cutime', 'cstime', 'vsize', 'rss',
> > 'rsslim',
> > -                      'whcan', 'gtime', 'eip', 'rip', 'cgtime', 'dbg',
> > 'gw',
> > -                      'sbrec', 'bfd', 'sizeof', 'pmds', 'nic', 'nics',
> > 'hwol',
> > -                      'encap', 'decap', 'tlv', 'tlvs', 'decapsulation',
> > 'fd',
> > -                      'cacheline', 'xlate', 'skiplist', 'idl',
> > 'comparator',
> > -                      'natting', 'alg', 'pasv', 'epasv', 'wildcard',
> > 'nated',
> > -                      'amd64', 'x86_64', 'recirculation']
> > -
> > -    spell_check_dict = enchant.Dict("en_US")
> > -    for kw in extra_keywords:
> > -        spell_check_dict.add(kw)
> > -
> > -    no_spellcheck = False
> > -except:
> > -    no_spellcheck = True
> > -
> >  RETURN_CHECK_INITIAL_STATE = 0
> >  RETURN_CHECK_STATE_WITH_RETURN = 1
> >  RETURN_CHECK_AWAITING_BRACE = 2
> > @@ -86,6 +33,66 @@ total_line = 0
> >  colors = False
> >  spellcheck_comments = False
> >  quiet = False
> > +spell_check_dict = None
> > +
> > +
> > +def open_spell_check_dict():
> > +    import enchant
> > +
> > +    try:
> > +        extra_keywords = ['ovs', 'vswitch', 'vswitchd', 'ovs-vswitchd',
> > +                          'netdev', 'selinux', 'ovs-ctl', 'dpctl',
> > 'ofctl',
> > +                          'openvswitch', 'dpdk', 'hugepage', 'hugepages',
> > +                          'pmd', 'upcall', 'vhost', 'rx', 'tx',
> > 'vhostuser',
> > +                          'openflow', 'qsort', 'rxq', 'txq', 'perf',
> > 'stats',
> > +                          'struct', 'int', 'char', 'bool', 'upcalls',
> > 'nicira',
> > +                          'bitmask', 'ipv4', 'ipv6', 'tcp', 'tcp4',
> > 'tcpv4',
> > +                          'udp', 'udp4', 'udpv4', 'icmp', 'icmp4',
> > 'icmpv6',
> > +                          'vlan', 'vxlan', 'cksum', 'csum', 'checksum',
> > +                          'ofproto', 'numa', 'mempool', 'mempools',
> > 'mbuf',
> > +                          'mbufs', 'hmap', 'cmap', 'smap', 'dhcpv4',
> > 'dhcp',
> > +                          'dhcpv6', 'opts', 'metadata', 'geneve', 'mutex',
> > +                          'netdev', 'netdevs', 'subtable', 'virtio',
> > 'qos',
> > +                          'policer', 'datapath', 'tunctl', 'attr',
> > 'ethernet',
> > +                          'ether', 'defrag', 'defragment', 'loopback',
> > 'sflow',
> > +                          'acl', 'initializer', 'recirc', 'xlated',
> > 'unclosed',
> > +                          'netlink', 'msec', 'usec', 'nsec', 'ms', 'us',
> > 'ns',
> > +                          'kilobits', 'kbps', 'kilobytes', 'megabytes',
> > 'mbps',
> > +                          'gigabytes', 'gbps', 'megabits', 'gigabits',
> > 'pkts',
> > +                          'tuple', 'miniflow', 'megaflow', 'conntrack',
> > +                          'vlans', 'vxlans', 'arg', 'tpid', 'xbundle',
> > +                          'xbundles', 'mbundle', 'mbundles', 'netflow',
> > +                          'localnet', 'odp', 'pre', 'dst', 'dest', 'src',
> > +                          'ethertype', 'cvlan', 'ips', 'msg', 'msgs',
> > +                          'liveness', 'userspace', 'eventmask',
> > 'datapaths',
> > +                          'slowpath', 'fastpath', 'multicast', 'unicast',
> > +                          'revalidation', 'namespace', 'qdisc', 'uuid',
> > +                          'ofport', 'subnet', 'revalidation',
> > 'revalidator',
> > +                          'revalidate', 'l2', 'l3', 'l4', 'openssl',
> > 'mtu',
> > +                          'ifindex', 'enum', 'enums', 'http', 'https',
> > 'num',
> > +                          'vconn', 'vconns', 'conn', 'nat', 'memset',
> > 'memcmp',
> > +                          'strcmp', 'strcasecmp', 'tc', 'ufid', 'api',
> > +                          'ofpbuf', 'ofpbufs', 'hashmaps', 'hashmap',
> > 'deref',
> > +                          'dereference', 'hw', 'prio', 'sendmmsg',
> > 'sendmsg',
> > +                          'malloc', 'free', 'alloc', 'pid', 'ppid',
> > 'pgid',
> > +                          'uid', 'gid', 'sid', 'utime', 'stime', 'cutime',
> > +                          'cstime', 'vsize', 'rss', 'rsslim', 'whcan',
> > 'gtime',
> > +                          'eip', 'rip', 'cgtime', 'dbg', 'gw', 'sbrec',
> > 'bfd',
> > +                          'sizeof', 'pmds', 'nic', 'nics', 'hwol',
> > 'encap',
> > +                          'decap', 'tlv', 'tlvs', 'decapsulation', 'fd',
> > +                          'cacheline', 'xlate', 'skiplist', 'idl',
> > +                          'comparator', 'natting', 'alg', 'pasv', 'epasv',
> > +                          'wildcard', 'nated', 'amd64', 'x86_64',
> > +                          'recirculation']
> > +
> > +        global spell_check_dict
> > +        spell_check_dict = enchant.Dict("en_US")
> > +        for kw in extra_keywords:
> > +            spell_check_dict.add(kw)
> > +
> > +        return True
> > +    except:
> > +        return False
> >
> >
> >  def get_color_end():
> > @@ -359,7 +366,7 @@ def filter_comments(current_line, keep=False):
> >
> >
> >  def check_comment_spelling(line):
> > -    if no_spellcheck or not spellcheck_comments:
> > +    if not spell_check_dict or not spellcheck_comments:
> >          return False
> >
> >      comment_words = filter_comments(line, True).replace(':', ' ').split('
> > ')
> > @@ -919,7 +926,7 @@ if __name__ == '__main__':
> >          elif o in ("-f", "--check-file"):
> >              checking_file = True
> >          elif o in ("-S", "--spellcheck-comments"):
> > -            if no_spellcheck:
> > +            if not open_spell_check_dict():
> >                  print("WARNING: The enchant library isn't availble.")
> >                  print("         Please install python enchant.")
> >              else:
> > --
> > 2.16.1
> >
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> >

Patch

diff --git a/utilities/checkpatch.py b/utilities/checkpatch.py
index 54aa4b6346db..8bbda78989c4 100755
--- a/utilities/checkpatch.py
+++ b/utilities/checkpatch.py
@@ -21,59 +21,6 @@  import os
 import re
 import sys
 
-try:
-    import enchant
-
-    extra_keywords = ['ovs', 'vswitch', 'vswitchd', 'ovs-vswitchd', 'netdev',
-                      'selinux', 'ovs-ctl', 'dpctl', 'ofctl', 'openvswitch',
-                      'dpdk', 'hugepage', 'hugepages', 'pmd', 'upcall',
-                      'vhost', 'rx', 'tx', 'vhostuser', 'openflow', 'qsort',
-                      'rxq', 'txq', 'perf', 'stats', 'struct', 'int',
-                      'char', 'bool', 'upcalls', 'nicira', 'bitmask', 'ipv4',
-                      'ipv6', 'tcp', 'tcp4', 'tcpv4', 'udp', 'udp4', 'udpv4',
-                      'icmp', 'icmp4', 'icmpv6', 'vlan', 'vxlan', 'cksum',
-                      'csum', 'checksum', 'ofproto', 'numa', 'mempool',
-                      'mempools', 'mbuf', 'mbufs', 'hmap', 'cmap', 'smap',
-                      'dhcpv4', 'dhcp', 'dhcpv6', 'opts', 'metadata',
-                      'geneve', 'mutex', 'netdev', 'netdevs', 'subtable',
-                      'virtio', 'qos', 'policer', 'datapath', 'tunctl',
-                      'attr', 'ethernet', 'ether', 'defrag', 'defragment',
-                      'loopback', 'sflow', 'acl', 'initializer', 'recirc',
-                      'xlated', 'unclosed', 'netlink', 'msec', 'usec',
-                      'nsec', 'ms', 'us', 'ns', 'kilobits', 'kbps',
-                      'kilobytes', 'megabytes', 'mbps', 'gigabytes', 'gbps',
-                      'megabits', 'gigabits', 'pkts', 'tuple', 'miniflow',
-                      'megaflow', 'conntrack', 'vlans', 'vxlans', 'arg',
-                      'tpid', 'xbundle', 'xbundles', 'mbundle', 'mbundles',
-                      'netflow', 'localnet', 'odp', 'pre', 'dst', 'dest',
-                      'src', 'ethertype', 'cvlan', 'ips', 'msg', 'msgs',
-                      'liveness', 'userspace', 'eventmask', 'datapaths',
-                      'slowpath', 'fastpath', 'multicast', 'unicast',
-                      'revalidation', 'namespace', 'qdisc', 'uuid', 'ofport',
-                      'subnet', 'revalidation', 'revalidator', 'revalidate',
-                      'l2', 'l3', 'l4', 'openssl', 'mtu', 'ifindex', 'enum',
-                      'enums', 'http', 'https', 'num', 'vconn', 'vconns',
-                      'conn', 'nat', 'memset', 'memcmp', 'strcmp',
-                      'strcasecmp', 'tc', 'ufid', 'api', 'ofpbuf', 'ofpbufs',
-                      'hashmaps', 'hashmap', 'deref', 'dereference', 'hw',
-                      'prio', 'sendmmsg', 'sendmsg', 'malloc', 'free', 'alloc',
-                      'pid', 'ppid', 'pgid', 'uid', 'gid', 'sid', 'utime',
-                      'stime', 'cutime', 'cstime', 'vsize', 'rss', 'rsslim',
-                      'whcan', 'gtime', 'eip', 'rip', 'cgtime', 'dbg', 'gw',
-                      'sbrec', 'bfd', 'sizeof', 'pmds', 'nic', 'nics', 'hwol',
-                      'encap', 'decap', 'tlv', 'tlvs', 'decapsulation', 'fd',
-                      'cacheline', 'xlate', 'skiplist', 'idl', 'comparator',
-                      'natting', 'alg', 'pasv', 'epasv', 'wildcard', 'nated',
-                      'amd64', 'x86_64', 'recirculation']
-
-    spell_check_dict = enchant.Dict("en_US")
-    for kw in extra_keywords:
-        spell_check_dict.add(kw)
-
-    no_spellcheck = False
-except:
-    no_spellcheck = True
-
 RETURN_CHECK_INITIAL_STATE = 0
 RETURN_CHECK_STATE_WITH_RETURN = 1
 RETURN_CHECK_AWAITING_BRACE = 2
@@ -86,6 +33,66 @@  total_line = 0
 colors = False
 spellcheck_comments = False
 quiet = False
+spell_check_dict = None
+
+
+def open_spell_check_dict():
+    import enchant
+
+    try:
+        extra_keywords = ['ovs', 'vswitch', 'vswitchd', 'ovs-vswitchd',
+                          'netdev', 'selinux', 'ovs-ctl', 'dpctl', 'ofctl',
+                          'openvswitch', 'dpdk', 'hugepage', 'hugepages',
+                          'pmd', 'upcall', 'vhost', 'rx', 'tx', 'vhostuser',
+                          'openflow', 'qsort', 'rxq', 'txq', 'perf', 'stats',
+                          'struct', 'int', 'char', 'bool', 'upcalls', 'nicira',
+                          'bitmask', 'ipv4', 'ipv6', 'tcp', 'tcp4', 'tcpv4',
+                          'udp', 'udp4', 'udpv4', 'icmp', 'icmp4', 'icmpv6',
+                          'vlan', 'vxlan', 'cksum', 'csum', 'checksum',
+                          'ofproto', 'numa', 'mempool', 'mempools', 'mbuf',
+                          'mbufs', 'hmap', 'cmap', 'smap', 'dhcpv4', 'dhcp',
+                          'dhcpv6', 'opts', 'metadata', 'geneve', 'mutex',
+                          'netdev', 'netdevs', 'subtable', 'virtio', 'qos',
+                          'policer', 'datapath', 'tunctl', 'attr', 'ethernet',
+                          'ether', 'defrag', 'defragment', 'loopback', 'sflow',
+                          'acl', 'initializer', 'recirc', 'xlated', 'unclosed',
+                          'netlink', 'msec', 'usec', 'nsec', 'ms', 'us', 'ns',
+                          'kilobits', 'kbps', 'kilobytes', 'megabytes', 'mbps',
+                          'gigabytes', 'gbps', 'megabits', 'gigabits', 'pkts',
+                          'tuple', 'miniflow', 'megaflow', 'conntrack',
+                          'vlans', 'vxlans', 'arg', 'tpid', 'xbundle',
+                          'xbundles', 'mbundle', 'mbundles', 'netflow',
+                          'localnet', 'odp', 'pre', 'dst', 'dest', 'src',
+                          'ethertype', 'cvlan', 'ips', 'msg', 'msgs',
+                          'liveness', 'userspace', 'eventmask', 'datapaths',
+                          'slowpath', 'fastpath', 'multicast', 'unicast',
+                          'revalidation', 'namespace', 'qdisc', 'uuid',
+                          'ofport', 'subnet', 'revalidation', 'revalidator',
+                          'revalidate', 'l2', 'l3', 'l4', 'openssl', 'mtu',
+                          'ifindex', 'enum', 'enums', 'http', 'https', 'num',
+                          'vconn', 'vconns', 'conn', 'nat', 'memset', 'memcmp',
+                          'strcmp', 'strcasecmp', 'tc', 'ufid', 'api',
+                          'ofpbuf', 'ofpbufs', 'hashmaps', 'hashmap', 'deref',
+                          'dereference', 'hw', 'prio', 'sendmmsg', 'sendmsg',
+                          'malloc', 'free', 'alloc', 'pid', 'ppid', 'pgid',
+                          'uid', 'gid', 'sid', 'utime', 'stime', 'cutime',
+                          'cstime', 'vsize', 'rss', 'rsslim', 'whcan', 'gtime',
+                          'eip', 'rip', 'cgtime', 'dbg', 'gw', 'sbrec', 'bfd',
+                          'sizeof', 'pmds', 'nic', 'nics', 'hwol', 'encap',
+                          'decap', 'tlv', 'tlvs', 'decapsulation', 'fd',
+                          'cacheline', 'xlate', 'skiplist', 'idl',
+                          'comparator', 'natting', 'alg', 'pasv', 'epasv',
+                          'wildcard', 'nated', 'amd64', 'x86_64',
+                          'recirculation']
+
+        global spell_check_dict
+        spell_check_dict = enchant.Dict("en_US")
+        for kw in extra_keywords:
+            spell_check_dict.add(kw)
+
+        return True
+    except:
+        return False
 
 
 def get_color_end():
@@ -359,7 +366,7 @@  def filter_comments(current_line, keep=False):
 
 
 def check_comment_spelling(line):
-    if no_spellcheck or not spellcheck_comments:
+    if not spell_check_dict or not spellcheck_comments:
         return False
 
     comment_words = filter_comments(line, True).replace(':', ' ').split(' ')
@@ -919,7 +926,7 @@  if __name__ == '__main__':
         elif o in ("-f", "--check-file"):
             checking_file = True
         elif o in ("-S", "--spellcheck-comments"):
-            if no_spellcheck:
+            if not open_spell_check_dict():
                 print("WARNING: The enchant library isn't availble.")
                 print("         Please install python enchant.")
             else: