All of lore.kernel.org
 help / color / mirror / Atom feed
From: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
To: Ilya Maximets <i.maximets@ovn.org>
Cc: linux-sparse@vger.kernel.org, ovs-dev@openvswitch.org,
	Ian Stokes <ian.stokes@intel.com>,
	Aaron Conole <aconole@redhat.com>,
	David Marchand <david.marchand@redhat.com>
Subject: Re: [PATCH] flex-array: allow arrays of unions with flexible members.
Date: Fri, 9 Oct 2020 18:01:41 +0200	[thread overview]
Message-ID: <20201009160141.hn2rhptqibrjyfxf@ltop.local> (raw)
In-Reply-To: <e2a2ef01-7432-9002-9be6-338a118bc4f4@ovn.org>

On Thu, Oct 08, 2020 at 12:04:55PM +0200, Ilya Maximets wrote:
> On 10/8/20 11:13 AM, Ilya Maximets wrote:
> > On 10/8/20 1:15 AM, Luc Van Oostenryck wrote:
> >> On Wed, Oct 07, 2020 at 01:52:34PM +0200, Ilya Maximets wrote:
> >>> The actual code in question that makes sparse fail
> >>> OVS build could be found here:
> >>>   https://github.com/openvswitch/ovs/blob/39fbd2c3f0392811689ec780f09baf90faceb877/lib/netdev-linux.c#L1238
> >>
> >> I'm impressed and surprised you're using of includes just for Sparse.
> >> I also see that this is since 2011. Just for my curiosity, have
> >> you an idea for why exactly this was needed and if it is still
> >> really needed?
> > 
> > There are some Sparse-related headers that could be safely removed now
> > because required functionality is already supported by Sparse.  We need
> > to clean this up someday, e.g. OVS builds fine without
> > include/sparse/threads.h since Sparse 0.5.1.
> > 
> > However, there are headers that are necessary for successful build.
> > There are few classes of issues that these headers are targeted on:
> > 
> > 1. Missing functionality in Sparse.
> > For example, it doesn't know about __builtin_ia32_pause, so we have to have
> > include/sparse/xmmintrin.h.
> > Sparse also doesn't know __atomic_load_n that comes from some DPDK headers.
> > OVS itself avoids using builtin atomics if __CHECKER__ defined.
> > DPDK library also has some issues with types in __sync_add_and_fetch, but I
> > do not remember exact problem.  We have include/sparse/rte_atomic.h for it.
> > These are from the top of my head.  I could go through our specific headers
> > and make a list of missing features someday if you're interested.

OK, I see. I'll add __builtin_ia32_pause() now and I'll look at
__atomic_load_n(), __sync_add_and_fetch() and friends soon.

> > 2. Sparse complains on standard libraries.
> > Complains on PTHREAD_MUTEX_INITIALIZER: 
> >     error: Using plain integer as NULL pointer
> > So, we have to have include/sparse/pthread.h.
> > Maybe some other examples, but I do not remember right now.
> > 
> > 3. Issues inside external libraries.
> > Ex. numa.h header from libnuma contains non-ANSI function declarations.
> > So we have include/sparse/numa.h.

It's always possible to use -Wno-non-pointer-null and
-Wno-old_-style-definition but ...

> > 4. Issues with restricted types (these are heaviest).
> > OVS uses restricted types like 'ovs_be32' inside (with __attribute__((bitwise))),
> > but standard functions like htonl() operates with usual 'uint32_t'.  While it's
> > safe to use these exact functions, Sparse complains about type mismatch.  One
> > option here is to explicitly cast arguments with (OVS_FORCE ovs_be32) each time,
> > but that is impractical (too many occurrences, ~4K lines of code only for hton/ntoh
> > conversions) and will make code less readable.  Much easier to override these
> > functions just for Sparse.  Ex. include/sparse/netinet/in.h.
> > 
> > Similar issue with some data types that goes from external libraries and system
> > headers. e.g. DPDK library operates with its own types like rte_be32_t.  While
> > it's completely safe to mix them with ovs_be32, Sparse doesn't know about that,
> > because DPDK doesn't mark them as bitwise.  This issue might be fixed on DPDK
> > side, I guess.  But Sparse will complain about different types even if these types
> > defined in exactly same way.  e.g. following test fails:
> > 
> > diff --git a/validation/bitwise-cast.c b/validation/bitwise-cast.c
> > index 0583461c..9284bd05 100644
> > --- a/validation/bitwise-cast.c
> > +++ b/validation/bitwise-cast.c
> > @@ -35,6 +35,18 @@ static __be32 quuy(void)
> >         return (__attribute__((force)) __be32) 1730;
> >  }
> >  
> > +/* Implicit casts of equally defined types, should be legal? */
> 
> I do understand why this is illegal.  Otherwise it will be not possible to
> create le and be types.  However, since the main purpose of 'bitwise' attribute,
> AFAIU, is to create le and be types, maybe it make sense to have 2 different
> attributes? e.g. 'bitwise_le' and 'bitwise_be'.  This way Sparse will be able
> to detect that 2 different types ovs_be32 and rte_be32_t could be safely mixed,
> if both defined with attribute 'bitwise_be' and has same base type uint32_t.

Well, one of the key characteristic of __bitwise is that it creates new,
distinct, incompatible types and it is very much used as such. For example,
in the kernel the 6 {be,le}{16,32,64} are maybe the most used but there
are about 100 other bitwise types that are defined (like poll_t or
pci_power_t) just to have a distinct type.

So, for the problem with rte_be32_t & ovs_be32, the solutions should be
to have a common definition, either via a macro or a typedef. Not an
easy thing with external libraries.
 
Best regards,
-- Luc

      reply	other threads:[~2020-10-09 16:01 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-07 11:52 [PATCH] flex-array: allow arrays of unions with flexible members Ilya Maximets
2020-10-07 23:09 ` Luc Van Oostenryck
2020-10-08  6:36   ` Ilya Maximets
2020-10-09 15:39     ` Luc Van Oostenryck
2020-10-07 23:15 ` Luc Van Oostenryck
2020-10-08  9:13   ` Ilya Maximets
2020-10-08 10:04     ` Ilya Maximets
2020-10-09 16:01       ` Luc Van Oostenryck [this message]

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=20201009160141.hn2rhptqibrjyfxf@ltop.local \
    --to=luc.vanoostenryck@gmail.com \
    --cc=aconole@redhat.com \
    --cc=david.marchand@redhat.com \
    --cc=i.maximets@ovn.org \
    --cc=ian.stokes@intel.com \
    --cc=linux-sparse@vger.kernel.org \
    --cc=ovs-dev@openvswitch.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.