From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id A25C0A0613 for ; Mon, 23 Sep 2019 11:13:05 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 56A1337B4; Mon, 23 Sep 2019 11:13:04 +0200 (CEST) Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by dpdk.org (Postfix) with ESMTP id 627F0343C for ; Mon, 23 Sep 2019 11:13:03 +0200 (CEST) Received: by mail-wr1-f66.google.com with SMTP id o18so12987438wrv.13 for ; Mon, 23 Sep 2019 02:13:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind.com; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=W8NfPEUQdhhhd+010LaHWaAtcNJqys5dyoT8SfffYNA=; b=CKP36MoctmQq/EHs+2rNKHkjiGQnM2rmsxABkL4Mgq7eyc6Ko1q2I3hRyedvycSFT5 Iz5YdT5LKZ7POSMHrnJLhD2PpKK5pNMsO6HoqKtjhAfVgz8ucqTFte3by9BRMo9VL5tj 8ihouvBtyue/4X5ztJECh3OqLyHvR8KLBT/Q6a9GqXSNtz5xGegBSPtGWZQxzeKJZCGi HBQam9cx4MydEFQcClJpzcn9CvG9Z9VmcQ99slC8HilaUNd2nxnhdC9m6UEszhi/jOki D21WFoT/fkWkZf49IEdQTtZsyKkfhU/vD6TS8grCFFrb3NSNWjyiMrhHiBZn4bemUx94 5NrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=W8NfPEUQdhhhd+010LaHWaAtcNJqys5dyoT8SfffYNA=; b=Mueoqwl5rr7yrFIb3kAhQkI9BbpecmAi/3vUCCqINu83ZH73GoJq6ygVTrilQsuyvd 9csBow6LOHf/ci82Eh0c54RxgN6MitaYotY1/IdF7qEbMLjqa3sD+NgyeZWOqruAmZYM fxkbF2LjQmZj02rImNQ6HdcyDJtgjsSyV/mzG+NXfOVTNK+hEjjDXLMVnegCHLmpU73Y wI4SVlK3809DNWj+OrtsqnwRZESPauLZEkSIp3TEUmCjG77C35WMxE9K2FJ8ZXvrS2Mv nqvDNEhmqqw18H1tSLYbA+VCpeVYcs0AvXDBxmpdedHvB4Yyz/3l0MSagxoA7bM34zVW db3g== X-Gm-Message-State: APjAAAXzh0kHWTDc3xf+4Sf3Z/3XFxzR8RRQfxtcpZUr/DSdEALb+Exa UKx3/xHaSCipL9Bsr4SyX6BSoA== X-Google-Smtp-Source: APXvYqy7UunwnZweJzpqe8yXi6tlSaZhILQK+DrSuN8yC58Qui2QAhD3tGC6Wh3XBMHKJaPt9woEwQ== X-Received: by 2002:a5d:4a43:: with SMTP id v3mr20489873wrs.146.1569229982959; Mon, 23 Sep 2019 02:13:02 -0700 (PDT) Received: from 6wind.com (2a01cb0c0005a6000226b0fffeed02fc.ipv6.abo.wanadoo.fr. [2a01:cb0c:5:a600:226:b0ff:feed:2fc]) by smtp.gmail.com with ESMTPSA id o22sm19472001wra.96.2019.09.23.02.13.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Sep 2019 02:13:02 -0700 (PDT) Date: Mon, 23 Sep 2019 11:13:01 +0200 From: Olivier Matz To: "Wiles, Keith" Cc: dev , Thomas Monjalon , "Wang, Haiyue" , Stephen Hemminger , Andrew Rybchenko , Jerin Jacob Kollanukkaran Message-ID: <20190923091301.hquyxbbcbai43e4p@platinum> References: <20190710092907.5565-1-olivier.matz@6wind.com> <20190918165448.22409-1-olivier.matz@6wind.com> <37115768-EDA5-4089-8E86-3EFB26194A00@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <37115768-EDA5-4089-8E86-3EFB26194A00@intel.com> User-Agent: NeoMutt/20180716 Subject: Re: [dpdk-dev] [PATCH] mbuf: support dynamic fields and flags X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Hi Keith, On Sat, Sep 21, 2019 at 08:28:32AM +0000, Wiles, Keith wrote: > > > > On Sep 18, 2019, at 6:54 PM, Olivier Matz wrote: > > > > Many features require to store data inside the mbuf. As the room in mbuf > > structure is limited, it is not possible to have a field for each > > feature. Also, changing fields in the mbuf structure can break the API > > or ABI. > > > > This commit addresses these issues, by enabling the dynamic registration > > of fields or flags: > > > > - a dynamic field is a named area in the rte_mbuf structure, with a > > given size (>= 1 byte) and alignment constraint. > > - a dynamic flag is a named bit in the rte_mbuf structure. > > > > The typical use case is a PMD that registers space for an offload > > feature, when the application requests to enable this feature. As > > the space in mbuf is limited, the space should only be reserved if it > > is going to be used (i.e when the application explicitly asks for it). > > > > The registration can be done at any moment, but it is not possible > > to unregister fields or flags for now. > > > > Signed-off-by: Olivier Matz > > Acked-by: Thomas Monjalon > > — > > > > The idea of registration for space in the mbuf I am not a big fan. I did like > Konstantin’s suggestion of having the compiler help with optimizing the code, > but with a slight difference. Maybe I misunderstand, but now with this design > you have to pass the offsets to different parts of the application or place in > global memory or have each section request the offsets. It seems great if the > application is one big application or an appliance model application having > control of the whole design not so good for service chains like designs where > different parts of the whole application is design by different teams. If the global variable storing the offset is defined in the mbuf layer, what would be the problem? The only things you would have to do is: 1/ ensure the offset is registered rte_mbuf_dyn_timestamp_register() 2/ use helpers rte_mbuf_dyn_timestamp_get(), rte_mbuf_dyn_timestamp_set(), ... > Konstantin’s suggest if I understand it was to use structures to allow the > compiler to optimize the access to the mbuf and I like that idea, but with one > change we add a field in the mbuf to define the mbuf structure type. > > Say 0 is the standard rte_mbuf type then type 1 could be the IPSec offset type > mbuf, type 2 could be something else, … The type 0 looks just like the mbuf we > have today with maybe the optional fields set to reserved or some type of > filler variables to reserve the holes in the structure. Then type 1 is the > IPSec mbuf and in the reserved sections of the mbuf contain the IPSec related > data with the standard mbuf fields still matching the type 0 version. This very look like the "selective layout" in our presentation [1], page 14. Your example talks about IPsec, but someone else will want to use a sequence number, another one a timestamp, and another one will want to use this space for its own application. There are a lot of use cases, and it does not scale to have a layout for each of them. Worst, if someone wants IPsec + a sequence number, how can it work? One of the problem to solve is to avoid mutually exclusive feature (i.e. union of fields that cannot be used together in the mbuf). > This allows the mbuf to be used by the developer and the compiler now knows > exactly where the fields are located in the structure and does not have to > deal with any of the macros and offsets and registration suggested here. Just > cast the mbuf pointer into the new type mbuf structure. We just have to make > sure the code that needs to use a given mbuf type has access to the structure > definitions. With the current proposal, we can imagine an API to ask to register a field at a specific offset. It can then be used in the application, so that accesses are done at no cost compared to a static field, because the offset would be const. In the driver, the same logic could be used, but dynamically: if (offset == PREFERRED_OFFSET) { /* code with static offset */ } else { /* generic code */ } But I'm not sure it would scale a lot if there are several features using dynamic fields. > If the mbufs it going to be translated from one type mbuf to another mbuf > type, we just have to define that type and then cast the mbuf pointer to that > structure. When an mbuf is received from IPSec PMD then the application needs > to forward that mbuf to the next stage it can reset the type to 0 or to > another type filling in the reserved fields to be used by the next stage in > the pipeline. What you describe is one use case. What could be done with the API mentionned above (but I think it is dangerous), is to allow a user to register 2 different fields at the same offset, using a specific flag. This could work if the user knows that these 2 fields are never used at the same time. > The mbuf now contains the type and every point in the application can look at > the type to determine how that mbuf is defined. I am sure there are some holes > here, but I think it is a better solution then using all of these macros, > offset values and registration APIs. I'm not convinced having selective layouts is doable. The layouts cannot fit all possible use cases, and managing the different layouts in the driver looks difficult to me. Additionnaly, it does not solve the problem of mutually exclusive features. Thanks for the feedback. Olivier [1] https://static.sched.com/hosted_files/dpdkbordeaux2019/2b/dpdk-201909-dyn-mbuf.pdf