* [PATCH v8 12/12] tests/vm: Add workaround to consume console
From: Robert Foley @ 2020-05-29 20:34 UTC (permalink / raw)
To: qemu-devel; +Cc: Fam Zheng, philmd, alex.bennee, robert.foley, peter.puhov
In-Reply-To: <20200529203458.1038-1-robert.foley@linaro.org>
This adds support to basevm.py so that we always
drain the console chars. This makes use of
support added in an earlier commit that allows
QEMUMachine to use the ConsoleSocket.
This is a workaround we found was needed since
there is a known issue where QEMU will hang waiting
for console characters to be consumed.
We also added the option of logging the console to a file.
LOG_CONSOLE=1 will now log the output to a file.
Signed-off-by: Robert Foley <robert.foley@linaro.org>
Reviewed-by: Peter Puhov <peter.puhov@linaro.org>
Acked-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/vm/Makefile.include | 4 ++++
tests/vm/basevm.py | 17 +++++++++++++++--
2 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/tests/vm/Makefile.include b/tests/vm/Makefile.include
index 8cccfaf95d..ad35c6e7a1 100644
--- a/tests/vm/Makefile.include
+++ b/tests/vm/Makefile.include
@@ -49,6 +49,7 @@ endif
@echo ' EXTRA_CONFIGURE_OPTS="..."'
@echo " J=[0..9]* - Override the -jN parameter for make commands"
@echo " DEBUG=1 - Enable verbose output on host and interactive debugging"
+ @echo " LOG_CONSOLE=1 - Log console to file in: ~/.cache/qemu-vm "
@echo " V=1 - Enable verbose ouput on host and guest commands"
@echo " QEMU_LOCAL=1 - Use QEMU binary local to this build."
@echo " QEMU=/path/to/qemu - Change path to QEMU binary"
@@ -75,6 +76,7 @@ $(IMAGES_DIR)/%.img: $(SRC_PATH)/tests/vm/% \
$(if $(GENISOIMAGE),--genisoimage $(GENISOIMAGE)) \
$(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \
$(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \
+ $(if $(LOG_CONSOLE),--log-console) \
--image "$@" \
--force \
--build-image $@, \
@@ -91,6 +93,7 @@ vm-build-%: $(IMAGES_DIR)/%.img
$(if $(V),--verbose) \
$(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \
$(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \
+ $(if $(LOG_CONSOLE),--log-console) \
--image "$<" \
$(if $(BUILD_TARGET),--build-target $(BUILD_TARGET)) \
--snapshot \
@@ -114,6 +117,7 @@ vm-boot-ssh-%: $(IMAGES_DIR)/%.img
$(if $(V)$(DEBUG), --debug) \
$(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \
$(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \
+ $(if $(LOG_CONSOLE),--log-console) \
--image "$<" \
--interactive \
false, \
diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py
index b9d828423b..64dbe64326 100644
--- a/tests/vm/basevm.py
+++ b/tests/vm/basevm.py
@@ -117,6 +117,11 @@ class BaseVM(object):
"w").write(self._config['ssh_pub_key'])
self.debug = args.debug
+ self._console_log_path = None
+ if args.log_console:
+ self._console_log_path = \
+ os.path.join(os.path.expanduser("~/.cache/qemu-vm"),
+ "{}.install.log".format(self.name))
self._stderr = sys.stderr
self._devnull = open(os.devnull, "w")
if self.debug:
@@ -271,7 +276,9 @@ class BaseVM(object):
args += self._data_args + extra_args + self._config['extra_args']
logging.debug("QEMU args: %s", " ".join(args))
qemu_path = get_qemu_path(self.arch, self._build_path)
- guest = QEMUMachine(binary=qemu_path, args=args)
+ guest = QEMUMachine(binary=qemu_path, args=args,
+ console_log=self._console_log_path,
+ drain_console=True)
guest.set_machine(self._config['machine'])
guest.set_console()
try:
@@ -285,6 +292,8 @@ class BaseVM(object):
raise
atexit.register(self.shutdown)
self._guest = guest
+ # Init console so we can start consuming the chars.
+ self.console_init()
usernet_info = guest.qmp("human-monitor-command",
command_line="info usernet")
self.ssh_port = None
@@ -296,7 +305,9 @@ class BaseVM(object):
raise Exception("Cannot find ssh port from 'info usernet':\n%s" % \
usernet_info)
- def console_init(self, timeout = 120):
+ def console_init(self, timeout = None):
+ if timeout == None:
+ timeout = self.socket_timeout
vm = self._guest
vm.console_socket.settimeout(timeout)
self.console_raw_path = os.path.join(vm._temp_dir,
@@ -578,6 +589,8 @@ def parse_args(vmcls):
parser.add_option("--efi-aarch64",
default="/usr/share/qemu-efi-aarch64/QEMU_EFI.fd",
help="Path to efi image for aarch64 VMs.")
+ parser.add_option("--log-console", action="store_true",
+ help="Log console to file.")
parser.disable_interspersed_args()
return parser.parse_args()
--
2.17.1
^ permalink raw reply related
* [xen-unstable-smoke test] 150502: regressions - trouble: blocked/fail
From: osstest service owner @ 2020-05-29 20:55 UTC (permalink / raw)
To: xen-devel, osstest-admin
flight 150502 xen-unstable-smoke real [real]
http://logs.test-lab.xenproject.org/osstest/logs/150502/
Regressions :-(
Tests which did not succeed and are blocking,
including tests which could not be run:
build-arm64-xsm 6 xen-build fail REGR. vs. 150438
build-amd64 6 xen-build fail REGR. vs. 150438
build-armhf 6 xen-build fail REGR. vs. 150438
Tests which did not succeed, but are not blocking:
test-amd64-amd64-libvirt 1 build-check(1) blocked n/a
test-arm64-arm64-xl-xsm 1 build-check(1) blocked n/a
build-amd64-libvirt 1 build-check(1) blocked n/a
test-amd64-amd64-xl-qemuu-debianhvm-amd64 1 build-check(1) blocked n/a
test-armhf-armhf-xl 1 build-check(1) blocked n/a
version targeted for testing:
xen 8e2aa76dc1670e82eaa15683353853bc66bf54fc
baseline version:
xen 1497e78068421d83956f8e82fb6e1bf1fc3b1199
Last test of basis 150438 2020-05-28 14:01:19 Z 1 days
Failing since 150465 2020-05-29 09:02:14 Z 0 days 8 attempts
Testing same since 150498 2020-05-29 18:01:30 Z 0 days 2 attempts
------------------------------------------------------------
People who touched revisions under test:
Andrew Cooper <andrew.cooper3@citrix.com>
Andrew Cooper <andrew.cooper@citrix.com>
Dario Faggioli <dfaggioli@suse.com>
Ian Jackson <ian.jackson@eu.citrix.com>
Jan Beulich <jbeulich@suse.com>
Juergen Gross <jgross@suse.com>
Julien Grall <jgrall@amazon.com>
Roger Pau Monné <roger.pau@citrix.com>
Tamas K Lengyel <tamas@tklengyel.com>
Wei Liu <wl@xen.org>
jobs:
build-arm64-xsm fail
build-amd64 fail
build-armhf fail
build-amd64-libvirt blocked
test-armhf-armhf-xl blocked
test-arm64-arm64-xl-xsm blocked
test-amd64-amd64-xl-qemuu-debianhvm-amd64 blocked
test-amd64-amd64-libvirt blocked
------------------------------------------------------------
sg-report-flight on osstest.test-lab.xenproject.org
logs: /home/logs/logs
images: /home/logs/images
Logs, config files, etc. are available at
http://logs.test-lab.xenproject.org/osstest/logs
Explanation of these reports, and of osstest in general, is at
http://xenbits.xen.org/gitweb/?p=osstest.git;a=blob;f=README.email;hb=master
http://xenbits.xen.org/gitweb/?p=osstest.git;a=blob;f=README;hb=master
Test harness code can be found at
http://xenbits.xen.org/gitweb?p=osstest.git;a=summary
Not pushing.
(No revision log; it would be 773 lines long.)
^ permalink raw reply
* [PATCH v2 3/4] configure: add flags to support SafeStack
From: Daniele Buono @ 2020-05-29 20:51 UTC (permalink / raw)
To: qemu-devel
Cc: Kevin Wolf, Daniel P . Berrangé, Stefan Hajnoczi,
Paolo Bonzini, Philippe Mathieu-Daudé, dbuono
In-Reply-To: <20200529205122.714-1-dbuono@linux.vnet.ibm.com>
This patch adds a flag to enable/disable the SafeStack instrumentation
provided by LLVM.
On enable, make sure that the compiler supports the flags, and that we
are using the proper coroutine implementation (coroutine-ucontext).
On disable, explicitly disable the option if it was enabled by default.
While SafeStack is supported only on Linux, NetBSD, FreeBSD and macOS,
we are not checking for the O.S. since this is already done by LLVM.
Signed-off-by: Daniele Buono <dbuono@linux.vnet.ibm.com>
---
configure | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 73 insertions(+)
diff --git a/configure b/configure
index b969dee675..260772b2d5 100755
--- a/configure
+++ b/configure
@@ -302,6 +302,7 @@ audio_win_int=""
libs_qga=""
debug_info="yes"
stack_protector=""
+safe_stack=""
use_containers="yes"
gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
@@ -1275,6 +1276,10 @@ for opt do
;;
--disable-stack-protector) stack_protector="no"
;;
+ --enable-safe-stack) safe_stack="yes"
+ ;;
+ --disable-safe-stack) safe_stack="no"
+ ;;
--disable-curses) curses="no"
;;
--enable-curses) curses="yes"
@@ -1804,6 +1809,8 @@ disabled with --disable-FEATURE, default is enabled if available:
debug-tcg TCG debugging (default is disabled)
debug-info debugging information
sparse sparse checker
+ safe-stack SafeStack Stack Smash Protection. Depends on
+ clang/llvm >= 3.7 and requires coroutine backend ucontext.
gnutls GNUTLS cryptography support
nettle nettle cryptography support
@@ -5517,6 +5524,67 @@ if test "$debug_stack_usage" = "yes"; then
fi
fi
+##################################################
+# SafeStack
+
+
+if test "$safe_stack" = "yes"; then
+cat > $TMPC << EOF
+int main(int argc, char *argv[])
+{
+#if ! __has_feature(safe_stack)
+#error SafeStack Disabled
+#endif
+ return 0;
+}
+EOF
+ flag="-fsanitize=safe-stack"
+ # Check that safe-stack is supported and enabled.
+ if compile_prog "-Werror $flag" "$flag"; then
+ # Flag needed both at compilation and at linking
+ QEMU_CFLAGS="$QEMU_CFLAGS $flag"
+ QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
+ else
+ error_exit "SafeStack not supported by your compiler"
+ fi
+ if test "$coroutine" != "ucontext"; then
+ error_exit "SafeStack is only supported by the coroutine backend ucontext"
+ fi
+else
+cat > $TMPC << EOF
+int main(int argc, char *argv[])
+{
+#if defined(__has_feature)
+#if __has_feature(safe_stack)
+#error SafeStack Enabled
+#endif
+#endif
+ return 0;
+}
+EOF
+if test "$safe_stack" = "no"; then
+ # Make sure that safe-stack is disabled
+ if ! compile_prog "-Werror" ""; then
+ # SafeStack was already enabled, try to explicitly remove the feature
+ flag="-fno-sanitize=safe-stack"
+ if ! compile_prog "-Werror $flag" "$flag"; then
+ error_exit "Configure cannot disable SafeStack"
+ fi
+ QEMU_CFLAGS="$QEMU_CFLAGS $flag"
+ QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
+ fi
+else # "$safe_stack" = ""
+ # Set safe_stack to yes or no based on pre-existing flags
+ if compile_prog "-Werror" ""; then
+ safe_stack="no"
+ else
+ safe_stack="yes"
+ if test "$coroutine" != "ucontext"; then
+ error_exit "SafeStack is only supported by the coroutine backend ucontext"
+ fi
+ fi
+fi
+fi
##########################################
# check if we have open_by_handle_at
@@ -6611,6 +6679,7 @@ echo "sparse enabled $sparse"
echo "strip binaries $strip_opt"
echo "profiler $profiler"
echo "static build $static"
+echo "safe stack $safe_stack"
if test "$darwin" = "yes" ; then
echo "Cocoa support $cocoa"
fi
@@ -8195,6 +8264,10 @@ if test "$ccache_cpp2" = "yes"; then
echo "export CCACHE_CPP2=y" >> $config_host_mak
fi
+if test "$safe_stack" = "yes"; then
+ echo "CONFIG_SAFESTACK=y" >> $config_host_mak
+fi
+
# If we're using a separate build tree, set it up now.
# DIRS are directories which we simply mkdir in the build tree;
# LINKS are things to symlink back into the source tree
--
2.26.2
^ permalink raw reply related
* [PATCH v2 1/4] coroutine: support SafeStack in ucontext backend
From: Daniele Buono @ 2020-05-29 20:51 UTC (permalink / raw)
To: qemu-devel
Cc: Kevin Wolf, Daniel P . Berrangé, Stefan Hajnoczi,
Paolo Bonzini, Philippe Mathieu-Daudé, dbuono
In-Reply-To: <20200529205122.714-1-dbuono@linux.vnet.ibm.com>
LLVM's SafeStack instrumentation does not yet support programs that make
use of the APIs in ucontext.h
With the current implementation of coroutine-ucontext, the resulting
binary is incorrect, with different coroutines sharing the same unsafe
stack and producing undefined behavior at runtime.
This fix allocates an additional unsafe stack area for each coroutine,
and sets the new unsafe stack pointer before calling swapcontext() in
qemu_coroutine_new.
This is the only place where the pointer needs to be manually updated,
since sigsetjmp/siglongjmp are already instrumented by LLVM to properly
support SafeStack.
The additional stack is then freed in qemu_coroutine_delete.
Signed-off-by: Daniele Buono <dbuono@linux.vnet.ibm.com>
---
include/qemu/coroutine_int.h | 5 +++++
util/coroutine-ucontext.c | 26 ++++++++++++++++++++++++++
2 files changed, 31 insertions(+)
diff --git a/include/qemu/coroutine_int.h b/include/qemu/coroutine_int.h
index bd6b0468e1..1da148552f 100644
--- a/include/qemu/coroutine_int.h
+++ b/include/qemu/coroutine_int.h
@@ -28,6 +28,11 @@
#include "qemu/queue.h"
#include "qemu/coroutine.h"
+#ifdef CONFIG_SAFESTACK
+/* Pointer to the unsafe stack, defined by the compiler */
+extern __thread void *__safestack_unsafe_stack_ptr;
+#endif
+
#define COROUTINE_STACK_SIZE (1 << 20)
typedef enum {
diff --git a/util/coroutine-ucontext.c b/util/coroutine-ucontext.c
index bd593e61bc..9108eb1294 100644
--- a/util/coroutine-ucontext.c
+++ b/util/coroutine-ucontext.c
@@ -41,6 +41,11 @@ typedef struct {
Coroutine base;
void *stack;
size_t stack_size;
+#ifdef CONFIG_SAFESTACK
+ /* Need an unsafe stack for each coroutine */
+ void *unsafe_stack;
+ size_t unsafe_stack_size;
+#endif
sigjmp_buf env;
#ifdef CONFIG_VALGRIND_H
@@ -140,6 +145,10 @@ Coroutine *qemu_coroutine_new(void)
co = g_malloc0(sizeof(*co));
co->stack_size = COROUTINE_STACK_SIZE;
co->stack = qemu_alloc_stack(&co->stack_size);
+#ifdef CONFIG_SAFESTACK
+ co->unsafe_stack_size = COROUTINE_STACK_SIZE;
+ co->unsafe_stack = qemu_alloc_stack(&co->unsafe_stack_size);
+#endif
co->base.entry_arg = &old_env; /* stash away our jmp_buf */
uc.uc_link = &old_uc;
@@ -160,6 +169,20 @@ Coroutine *qemu_coroutine_new(void)
/* swapcontext() in, siglongjmp() back out */
if (!sigsetjmp(old_env, 0)) {
start_switch_fiber(&fake_stack_save, co->stack, co->stack_size);
+#ifdef CONFIG_SAFESTACK
+ /*
+ * Before we swap the context, set the new unsafe stack
+ * The unsafe stack grows just like the normal stack, so start from
+ * the last usable location of the memory area.
+ * NOTE: we don't have to re-set the usp afterwards because we are
+ * coming back to this context through a siglongjmp.
+ * The compiler already wrapped the corresponding sigsetjmp call with
+ * code that saves the usp on the (safe) stack before the call, and
+ * restores it right after (which is where we return with siglongjmp).
+ */
+ void *usp = co->unsafe_stack + co->unsafe_stack_size;
+ __safestack_unsafe_stack_ptr = usp;
+#endif
swapcontext(&old_uc, &uc);
}
@@ -192,6 +215,9 @@ void qemu_coroutine_delete(Coroutine *co_)
#endif
qemu_free_stack(co->stack, co->stack_size);
+#ifdef CONFIG_SAFESTACK
+ qemu_free_stack(co->unsafe_stack, co->unsafe_stack_size);
+#endif
g_free(co);
}
--
2.26.2
^ permalink raw reply related
* Re: [PATCH] dl-runtime: reloc_{offset,index} now functions arch overide'able
From: Adhemerval Zanella @ 2020-05-29 20:54 UTC (permalink / raw)
To: Vineet Gupta, libc-alpha@sourceware.org
Cc: linux-snps-arc@lists.infradead.org
In-Reply-To: <0f9ad824-2278-a55b-7203-96497f06c198@synopsys.com>
On 29/05/2020 14:39, Vineet Gupta wrote:
> On 5/29/20 5:58 AM, Adhemerval Zanella via Libc-alpha wrote:
>>
>>
>> On 28/05/2020 16:43, Vineet Gupta wrote:
>>> The existing macros are fragile and expect local variables with a
>>> certain name. Fix this by defining them as functions with defaul
>>> timplementation in a new header dl-runtime.h which arches can overrid
>>> eif need be.
>>>
>>> This came up during ARC port review.
>>>
>>> This patch potentially only affects hppa/x86 ports,
>>> build tested for both those configs and a few more.
>>>
>>> Suggested-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
>>
>> LGTM, thanks.
>>
>> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
>
> Sorry I didn't think through this before, but ARC port needs pltgot arg (runtime
> address of plt0) in reloc_index not reloc_offset. I'll swap them and repost.
Hum I though I had it covered on my suggestion, but it seems I mixed them
up. Ok, I will review the new version.
_______________________________________________
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc
^ permalink raw reply
* Re: Some -serious- BPF-related litmus tests
From: Peter Zijlstra @ 2020-05-29 20:53 UTC (permalink / raw)
To: Andrii Nakryiko
Cc: Joel Fernandes, Paul E. McKenney, Andrii Nakryiko, Alan Stern,
parri.andrea, will, Boqun Feng, npiggin, dhowells, j.alglave,
luc.maranget, Akira Yokosawa, dlustig, open list, linux-arch
In-Reply-To: <CAEf4Bzb9D1jTdmUzopc35qmFopaW-UfvLO9ohFsFsBuLVm0ZCw@mail.gmail.com>
On Fri, May 29, 2020 at 01:01:51PM -0700, Andrii Nakryiko wrote:
> > question though; why are you using xchg() for the commit? Isn't that
> > more expensive than it should be?
> >
> > That is, why isn't that:
> >
> > smp_store_release(&hdr->len, new_len);
> >
> > ? Or are you needing the smp_mb() for the store->load ordering for the
> > ->consumer_pos load? That really needs a comment.
>
> Yeah, smp_store_release() is not strong enough, this memory barrier is
> necessary. And yeah, I'll follow up with some more comments, that's
> been what Joel requested as well.
Ok, great.
> > I think you can get rid of the smp_load_acquire() there, you're ordering
> > a load->store and could rely on the branch to do that:
> >
> > cons_pos = READ_ONCE(&rb->consumer_pos) & rb->mask;
> > if ((flags & BPF_RB_FORCE_WAKEUP) || (cons_pos == rec_pos && !(flags &BPF_RB_NO_WAKEUP))
> > irq_work_queue(&rq->work);
> >
> > should be a control dependency.
>
> Could be. I tried to keep consistent
> smp_load_acquire/smp_store_release usage to keep it simpler. It might
> not be the absolutely minimal amount of ordering that would still be
> correct. We might be able to tweak and tune this without changing
> correctness.
We can even rely on the irq_work_queue() being an atomic, but sure, get
it all working and correct first before you wreck it ;-)
^ permalink raw reply
* Re: Lost PCIe PME after a914ff2d78ce ("PCI/ASPM: Don't select CONFIG_PCIEASPM by default")
From: Heiner Kallweit @ 2020-05-29 20:53 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: Rafael J. Wysocki, Bjorn Helgaas, linux-pci@vger.kernel.org,
linux-kernel, linux-acpi, Matthew Garrett
In-Reply-To: <20200529202135.GA461617@bjorn-Precision-5520>
On 29.05.2020 22:21, Bjorn Helgaas wrote:
> [+cc Matthew]
>
> On Fri, May 29, 2020 at 10:09:08PM +0200, Heiner Kallweit wrote:
>> On 29.05.2020 21:40, Heiner Kallweit wrote:
>>> On 29.05.2020 21:21, Bjorn Helgaas wrote:
>>>> On Fri, May 29, 2020 at 08:50:46PM +0200, Heiner Kallweit wrote:
>>>>> On 28.05.2020 23:44, Heiner Kallweit wrote:
>>>>>> For whatever reason with this change (and losing ASPM control) I also
>>>>>> loose the PCIe PME interrupts. This prevents my network card from
>>>>>> resuming from runtime-suspend.
>>>>>> Reverting the change brings back ASPM control and the PCIe PME irq's.
>>>>>>
>>>>>> Affected system is a Zotac MiniPC with a N3450 CPU:
>>>>>> PCI bridge: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #1 (rev fb)
>>>>>>
>>>>> I checked a little bit further and w/o ASPM control the root ports
>>>>> don't have the PME service bit set in their capabilities.
>>>>> Not sure whether this is a chipset bug or whether there's a better
>>>>> explanation. However more chipsets may have such a behavior.
>>>>
>>>> Hmm. Is the difference simply changing the PCIEASPM config symbol, or
>>>> are you booting with command-line arguments like "pcie_aspm=off"?
>>>>
>>> Only difference is the config symbol. My command line is plain and simple:
>>>
>>> Command line: initrd=\intel-ucode.img initrd=\initramfs-linux.img root=/dev/sda2 rw
>>>
>>>> What's the specific PME bit that changes in the root ports? Can you
>>>> collect the "sudo lspci -vvxxxx" output with and without ASPM?
>>>>
>>>> The capability bits are generally read-only as far as the PCI spec is
>>>> concerned, but devices have implementation-specific knobs that the
>>>> BIOS may use to change things. Without CONFIG_PCIEASPM, Linux will
>>>> not request control of LTR, and that could cause the BIOS to change
>>>> something. You should be able to see the LTR control difference in
>>>> the dmesg logging about _OSC.
>>>>
>>>>> W/o the "default y" for ASPM control we also have the situation now
>>>>> that the config option description says "When in doubt, say Y."
>>>>> but it takes the EXPERT mode to enable it. This seems to be a little
>>>>> bit inconsistent.
>>>>
>>>> We should probably remove the "if EXPERT" from the PCIEASPM kconfig.
>>>> But I would expect PME to work correctly regardless of PCIEASPM, so
>>>> removing "if EXPERT" doesn't solve the underlying problem.
>>>>
>>>> Rafael, does this ring any bells for you? I don't remember a
>>>> connection between PME and ASPM, but maybe there is one.
>>>>
>>>>> To cut a long story short:
>>>>> At least on some systems this change has unwanted side effects.
>>>
>>> lspci output w/ and w/o ASPM is attached incl. a diff.
>>> Here comes the _OSC difference.
>>>
>>> w/o ASPM
>>>
>>> [ 0.386063] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig Segments MSI HPX-Type3]
>>> [ 0.386918] acpi PNP0A08:00: _OSC: not requesting OS control; OS requires [ExtendedConfig ASPM ClockPM MSI]
>>>
>>> w/ ASPM
>>> [ 0.388141] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI HPX-Type3]
>>> [ 0.393648] acpi PNP0A08:00: _OSC: OS now controls [PME AER PCIeCapability LTR]
>>>
>>> It's at least interesting that w/o ASPM OS doesn't control PME and AER.
>>>
>>
>> This was the right entry point, also w/o ASPM control OS states to ACPI that it
>> needs ASPM and ClockPM. The following patch fixes the PME issue for me.
>> See also the _OSC part below.
>>
>>
>> diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
>> index 9e235c1a7..8df1fa728 100644
>> --- a/drivers/acpi/pci_root.c
>> +++ b/drivers/acpi/pci_root.c
>> @@ -38,10 +38,15 @@ static int acpi_pci_root_scan_dependent(struct acpi_device *adev)
>> return 0;
>> }
>>
>> +#ifdef CONFIG_PCIEASPM
>> #define ACPI_PCIE_REQ_SUPPORT (OSC_PCI_EXT_CONFIG_SUPPORT \
>> | OSC_PCI_ASPM_SUPPORT \
>> | OSC_PCI_CLOCK_PM_SUPPORT \
>> | OSC_PCI_MSI_SUPPORT)
>> +#else
>> +#define ACPI_PCIE_REQ_SUPPORT (OSC_PCI_EXT_CONFIG_SUPPORT \
>> + | OSC_PCI_MSI_SUPPORT)
>> +#endif
>
> Yeah, that makes sense. I can't remember the details, but I'm pretty
> sure there's a reason why we ask for the whole set of things. Seems
> like it solved some problem. I think Matthew Garrett might have been
> involved in that.
>
ACPI_PCIE_REQ_SUPPORT was introduced with 415e12b23792 ("PCI/ACPI:
Request _OSC control once for each root bridge (v3)") in 2011.
It's linked to the following bug report:
https://bugzilla.kernel.org/show_bug.cgi?id=20232
I can't say whether there's a chance that the proposed patch would
bring back the issue discussed at that time.
If somebody thinks that the proposed patch isn't the right solution,
then presumably the following needs to be touched.
if ((support & ACPI_PCIE_REQ_SUPPORT) != ACPI_PCIE_REQ_SUPPORT) {
decode_osc_support(root, "not requesting OS control; OS requires",
ACPI_PCIE_REQ_SUPPORT);
return;
}
control = OSC_PCI_EXPRESS_CAPABILITY_CONTROL
| OSC_PCI_EXPRESS_PME_CONTROL;
^ permalink raw reply
* [PATCH v8 11/12] python/qemu: Add ConsoleSocket for optional use in QEMUMachine
From: Robert Foley @ 2020-05-29 20:34 UTC (permalink / raw)
To: qemu-devel
Cc: robert.foley, alex.bennee, Cleber Rosa, peter.puhov, philmd,
Eduardo Habkost
In-Reply-To: <20200529203458.1038-1-robert.foley@linaro.org>
We add the ConsoleSocket object, which has a socket interface
and which will consume all arriving characters on the
socket, placing them into an in memory buffer.
This will also provide those chars via recv() as
would a regular socket.
ConsoleSocket also has the option of dumping
the console bytes to a log file.
We also give QEMUMachine the option of using ConsoleSocket
to drain and to use for logging console to a file.
By default QEMUMachine does not use ConsoleSocket.
This is added in preparation for use by basevm.py in a later commit.
This is a workaround we found was needed for basevm.py since
there is a known issue where QEMU will hang waiting
for console characters to be consumed.
Cc: Eduardo Habkost <ehabkost@redhat.com>
Cc: Cleber Rosa <crosa@redhat.com>
Signed-off-by: Robert Foley <robert.foley@linaro.org>
Reviewed-by: Peter Puhov <peter.puhov@linaro.org>
Acked-by: Alex Bennée <alex.bennee@linaro.org>
---
python/qemu/console_socket.py | 118 ++++++++++++++++++++++++++++++++++
python/qemu/machine.py | 23 +++++--
2 files changed, 137 insertions(+), 4 deletions(-)
create mode 100644 python/qemu/console_socket.py
diff --git a/python/qemu/console_socket.py b/python/qemu/console_socket.py
new file mode 100644
index 0000000000..2fe1c20d64
--- /dev/null
+++ b/python/qemu/console_socket.py
@@ -0,0 +1,118 @@
+#!/usr/bin/env python3
+#
+# This python module implements a ConsoleSocket object which is
+# designed always drain the socket itself, and place
+# the bytes into a in memory buffer for later processing.
+#
+# Optionally a file path can be passed in and we will also
+# dump the characters to this file for debug.
+#
+# Copyright 2020 Linaro
+#
+# Authors:
+# Robert Foley <robert.foley@linaro.org>
+#
+# This code is licensed under the GPL version 2 or later. See
+# the COPYING file in the top-level directory.
+#
+import asyncore
+import socket
+import threading
+import io
+import os
+import sys
+from collections import deque
+import time
+import traceback
+
+class ConsoleSocket(asyncore.dispatcher):
+
+ def __init__(self, address, file=None):
+ self._recv_timeout_sec = 300
+ self._buffer = deque()
+ self._asyncore_thread = None
+ self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ self._sock.connect(address)
+ self._logfile = None
+ if file:
+ self._logfile = open(file, "w")
+ asyncore.dispatcher.__init__(self, sock=self._sock)
+ self._thread_start()
+ self._open = True
+
+ def _thread_start(self):
+ """Kick off a thread to wait on the asyncore.loop"""
+ if self._asyncore_thread is not None:
+ return
+ self._asyncore_thread = threading.Thread(target=asyncore.loop,
+ kwargs={'timeout':1})
+ self._asyncore_thread.daemon = True
+ self._asyncore_thread.start()
+
+ def handle_close(self):
+ """redirect close to base class"""
+ # Call the base class close, but not self.close() since
+ # handle_close() occurs in the context of the thread which
+ # self.close() attempts to join.
+ asyncore.dispatcher.close(self)
+
+ def close(self):
+ """Close the base object and wait for the thread to terminate"""
+ if self._open:
+ self._open = False
+ asyncore.dispatcher.close(self)
+ if self._asyncore_thread is not None:
+ thread, self._asyncore_thread = self._asyncore_thread, None
+ thread.join()
+ if self._logfile:
+ self._logfile.close()
+ self._logfile = None
+
+ def handle_read(self):
+ """process arriving characters into in memory _buffer"""
+ try:
+ data = asyncore.dispatcher.recv(self, 1)
+ # latin1 is needed since there are some chars
+ # we are receiving that cannot be encoded to utf-8
+ # such as 0xe2, 0x80, 0xA6.
+ string = data.decode("latin1")
+ except:
+ print("Exception seen.")
+ traceback.print_exc()
+ return
+ if self._logfile:
+ self._logfile.write("{}".format(string))
+ self._logfile.flush()
+ for c in string:
+ self._buffer.append(c)
+
+ def recv(self, n=1):
+ """Return chars from in memory buffer"""
+ start_time = time.time()
+ while len(self._buffer) < n:
+ time.sleep(0.1)
+ elapsed_sec = time.time() - start_time
+ if elapsed_sec > self._recv_timeout_sec:
+ raise socket.timeout
+ chars = ''.join([self._buffer.popleft() for i in range(n)])
+ # We choose to use latin1 to remain consistent with
+ # handle_read() and give back the same data as the user would
+ # receive if they were reading directly from the
+ # socket w/o our intervention.
+ return chars.encode("latin1")
+
+ def set_blocking(self):
+ """Maintain compatibility with socket API"""
+ pass
+
+ def settimeout(self, seconds):
+ """Set current timeout on recv"""
+ self._recv_timeout_sec = seconds
+
+class ByteBuffer(deque):
+ """Simple in memory buffer with read/write interface"""
+ def write(self, bytes):
+ for i in bytes:
+ self.append(i)
+ def read(self, n):
+ return ''.join([self.popleft() for i in range(n)])
diff --git a/python/qemu/machine.py b/python/qemu/machine.py
index b9a98e2c86..ee9c337f55 100644
--- a/python/qemu/machine.py
+++ b/python/qemu/machine.py
@@ -24,6 +24,7 @@ import subprocess
import shutil
import socket
import tempfile
+from qemu.console_socket import ConsoleSocket
from . import qmp
@@ -71,7 +72,8 @@ class QEMUMachine(object):
def __init__(self, binary, args=None, wrapper=None, name=None,
test_dir="/var/tmp", monitor_address=None,
- socket_scm_helper=None, sock_dir=None):
+ socket_scm_helper=None, sock_dir=None,
+ drain_console=False, console_log=None):
'''
Initialize a QEMUMachine
@@ -82,6 +84,9 @@ class QEMUMachine(object):
@param test_dir: where to create socket and log file
@param monitor_address: address for QMP monitor
@param socket_scm_helper: helper program, required for send_fd_scm()
+ @param sock_dir: where to create socket (overrides test_dir for sock)
+ @param console_log: (optional) path to console log file
+ @param drain_console: (optional) True to drain console socket to buffer
@note: Qemu process is not started until launch() is used.
'''
if args is None:
@@ -118,6 +123,12 @@ class QEMUMachine(object):
self._console_address = None
self._console_socket = None
self._remove_files = []
+ self._console_log_path = console_log
+ if self._console_log_path:
+ # In order to log the console, buffering needs to be enabled.
+ self._drain_console = True
+ else:
+ self._drain_console = drain_console
# just in case logging wasn't configured by the main script:
logging.basicConfig()
@@ -568,7 +579,11 @@ class QEMUMachine(object):
Returns a socket connected to the console
"""
if self._console_socket is None:
- self._console_socket = socket.socket(socket.AF_UNIX,
- socket.SOCK_STREAM)
- self._console_socket.connect(self._console_address)
+ if self._drain_console:
+ self._console_socket = ConsoleSocket(self._console_address,
+ file=self._console_log_path)
+ else:
+ self._console_socket = socket.socket(socket.AF_UNIX,
+ socket.SOCK_STREAM)
+ self._console_socket.connect(self._console_address)
return self._console_socket
--
2.17.1
^ permalink raw reply related
* Re: [PATCHv4 0/5] scsi: use xarray for devices and targets
From: Douglas Gilbert @ 2020-05-29 20:53 UTC (permalink / raw)
To: Hannes Reinecke, Martin K. Petersen
Cc: Christoph Hellwig, Daniel Wagner, Johannes Thumshirn,
James Bottomley, linux-scsi
In-Reply-To: <20200529134730.146573-1-hare@suse.de>
[-- Attachment #1: Type: text/plain, Size: 8028 bytes --]
On 2020-05-29 9:47 a.m., Hannes Reinecke wrote:
> Hi all,
>
> based on the ideas from Doug Gilbert here's now my take on using
> xarrays for devices and targets.
> It revolves around two ideas:
>
> - The scsi target 'channel' and 'id' numbers are never ever used
> to the full 32 bit range; channels are well below 10, and no
> driver is using more than 16 bits for the id. So we can reduce
> the type of 'channel' and 'id' to 16 bits, and use the 32 bit
> value 'channel << 16 | id' as the index into the target xarray.
> - Most SCSI targets are only using the first 32 bits of the 64 bit
> LUN structure. So there we can use the LUN number as the index into
> the xarray; larger LUN numbers won't fit, so we'll allocate a
> separate index for those. For these device lookup won't be as
> efficient, but one can argue that we're running into scalability
> issues long before that.
>
> With these changes we can implement an efficient lookup mechanism,
> devolving into direct lookup for most cases.
> And iteration over devices should be as efficient as the current,
> list-based, approach.
>
> It also removes the current duality between host-based and
> target-based device lists; now all devices are listed per target,
> and a full iteration would need to iterate first over all targets
> and then over all devices per target.
>
> As usual, comments and reviews are welcome
>
> Changes to v1:
> - Fixup __scsi_iterate_devices()
> - Include reviews from Johannes
> - Minor fixes
> - Include comments from Doug
>
> Changes to v2:
> - Reshuffle hunks as per suggestion from Johannes
>
> Changes to v3:
> - Use GFP_ATOMIC instead of GFP_KERNEL
> - Fixup target iteration as reported by Doug Gilbert
> - Update scsi_error to make use of the new iterators
>
> Hannes Reinecke (5):
> scsi: convert target lookup to xarray
> target_core_pscsi: use __scsi_device_lookup()
> scsi: move target device list to xarray
> scsi: remove direct device lookup per host
> scsi_error: use xarray lookup instead of wrappers
>
> drivers/scsi/hosts.c | 4 +-
> drivers/scsi/scsi.c | 151 +++++++++++++++++++++++++++++--------
> drivers/scsi/scsi_error.c | 35 +++++----
> drivers/scsi/scsi_lib.c | 9 +--
> drivers/scsi/scsi_priv.h | 2 +
> drivers/scsi/scsi_scan.c | 73 +++++++++---------
> drivers/scsi/scsi_sysfs.c | 48 ++++++++----
> drivers/target/target_core_pscsi.c | 8 +-
> include/scsi/scsi_device.h | 32 +++++---
> include/scsi/scsi_host.h | 5 +-
> 10 files changed, 243 insertions(+), 124 deletions(-)
>
Hannes,
I'm pretty sure this one was happening yesterday, around about the same
number of sdev_s (i.e. sg791). The missing 0:0:1:0, 0:0:2:0, etc
distracted me. That is now fixed. See attached.
It was executing an rmmod at the time in the tst_sdebug_modpr_rmmod.sh
script. Just checked my logs from yesterday. It blew up at the same spot
in the code (but after /dev/sg971):
...
2020-05-28T20:44:31.543998-04:00 xtwo70 kernel: scsi 11:0:8:8: Attached scsi
generic sg969 type 9
2020-05-28T20:44:31.545999-04:00 xtwo70 kernel: scsi 11:0:8:9: Attached scsi
generic sg970 type 9
2020-05-28T20:44:31.558008-04:00 xtwo70 kernel: scsi 11:0:8:10: Attached scsi
generic sg971 type 9
2020-05-28T20:44:45.660126-04:00 xtwo70 kernel: [UFW BLOCK] IN=enp0s31f6 OUT=
MAC=54:e1:ad:36:d8:55:00:15:99:30:1d:2b:08:00 SRC=192.168.48.94
DST=192.168.48.23 LEN=224 TOS=0x00 PREC=0x00 TTL=64 ID=34650 PROTO=UDP SPT=161
DPT=48409 LEN=204
2020-05-28T20:44:45.692021-04:00 xtwo70 kernel: [UFW BLOCK] IN=enp0s31f6 OUT=
MAC=54:e1:ad:36:d8:55:00:15:99:e9:97:99:08:00 SRC=192.168.48.55
DST=192.168.48.23 LEN=258 TOS=0x00 PREC=0x00 TTL=64 ID=60034 PROTO=UDP SPT=161
DPT=48409 LEN=238
2020-05-28T20:44:46.660191-04:00 xtwo70 kernel: [UFW BLOCK] IN=enp0s31f6 OUT=
MAC=54:e1:ad:36:d8:55:00:15:99:e9:97:99:08:00 SRC=192.168.48.55
DST=192.168.48.23 LEN=258 TOS=0x00 PREC=0x00 TTL=64 ID=60290 PROTO=UDP SPT=161
DPT=48409 LEN=238
2020-05-28T20:44:46.660273-04:00 xtwo70 kernel: [UFW BLOCK] IN=enp0s31f6 OUT=
MAC=54:e1:ad:36:d8:55:00:15:99:30:1d:2b:08:00 SRC=192.168.48.94
DST=192.168.48.23 LEN=224 TOS=0x00 PREC=0x00 TTL=64 ID=34651 PROTO=UDP SPT=161
DPT=48409 LEN=204
2020-05-28T20:46:46.306581-04:00 xtwo70 systemd-resolved[1953]: Server returned
error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001, retrying
transaction with reduced feature level UDP.
2020-05-28T20:47:05.776485-04:00 xtwo70 kernel: BUG: unable to handle page fault
for address: ffff8881327c6868
2020-05-28T20:47:05.776504-04:00 xtwo70 kernel: #PF: supervisor read access in
kernel mode
2020-05-28T20:47:05.776506-04:00 xtwo70 kernel: #PF: error_code(0x0000) -
not-present page
2020-05-28T20:47:05.776507-04:00 xtwo70 kernel: PGD 3c01067 P4D 3c01067 PUD
22f031067 PMD 22ee9d067 PTE 800ffffecd839060
2020-05-28T20:47:05.776509-04:00 xtwo70 kernel: Oops: 0000 [#1] PREEMPT SMP
DEBUG_PAGEALLOC PTI
2020-05-28T20:47:05.776510-04:00 xtwo70 kernel: CPU: 2 PID: 4647 Comm: rmmod Not
tainted 5.7.0-rc1+ #74
2020-05-28T20:47:05.776511-04:00 xtwo70 kernel: Hardware name: LENOVO
20K5S27Q02/20K5S27Q02, BIOS R0IET60W (1.38 ) 12/19/2019
2020-05-28T20:47:05.776512-04:00 xtwo70 kernel: RIP: 0010:xas_start+0x2a/0x1c0
2020-05-28T20:47:05.776513-04:00 xtwo70 kernel: Code: 41 55 41 54 55 53 48 8b 47
18 48 89 fb 48 89 c2 83 e2 03 0f 84 8d 00 00 00 48 3d 05 c0 ff ff 76 06 48 83 fa
02 74 50 4c 8b 2b <49> 8b 6d 50 e8 fd 2f c2 ff 85 c0 49 89 ec 74 0d 80 3d ef f0
e4 00
2020-05-28T20:47:05.776514-04:00 xtwo70 kernel: RSP: 0000:ffffc900005bbc90
EFLAGS: 00010013
2020-05-28T20:47:05.776514-04:00 xtwo70 kernel: RAX: 0000000000000003 RBX:
ffffc900005bbd00 RCX: 00000000ceb8764a
2020-05-28T20:47:05.776515-04:00 xtwo70 kernel: RDX: 0000000000000003 RSI:
ffffffffffffffff RDI: ffffc900005bbd00
2020-05-28T20:47:05.776516-04:00 xtwo70 kernel: RBP: ffffc900005bbd00 R08:
000000008830cd27 R09: 0000000000000001
2020-05-28T20:47:05.776517-04:00 xtwo70 kernel: R10: 0000000000000001 R11:
0000000000000003 R12: 0000000000000003
2020-05-28T20:47:05.776518-04:00 xtwo70 kernel: R13: ffff8881327c6818 R14:
0000000000000040 R15: ffff88814020f020
2020-05-28T20:47:05.776519-04:00 xtwo70 kernel: FS: 00007f1361c6f540(0000)
GS:ffff888226000000(0000) knlGS:0000000000000000
2020-05-28T20:47:05.776520-04:00 xtwo70 kernel: CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
2020-05-28T20:47:05.776521-04:00 xtwo70 kernel: CR2: ffff8881327c6868 CR3:
000000012f48e003 CR4: 00000000003606e0
2020-05-28T20:47:05.776522-04:00 xtwo70 kernel: Call Trace:
2020-05-28T20:47:05.776523-04:00 xtwo70 kernel: xas_load+0xa/0x50
2020-05-28T20:47:05.776524-04:00 xtwo70 kernel: xas_find+0x274/0x2c0
2020-05-28T20:47:05.776525-04:00 xtwo70 kernel: xa_find_after+0x163/0x1f0
2020-05-28T20:47:05.776526-04:00 xtwo70 kernel: scsi_forget_host+0xd2/0x129
2020-05-28T20:47:05.776527-04:00 xtwo70 kernel: scsi_remove_host+0x78/0x120
2020-05-28T20:47:05.776528-04:00 xtwo70 kernel: sdebug_driver_remove+0x3b/0x90
[scsi_debug]
2020-05-28T20:47:05.776528-04:00 xtwo70 kernel:
device_release_driver_internal+0xdf/0x1c0
2020-05-28T20:47:05.776529-04:00 xtwo70 kernel: bus_remove_device+0xe4/0x120
2020-05-28T20:47:05.776530-04:00 xtwo70 kernel: device_del+0x174/0x3c0
2020-05-28T20:47:05.776531-04:00 xtwo70 kernel: device_unregister+0x9/0x20
2020-05-28T20:47:05.776532-04:00 xtwo70 kernel: sdebug_do_remove_host+0xc0/0xe0
[scsi_debug]
2020-05-28T20:47:05.776533-04:00 xtwo70 kernel: scsi_debug_exit+0x21/0xc5b
[scsi_debug]
2020-05-28T20:47:05.776534-04:00 xtwo70 kernel: __x64_sys_delete_module+0x18f/0x230
2020-05-28T20:47:05.776535-04:00 xtwo70 kernel: ? lockdep_hardirqs_off+0x79/0xd0
2020-05-28T20:47:05.776537-04:00 xtwo70 kernel: ? trace_hardirqs_off_thunk+0x1a/0x1c
2020-05-28T20:47:05.776538-04:00 xtwo70 kernel: do_syscall_64+0x4b/0x1c0
2020-05-28T20:47:05.776539-04:00 xtwo70 kernel: entry_SYSCALL_64_after_hw
[-- Attachment #2: oops.txt --]
[-- Type: text/plain, Size: 10289 bytes --]
2020-05-29T16:26:17.670996-04:00 xtwo70 kernel: scsi 11:0:5:10: Attached scsi generic sg791 type 9
2020-05-29T16:26:17.785102-04:00 xtwo70 kernel: scsi 0:0:0:0: Power-on or device reset occurred
2020-05-29T16:26:17.797144-04:00 xtwo70 kernel: scsi 0:0:0:1: Power-on or device reset occurred
2020-05-29T16:26:18.277606-04:00 xtwo70 kernel: BUG: unable to handle page fault for address: ffff88815c206868
2020-05-29T16:26:18.277633-04:00 xtwo70 kernel: #PF: supervisor read access in kernel mode
2020-05-29T16:26:18.277635-04:00 xtwo70 kernel: #PF: error_code(0x0000) - not-present page
2020-05-29T16:26:18.277640-04:00 xtwo70 kernel: PGD 3c01067 P4D 3c01067 PUD 22ee30067 PMD 22ed4e067 PTE 800ffffea3df9060
2020-05-29T16:26:18.277655-04:00 xtwo70 kernel: Oops: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC PTI
2020-05-29T16:26:18.277671-04:00 xtwo70 kernel: CPU: 0 PID: 6742 Comm: rmmod Not tainted 5.7.0-rc1+ #75
2020-05-29T16:26:18.277672-04:00 xtwo70 kernel: Hardware name: LENOVO 20K5S27Q02/20K5S27Q02, BIOS R0IET61W (1.39 ) 04/20/2020
2020-05-29T16:26:18.277673-04:00 xtwo70 kernel: RIP: 0010:xas_start+0x2a/0x1c0
2020-05-29T16:26:18.277674-04:00 xtwo70 kernel: Code: 41 55 41 54 55 53 48 8b 47 18 48 89 fb 48 89 c2 83 e2 03 0f 84 8d 00 00 00 48 3d 05 c0 ff ff 76 06 48 83 fa 02 74 50 4c 8b 2b <49> 8b 6d 50 e8 fd 2f c2 ff 85 c0 49 89 ec 74 0d 80 3d ef f0 e4 00
2020-05-29T16:26:18.277675-04:00 xtwo70 kernel: RSP: 0018:ffffc900019dfc90 EFLAGS: 00010013
2020-05-29T16:26:18.277676-04:00 xtwo70 kernel: RAX: 0000000000000003 RBX: ffffc900019dfd00 RCX: 000000004a27657b
2020-05-29T16:26:18.277676-04:00 xtwo70 kernel: RDX: 0000000000000003 RSI: ffffffffffffffff RDI: ffffc900019dfd00
2020-05-29T16:26:18.277677-04:00 xtwo70 kernel: RBP: ffffc900019dfd00 R08: 000000001877b6b6 R09: 0000000000000001
2020-05-29T16:26:18.277679-04:00 xtwo70 kernel: R10: 0000000000000001 R11: 0000000000000003 R12: 0000000000000003
2020-05-29T16:26:18.277679-04:00 xtwo70 kernel: R13: ffff88815c206818 R14: 0000000000000040 R15: ffff88815af54020
2020-05-29T16:26:18.277680-04:00 xtwo70 kernel: FS: 00007fbfbb58b540(0000) GS:ffff888225800000(0000) knlGS:0000000000000000
2020-05-29T16:26:18.277681-04:00 xtwo70 kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
2020-05-29T16:26:18.277681-04:00 xtwo70 kernel: CR2: ffff88815c206868 CR3: 0000000141a5a006 CR4: 00000000003606f0
2020-05-29T16:26:18.277682-04:00 xtwo70 kernel: Call Trace:
2020-05-29T16:26:18.277683-04:00 xtwo70 kernel: xas_load+0xa/0x50
2020-05-29T16:26:18.277683-04:00 xtwo70 kernel: xas_find+0x274/0x2c0
2020-05-29T16:26:18.277684-04:00 xtwo70 kernel: xa_find_after+0x163/0x1f0
2020-05-29T16:26:18.277689-04:00 xtwo70 kernel: scsi_forget_host+0xd2/0x129
2020-05-29T16:26:18.277690-04:00 xtwo70 kernel: scsi_remove_host+0x79/0x120
2020-05-29T16:26:18.277693-04:00 xtwo70 kernel: sdebug_driver_remove+0x3b/0xa0 [scsi_debug]
2020-05-29T16:26:18.277694-04:00 xtwo70 kernel: device_release_driver_internal+0xdf/0x1c0
2020-05-29T16:26:18.277696-04:00 xtwo70 kernel: bus_remove_device+0xe4/0x120
2020-05-29T16:26:18.277697-04:00 xtwo70 kernel: device_del+0x174/0x3c0
2020-05-29T16:26:18.277700-04:00 xtwo70 kernel: device_unregister+0x9/0x20
2020-05-29T16:26:18.277700-04:00 xtwo70 kernel: sdebug_do_remove_host+0xc0/0xe0 [scsi_debug]
2020-05-29T16:26:18.277701-04:00 xtwo70 kernel: scsi_debug_exit+0x21/0xa87 [scsi_debug]
2020-05-29T16:26:18.277706-04:00 xtwo70 kernel: __x64_sys_delete_module+0x18f/0x230
2020-05-29T16:26:18.277712-04:00 xtwo70 kernel: ? lockdep_hardirqs_off+0x79/0xd0
2020-05-29T16:26:18.277715-04:00 xtwo70 kernel: ? trace_hardirqs_off_thunk+0x1a/0x1c
2020-05-29T16:26:18.277721-04:00 xtwo70 kernel: do_syscall_64+0x4b/0x1c0
2020-05-29T16:26:18.277725-04:00 xtwo70 kernel: entry_SYSCALL_64_after_hwframe+0x49/0xb3
2020-05-29T16:26:18.277728-04:00 xtwo70 kernel: RIP: 0033:0x7fbfbb6d7a3b
2020-05-29T16:26:18.277732-04:00 xtwo70 kernel: Code: 73 01 c3 48 8b 0d 55 84 0c 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa b8 b0 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 25 84 0c 00 f7 d8 64 89 01 48
2020-05-29T16:26:18.277735-04:00 xtwo70 kernel: RSP: 002b:00007ffde231d9f8 EFLAGS: 00000206 ORIG_RAX: 00000000000000b0
2020-05-29T16:26:18.277736-04:00 xtwo70 kernel: RAX: ffffffffffffffda RBX: 0000559b8e31f750 RCX: 00007fbfbb6d7a3b
2020-05-29T16:26:18.277736-04:00 xtwo70 kernel: RDX: 000000000000000a RSI: 0000000000000800 RDI: 0000559b8e31f7b8
2020-05-29T16:26:18.277765-04:00 xtwo70 kernel: RBP: 00007ffde231da58 R08: 0000000000000000 R09: 0000000000000000
2020-05-29T16:26:18.277766-04:00 xtwo70 kernel: R10: 00007fbfbb753ac0 R11: 0000000000000206 R12: 00007ffde231dc30
2020-05-29T16:26:18.277767-04:00 xtwo70 kernel: R13: 00007ffde231e8b0 R14: 0000559b8e31f2a0 R15: 0000559b8e31f750
2020-05-29T16:26:18.277767-04:00 xtwo70 kernel: Modules linked in: scsi_debug(-) sg netconsole configfs rfcomm hid_generic hidp hid fuse intel_rapl_msr cmac af_alg bnep iwlmvm intel_rapl_common mac80211 x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_codec_generic libarc4 iwlwifi kvm snd_seq_dummy snd_seq_oss i915 snd_seq_midi snd_rawmidi snd_seq_midi_event irqbypass crct10dif_pclmul snd_seq ghash_clmulni_intel snd_hda_intel cfg80211 aesni_intel efi_pstore snd_intel_dspcfg crypto_simd snd_hda_codec snd_hwdep snd_hda_core btusb btrtl cryptd btbcm btintel bluetooth glue_helper nls_iso8859_1 nls_cp437 vfat intel_cstate fat drm_kms_helper intel_uncore ti_usb_3410_5052 mei_me usbserial snd_pcm mmc_block input_leds joydev intel_rapl_perf thinkpad_acpi mousedev mei ecdh_generic serio_raw syscopyarea ecc efivars nvram sysfillrect snd_seq_device ledtrig_audio sysimgblt fb_sys_fops snd_timer intel_gtt intel_xhci_usb_role_switch i2c_algo_bit roles intel_pch_thermal snd soundcore
2020-05-29T16:26:18.277769-04:00 xtwo70 kernel: rfkill evdev video mac_hid nf_log_ipv6 ip6t_REJECT nf_reject_ipv6 xt_hl ip6t_rt nf_log_ipv4 nf_log_common ipt_REJECT nf_reject_ipv4 xt_LOG xt_limit xt_addrtype xt_tcpudp xt_conntrack nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 libcrc32c drm ip6table_filter ip6_tables parport_pc ppdev iptable_filter lp parport drm_panel_orientation_quirks agpgart efivarfs ip_tables x_tables autofs4 rtsx_pci_sdmmc mmc_core xhci_pci xhci_hcd usbcore e1000e nvme i2c_i801 intel_lpss_pci nvme_core intel_lpss rtsx_pci idma64 crc32_pclmul virt_dma usb_common [last unloaded: scsi_debug]
2020-05-29T16:26:18.277770-04:00 xtwo70 kernel: CR2: ffff88815c206868
2020-05-29T16:26:18.277770-04:00 xtwo70 kernel: ---[ end trace e67629a806869a64 ]---
2020-05-29T16:26:18.277771-04:00 xtwo70 kernel: RIP: 0010:xas_start+0x2a/0x1c0
2020-05-29T16:26:18.277771-04:00 xtwo70 kernel: Code: 41 55 41 54 55 53 48 8b 47 18 48 89 fb 48 89 c2 83 e2 03 0f 84 8d 00 00 00 48 3d 05 c0 ff ff 76 06 48 83 fa 02 74 50 4c 8b 2b <49> 8b 6d 50 e8 fd 2f c2 ff 85 c0 49 89 ec 74 0d 80 3d ef f0 e4 00
2020-05-29T16:26:18.277772-04:00 xtwo70 kernel: RSP: 0018:ffffc900019dfc90 EFLAGS: 00010013
2020-05-29T16:26:18.277772-04:00 xtwo70 kernel: RAX: 0000000000000003 RBX: ffffc900019dfd00 RCX: 000000004a27657b
2020-05-29T16:26:18.277773-04:00 xtwo70 kernel: RDX: 0000000000000003 RSI: ffffffffffffffff RDI: ffffc900019dfd00
2020-05-29T16:26:18.277774-04:00 xtwo70 kernel: RBP: ffffc900019dfd00 R08: 000000001877b6b6 R09: 0000000000000001
2020-05-29T16:26:18.277774-04:00 xtwo70 kernel: R10: 0000000000000001 R11: 0000000000000003 R12: 0000000000000003
2020-05-29T16:26:18.277775-04:00 xtwo70 kernel: R13: ffff88815c206818 R14: 0000000000000040 R15: ffff88815af54020
2020-05-29T16:26:18.277775-04:00 xtwo70 kernel: FS: 00007fbfbb58b540(0000) GS:ffff888225800000(0000) knlGS:0000000000000000
2020-05-29T16:26:18.277776-04:00 xtwo70 kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
2020-05-29T16:26:18.277777-04:00 xtwo70 kernel: CR2: ffff88815c206868 CR3: 0000000141a5a006 CR4: 00000000003606f0
2020-05-29T16:26:18.277777-04:00 xtwo70 kernel: BUG: sleeping function called from invalid context at include/linux/percpu-rwsem.h:49
2020-05-29T16:26:18.277778-04:00 xtwo70 kernel: in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 6742, name: rmmod
2020-05-29T16:26:18.277778-04:00 xtwo70 kernel: INFO: lockdep is turned off.
2020-05-29T16:26:18.277779-04:00 xtwo70 kernel: irq event stamp: 311538
2020-05-29T16:26:18.277780-04:00 xtwo70 kernel: hardirqs last enabled at (311537): [<ffffffff8125d2d0>] kfree+0x1b0/0x310
2020-05-29T16:26:18.277780-04:00 xtwo70 kernel: hardirqs last disabled at (311538): [<ffffffff818b8be1>] _raw_spin_lock_irqsave+0x11/0x80
2020-05-29T16:26:18.277781-04:00 xtwo70 kernel: softirqs last enabled at (310482): [<ffffffff81c0039d>] __do_softirq+0x39d/0x4a4
2020-05-29T16:26:18.277782-04:00 xtwo70 kernel: softirqs last disabled at (310473): [<ffffffff8106e7e7>] irq_exit+0xb7/0xd0
2020-05-29T16:26:18.277782-04:00 xtwo70 kernel: Preemption disabled at:
2020-05-29T16:26:18.277783-04:00 xtwo70 kernel: [<0000000000000000>] 0x0
2020-05-29T16:26:18.277784-04:00 xtwo70 kernel: CPU: 0 PID: 6742 Comm: rmmod Tainted: G D 5.7.0-rc1+ #75
2020-05-29T16:26:18.277784-04:00 xtwo70 kernel: Hardware name: LENOVO 20K5S27Q02/20K5S27Q02, BIOS R0IET61W (1.39 ) 04/20/2020
2020-05-29T16:26:18.277785-04:00 xtwo70 kernel: Call Trace:
2020-05-29T16:26:18.277785-04:00 xtwo70 kernel: dump_stack+0x71/0xa0
2020-05-29T16:26:18.277786-04:00 xtwo70 kernel: ___might_sleep.cold+0xf7/0x10b
2020-05-29T16:26:18.277787-04:00 xtwo70 kernel: exit_signals+0x2b/0x390
2020-05-29T16:26:18.277787-04:00 xtwo70 kernel: do_exit+0xaf/0xb80
2020-05-29T16:26:18.277788-04:00 xtwo70 kernel: ? trace_hardirqs_off_thunk+0x1a/0x1c
2020-05-29T16:26:18.277789-04:00 xtwo70 kernel: rewind_stack_do_exit+0x17/0x20
2020-05-29T16:26:18.277789-04:00 xtwo70 kernel: note: rmmod[6742] exited with preempt_count 1
2020-05-29T16:26:22.525103-04:00 xtwo70 kernel: systemd[1]: systemd-journald-dev-log.socket: Failed to queue service startup job (Maybe the service file is missing or not a non-template unit?): Unit systemd-journald.service is masked.
2020-05-29T16:26:22.526520-04:00 xtwo70 kernel: systemd[1]: systemd-journald-dev-log.socket: Failed with result 'resources'.
2020-05-29T16:26:22.533056-04:00 xtwo70 kernel: systemd[1]: packagekit.service: Succeeded.
^ permalink raw reply
* Re: [bpf PATCH 0/3] verifier fix for assigning 32bit reg to 64bit reg
From: Alexei Starovoitov @ 2020-05-29 20:53 UTC (permalink / raw)
To: John Fastabend; +Cc: Yonghong Song, Daniel Borkmann, bpf, Kernel Team
In-Reply-To: <159077324869.6014.6516130782021506562.stgit@john-Precision-5820-Tower>
On Fri, May 29, 2020 at 10:28 AM John Fastabend
<john.fastabend@gmail.com> wrote:
>
> These add a fix for 32 bit to 64 bit assignment introduced with
> latest alu32 bounds tracking. The initial fix was proposed by
> Yonghong and then I updated it slightly and added a test fix.
Applied. Thanks
^ permalink raw reply
* [PATCH v2 2/4] coroutine: add check for SafeStack in sigaltstack
From: Daniele Buono @ 2020-05-29 20:51 UTC (permalink / raw)
To: qemu-devel
Cc: Kevin Wolf, Daniel P . Berrangé, Stefan Hajnoczi,
Paolo Bonzini, Philippe Mathieu-Daudé, dbuono
In-Reply-To: <20200529205122.714-1-dbuono@linux.vnet.ibm.com>
Current implementation of LLVM's SafeStack is not compatible with
code that uses an alternate stack created with sigaltstack().
Since coroutine-sigaltstack relies on sigaltstack(), it is not
compatible with SafeStack. The resulting binary is incorrect, with
different coroutines sharing the same unsafe stack and producing
undefined behavior at runtime.
In the future LLVM may provide a SafeStack implementation compatible with
sigaltstack(). In the meantime, if SafeStack is desired, the coroutine
implementation from coroutine-ucontext should be used.
As a safety check, add a control in coroutine-sigaltstack to throw a
preprocessor #error if SafeStack is enabled and we are trying to
use coroutine-sigaltstack to implement coroutines.
Signed-off-by: Daniele Buono <dbuono@linux.vnet.ibm.com>
---
util/coroutine-sigaltstack.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/util/coroutine-sigaltstack.c b/util/coroutine-sigaltstack.c
index f6fc49a0e5..aade82afb8 100644
--- a/util/coroutine-sigaltstack.c
+++ b/util/coroutine-sigaltstack.c
@@ -30,6 +30,10 @@
#include "qemu-common.h"
#include "qemu/coroutine_int.h"
+#ifdef CONFIG_SAFESTACK
+#error "SafeStack is not compatible with code run in alternate signal stacks"
+#endif
+
typedef struct {
Coroutine base;
void *stack;
--
2.26.2
^ permalink raw reply related
* [PATCH v2 0/4] Add support for SafeStack
From: Daniele Buono @ 2020-05-29 20:51 UTC (permalink / raw)
To: qemu-devel
Cc: Kevin Wolf, Daniel P . Berrangé, Stefan Hajnoczi,
Paolo Bonzini, Philippe Mathieu-Daudé, dbuono
LLVM supports SafeStack instrumentation to protect against stack buffer
overflows, since version 3.7
From https://clang.llvm.org/docs/SafeStack.html:
"It works by separating the program stack into two distinct regions: the
safe stack and the unsafe stack. The safe stack stores return addresses,
register spills, and local variables that are always accessed in a safe
way, while the unsafe stack stores everything else. This separation
ensures that buffer overflows on the unsafe stack cannot be used to
overwrite anything on the safe stack."
Unfortunately, the use of two stack regions does not cope well with
QEMU's coroutines. The second stack region is not properly set up with
both ucontext and sigaltstack, so multiple coroutines end up sharing the
same memory area for the unsafe stack, causing undefined behaviors at
runtime (and most iochecks to fail).
This patch series fixes the implementation of the ucontext backend and
make sure that sigaltstack is never used if the compiler is applying
the SafeStack instrumentation. It also adds a configure flag to enable
SafeStack, and enables iotests when SafeStack is used.
Changes since v1:
- CONFIG_SAFESTACK is now set up in configure, and not in the code
- Added option for a --disable-safe-stack in configure
- Configure checks if SafeStack is enabled by default in the compiler,
and set the CONFIG_SAFESTACK accordingly
- Updated some comments in the code and the commit log
NOTE: I kept configure as Patch #3.
The reason is that the code changes will not be enabled without the
configure, making the code fully functional if only Patches #1 or #2 are
applied.
On the other hand, the configure patch will produce incorrect code if we
request SafeStack and the other patches are not applied.
Daniele Buono (4):
coroutine: support SafeStack in ucontext backend
coroutine: add check for SafeStack in sigaltstack
configure: add flags to support SafeStack
check-block: enable iotests with SafeStack
configure | 73 ++++++++++++++++++++++++++++++++++++
include/qemu/coroutine_int.h | 5 +++
tests/check-block.sh | 12 +++++-
util/coroutine-sigaltstack.c | 4 ++
util/coroutine-ucontext.c | 26 +++++++++++++
5 files changed, 119 insertions(+), 1 deletion(-)
--
2.26.2
^ permalink raw reply
* Re: [PATCH 2/2] nvmem: add ONIE NVMEM cells support
From: kbuild test robot @ 2020-05-29 20:52 UTC (permalink / raw)
To: kbuild-all
In-Reply-To: <20200527201715.3660-3-vadym.kochan@plvision.eu>
[-- Attachment #1: Type: text/plain, Size: 2543 bytes --]
Hi Vadym,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on linus/master]
[also build test WARNING on linux/master v5.7-rc7 next-20200529]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Vadym-Kochan/nvmem-add-ONIE-NVMEM-cells-provider/20200528-041903
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git b0c3ba31be3e45a130e13b278cf3b90f69bda6f6
config: x86_64-randconfig-r024-20200529 (attached as .config)
compiler: clang version 11.0.0 (https://github.com/llvm/llvm-project 2d068e534f1671459e1b135852c1b3c10502e929)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kbuild test robot <lkp@intel.com>
All warnings (new ones prefixed by >>, old ones prefixed by <<):
>> drivers/nvmem/onie-cells.c:56:57: warning: size argument in 'memcmp' call is a comparison [-Wmemsize-comparison]
if (memcmp(hdr->id, ONIE_NVMEM_HDR_ID, sizeof(hdr->id) != 0))
~~~~~~~~~~~~~~~~^~~~
drivers/nvmem/onie-cells.c:56:6: note: did you mean to compare the result of 'memcmp' instead?
if (memcmp(hdr->id, ONIE_NVMEM_HDR_ID, sizeof(hdr->id) != 0))
^ ~
)
drivers/nvmem/onie-cells.c:56:41: note: explicitly cast the argument to size_t to silence this warning
if (memcmp(hdr->id, ONIE_NVMEM_HDR_ID, sizeof(hdr->id) != 0))
^
(size_t)( )
1 warning generated.
vim +/memcmp +56 drivers/nvmem/onie-cells.c
53
54 static bool onie_nvmem_hdr_is_valid(struct onie_nvmem_hdr *hdr)
55 {
> 56 if (memcmp(hdr->id, ONIE_NVMEM_HDR_ID, sizeof(hdr->id) != 0))
57 return false;
58 if (hdr->version != 0x1)
59 return false;
60
61 return true;
62 }
63
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 34875 bytes --]
^ permalink raw reply
* Re: [Intel-gfx] [PATCH 1/4] drm/i915/display/hsw+: Do not program the same vswing entry twice
From: Souza, Jose @ 2020-05-29 20:52 UTC (permalink / raw)
To: ville.syrjala@linux.intel.com; +Cc: intel-gfx@lists.freedesktop.org
In-Reply-To: <20200529065148.GG6112@intel.com>
On Fri, 2020-05-29 at 09:51 +0300, Ville Syrjälä wrote:
> On Thu, May 28, 2020 at 01:03:53PM -0700, José Roberto de Souza wrote:
> > It will be programed right before the link training, so no need to do
> > it twice.
> > It will not strictly follow BSpec sequences but most of this sequences
> > are not matching anyways.
> >
> > Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> > ---
> > drivers/gpu/drm/i915/display/intel_ddi.c | 19 ++++---------------
> > 1 file changed, 4 insertions(+), 15 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> > index aa22465bb56e..c100efc6a2c4 100644
> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > @@ -3115,7 +3115,6 @@ static void tgl_ddi_pre_enable_dp(struct intel_atomic_state *state,
> > enum phy phy = intel_port_to_phy(dev_priv, encoder->port);
> > struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
> > bool is_mst = intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST);
> > - int level = intel_ddi_dp_level(intel_dp);
> > enum transcoder transcoder = crtc_state->cpu_transcoder;
> >
> > intel_dp_set_link_params(intel_dp, crtc_state->port_clock,
> > @@ -3190,9 +3189,10 @@ static void tgl_ddi_pre_enable_dp(struct intel_atomic_state *state,
> > * down this function.
> > */
> >
> > - /* 7.e Configure voltage swing and related IO settings */
> > - tgl_ddi_vswing_sequence(encoder, crtc_state->port_clock, level,
> > - encoder->type);
> > + /*
> > + * 7.e Configure voltage swing and related IO settings
> > + * It will be done in intel_dp_start_link_train(), no need to do twice
> > + */
>
> Hmm. Do we still set it up before turning on the port?
No.
intel_dp_start_link_train()
intel_dp_link_training_clock_recovery()
intel_dp->prepare_link_retrain(intel_dp)/intel_ddi_prepare_link_retrain();/* Port is enabled here in training mode */
....
intel_dp_reset_link_train()
intel_dp_set_signal_levels() /* Vswing table is set here */
Guess is safer keep programming it twice then?
>
> >
> > /*
> > * 7.f Combo PHY: Configure PORT_CL_DW10 Static Power Down to power up
> > @@ -3257,7 +3257,6 @@ static void hsw_ddi_pre_enable_dp(struct intel_atomic_state *state,
> > enum phy phy = intel_port_to_phy(dev_priv, port);
> > struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
> > bool is_mst = intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST);
> > - int level = intel_ddi_dp_level(intel_dp);
> >
> > if (INTEL_GEN(dev_priv) < 11)
> > drm_WARN_ON(&dev_priv->drm,
> > @@ -3279,16 +3278,6 @@ static void hsw_ddi_pre_enable_dp(struct intel_atomic_state *state,
> >
> > icl_program_mg_dp_mode(dig_port, crtc_state);
> >
> > - if (INTEL_GEN(dev_priv) >= 11)
> > - icl_ddi_vswing_sequence(encoder, crtc_state->port_clock,
> > - level, encoder->type);
> > - else if (IS_CANNONLAKE(dev_priv))
> > - cnl_ddi_vswing_sequence(encoder, level, encoder->type);
> > - else if (IS_GEN9_LP(dev_priv))
> > - bxt_ddi_vswing_sequence(encoder, level, encoder->type);
> > - else
> > - intel_prepare_dp_ddi_buffers(encoder, crtc_state);
>
> This last one definitely has to stay IIRC. HSW/BDW/SKL buf trans
> stuff works quite bit differently than the BXT+ style more manual
> programming.
>
> > -
> > if (intel_phy_is_combo(dev_priv, phy)) {
> > bool lane_reversal =
> > dig_port->saved_port_bits & DDI_BUF_PORT_REVERSAL;
> > --
> > 2.26.2
> >
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply
* Re: [PATCH v2 bpf-next 2/4] bpf: Introduce sleepable BPF programs
From: Alexei Starovoitov @ 2020-05-29 20:52 UTC (permalink / raw)
To: Andrii Nakryiko
Cc: David S. Miller, Daniel Borkmann, Networking, bpf, Kernel Team
In-Reply-To: <CAEf4BzaVHD7HyRDQGRCUKBDOZq-LcZpHrBoOjuOP+443Xc+Vaw@mail.gmail.com>
On Fri, May 29, 2020 at 01:38:40PM -0700, Andrii Nakryiko wrote:
> > > > if (prog->type == BPF_PROG_TYPE_STRUCT_OPS)
> > > > return check_struct_ops_btf_id(env);
> > > >
> > > > @@ -10762,8 +10801,29 @@ static int check_attach_btf_id(struct bpf_verifier_env *env)
> > > > if (ret)
> > > > verbose(env, "%s() is not modifiable\n",
> > > > prog->aux->attach_func_name);
> > > > + } else if (prog->aux->sleepable) {
> > > > + switch (prog->type) {
> > > > + case BPF_PROG_TYPE_TRACING:
> > > > + /* fentry/fexit progs can be sleepable only if they are
> > > > + * attached to ALLOW_ERROR_INJECTION or security_*() funcs.
> > > > + */
> > > > + ret = check_attach_modify_return(prog, addr);
> > >
> > > I was so confused about this piece... check_attach_modify_return()
> > > should probably be renamed to something else, it's not for fmod_ret
> > > only anymore.
> >
> > why? I think the name is correct. The helper checks whether target
> > allows modifying its return value. It's a first while list.
>
> check_attach_modify_return() name implies to me that it's strictly for
> fmod_ret-specific attachment checks, that's all. It's minor, if you
> feel like name is appropriate I'm fine with it.
ahh. i see the confusion. I've read check_attach_modify_return as
whether target kernel function allows tweaking it's return value.
whereas it sounds that you've read it as it's check whether target
func is ok for modify_return bpf program type.
>
> > When that passes the black list applies via check_sleepable_blacklist() function.
> >
> > I was considering using whitelist for sleepable as well, but that's overkill.
> > Too much overlap with mod_ret.
> > Imo check whitelist + check blacklist for white list exceptions is clean enough.
>
> I agree about whitelist+blacklist, my only point was that
> check_attach_modify_return() is not communicating that it's a
> whitelist. check_sleepable_blacklist() is clear as day,
> check_sleepable_whitelist() would be as clear, even if internally it
> (for now) just calls into check_attach_modify_return(). Eventually it
> might be evolved beyond what's in check_attach_modify_return(). Not a
> big deal and can be changed later, if necessary.
got it. I will wrap it into another helper.
^ permalink raw reply
* Re: [PATCH v8 44/62] target/riscv: widening floating-point/integer type-convert instructions
From: Alistair Francis @ 2020-05-29 20:43 UTC (permalink / raw)
To: LIU Zhiwei
Cc: qemu-devel@nongnu.org Developers, open list:RISC-V,
Richard Henderson, wxy194768, wenmeng_zhang, Alistair Francis,
Palmer Dabbelt
In-Reply-To: <20200521094413.10425-45-zhiwei_liu@c-sky.com>
On Thu, May 21, 2020 at 4:13 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>
> Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/helper.h | 11 ++++++
> target/riscv/insn32.decode | 5 +++
> target/riscv/insn_trans/trans_rvv.inc.c | 47 +++++++++++++++++++++++++
> target/riscv/vector_helper.c | 42 ++++++++++++++++++++++
> 4 files changed, 105 insertions(+)
>
> diff --git a/target/riscv/helper.h b/target/riscv/helper.h
> index 05f8fb5ffc..e59dcc5a7c 100644
> --- a/target/riscv/helper.h
> +++ b/target/riscv/helper.h
> @@ -1011,3 +1011,14 @@ DEF_HELPER_5(vfcvt_f_xu_v_d, void, ptr, ptr, ptr, env, i32)
> DEF_HELPER_5(vfcvt_f_x_v_h, void, ptr, ptr, ptr, env, i32)
> DEF_HELPER_5(vfcvt_f_x_v_w, void, ptr, ptr, ptr, env, i32)
> DEF_HELPER_5(vfcvt_f_x_v_d, void, ptr, ptr, ptr, env, i32)
> +
> +DEF_HELPER_5(vfwcvt_xu_f_v_h, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfwcvt_xu_f_v_w, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfwcvt_x_f_v_h, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfwcvt_x_f_v_w, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfwcvt_f_xu_v_h, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfwcvt_f_xu_v_w, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfwcvt_f_x_v_h, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfwcvt_f_x_v_w, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfwcvt_f_f_v_h, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfwcvt_f_f_v_w, void, ptr, ptr, ptr, env, i32)
> diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
> index 53562c6663..e0efc63ec2 100644
> --- a/target/riscv/insn32.decode
> +++ b/target/riscv/insn32.decode
> @@ -519,6 +519,11 @@ vfcvt_xu_f_v 100010 . ..... 00000 001 ..... 1010111 @r2_vm
> vfcvt_x_f_v 100010 . ..... 00001 001 ..... 1010111 @r2_vm
> vfcvt_f_xu_v 100010 . ..... 00010 001 ..... 1010111 @r2_vm
> vfcvt_f_x_v 100010 . ..... 00011 001 ..... 1010111 @r2_vm
> +vfwcvt_xu_f_v 100010 . ..... 01000 001 ..... 1010111 @r2_vm
> +vfwcvt_x_f_v 100010 . ..... 01001 001 ..... 1010111 @r2_vm
> +vfwcvt_f_xu_v 100010 . ..... 01010 001 ..... 1010111 @r2_vm
> +vfwcvt_f_x_v 100010 . ..... 01011 001 ..... 1010111 @r2_vm
> +vfwcvt_f_f_v 100010 . ..... 01100 001 ..... 1010111 @r2_vm
>
> vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
> vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
> diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
> index 6db460177d..44505027c1 100644
> --- a/target/riscv/insn_trans/trans_rvv.inc.c
> +++ b/target/riscv/insn_trans/trans_rvv.inc.c
> @@ -2221,3 +2221,50 @@ GEN_OPFV_TRANS(vfcvt_xu_f_v, opfv_check)
> GEN_OPFV_TRANS(vfcvt_x_f_v, opfv_check)
> GEN_OPFV_TRANS(vfcvt_f_xu_v, opfv_check)
> GEN_OPFV_TRANS(vfcvt_f_x_v, opfv_check)
> +
> +/* Widening Floating-Point/Integer Type-Convert Instructions */
> +
> +/*
> + * If the current SEW does not correspond to a supported IEEE floating-point
> + * type, an illegal instruction exception is raised
> + */
> +static bool opfv_widen_check(DisasContext *s, arg_rmr *a)
> +{
> + return (vext_check_isa_ill(s) &&
> + vext_check_overlap_mask(s, a->rd, a->vm, true) &&
> + vext_check_reg(s, a->rd, true) &&
> + vext_check_reg(s, a->rs2, false) &&
> + vext_check_overlap_group(a->rd, 2 << s->lmul, a->rs2,
> + 1 << s->lmul) &&
> + (s->lmul < 0x3) && (s->sew < 0x3) && (s->sew != 0));
> +}
> +
> +#define GEN_OPFV_WIDEN_TRANS(NAME) \
> +static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
> +{ \
> + if (opfv_widen_check(s, a)) { \
> + uint32_t data = 0; \
> + static gen_helper_gvec_3_ptr * const fns[2] = { \
> + gen_helper_##NAME##_h, \
> + gen_helper_##NAME##_w, \
> + }; \
> + TCGLabel *over = gen_new_label(); \
> + tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
> + \
> + data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \
> + data = FIELD_DP32(data, VDATA, VM, a->vm); \
> + data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
> + tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
> + vreg_ofs(s, a->rs2), cpu_env, 0, \
> + s->vlen / 8, data, fns[s->sew - 1]); \
> + gen_set_label(over); \
> + return true; \
> + } \
> + return false; \
> +}
> +
> +GEN_OPFV_WIDEN_TRANS(vfwcvt_xu_f_v)
> +GEN_OPFV_WIDEN_TRANS(vfwcvt_x_f_v)
> +GEN_OPFV_WIDEN_TRANS(vfwcvt_f_xu_v)
> +GEN_OPFV_WIDEN_TRANS(vfwcvt_f_x_v)
> +GEN_OPFV_WIDEN_TRANS(vfwcvt_f_f_v)
> diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
> index 34b21c8deb..ea6a5853f3 100644
> --- a/target/riscv/vector_helper.c
> +++ b/target/riscv/vector_helper.c
> @@ -4250,3 +4250,45 @@ RVVCALL(OPFVV1, vfcvt_f_x_v_d, OP_UU_D, H8, H8, int64_to_float64)
> GEN_VEXT_V_ENV(vfcvt_f_x_v_h, 2, 2, clearh)
> GEN_VEXT_V_ENV(vfcvt_f_x_v_w, 4, 4, clearl)
> GEN_VEXT_V_ENV(vfcvt_f_x_v_d, 8, 8, clearq)
> +
> +/* Widening Floating-Point/Integer Type-Convert Instructions */
> +/* (TD, T2, TX2) */
> +#define WOP_UU_H uint32_t, uint16_t, uint16_t
> +#define WOP_UU_W uint64_t, uint32_t, uint32_t
> +/* vfwcvt.xu.f.v vd, vs2, vm # Convert float to double-width unsigned integer.*/
> +RVVCALL(OPFVV1, vfwcvt_xu_f_v_h, WOP_UU_H, H4, H2, float16_to_uint32)
> +RVVCALL(OPFVV1, vfwcvt_xu_f_v_w, WOP_UU_W, H8, H4, float32_to_uint64)
> +GEN_VEXT_V_ENV(vfwcvt_xu_f_v_h, 2, 4, clearl)
> +GEN_VEXT_V_ENV(vfwcvt_xu_f_v_w, 4, 8, clearq)
> +
> +/* vfwcvt.x.f.v vd, vs2, vm # Convert float to double-width signed integer. */
> +RVVCALL(OPFVV1, vfwcvt_x_f_v_h, WOP_UU_H, H4, H2, float16_to_int32)
> +RVVCALL(OPFVV1, vfwcvt_x_f_v_w, WOP_UU_W, H8, H4, float32_to_int64)
> +GEN_VEXT_V_ENV(vfwcvt_x_f_v_h, 2, 4, clearl)
> +GEN_VEXT_V_ENV(vfwcvt_x_f_v_w, 4, 8, clearq)
> +
> +/* vfwcvt.f.xu.v vd, vs2, vm # Convert unsigned integer to double-width float */
> +RVVCALL(OPFVV1, vfwcvt_f_xu_v_h, WOP_UU_H, H4, H2, uint16_to_float32)
> +RVVCALL(OPFVV1, vfwcvt_f_xu_v_w, WOP_UU_W, H8, H4, uint32_to_float64)
> +GEN_VEXT_V_ENV(vfwcvt_f_xu_v_h, 2, 4, clearl)
> +GEN_VEXT_V_ENV(vfwcvt_f_xu_v_w, 4, 8, clearq)
> +
> +/* vfwcvt.f.x.v vd, vs2, vm # Convert integer to double-width float. */
> +RVVCALL(OPFVV1, vfwcvt_f_x_v_h, WOP_UU_H, H4, H2, int16_to_float32)
> +RVVCALL(OPFVV1, vfwcvt_f_x_v_w, WOP_UU_W, H8, H4, int32_to_float64)
> +GEN_VEXT_V_ENV(vfwcvt_f_x_v_h, 2, 4, clearl)
> +GEN_VEXT_V_ENV(vfwcvt_f_x_v_w, 4, 8, clearq)
> +
> +/*
> + * vfwcvt.f.f.v vd, vs2, vm #
> + * Convert single-width float to double-width float.
> + */
> +static uint32_t vfwcvtffv16(uint16_t a, float_status *s)
> +{
> + return float16_to_float32(a, true, s);
> +}
> +
> +RVVCALL(OPFVV1, vfwcvt_f_f_v_h, WOP_UU_H, H4, H2, vfwcvtffv16)
> +RVVCALL(OPFVV1, vfwcvt_f_f_v_w, WOP_UU_W, H8, H4, float32_to_float64)
> +GEN_VEXT_V_ENV(vfwcvt_f_f_v_h, 2, 4, clearl)
> +GEN_VEXT_V_ENV(vfwcvt_f_f_v_w, 4, 8, clearq)
> --
> 2.23.0
>
>
^ permalink raw reply
* [PATCH v8 08/12] tests/vm: Added a new script for ubuntu.aarch64.
From: Robert Foley @ 2020-05-29 20:34 UTC (permalink / raw)
To: qemu-devel; +Cc: Fam Zheng, philmd, alex.bennee, robert.foley, peter.puhov
In-Reply-To: <20200529203458.1038-1-robert.foley@linaro.org>
ubuntu.aarch64 provides a script to create an Ubuntu 18.04 VM.
Another new file is also added aarch64vm.py, which is a module with
common methods used by aarch64 VMs, such as how to create the
flash images.
Signed-off-by: Robert Foley <robert.foley@linaro.org>
Reviewed-by: Peter Puhov <peter.puhov@linaro.org>
---
configure | 20 +++++++
tests/vm/Makefile.include | 11 ++++
tests/vm/aarch64vm.py | 106 ++++++++++++++++++++++++++++++++++++++
tests/vm/basevm.py | 12 +++++
tests/vm/ubuntu.aarch64 | 68 ++++++++++++++++++++++++
5 files changed, 217 insertions(+)
create mode 100644 tests/vm/aarch64vm.py
create mode 100755 tests/vm/ubuntu.aarch64
diff --git a/configure b/configure
index d82de47fdd..8a286e75a5 100755
--- a/configure
+++ b/configure
@@ -411,6 +411,7 @@ prefix="/usr/local"
mandir="\${prefix}/share/man"
datadir="\${prefix}/share"
firmwarepath="\${prefix}/share/qemu-firmware"
+efi_aarch64=""
qemu_docdir="\${prefix}/share/doc/qemu"
bindir="\${prefix}/bin"
libdir="\${prefix}/lib"
@@ -1099,6 +1100,8 @@ for opt do
;;
--firmwarepath=*) firmwarepath="$optarg"
;;
+ --efi-aarch64=*) efi_aarch64="$optarg"
+ ;;
--host=*|--build=*|\
--disable-dependency-tracking|\
--sbindir=*|--sharedstatedir=*|\
@@ -1753,6 +1756,7 @@ Advanced options (experts only):
--sysconfdir=PATH install config in PATH$confsuffix
--localstatedir=PATH install local state in PATH (set at runtime on win32)
--firmwarepath=PATH search PATH for firmware files
+ --efi-aarch64=PATH PATH of efi file to use for aarch64 VMs.
--with-confsuffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir [$confsuffix]
--with-pkgversion=VERS use specified string as sub-version of the package
--enable-debug enable common debug build options
@@ -3548,6 +3552,20 @@ EOF
fi
fi
+############################################
+# efi-aarch64 probe
+# Check for efi files needed by aarch64 VMs.
+# By default we will use the efi included with QEMU.
+# Allow user to override the path for efi also.
+if ! test -f "$efi_aarch64"; then
+ if test -f $source_path/pc-bios/edk2-aaarch64-code.fd.bz2; then
+ # valid after build
+ efi_aarch64=$PWD/pc-bios/edk2-aarch64-code.fd
+ else
+ efi_aarch64=""
+ fi
+fi
+
##########################################
# libcap-ng library probe
if test "$cap_ng" != "no" ; then
@@ -6604,6 +6622,7 @@ if test "$docs" != "no"; then
echo "sphinx-build $sphinx_build"
fi
echo "genisoimage $genisoimage"
+echo "efi_aarch64 $efi_aarch64"
echo "python_yaml $python_yaml"
echo "slirp support $slirp $(echo_version $slirp $slirp_version)"
if test "$slirp" != "no" ; then
@@ -7667,6 +7686,7 @@ echo "PYTHON=$python" >> $config_host_mak
echo "SPHINX_BUILD=$sphinx_build" >> $config_host_mak
echo "SPHINX_WERROR=$sphinx_werror" >> $config_host_mak
echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
+echo "EFI_AARCH64=$efi_aarch64" >> $config_host_mak
echo "PYTHON_YAML=$python_yaml" >> $config_host_mak
echo "CC=$cc" >> $config_host_mak
if $iasl -h > /dev/null 2>&1; then
diff --git a/tests/vm/Makefile.include b/tests/vm/Makefile.include
index f6c3892bb2..cc71e6ed0a 100644
--- a/tests/vm/Makefile.include
+++ b/tests/vm/Makefile.include
@@ -5,6 +5,9 @@
IMAGES := freebsd netbsd openbsd centos fedora
ifneq ($(GENISOIMAGE),)
IMAGES += ubuntu.i386 centos
+ifneq ($(EFI_AARCH64),)
+IMAGES += ubuntu.aarch64
+endif
endif
IMAGES_DIR := $(HOME)/.cache/qemu-vm/images
@@ -23,6 +26,11 @@ vm-help vm-test:
ifneq ($(GENISOIMAGE),)
@echo " vm-build-centos - Build QEMU in CentOS VM, with Docker"
@echo " vm-build-ubuntu.i386 - Build QEMU in ubuntu i386 VM"
+ifneq ($(EFI_AARCH64),)
+ @echo " vm-build-ubuntu.aarch64 - Build QEMU in ubuntu aarch64 VM"
+else
+ @echo " (install qemu-efi-aarch64 to build centos/ubuntu aarch64 images.)"
+endif
else
@echo " (install genisoimage to build centos/ubuntu images)"
endif
@@ -65,6 +73,7 @@ $(IMAGES_DIR)/%.img: $(SRC_PATH)/tests/vm/% \
$(if $(V)$(DEBUG), --debug) \
$(if $(GENISOIMAGE),--genisoimage $(GENISOIMAGE)) \
$(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \
+ $(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \
--image "$@" \
--force \
--build-image $@, \
@@ -80,6 +89,7 @@ vm-build-%: $(IMAGES_DIR)/%.img
$(if $(J),--jobs $(J)) \
$(if $(V),--verbose) \
$(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \
+ $(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \
--image "$<" \
$(if $(BUILD_TARGET),--build-target $(BUILD_TARGET)) \
--snapshot \
@@ -102,6 +112,7 @@ vm-boot-ssh-%: $(IMAGES_DIR)/%.img
$(if $(J),--jobs $(J)) \
$(if $(V)$(DEBUG), --debug) \
$(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \
+ $(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \
--image "$<" \
--interactive \
false, \
diff --git a/tests/vm/aarch64vm.py b/tests/vm/aarch64vm.py
new file mode 100644
index 0000000000..bb04cb19c9
--- /dev/null
+++ b/tests/vm/aarch64vm.py
@@ -0,0 +1,106 @@
+#!/usr/bin/env python3
+#
+# VM testing aarch64 library
+#
+# Copyright 2020 Linaro
+#
+# Authors:
+# Robert Foley <robert.foley@linaro.org>
+#
+# This code is licensed under the GPL version 2 or later. See
+# the COPYING file in the top-level directory.
+#
+import os
+import sys
+import subprocess
+import basevm
+from qemu.accel import kvm_available
+
+# This is the config needed for current version of QEMU.
+# This works for both kvm and tcg.
+CURRENT_CONFIG = {
+ 'cpu' : "max",
+ 'machine' : "virt,gic-version=max",
+}
+
+# The minimum minor version of QEMU we will support with aarch64 VMs is 3.
+# QEMU versions less than 3 have various issues running these VMs.
+QEMU_AARCH64_MIN_VERSION = 3
+
+# The DEFAULT_CONFIG will default to a version of
+# parameters that works for backwards compatibility.
+DEFAULT_CONFIG = {'kvm' : {'cpu' : "host",
+ 'machine' : "virt,gic-version=host"},
+ 'tcg' : {'cpu' : "cortex-a57",
+ 'machine' : "virt"},
+}
+
+def get_config_defaults(vmcls, default_config):
+ """Fetch the configuration defaults for this VM,
+ taking into consideration the defaults for
+ aarch64 first, followed by the defaults for this VM."""
+ config = default_config
+ config.update(aarch_get_config_defaults(vmcls))
+ return config
+
+def aarch_get_config_defaults(vmcls):
+ """Set the defaults for current version of QEMU."""
+ config = CURRENT_CONFIG
+ args, argv = basevm.parse_args(vmcls)
+ qemu_path = basevm.get_qemu_path(vmcls.arch, args.build_path)
+ qemu_version = basevm.get_qemu_version(qemu_path)
+ if qemu_version < QEMU_AARCH64_MIN_VERSION:
+ error = "\nThis major version of QEMU {} is to old for aarch64 VMs.\n"\
+ "The major version must be at least {}.\n"\
+ "To continue with the current build of QEMU, "\
+ "please restart with QEMU_LOCAL=1 .\n"
+ print(error.format(qemu_version, QEMU_AARCH64_MIN_VERSION))
+ exit(1)
+ if qemu_version == QEMU_AARCH64_MIN_VERSION:
+ # We have an older version of QEMU,
+ # set the config values for backwards compatibility.
+ if kvm_available('aarch64'):
+ config.update(DEFAULT_CONFIG['kvm'])
+ else:
+ config.update(DEFAULT_CONFIG['tcg'])
+ return config
+
+def create_flash_images(flash_dir="./", efi_img=""):
+ """Creates the appropriate pflash files
+ for an aarch64 VM."""
+ flash0_path = get_flash_path(flash_dir, "flash0")
+ flash1_path = get_flash_path(flash_dir, "flash1")
+ fd_null = open(os.devnull, 'w')
+ subprocess.check_call(["dd", "if=/dev/zero", "of={}".format(flash0_path),
+ "bs=1M", "count=64"],
+ stdout=fd_null, stderr=subprocess.STDOUT)
+ # A reliable way to get the QEMU EFI image is via an installed package or
+ # via the bios included with qemu.
+ if not os.path.exists(efi_img):
+ sys.stderr.write("*** efi argument is invalid ({})\n".format(efi_img))
+ sys.stderr.write("*** please check --efi-aarch64 argument or "\
+ "install qemu-efi-aarch64 package\n")
+ exit(3)
+ subprocess.check_call(["dd", "if={}".format(efi_img),
+ "of={}".format(flash0_path),
+ "conv=notrunc"],
+ stdout=fd_null, stderr=subprocess.STDOUT)
+ subprocess.check_call(["dd", "if=/dev/zero",
+ "of={}".format(flash1_path),
+ "bs=1M", "count=64"],
+ stdout=fd_null, stderr=subprocess.STDOUT)
+ fd_null.close()
+
+def get_pflash_args(flash_dir="./"):
+ """Returns a string that can be used to
+ boot qemu using the appropriate pflash files
+ for aarch64."""
+ flash0_path = get_flash_path(flash_dir, "flash0")
+ flash1_path = get_flash_path(flash_dir, "flash1")
+ pflash_args_str = "-drive file={},format=raw,if=pflash "\
+ "-drive file={},format=raw,if=pflash"
+ pflash_args = pflash_args_str.format(flash0_path, flash1_path)
+ return pflash_args.split(" ")
+
+def get_flash_path(flash_dir, name):
+ return os.path.join(flash_dir, "{}.img".format(name))
diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py
index 1aab9e3a24..f406a20466 100644
--- a/tests/vm/basevm.py
+++ b/tests/vm/basevm.py
@@ -92,6 +92,7 @@ class BaseVM(object):
self._guest = None
self._genisoimage = args.genisoimage
self._build_path = args.build_path
+ self._efi_aarch64 = args.efi_aarch64
# Allow input config to override defaults.
self._config = DEFAULT_CONFIG.copy()
if config != None:
@@ -496,6 +497,14 @@ def get_qemu_path(arch, build_path=None):
qemu_path = "qemu-system-" + arch
return qemu_path
+def get_qemu_version(qemu_path):
+ """Get the version number from the current QEMU,
+ and return the major number."""
+ output = subprocess.check_output([qemu_path, '--version'])
+ version_line = output.decode("utf-8")
+ version_num = re.split(' |\(', version_line)[3].split('.')[0]
+ return int(version_num)
+
def parse_config(config, args):
""" Parse yaml config and populate our config structure.
The yaml config allows the user to override the
@@ -573,6 +582,9 @@ def parse_args(vmcls):
parser.add_option("--build-path", default=None,
help="Path of build directory, "\
"for using build tree QEMU binary. ")
+ parser.add_option("--efi-aarch64",
+ default="/usr/share/qemu-efi-aarch64/QEMU_EFI.fd",
+ help="Path to efi image for aarch64 VMs.")
parser.disable_interspersed_args()
return parser.parse_args()
diff --git a/tests/vm/ubuntu.aarch64 b/tests/vm/ubuntu.aarch64
new file mode 100755
index 0000000000..6f903c029c
--- /dev/null
+++ b/tests/vm/ubuntu.aarch64
@@ -0,0 +1,68 @@
+#!/usr/bin/env python3
+#
+# Ubuntu aarch64 image
+#
+# Copyright 2020 Linaro
+#
+# Authors:
+# Robert Foley <robert.foley@linaro.org>
+# Originally based on ubuntu.i386 Fam Zheng <famz@redhat.com>
+#
+# This code is licensed under the GPL version 2 or later. See
+# the COPYING file in the top-level directory.
+#
+
+import sys
+import basevm
+import aarch64vm
+import ubuntuvm
+
+DEFAULT_CONFIG = {
+ 'cpu' : "cortex-a57",
+ 'machine' : "virt,gic-version=3",
+ 'install_cmds' : "apt-get update,"\
+ "apt-get build-dep -y --arch-only qemu,"\
+ "apt-get install -y libfdt-dev flex bison pkg-config",
+ # We increase beyond the default time since during boot
+ # it can take some time (many seconds) to log into the VM
+ # especially using softmmu.
+ 'ssh_timeout' : 60,
+}
+
+class UbuntuAarch64VM(ubuntuvm.UbuntuVM):
+ name = "ubuntu.aarch64"
+ arch = "aarch64"
+ image_name = "ubuntu-18.04-server-cloudimg-arm64.img"
+ image_link = "https://cloud-images.ubuntu.com/releases/18.04/release/" + image_name
+ image_sha256="0fdcba761965735a8a903d8b88df8e47f156f48715c00508e4315c506d7d3cb1"
+ BUILD_SCRIPT = """
+ set -e;
+ cd $(mktemp -d);
+ sudo chmod a+r /dev/vdb;
+ tar --checkpoint=.10 -xf /dev/vdb;
+ ./configure {configure_opts};
+ make --output-sync {target} -j{jobs} {verbose};
+ """
+ def boot(self, img, extra_args=None):
+ aarch64vm.create_flash_images(self._tmpdir, self._efi_aarch64)
+ default_args = aarch64vm.get_pflash_args(self._tmpdir)
+ if extra_args:
+ extra_args.extend(default_args)
+ else:
+ extra_args = default_args
+ # We always add these performance tweaks
+ # because without them, we boot so slowly that we
+ # can time out finding the boot efi device.
+ if '-smp' not in extra_args and \
+ '-smp' not in self._config['extra_args'] and \
+ '-smp' not in self._args:
+ # Only add if not already there to give caller option to change it.
+ extra_args.extend(["-smp", "8"])
+
+ # We have overridden boot() since aarch64 has additional parameters.
+ # Call down to the base class method.
+ super(UbuntuAarch64VM, self).boot(img, extra_args=extra_args)
+
+if __name__ == "__main__":
+ defaults = aarch64vm.get_config_defaults(UbuntuAarch64VM, DEFAULT_CONFIG)
+ sys.exit(basevm.main(UbuntuAarch64VM, defaults))
--
2.17.1
^ permalink raw reply related
* Re: [PATCH v3 6/7] zram: Allocate struct zcomp_strm as per-CPU memory
From: Minchan Kim @ 2020-05-29 20:51 UTC (permalink / raw)
To: Sebastian Andrzej Siewior
Cc: linux-kernel, Peter Zijlstra, Ingo Molnar, Steven Rostedt,
Will Deacon, Thomas Gleixner, Paul E . McKenney, Linus Torvalds,
Matthew Wilcox, Nitin Gupta, Sergey Senozhatsky
In-Reply-To: <20200527201119.1692513-7-bigeasy@linutronix.de>
On Wed, May 27, 2020 at 10:11:18PM +0200, Sebastian Andrzej Siewior wrote:
> zcomp::stream is a per-CPU pointer, pointing to struct zcomp_strm
> which contains two pointers. Having struct zcomp_strm allocated
> directly as per-CPU memory would avoid one additional memory
> allocation and a pointer dereference. This also simplifies the
> addition of a local_lock to struct zcomp_strm.
>
> Allocate zcomp::stream directly as per-CPU memory.
>
> Cc: Minchan Kim <minchan@kernel.org>
> Cc: Nitin Gupta <ngupta@vflare.org>
> Cc: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Acked-by: Minchan Kim <minchan@kernel.org>
Looks good to me.
^ permalink raw reply
* [PATCH v8 10/12] tests/vm: change scripts to use self._config
From: Robert Foley @ 2020-05-29 20:34 UTC (permalink / raw)
To: qemu-devel; +Cc: Fam Zheng, philmd, alex.bennee, robert.foley, peter.puhov
In-Reply-To: <20200529203458.1038-1-robert.foley@linaro.org>
This change converts existing scripts to using for example self.ROOT_PASS,
to self._config['root_pass'].
We made similar changes for GUEST_USER, and GUEST_PASS.
This allows us also to remove the change in basevm.py,
which adds __getattr__ for backwards compatibility.
Signed-off-by: Robert Foley <robert.foley@linaro.org>
Reviewed-by: Peter Puhov <peter.puhov@linaro.org>
---
tests/vm/basevm.py | 11 ++---------
tests/vm/fedora | 17 +++++++++--------
tests/vm/freebsd | 16 ++++++++--------
tests/vm/netbsd | 19 ++++++++++---------
tests/vm/openbsd | 17 +++++++++--------
5 files changed, 38 insertions(+), 42 deletions(-)
diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py
index f406a20466..b9d828423b 100644
--- a/tests/vm/basevm.py
+++ b/tests/vm/basevm.py
@@ -183,13 +183,6 @@ class BaseVM(object):
self.console_init(timeout=timeout)
self.console_wait(wait_string)
- def __getattr__(self, name):
- # Support direct access to config by key.
- # for example, access self._config['cpu'] by self.cpu
- if name.lower() in self._config.keys():
- return self._config[name.lower()]
- return object.__getattribute__(self, name)
-
def _download_with_cache(self, url, sha256sum=None, sha512sum=None):
def check_sha256sum(fname):
if not sha256sum:
@@ -239,13 +232,13 @@ class BaseVM(object):
return r
def ssh(self, *cmd):
- return self._ssh_do(self.GUEST_USER, cmd, False)
+ return self._ssh_do(self._config["guest_user"], cmd, False)
def ssh_root(self, *cmd):
return self._ssh_do("root", cmd, False)
def ssh_check(self, *cmd):
- self._ssh_do(self.GUEST_USER, cmd, True)
+ self._ssh_do(self._config["guest_user"], cmd, True)
def ssh_root_check(self, *cmd):
self._ssh_do("root", cmd, True)
diff --git a/tests/vm/fedora b/tests/vm/fedora
index bd9c6cf295..f536a92678 100755
--- a/tests/vm/fedora
+++ b/tests/vm/fedora
@@ -109,20 +109,20 @@ class FedoraVM(basevm.BaseVM):
self.console_wait_send("7) [!] Root password", "7\n")
self.console_wait("Password:")
- self.console_send("%s\n" % self.ROOT_PASS)
+ self.console_send("%s\n" % self._config["root_pass"])
self.console_wait("Password (confirm):")
- self.console_send("%s\n" % self.ROOT_PASS)
+ self.console_send("%s\n" % self._config["root_pass"])
self.console_wait_send("8) [ ] User creation", "8\n")
self.console_wait_send("1) [ ] Create user", "1\n")
self.console_wait_send("3) User name", "3\n")
- self.console_wait_send("ENTER:", "%s\n" % self.GUEST_USER)
+ self.console_wait_send("ENTER:", "%s\n" % self._config["guest_user"])
self.console_wait_send("4) [ ] Use password", "4\n")
self.console_wait_send("5) Password", "5\n")
self.console_wait("Password:")
- self.console_send("%s\n" % self.GUEST_PASS)
+ self.console_send("%s\n" % self._config["guest_pass"])
self.console_wait("Password (confirm):")
- self.console_send("%s\n" % self.GUEST_PASS)
+ self.console_send("%s\n" % self._config["guest_pass"])
self.console_wait_send("7) Groups", "c\n")
while True:
@@ -140,7 +140,7 @@ class FedoraVM(basevm.BaseVM):
if good:
break
time.sleep(10)
- self.console_send("r\n" % self.GUEST_PASS)
+ self.console_send("r\n" % self._config["guest_pass"])
self.console_wait_send("'b' to begin install", "b\n")
@@ -151,12 +151,13 @@ class FedoraVM(basevm.BaseVM):
# setup qemu user
prompt = " ~]$"
- self.console_ssh_init(prompt, self.GUEST_USER, self.GUEST_PASS)
+ self.console_ssh_init(prompt, self._config["guest_user"],
+ self._config["guest_pass"])
self.console_wait_send(prompt, "exit\n")
# setup root user
prompt = " ~]#"
- self.console_ssh_init(prompt, "root", self.ROOT_PASS)
+ self.console_ssh_init(prompt, "root", self._config["root_pass"])
self.console_sshd_config(prompt)
# setup virtio-blk #1 (tarfile)
diff --git a/tests/vm/freebsd b/tests/vm/freebsd
index 298967fe9c..898393b58d 100755
--- a/tests/vm/freebsd
+++ b/tests/vm/freebsd
@@ -114,9 +114,9 @@ class FreeBSDVM(basevm.BaseVM):
# post-install configuration
self.console_wait("New Password:")
- self.console_send("%s\n" % self.ROOT_PASS)
+ self.console_send("%s\n" % self._config["root_pass"])
self.console_wait("Retype New Password:")
- self.console_send("%s\n" % self.ROOT_PASS)
+ self.console_send("%s\n" % self._config["root_pass"])
self.console_wait_send("Network Configuration", "\n")
self.console_wait_send("IPv4", "y")
@@ -135,9 +135,9 @@ class FreeBSDVM(basevm.BaseVM):
# qemu user
self.console_wait_send("Add User Accounts", "y")
self.console_wait("Username")
- self.console_send("%s\n" % self.GUEST_USER)
+ self.console_send("%s\n" % self._config["guest_user"])
self.console_wait("Full name")
- self.console_send("%s\n" % self.GUEST_USER)
+ self.console_send("%s\n" % self._config["guest_user"])
self.console_wait_send("Uid", "\n")
self.console_wait_send("Login group", "\n")
self.console_wait_send("Login group", "\n")
@@ -149,9 +149,9 @@ class FreeBSDVM(basevm.BaseVM):
self.console_wait_send("Use an empty password", "\n")
self.console_wait_send("Use a random password", "\n")
self.console_wait("Enter password:")
- self.console_send("%s\n" % self.GUEST_PASS)
+ self.console_send("%s\n" % self._config["guest_pass"])
self.console_wait("Enter password again:")
- self.console_send("%s\n" % self.GUEST_PASS)
+ self.console_send("%s\n" % self._config["guest_pass"])
self.console_wait_send("Lock out", "\n")
self.console_wait_send("OK", "yes\n")
self.console_wait_send("Add another user", "no\n")
@@ -165,12 +165,12 @@ class FreeBSDVM(basevm.BaseVM):
# setup qemu user
prompt = "$"
- self.console_ssh_init(prompt, self.GUEST_USER, self.GUEST_PASS)
+ self.console_ssh_init(prompt, self._config["guest_user"], self._config["guest_pass"])
self.console_wait_send(prompt, "exit\n")
# setup root user
prompt = "root@freebsd:~ #"
- self.console_ssh_init(prompt, "root", self.ROOT_PASS)
+ self.console_ssh_init(prompt, "root", self._config["root_pass"])
self.console_sshd_config(prompt)
# setup serial console
diff --git a/tests/vm/netbsd b/tests/vm/netbsd
index b10c9d429d..7e54fe8322 100755
--- a/tests/vm/netbsd
+++ b/tests/vm/netbsd
@@ -121,24 +121,24 @@ class NetBSDVM(basevm.BaseVM):
self.console_wait_send("d: Change root password", "d\n")
self.console_wait_send("a: Yes", "a\n")
self.console_wait("New password:")
- self.console_send("%s\n" % self.ROOT_PASS)
+ self.console_send("%s\n" % self._config["root_pass"])
self.console_wait("New password:")
- self.console_send("%s\n" % self.ROOT_PASS)
+ self.console_send("%s\n" % self._config["root_pass"])
self.console_wait("Retype new password:")
- self.console_send("%s\n" % self.ROOT_PASS)
+ self.console_send("%s\n" % self._config["root_pass"])
self.console_wait_send("o: Add a user", "o\n")
self.console_wait("username")
- self.console_send("%s\n" % self.GUEST_USER)
+ self.console_send("%s\n" % self._config["guest_pass"])
self.console_wait("to group wheel")
self.console_wait_send("a: Yes", "a\n")
self.console_wait_send("a: /bin/sh", "a\n")
self.console_wait("New password:")
- self.console_send("%s\n" % self.GUEST_PASS)
+ self.console_send("%s\n" % self._config["guest_pass"])
self.console_wait("New password:")
- self.console_send("%s\n" % self.GUEST_PASS)
+ self.console_send("%s\n" % self._config["guest_pass"])
self.console_wait("Retype new password:")
- self.console_send("%s\n" % self.GUEST_PASS)
+ self.console_send("%s\n" % self._config["guest_pass"])
self.console_wait_send("a: Configure network", "a\n")
self.console_wait_send("a: vioif0", "a\n")
@@ -171,12 +171,13 @@ class NetBSDVM(basevm.BaseVM):
# setup qemu user
prompt = "localhost$"
- self.console_ssh_init(prompt, self.GUEST_USER, self.GUEST_PASS)
+ self.console_ssh_init(prompt, self._config["guest_user"],
+ self._config["guest_pass"])
self.console_wait_send(prompt, "exit\n")
# setup root user
prompt = "localhost#"
- self.console_ssh_init(prompt, "root", self.ROOT_PASS)
+ self.console_ssh_init(prompt, "root", self._config["root_pass"])
self.console_sshd_config(prompt)
# setup virtio-blk #1 (tarfile)
diff --git a/tests/vm/openbsd b/tests/vm/openbsd
index 0b705f4945..04a532c763 100755
--- a/tests/vm/openbsd
+++ b/tests/vm/openbsd
@@ -99,9 +99,9 @@ class OpenBSDVM(basevm.BaseVM):
self.console_wait_send("Which network interface", "done\n")
self.console_wait_send("DNS domain name", "localnet\n")
self.console_wait("Password for root account")
- self.console_send("%s\n" % self.ROOT_PASS)
+ self.console_send("%s\n" % self._config["root_pass"])
self.console_wait("Password for root account")
- self.console_send("%s\n" % self.ROOT_PASS)
+ self.console_send("%s\n" % self._config["root_pass"])
self.console_wait_send("Start sshd(8)", "yes\n")
self.console_wait_send("X Window System", "\n")
self.console_wait_send("xenodm", "\n")
@@ -109,13 +109,13 @@ class OpenBSDVM(basevm.BaseVM):
self.console_wait_send("Which speed", "\n")
self.console_wait("Setup a user")
- self.console_send("%s\n" % self.GUEST_USER)
+ self.console_send("%s\n" % self._config["guest_user"])
self.console_wait("Full name")
- self.console_send("%s\n" % self.GUEST_USER)
+ self.console_send("%s\n" % self._config["guest_user"])
self.console_wait("Password")
- self.console_send("%s\n" % self.GUEST_PASS)
+ self.console_send("%s\n" % self._config["guest_pass"])
self.console_wait("Password")
- self.console_send("%s\n" % self.GUEST_PASS)
+ self.console_send("%s\n" % self._config["guest_pass"])
self.console_wait_send("Allow root ssh login", "yes\n")
self.console_wait_send("timezone", "UTC\n")
@@ -136,12 +136,13 @@ class OpenBSDVM(basevm.BaseVM):
# setup qemu user
prompt = "$"
- self.console_ssh_init(prompt, self.GUEST_USER, self.GUEST_PASS)
+ self.console_ssh_init(prompt, self._config["guest_user"],
+ self._config["guest_pass"])
self.console_wait_send(prompt, "exit\n")
# setup root user
prompt = "openbsd#"
- self.console_ssh_init(prompt, "root", self.ROOT_PASS)
+ self.console_ssh_init(prompt, "root", self._config["root_pass"])
self.console_sshd_config(prompt)
# setup virtio-blk #1 (tarfile)
--
2.17.1
^ permalink raw reply related
* [Buildroot] [PATCH/next 1/1] package/hiawatha: enable xslt support
From: Thomas Petazzoni @ 2020-05-29 20:50 UTC (permalink / raw)
To: buildroot
In-Reply-To: <20200529175856.3112405-1-fontaine.fabrice@gmail.com>
On Fri, 29 May 2020 19:58:56 +0200
Fabrice Fontaine <fontaine.fabrice@gmail.com> wrote:
> Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
> ---
> package/hiawatha/hiawatha.mk | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
Applied to next, thanks.
Thomas
--
Thomas Petazzoni, CTO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply
* Re: [PATCH v8 43/62] target/riscv: vector floating-point/integer type-convert instructions
From: Alistair Francis @ 2020-05-29 20:40 UTC (permalink / raw)
To: LIU Zhiwei
Cc: open list:RISC-V, Richard Henderson,
qemu-devel@nongnu.org Developers, wxy194768, wenmeng_zhang,
Alistair Francis, Palmer Dabbelt
In-Reply-To: <20200521094413.10425-44-zhiwei_liu@c-sky.com>
On Thu, May 21, 2020 at 4:11 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>
> Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/helper.h | 13 ++++++++++
> target/riscv/insn32.decode | 4 +++
> target/riscv/insn_trans/trans_rvv.inc.c | 6 +++++
> target/riscv/vector_helper.c | 33 +++++++++++++++++++++++++
> 4 files changed, 56 insertions(+)
>
> diff --git a/target/riscv/helper.h b/target/riscv/helper.h
> index 21054cc957..05f8fb5ffc 100644
> --- a/target/riscv/helper.h
> +++ b/target/riscv/helper.h
> @@ -998,3 +998,16 @@ DEF_HELPER_5(vfclass_v_d, void, ptr, ptr, ptr, env, i32)
> DEF_HELPER_6(vfmerge_vfm_h, void, ptr, ptr, i64, ptr, env, i32)
> DEF_HELPER_6(vfmerge_vfm_w, void, ptr, ptr, i64, ptr, env, i32)
> DEF_HELPER_6(vfmerge_vfm_d, void, ptr, ptr, i64, ptr, env, i32)
> +
> +DEF_HELPER_5(vfcvt_xu_f_v_h, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfcvt_xu_f_v_w, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfcvt_xu_f_v_d, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfcvt_x_f_v_h, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfcvt_x_f_v_w, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfcvt_x_f_v_d, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfcvt_f_xu_v_h, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfcvt_f_xu_v_w, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfcvt_f_xu_v_d, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfcvt_f_x_v_h, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfcvt_f_x_v_w, void, ptr, ptr, ptr, env, i32)
> +DEF_HELPER_5(vfcvt_f_x_v_d, void, ptr, ptr, ptr, env, i32)
> diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
> index 14cb4e2e66..53562c6663 100644
> --- a/target/riscv/insn32.decode
> +++ b/target/riscv/insn32.decode
> @@ -515,6 +515,10 @@ vmford_vf 011010 . ..... ..... 101 ..... 1010111 @r_vm
> vfclass_v 100011 . ..... 10000 001 ..... 1010111 @r2_vm
> vfmerge_vfm 010111 0 ..... ..... 101 ..... 1010111 @r_vm_0
> vfmv_v_f 010111 1 00000 ..... 101 ..... 1010111 @r2
> +vfcvt_xu_f_v 100010 . ..... 00000 001 ..... 1010111 @r2_vm
> +vfcvt_x_f_v 100010 . ..... 00001 001 ..... 1010111 @r2_vm
> +vfcvt_f_xu_v 100010 . ..... 00010 001 ..... 1010111 @r2_vm
> +vfcvt_f_x_v 100010 . ..... 00011 001 ..... 1010111 @r2_vm
>
> vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
> vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
> diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
> index dfa2177331..6db460177d 100644
> --- a/target/riscv/insn_trans/trans_rvv.inc.c
> +++ b/target/riscv/insn_trans/trans_rvv.inc.c
> @@ -2215,3 +2215,9 @@ static bool trans_vfmv_v_f(DisasContext *s, arg_vfmv_v_f *a)
> }
> return false;
> }
> +
> +/* Single-Width Floating-Point/Integer Type-Convert Instructions */
> +GEN_OPFV_TRANS(vfcvt_xu_f_v, opfv_check)
> +GEN_OPFV_TRANS(vfcvt_x_f_v, opfv_check)
> +GEN_OPFV_TRANS(vfcvt_f_xu_v, opfv_check)
> +GEN_OPFV_TRANS(vfcvt_f_x_v, opfv_check)
> diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
> index 018293570d..34b21c8deb 100644
> --- a/target/riscv/vector_helper.c
> +++ b/target/riscv/vector_helper.c
> @@ -4217,3 +4217,36 @@ void HELPER(NAME)(void *vd, void *v0, uint64_t s1, void *vs2, \
> GEN_VFMERGE_VF(vfmerge_vfm_h, int16_t, H2, clearh)
> GEN_VFMERGE_VF(vfmerge_vfm_w, int32_t, H4, clearl)
> GEN_VFMERGE_VF(vfmerge_vfm_d, int64_t, H8, clearq)
> +
> +/* Single-Width Floating-Point/Integer Type-Convert Instructions */
> +/* vfcvt.xu.f.v vd, vs2, vm # Convert float to unsigned integer. */
> +RVVCALL(OPFVV1, vfcvt_xu_f_v_h, OP_UU_H, H2, H2, float16_to_uint16)
> +RVVCALL(OPFVV1, vfcvt_xu_f_v_w, OP_UU_W, H4, H4, float32_to_uint32)
> +RVVCALL(OPFVV1, vfcvt_xu_f_v_d, OP_UU_D, H8, H8, float64_to_uint64)
> +GEN_VEXT_V_ENV(vfcvt_xu_f_v_h, 2, 2, clearh)
> +GEN_VEXT_V_ENV(vfcvt_xu_f_v_w, 4, 4, clearl)
> +GEN_VEXT_V_ENV(vfcvt_xu_f_v_d, 8, 8, clearq)
> +
> +/* vfcvt.x.f.v vd, vs2, vm # Convert float to signed integer. */
> +RVVCALL(OPFVV1, vfcvt_x_f_v_h, OP_UU_H, H2, H2, float16_to_int16)
> +RVVCALL(OPFVV1, vfcvt_x_f_v_w, OP_UU_W, H4, H4, float32_to_int32)
> +RVVCALL(OPFVV1, vfcvt_x_f_v_d, OP_UU_D, H8, H8, float64_to_int64)
> +GEN_VEXT_V_ENV(vfcvt_x_f_v_h, 2, 2, clearh)
> +GEN_VEXT_V_ENV(vfcvt_x_f_v_w, 4, 4, clearl)
> +GEN_VEXT_V_ENV(vfcvt_x_f_v_d, 8, 8, clearq)
> +
> +/* vfcvt.f.xu.v vd, vs2, vm # Convert unsigned integer to float. */
> +RVVCALL(OPFVV1, vfcvt_f_xu_v_h, OP_UU_H, H2, H2, uint16_to_float16)
> +RVVCALL(OPFVV1, vfcvt_f_xu_v_w, OP_UU_W, H4, H4, uint32_to_float32)
> +RVVCALL(OPFVV1, vfcvt_f_xu_v_d, OP_UU_D, H8, H8, uint64_to_float64)
> +GEN_VEXT_V_ENV(vfcvt_f_xu_v_h, 2, 2, clearh)
> +GEN_VEXT_V_ENV(vfcvt_f_xu_v_w, 4, 4, clearl)
> +GEN_VEXT_V_ENV(vfcvt_f_xu_v_d, 8, 8, clearq)
> +
> +/* vfcvt.f.x.v vd, vs2, vm # Convert integer to float. */
> +RVVCALL(OPFVV1, vfcvt_f_x_v_h, OP_UU_H, H2, H2, int16_to_float16)
> +RVVCALL(OPFVV1, vfcvt_f_x_v_w, OP_UU_W, H4, H4, int32_to_float32)
> +RVVCALL(OPFVV1, vfcvt_f_x_v_d, OP_UU_D, H8, H8, int64_to_float64)
> +GEN_VEXT_V_ENV(vfcvt_f_x_v_h, 2, 2, clearh)
> +GEN_VEXT_V_ENV(vfcvt_f_x_v_w, 4, 4, clearl)
> +GEN_VEXT_V_ENV(vfcvt_f_x_v_d, 8, 8, clearq)
> --
> 2.23.0
>
>
^ permalink raw reply
* Re: [PATCH v6 11/12] mmap locking API: convert mmap_sem API comments
From: Daniel Jordan @ 2020-05-29 20:50 UTC (permalink / raw)
To: Michel Lespinasse
Cc: Andrew Morton, linux-mm, LKML, Peter Zijlstra, Laurent Dufour,
Vlastimil Babka, Matthew Wilcox, Liam Howlett, Jerome Glisse,
Davidlohr Bueso, David Rientjes, Hugh Dickins, Ying Han,
Jason Gunthorpe, Daniel Jordan, John Hubbard
In-Reply-To: <20200520052908.204642-12-walken@google.com>
On Tue, May 19, 2020 at 10:29:07PM -0700, Michel Lespinasse wrote:
> Convert comments that reference old mmap_sem APIs to reference
> corresponding new mmap locking APIs instead.
>
> Signed-off-by: Michel Lespinasse <walken@google.com>
Reviewed-by: Daniel Jordan <daniel.m.jordan@oracle.com>
^ permalink raw reply
* [PATCH v8 06/12] tests/vm: allow wait_ssh() to specify command
From: Robert Foley @ 2020-05-29 20:34 UTC (permalink / raw)
To: qemu-devel; +Cc: Fam Zheng, philmd, alex.bennee, robert.foley, peter.puhov
In-Reply-To: <20200529203458.1038-1-robert.foley@linaro.org>
This allows for waiting for completion of arbitrary commands.
Signed-off-by: Robert Foley <robert.foley@linaro.org>
Reviewed-by: Peter Puhov <peter.puhov@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/vm/basevm.py | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py
index 75a7ac2bd3..1aab9e3a24 100644
--- a/tests/vm/basevm.py
+++ b/tests/vm/basevm.py
@@ -411,24 +411,24 @@ class BaseVM(object):
def print_step(self, text):
sys.stderr.write("### %s ...\n" % text)
- def wait_ssh(self, wait_root=False, seconds=300):
+ def wait_ssh(self, wait_root=False, seconds=300, cmd="exit 0"):
# Allow more time for VM to boot under TCG.
if not kvm_available(self.arch):
seconds *= self.tcg_ssh_timeout_multiplier
starttime = datetime.datetime.now()
endtime = starttime + datetime.timedelta(seconds=seconds)
- guest_up = False
+ cmd_success = False
while datetime.datetime.now() < endtime:
- if wait_root and self.ssh_root("exit 0") == 0:
- guest_up = True
+ if wait_root and self.ssh_root(cmd) == 0:
+ cmd_success = True
break
- elif self.ssh("exit 0") == 0:
- guest_up = True
+ elif self.ssh(cmd) == 0:
+ cmd_success = True
break
seconds = (endtime - datetime.datetime.now()).total_seconds()
logging.debug("%ds before timeout", seconds)
time.sleep(1)
- if not guest_up:
+ if not cmd_success:
raise Exception("Timeout while waiting for guest ssh")
def shutdown(self):
--
2.17.1
^ permalink raw reply related
* [dax:xarray-pagecache 67/67] m68k-linux-ld: filemap.c:undefined reference to `dump_iomap_page'
From: kbuild test robot @ 2020-05-29 20:49 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 1576 bytes --]
tree: git://git.infradead.org/users/willy/linux-dax.git xarray-pagecache
head: 85277e3f0e1527f5f40225fa49a5cb2441b2b548
commit: 85277e3f0e1527f5f40225fa49a5cb2441b2b548 [67/67] debug
config: m68k-allnoconfig (attached as .config)
compiler: m68k-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
git checkout 85277e3f0e1527f5f40225fa49a5cb2441b2b548
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=m68k
If you fix the issue, kindly add following tag as appropriate
Reported-by: kbuild test robot <lkp@intel.com>
All errors (new ones prefixed by >>, old ones prefixed by <<):
m68k-linux-ld: mm/filemap.o: in function `__lock_page':
filemap.c:(.text+0x19f4): undefined reference to `dump_iomap_page'
>> m68k-linux-ld: filemap.c:(.text+0x1b02): undefined reference to `dump_iomap_page'
m68k-linux-ld: mm/filemap.o: in function `__lock_page_or_retry':
filemap.c:(.text+0x1e78): undefined reference to `dump_iomap_page'
m68k-linux-ld: filemap.c:(.text+0x1fba): undefined reference to `dump_iomap_page'
m68k-linux-ld: filemap.c:(.text+0x2170): undefined reference to `dump_iomap_page'
m68k-linux-ld: mm/filemap.o:filemap.c:(.text+0x21e6): more undefined references to `dump_iomap_page' follow
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 4923 bytes --]
^ permalink raw reply
* [PATCH v8 09/12] tests/vm: Added a new script for centos.aarch64.
From: Robert Foley @ 2020-05-29 20:34 UTC (permalink / raw)
To: qemu-devel; +Cc: Fam Zheng, philmd, alex.bennee, robert.foley, peter.puhov
In-Reply-To: <20200529203458.1038-1-robert.foley@linaro.org>
centos.aarch64 creates a CentOS 8 image.
Also added a new kickstart script used to build the centos.aarch64 image.
Signed-off-by: Robert Foley <robert.foley@linaro.org>
Reviewed-by: Peter Puhov <peter.puhov@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/vm/Makefile.include | 3 +-
tests/vm/centos-8-aarch64.ks | 51 ++++++++
tests/vm/centos.aarch64 | 227 +++++++++++++++++++++++++++++++++++
3 files changed, 280 insertions(+), 1 deletion(-)
create mode 100644 tests/vm/centos-8-aarch64.ks
create mode 100755 tests/vm/centos.aarch64
diff --git a/tests/vm/Makefile.include b/tests/vm/Makefile.include
index cc71e6ed0a..8cccfaf95d 100644
--- a/tests/vm/Makefile.include
+++ b/tests/vm/Makefile.include
@@ -6,7 +6,7 @@ IMAGES := freebsd netbsd openbsd centos fedora
ifneq ($(GENISOIMAGE),)
IMAGES += ubuntu.i386 centos
ifneq ($(EFI_AARCH64),)
-IMAGES += ubuntu.aarch64
+IMAGES += ubuntu.aarch64 centos.aarch64
endif
endif
@@ -28,6 +28,7 @@ ifneq ($(GENISOIMAGE),)
@echo " vm-build-ubuntu.i386 - Build QEMU in ubuntu i386 VM"
ifneq ($(EFI_AARCH64),)
@echo " vm-build-ubuntu.aarch64 - Build QEMU in ubuntu aarch64 VM"
+ @echo " vm-build-centos.aarch64 - Build QEMU in CentOS aarch64 VM"
else
@echo " (install qemu-efi-aarch64 to build centos/ubuntu aarch64 images.)"
endif
diff --git a/tests/vm/centos-8-aarch64.ks b/tests/vm/centos-8-aarch64.ks
new file mode 100644
index 0000000000..fd6ebe4d49
--- /dev/null
+++ b/tests/vm/centos-8-aarch64.ks
@@ -0,0 +1,51 @@
+# CentOS aarch64 image kickstart file.
+# This file is used by the CentOS installer to
+# script the generation of the image.
+#
+# Copyright 2020 Linaro
+#
+ignoredisk --only-use=vda
+# System bootloader configuration
+bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=vda
+autopart --type=plain
+# Partition clearing information
+clearpart --linux --initlabel --drives=vda
+# Use text mode install
+text
+repo --name="AppStream" --baseurl=file:///run/install/repo/AppStream
+# Use CDROM installation media
+cdrom
+# Keyboard layouts
+keyboard --vckeymap=us --xlayouts=''
+# System language
+lang en_US.UTF-8
+
+# Network information
+network --bootproto=dhcp --device=enp0s1 --onboot=off --ipv6=auto --no-activate
+network --hostname=localhost.localdomain
+# Run the Setup Agent on first boot
+firstboot --enable
+# Do not configure the X Window System
+skipx
+# System services
+services --enabled="chronyd"
+# System timezone
+timezone America/New_York --isUtc
+
+# Shutdown after installation is complete.
+shutdown
+
+%packages
+@^server-product-environment
+kexec-tools
+
+%end
+
+%addon com_redhat_kdump --enable --reserve-mb='auto'
+
+%end
+%anaconda
+pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
+pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
+pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
+%end
diff --git a/tests/vm/centos.aarch64 b/tests/vm/centos.aarch64
new file mode 100755
index 0000000000..d5232ecdb8
--- /dev/null
+++ b/tests/vm/centos.aarch64
@@ -0,0 +1,227 @@
+#!/usr/bin/env python3
+#
+# Centos aarch64 image
+#
+# Copyright 2020 Linaro
+#
+# Authors:
+# Robert Foley <robert.foley@linaro.org>
+# Originally based on ubuntu.aarch64
+#
+# This code is licensed under the GPL version 2 or later. See
+# the COPYING file in the top-level directory.
+#
+
+import os
+import sys
+import subprocess
+import basevm
+import time
+import traceback
+import aarch64vm
+
+DEFAULT_CONFIG = {
+ 'cpu' : "max",
+ 'machine' : "virt,gic-version=max",
+ 'install_cmds' : "yum install -y make git python3 gcc gcc-c++ flex bison, "\
+ "yum install -y glib2-devel pixman-devel zlib-devel, "\
+ "yum install -y perl-Test-Harness, "\
+ "alternatives --set python /usr/bin/python3, "\
+ "sudo dnf config-manager "\
+ "--add-repo=https://download.docker.com/linux/centos/docker-ce.repo,"\
+ "sudo dnf install --nobest -y docker-ce.aarch64,"\
+ "systemctl enable docker",
+ # We increase beyond the default time since during boot
+ # it can take some time (many seconds) to log into the VM.
+ 'ssh_timeout' : 60,
+}
+
+class CentosAarch64VM(basevm.BaseVM):
+ name = "centos.aarch64"
+ arch = "aarch64"
+ login_prompt = "localhost login:"
+ prompt = '[root@localhost ~]#'
+ image_name = "CentOS-8-aarch64-1905-dvd1.iso"
+ image_link = "http://mirrors.usc.edu/pub/linux/distributions/centos/8.0.1905/isos/aarch64/"
+ image_link += image_name
+ BUILD_SCRIPT = """
+ set -e;
+ cd $(mktemp -d);
+ sudo chmod a+r /dev/vdb;
+ tar --checkpoint=.10 -xf /dev/vdb;
+ ./configure {configure_opts};
+ make --output-sync {target} -j{jobs} {verbose};
+ """
+ def set_key_perm(self):
+ """Set permissions properly on certain files to allow
+ ssh access."""
+ self.console_wait_send(self.prompt,
+ "/usr/sbin/restorecon -R -v /root/.ssh\n")
+ self.console_wait_send(self.prompt,
+ "/usr/sbin/restorecon -R -v "\
+ "/home/{}/.ssh\n".format(self._config["guest_user"]))
+
+ def create_kickstart(self):
+ """Generate the kickstart file used to generate the centos image."""
+ # Start with the template for the kickstart.
+ ks_file = "../tests/vm/centos-8-aarch64.ks"
+ subprocess.check_call("cp {} ./ks.cfg".format(ks_file), shell=True)
+ # Append the ssh keys to the kickstart file
+ # as the post processing phase of installation.
+ with open("ks.cfg", "a") as f:
+ # Add in the root pw and guest user.
+ rootpw = "rootpw --plaintext {}\n"
+ f.write(rootpw.format(self._config["root_pass"]))
+ add_user = "user --groups=wheel --name={} "\
+ "--password={} --plaintext\n"
+ f.write(add_user.format(self._config["guest_user"],
+ self._config["guest_pass"]))
+ # Add the ssh keys.
+ f.write("%post --log=/root/ks-post.log\n")
+ f.write("mkdir -p /root/.ssh\n")
+ addkey = 'echo "{}" >> /root/.ssh/authorized_keys\n'
+ addkey_cmd = addkey.format(self._config["ssh_pub_key"])
+ f.write(addkey_cmd)
+ f.write('mkdir -p /home/{}/.ssh\n'.format(self._config["guest_user"]))
+ addkey = 'echo "{}" >> /home/{}/.ssh/authorized_keys\n'
+ addkey_cmd = addkey.format(self._config["ssh_pub_key"],
+ self._config["guest_user"])
+ f.write(addkey_cmd)
+ f.write("%end\n")
+ # Take our kickstart file and create an .iso from it.
+ # The .iso will be provided to qemu as we boot
+ # from the install dvd.
+ # Anaconda will recognize the label "OEMDRV" and will
+ # start the automated installation.
+ gen_iso_img = 'genisoimage -output ks.iso -volid "OEMDRV" ks.cfg'
+ subprocess.check_call(gen_iso_img, shell=True)
+
+ def wait_for_shutdown(self):
+ """We wait for qemu to shutdown the VM and exit.
+ While this happens we display the console view
+ for easier debugging."""
+ # The image creation is essentially done,
+ # so whether or not the wait is successful we want to
+ # wait for qemu to exit (the self.wait()) before we return.
+ try:
+ self.console_wait("reboot: Power down")
+ except Exception as e:
+ sys.stderr.write("Exception hit\n")
+ if isinstance(e, SystemExit) and e.code == 0:
+ return 0
+ traceback.print_exc()
+ finally:
+ self.wait()
+
+ def build_base_image(self, dest_img):
+ """Run through the centos installer to create
+ a base image with name dest_img."""
+ # We create the temp image, and only rename
+ # to destination when we are done.
+ img = dest_img + ".tmp"
+ # Create an empty image.
+ # We will provide this as the install destination.
+ qemu_img_create = "qemu-img create {} 50G".format(img)
+ subprocess.check_call(qemu_img_create, shell=True)
+
+ # Create our kickstart file to be fed to the installer.
+ self.create_kickstart()
+ # Boot the install dvd with the params as our ks.iso
+ os_img = self._download_with_cache(self.image_link)
+ dvd_iso = "centos-8-dvd.iso"
+ subprocess.check_call(["cp", "-f", os_img, dvd_iso])
+ extra_args = "-cdrom ks.iso"
+ extra_args += " -drive file={},if=none,id=drive1,cache=writeback"
+ extra_args += " -device virtio-blk,drive=drive1,bootindex=1"
+ extra_args = extra_args.format(dvd_iso).split(" ")
+ self.boot(img, extra_args=extra_args)
+ self.console_wait_send("change the selection", "\n")
+ # We seem to need to hit esc (chr(27)) twice to abort the
+ # media check, which takes a long time.
+ # Waiting a bit seems to be more reliable before hitting esc.
+ self.console_wait("Checking")
+ time.sleep(5)
+ self.console_wait_send("Checking", chr(27))
+ time.sleep(5)
+ self.console_wait_send("Checking", chr(27))
+ print("Found Checking")
+ # Give sufficient time for the installer to create the image.
+ self.console_init(timeout=7200)
+ self.wait_for_shutdown()
+ os.rename(img, dest_img)
+ print("Done with base image build: {}".format(dest_img))
+
+ def check_create_base_img(self, img_base, img_dest):
+ """Create a base image using the installer.
+ We will use the base image if it exists.
+ This helps cut down on install time in case we
+ need to restart image creation,
+ since the base image creation can take a long time."""
+ if not os.path.exists(img_base):
+ print("Generate new base image: {}".format(img_base))
+ self.build_base_image(img_base);
+ else:
+ print("Use existing base image: {}".format(img_base))
+ # Save a copy of the base image and copy it to dest.
+ # which we will use going forward.
+ subprocess.check_call(["cp", img_base, img_dest])
+
+ def boot(self, img, extra_args=None):
+ aarch64vm.create_flash_images(self._tmpdir, self._efi_aarch64)
+ default_args = aarch64vm.get_pflash_args(self._tmpdir)
+ if extra_args:
+ extra_args.extend(default_args)
+ else:
+ extra_args = default_args
+ # We always add these performance tweaks
+ # because without them, we boot so slowly that we
+ # can time out finding the boot efi device.
+ if '-smp' not in extra_args and \
+ '-smp' not in self._config['extra_args'] and \
+ '-smp' not in self._args:
+ # Only add if not already there to give caller option to change it.
+ extra_args.extend(["-smp", "8"])
+ # We have overridden boot() since aarch64 has additional parameters.
+ # Call down to the base class method.
+ super(CentosAarch64VM, self).boot(img, extra_args=extra_args)
+
+ def build_image(self, img):
+ img_tmp = img + ".tmp"
+ self.check_create_base_img(img + ".base", img_tmp)
+
+ # Boot the new image for the first time to finish installation.
+ self.boot(img_tmp)
+ self.console_init()
+ self.console_wait_send(self.login_prompt, "root\n")
+ self.console_wait_send("Password:",
+ "{}\n".format(self._config["root_pass"]))
+
+ self.set_key_perm()
+ self.console_wait_send(self.prompt, "rpm -q centos-release\n")
+ enable_adapter = "sed -i 's/ONBOOT=no/ONBOOT=yes/g'" \
+ " /etc/sysconfig/network-scripts/ifcfg-enp0s1\n"
+ self.console_wait_send(self.prompt, enable_adapter)
+ self.console_wait_send(self.prompt, "ifup enp0s1\n")
+ self.console_wait_send(self.prompt,
+ 'echo "qemu ALL=(ALL) NOPASSWD:ALL" | '\
+ 'sudo tee /etc/sudoers.d/qemu\n')
+ self.console_wait(self.prompt)
+
+ # Rest of the commands we issue through ssh.
+ self.wait_ssh(wait_root=True)
+
+ # If the user chooses *not* to do the second phase,
+ # then we will jump right to the graceful shutdown
+ if self._config['install_cmds'] != "":
+ install_cmds = self._config['install_cmds'].split(',')
+ for cmd in install_cmds:
+ self.ssh_root(cmd)
+ self.ssh_root("poweroff")
+ self.wait_for_shutdown()
+ os.rename(img_tmp, img)
+ print("image creation complete: {}".format(img))
+ return 0
+
+if __name__ == "__main__":
+ defaults = aarch64vm.get_config_defaults(CentosAarch64VM, DEFAULT_CONFIG)
+ sys.exit(basevm.main(CentosAarch64VM, defaults))
--
2.17.1
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
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.