DPDK patches and discussions
 help / color / mirror / Atom feed
From: David Marchand <david.marchand@redhat.com>
To: Maxime Coquelin <maxime.coquelin@redhat.com>
Cc: dev@dpdk.org, techboard@dpdk.org, thomas@monjalon.net,
	 mb@smartsharesystems.com
Subject: Re: [RFC v2 1/3] uapi: introduce kernel uAPI headers import
Date: Sat, 7 Sep 2024 16:34:12 +0200	[thread overview]
Message-ID: <CAJFAV8wb-gJRJwG8Q_6jTAGssb622COXrm0_qTReuGL9=1psfA@mail.gmail.com> (raw)
In-Reply-To: <20240906152337.2805036-2-maxime.coquelin@redhat.com>

On Fri, Sep 6, 2024 at 5:23 PM Maxime Coquelin
<maxime.coquelin@redhat.com> wrote:

[snip]

> diff --git a/devtools/check-linux-uapi.sh b/devtools/check-linux-uapi.sh
> new file mode 100755
> index 0000000000..76111d78ce
> --- /dev/null
> +++ b/devtools/check-linux-uapi.sh
> @@ -0,0 +1,74 @@
> +#!/bin/sh

-e maybe?

> +# SPDX-License-Identifier: BSD-3-Clause
> +# Copyright (c) 2024 Red Hat, Inc.
> +
> +#
> +# Import Linux Kernel uAPI header file

# Check Linux Kernel uAPI headers

> +#
> +
> +base_url="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/include/uapi/"
> +base_path="linux-headers/uapi/"
> +errors=0
> +
> +print_usage()
> +{
> +       echo "Usage: $(basename $0) [-h]"
> +}
> +
> +check_uapi_header() {
> +       path=$1
> +       file=${1//"$base_path"/}

I suspect it is a bashism.

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
${parameter#[word]}
Remove Smallest Prefix Pattern. The word shall be expanded to produce
a pattern. The parameter expansion shall then result in parameter,
with the smallest portion of the prefix matched by the pattern
deleted. If present, word shall not begin with an unquoted '#'.

So a POSIX alternative is:
file=${1#$base_path/}


> +       version=$(git log --format=%b -1 $path | sed -ne 's/^uAPI Version: \(.*\)$/\1/p')

I would add a check and raise a warning (error?) if extracting version
fails (iow -z "$version").


> +
> +       url="${base_url}${file}?h=${version}"
> +       echo -n "Checking $file for version $version... "
> +       curl -s -f -o $tmpinput $url
> +       if [ $? -ne 0 ]; then
> +               echo "Failed to download $url"
> +               exit 1
> +       fi
> +
> +       diff -q $path $tmpinput >/dev/null
> +       if [ $? -ne 0 ]; then
> +               echo "KO"
> +               diff -u $path $tmpinput
> +               errors=$((errors+1))
> +       else
> +               echo "OK"
> +       fi
> +}
> +
> +while getopts hv ARG ; do
> +       case $ARG in
> +               h )
> +                       print_usage
> +                       exit 0
> +                       ;;
> +               ? )
> +                       print_usage
> +                       exit 1
> +                       ;;
> +       esac
> +done
> +
> +shift $(($OPTIND - 1))
> +if [ $# -ne 0 ]; then
> +       print_usage
> +       exit 1
> +fi
> +
> +cd $(dirname $0)/..
> +
> +tmpinput=$(mktemp -t dpdk.checkuapi.XXXXXX)
> +trap "rm -f '$tmpinput'" INT
> +
> +while IFS= read -d '' -r filename; do

Simpler:

for filename in $(find $base_path -name "*.h" -type f); do
     check_uapi_header "${filename}" </dev/null
done

> +       check_uapi_header "${filename}" </dev/null
> +done < <(find $base_path -name "*.h" -type f -print0)


> +
> +echo "$errors error(s) found"
> +
> +rm -f $tmpinput
> +trap - INT
> +
> +exit $errors

[snip]

> diff --git a/doc/guides/contributing/linux_uapi.rst b/doc/guides/contributing/linux_uapi.rst
> new file mode 100644
> index 0000000000..a3f684013a
> --- /dev/null
> +++ b/doc/guides/contributing/linux_uapi.rst
> @@ -0,0 +1,77 @@
> +.. SPDX-License-Identifier: BSD-3-Clause
> +   Copyright(c) 2024 Red Hat, Inc.
> +
> +Linux uAPI header files
> +=======================
> +
> +Rationale
> +---------
> +
> +The system a DPDK library or driver is built on is not necessarily running the
> +same Kernel version than the system that will run it.
> +Importing Linux Kernel uAPI headers enable to build features that are not
> +supported yet by the build system.
> +
> +For example, the build system runs upstream Kernel v5.19 and we would like to
> +build a VDUSE application that will use VDUSE_IOTLB_GET_INFO ioctl() introduced
> +in Linux Kernel v6.0.
> +
> +`Linux Kernel licence exception regarding syscalls
> +<https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/LICENSES/exceptions/Linux-syscall-note>`_
> +enable importing unmodified Linux Kernel uAPI header files.
> +
> +Importing or updating an uAPI header file
> +-----------------------------------------
> +
> +In order to ensure the imported uAPI headers are both unmodified and from a
> +released version of the linux Kernel, a helper script is made available and
> +MUST be used.
> +Below is an example to import ``linux/vduse.h`` file from Linux ``v6.10``:
> +
> +.. code-block:: console
> +
> +   ./devtools/import-linux-uapi.sh linux/vduse.h v6.10
> +
> +Once imported, the header files should be committed without any other change,
> +and the commit message MUST specify the imported version using
> +``uAPI Version:`` tag and title MUST be prefixed with uapi keyword.
> +For example::
> +
> +  uapi: import VDUSE header file
> +
> +  This patch imports VDUSE uAPI header file for inclusion
> +  into the Vhost library.
> +
> +  uAPI Version: v6.10
> +
> +  Signed-off-by: Alex Smith <alex.smith@example.com>
> +
> +Updating an already imported header to a newer released version should only
> +be done on a need basis.
> +The commit message should reflect why updating the header is necessary.

+1.


> +
> +Once committed, user can check headers and commit message are valid by using
> +the Linux uAPI checker tool:
> +
> +.. code-block:: console
> +
> +   ./devtools/check-linux-uapi.sh

And thanks for adding this check.
It will help maintainers.


> +
> +Header inclusion into library or driver
> +---------------------------------------
> +
> +The library or driver willing to make use of imported uAPI headers needs to
> +explicitly add uAPI headers path to the ``includes`` var in its ``meson.build``
> +file:
> +
> +.. code-block:: python
> +
> +   includes += linux_uapi_inc

Now that the uapi headers directory is pushed to global_inc, there is
no need for this part in the doc.


> +
> +Then, it can be included with ``uapi/`` prefix in C files.
> +For example to include VDUSE uAPI:
> +
> +.. code-block:: c
> +
> +   #include <uapi/linux/vduse.h>
> +
> diff --git a/linux-headers/uapi/.gitignore b/linux-headers/uapi/.gitignore
> new file mode 100644
> index 0000000000..88829d04e9
> --- /dev/null
> +++ b/linux-headers/uapi/.gitignore
> @@ -0,0 +1,3 @@
> +**
> +!**/
> +!**/*.h

Nice trick to solve the per patch build issue :-).


-- 
David Marchand


  parent reply	other threads:[~2024-09-07 14:34 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-06 15:23 [RFC v2 0/3] Import Kernel uAPI header files Maxime Coquelin
2024-09-06 15:23 ` [RFC v2 1/3] uapi: introduce kernel uAPI headers import Maxime Coquelin
2024-09-07 14:06   ` Morten Brørup
2024-09-07 14:34   ` David Marchand [this message]
2024-09-11 19:55     ` Maxime Coquelin
2024-09-06 15:23 ` [RFC v2 2/3] uapi: import VDUSE header Maxime Coquelin
2024-09-06 15:23 ` [RFC v2 3/3] vduse: use import VDUSE uAPI header Maxime Coquelin
2024-09-09  0:31 ` [RFC v2 0/3] Import Kernel uAPI header files Stephen Hemminger
2024-09-09  7:34   ` Maxime Coquelin

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='CAJFAV8wb-gJRJwG8Q_6jTAGssb622COXrm0_qTReuGL9=1psfA@mail.gmail.com' \
    --to=david.marchand@redhat.com \
    --cc=dev@dpdk.org \
    --cc=maxime.coquelin@redhat.com \
    --cc=mb@smartsharesystems.com \
    --cc=techboard@dpdk.org \
    --cc=thomas@monjalon.net \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).