Patchwork [RFC] Import Linux headers for KVM and vhost

login
register
mail settings
Submitter Jan Kiszka
Date May 3, 2011, 2:05 p.m.
Message ID <4DC00BB1.7000008@siemens.com>
Download mbox | patch
Permalink /patch/93797/
State New
Headers show

Comments

Jan Kiszka - May 3, 2011, 2:05 p.m.
This helps reducing our build-time checks for feature support in the
available Linux kernel headers. And it helps users that do not have
sufficiently recent headers installed on their build machine.

Header upstate is triggered via 'make update-linux-headers', optionally
specifying a kernel directory as source via 'LINUX='.

---

I'm sure this is not yet perfect from technical POV (e.g. the patch to
Makefile.target looks like a hack to me, better ideas welcome),
therefore RFC and no SOB. But it should demonstrate the plan. The
workflow for adding a new KVM feature support would be first a 'make
update-linux-header LINUX=/my/local/linux' + git commit, and then the
commit of the kvm, vhost, whatever changes.

A patch to actually add the result of the header update would be posted
separately. Same for the now possible massive cleanups of kvm sources.

 Makefile        |   17 +++++++
 Makefile.target |    2 +-
 configure       |  127 ++++++++-----------------------------------------------
 3 files changed, 36 insertions(+), 110 deletions(-)
Christoph Hellwig - May 3, 2011, 3:12 p.m.
On Tue, May 03, 2011 at 04:05:37PM +0200, Jan Kiszka wrote:
> This helps reducing our build-time checks for feature support in the
> available Linux kernel headers. And it helps users that do not have
> sufficiently recent headers installed on their build machine.
> 
> Header upstate is triggered via 'make update-linux-headers', optionally
> specifying a kernel directory as source via 'LINUX='.

Why not make it a shell scripts?  It's not like it's part of the build
system.  I also think the source tree argument should be mandatory instead
of grabbing random headers.
Jan Kiszka - May 3, 2011, 3:32 p.m.
On 2011-05-03 17:12, Christoph Hellwig wrote:
> On Tue, May 03, 2011 at 04:05:37PM +0200, Jan Kiszka wrote:
>> This helps reducing our build-time checks for feature support in the
>> available Linux kernel headers. And it helps users that do not have
>> sufficiently recent headers installed on their build machine.
>>
>> Header upstate is triggered via 'make update-linux-headers', optionally
>> specifying a kernel directory as source via 'LINUX='.
> 
> Why not make it a shell scripts?  It's not like it's part of the build
> system.  I also think the source tree argument should be mandatory instead
> of grabbing random headers.

Yes, makes sense. I just adopted the kvm-kmod style here which I'm used to.

Jan
Arnd Bergmann - May 3, 2011, 3:41 p.m.
On Tuesday 03 May 2011, Jan Kiszka wrote:
> This helps reducing our build-time checks for feature support in the
> available Linux kernel headers. And it helps users that do not have
> sufficiently recent headers installed on their build machine.
> 
> Header upstate is triggered via 'make update-linux-headers', optionally
> specifying a kernel directory as source via 'LINUX='.
> 
> ---
> 
> I'm sure this is not yet perfect from technical POV (e.g. the patch to
> Makefile.target looks like a hack to me, better ideas welcome),
> therefore RFC and no SOB. But it should demonstrate the plan. The
> workflow for adding a new KVM feature support would be first a 'make
> update-linux-header LINUX=/my/local/linux' + git commit, and then the
> commit of the kvm, vhost, whatever changes.
> 
> Makefile        |   17 +++++++
> Makefile.target |    2 +-
> configure       |  127 ++++++++-----------------------------------------------
> 3 files changed, 36 insertions(+), 110 deletions(-)

Very nice!

The old way to poke into the kernel internals was really annoying and confusing.

	Arnd

Patch

diff --git a/Makefile b/Makefile
index 67c0268..6ca065b 100644
--- a/Makefile
+++ b/Makefile
@@ -341,3 +341,20 @@  tarbin:
 
 # Include automatically generated dependency files
 -include $(wildcard *.d audio/*.d slirp/*.d block/*.d net/*.d ui/*.d)
+
+update-linux-headers:
+	for arch in x86 powerpc s390; do \
+		$(MAKE) -C $(LINUX) INSTALL_HDR_PATH=`pwd`/.tmp-hdrs SRCARCH="$$arch" headers_install; \
+		rm -rf $(SRC_PATH)/include/asm-"$$arch"/*; \
+		for header in kvm.h kvm_para.h; do \
+			cp .tmp-hdrs/include/asm/$$header $(SRC_PATH)/include/asm-"$$arch"; \
+		done; \
+		if test $$arch == x86; then \
+			cp .tmp-hdrs/include/asm/hyperv.h $(SRC_PATH)/include/asm-x86; \
+		fi \
+	done
+	rm -rf $(SRC_PATH)/include/linux/*
+	for header in kvm.h kvm_para.h vhost.h virtio_config.h virtio_ring.h; do \
+		cp .tmp-hdrs/include/linux/$$header $(SRC_PATH)/include/linux; \
+	done
+	rm -rf .tmp-hdrs
diff --git a/Makefile.target b/Makefile.target
index 89280c6..b0fe021 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -14,7 +14,7 @@  endif
 
 TARGET_PATH=$(SRC_PATH)/target-$(TARGET_BASE_ARCH)
 $(call set-vpath, $(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw)
-QEMU_CFLAGS+= -I.. -I$(TARGET_PATH) -DNEED_CPU_H
+QEMU_CFLAGS+= -I.. -I../include -I$(TARGET_PATH) -DNEED_CPU_H
 
 include $(SRC_PATH)/Makefile.objs
 
diff --git a/configure b/configure
index 3239fbb..792e4c2 100755
--- a/configure
+++ b/configure
@@ -113,8 +113,7 @@  curl=""
 curses=""
 docs=""
 fdt=""
-kvm=""
-kvm_para=""
+kvm="yes"
 nptl=""
 sdl=""
 vnc="yes"
@@ -129,7 +128,7 @@  vnc_thread="no"
 xen=""
 linux_aio=""
 attr=""
-vhost_net=""
+vhost_net="yes"
 xfs=""
 
 gprof="no"
@@ -1695,109 +1694,6 @@  EOF
 fi
 
 ##########################################
-# kvm probe
-if test "$kvm" != "no" ; then
-    cat > $TMPC <<EOF
-#include <linux/kvm.h>
-#if !defined(KVM_API_VERSION) || KVM_API_VERSION < 12 || KVM_API_VERSION > 12
-#error Invalid KVM version
-#endif
-EOF
-    must_have_caps="KVM_CAP_USER_MEMORY \
-                    KVM_CAP_DESTROY_MEMORY_REGION_WORKS \
-                    KVM_CAP_COALESCED_MMIO \
-                    KVM_CAP_SYNC_MMU \
-                   "
-    if test \( "$cpu" = "i386" -o "$cpu" = "x86_64" \) ; then
-      must_have_caps="$caps \
-                      KVM_CAP_SET_TSS_ADDR \
-                      KVM_CAP_EXT_CPUID \
-                      KVM_CAP_CLOCKSOURCE \
-                      KVM_CAP_NOP_IO_DELAY \
-                      KVM_CAP_PV_MMU \
-                      KVM_CAP_MP_STATE \
-                      KVM_CAP_USER_NMI \
-                     "
-    fi
-    for c in $must_have_caps ; do
-      cat >> $TMPC <<EOF
-#if !defined($c)
-#error Missing KVM capability $c
-#endif
-EOF
-    done
-    cat >> $TMPC <<EOF
-int main(void) { return 0; }
-EOF
-  if test "$kerneldir" != "" ; then
-      kvm_cflags=-I"$kerneldir"/include
-      if test \( "$cpu" = "i386" -o "$cpu" = "x86_64" \) \
-         -a -d "$kerneldir/arch/x86/include" ; then
-            kvm_cflags="$kvm_cflags -I$kerneldir/arch/x86/include"
-	elif test "$cpu" = "ppc" -a -d "$kerneldir/arch/powerpc/include" ; then
-	    kvm_cflags="$kvm_cflags -I$kerneldir/arch/powerpc/include"
-	elif test "$cpu" = "s390x" -a -d "$kerneldir/arch/s390/include" ; then
-	    kvm_cflags="$kvm_cflags -I$kerneldir/arch/s390/include"
-        elif test -d "$kerneldir/arch/$cpu/include" ; then
-            kvm_cflags="$kvm_cflags -I$kerneldir/arch/$cpu/include"
-      fi
-  else
-    kvm_cflags=`$pkg_config --cflags kvm-kmod 2>/dev/null`
-  fi
-  if compile_prog "$kvm_cflags" "" ; then
-    kvm=yes
-    cat > $TMPC <<EOF
-#include <linux/kvm_para.h>
-int main(void) { return 0; }
-EOF
-    if compile_prog "$kvm_cflags" "" ; then
-      kvm_para=yes
-    fi
-  else
-    if test "$kvm" = "yes" ; then
-      if has awk && has grep; then
-        kvmerr=`LANG=C $cc $QEMU_CFLAGS -o $TMPE $kvm_cflags $TMPC 2>&1 \
-	| grep "error: " \
-	| awk -F "error: " '{if (NR>1) printf(", "); printf("%s",$2);}'`
-        if test "$kvmerr" != "" ; then
-          echo -e "${kvmerr}\n\
-NOTE: To enable KVM support, update your kernel to 2.6.29+ or install \
-recent kvm-kmod from http://sourceforge.net/projects/kvm."
-        fi
-      fi
-      feature_not_found "kvm"
-    fi
-    kvm=no
-  fi
-fi
-
-##########################################
-# test for vhost net
-
-if test "$vhost_net" != "no"; then
-    if test "$kvm" != "no"; then
-            cat > $TMPC <<EOF
-    #include <linux/vhost.h>
-    int main(void) { return 0; }
-EOF
-            if compile_prog "$kvm_cflags" "" ; then
-                vhost_net=yes
-            else
-                if test "$vhost_net" = "yes" ; then
-                    feature_not_found "vhost-net"
-                fi
-                vhost_net=no
-            fi
-    else
-            if test "$vhost_net" = "yes" ; then
-                echo "NOTE: vhost-net feature requires KVM (--enable-kvm)."
-                feature_not_found "vhost-net"
-            fi
-            vhost_net=no
-    fi
-fi
-
-##########################################
 # pthread probe
 PTHREADLIBS_LIST="-lpthread -lpthreadGC2"
 
@@ -3251,9 +3147,7 @@  case "$target_arch2" in
       \( "$target_arch2" = "i386"   -a "$cpu" = "x86_64" \) \) ; then
       echo "CONFIG_KVM=y" >> $config_target_mak
       echo "KVM_CFLAGS=$kvm_cflags" >> $config_target_mak
-      if test "$kvm_para" = "yes"; then
-        echo "CONFIG_KVM_PARA=y" >> $config_target_mak
-      fi
+      echo "CONFIG_KVM_PARA=y" >> $config_target_mak
       if test $vhost_net = "yes" ; then
         echo "CONFIG_VHOST_NET=y" >> $config_target_mak
       fi
@@ -3449,6 +3343,21 @@  if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then
   esac
 fi
 
+# use included Linux headers
+includes="-I\$(SRC_PATH)/include $includes"
+mkdir -p include
+case "$cpu" in
+i386|x86_64)
+  symlink $source_path/include/asm-x86 include/asm
+  ;;
+ppcemb|ppc|ppc64)
+  symlink $source_path/include/asm-x86 include/asm
+  ;;
+s390x)
+  symlink $source_path/include/asm-s390 include/asm
+  ;;
+esac
+
 echo "LDFLAGS+=$ldflags" >> $config_target_mak
 echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
 echo "QEMU_INCLUDES+=$includes" >> $config_target_mak