From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193123866288.3422396805589; Fri, 19 May 2017 04:25:23 -0700 (PDT) Received: from localhost ([::1]:57940 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBg26-0007fI-Cc for importer@patchew.org; Fri, 19 May 2017 07:25:22 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49311) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyE-0004GR-Ei for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyA-0000sh-Ss for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:22 -0400 Received: from mail-wr0-x243.google.com ([2a00:1450:400c:c0c::243]:36315) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyA-0000sK-NM for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:18 -0400 Received: by mail-wr0-x243.google.com with SMTP id v42so2612876wrc.3 for ; Fri, 19 May 2017 04:21:18 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=X+QrCGsug6TNVGVsam5dWZ/6rpjMMZmdDcvTPUbNPMw=; b=OZI9YVy4M26fF5Kv8oElWkaKmWP8hwICWEygZYDR1++Jl5n7GkKXyharV9VnTlBSoC Kdk1ylbJ4MVqvIR6uDcBgTebvfTJhVFsThYRe4hp7Mb8oOBRH7p3l7i+mTyjb5U3OtDj sCpWK10lQze6yWkmuAKq8/hV4I7G4d80BHK6oHttulLBUYtvJ5S/DR2LwJvPSrSfOBPB ydeJzrd07mSgu0ZR5vtwzTx9HAzlA8bRsU20lSM4c9Db/al4EdXeBnXrOSUy+vozLx5I rMJU5fztCTEijB05EpH8uSvo0Ie+Apr1Qg2yf4D4+Nsi+o+oxB24O/Z18+iZGml+PYxi WiVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=X+QrCGsug6TNVGVsam5dWZ/6rpjMMZmdDcvTPUbNPMw=; b=IJ20K5c+GmfRUarc89/9HI6nYWjvD08H7K/fTk3MxSXsoDL9JumqGfIi2yfzNqi+S5 ZqUwKgb0zjAMX5ggDbGCEVc8+e0MSAM2km0xnJWGu0mstM4YuUWMXdOTrEFePZDpOj8O ib33J/jr73sr5kI+MDb2nmB0rN1E/thF8bb7NCru21xdUutCU/qLSPEA0NMgk4L2x2/N B+BCd6ioJ7ShMi0D8lPNNbwQhzlHkZh0KZIjD1RfYVyo9Qj9eu6dxgsY7zXidyn9ocat IuvWfLhn8A50DQlo5d+T4Ggx44YbmAu1ai/pqI8Sy9ff6HTtYnohNYvsrXqalWOpZNJa gmxw== X-Gm-Message-State: AODbwcD5yzAfMmPlzs68V9JtKHJPWMTpAPK5lOx/nGcpyht1KGX93Fq9 5Y9inAK7qTj0hg== X-Received: by 10.223.151.13 with SMTP id r13mr2666655wrb.6.1495192877714; Fri, 19 May 2017 04:21:17 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:20:53 +0200 Message-Id: <1495192872-27667-2-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::243 Subject: [Qemu-devel] [PULL 01/20] mc146818rtc: update periodic timer only if it is needed X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Xiao Guangrong Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Xiao Guangrong Currently, the timer is updated whenever RegA or RegB is written even if the periodic timer related configuration is not changed This patch optimizes it slightly to make the update happen only if its period or enable-status is changed, also later patches are depend on this optimization Signed-off-by: Xiao Guangrong Message-Id: <20170510083259.3900-2-xiaoguangrong@tencent.com> Signed-off-by: Paolo Bonzini --- hw/timer/mc146818rtc.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c index 93de3e1..7d78391 100644 --- a/hw/timer/mc146818rtc.c +++ b/hw/timer/mc146818rtc.c @@ -391,6 +391,7 @@ static void cmos_ioport_write(void *opaque, hwaddr addr, uint64_t data, unsigned size) { RTCState *s =3D opaque; + bool update_periodic_timer; =20 if ((addr & 1) =3D=3D 0) { s->cmos_index =3D data & 0x7f; @@ -423,6 +424,8 @@ static void cmos_ioport_write(void *opaque, hwaddr addr, } break; case RTC_REG_A: + update_periodic_timer =3D (s->cmos_data[RTC_REG_A] ^ data) & 0= x0f; + if ((data & 0x60) =3D=3D 0x60) { if (rtc_running(s)) { rtc_update_time(s); @@ -445,10 +448,17 @@ static void cmos_ioport_write(void *opaque, hwaddr ad= dr, /* UIP bit is read only */ s->cmos_data[RTC_REG_A] =3D (data & ~REG_A_UIP) | (s->cmos_data[RTC_REG_A] & REG_A_UIP); - periodic_timer_update(s, qemu_clock_get_ns(rtc_clock)); + + if (update_periodic_timer) { + periodic_timer_update(s, qemu_clock_get_ns(rtc_clock)); + } + check_update_timer(s); break; case RTC_REG_B: + update_periodic_timer =3D (s->cmos_data[RTC_REG_B] ^ data) + & REG_B_PIE; + if (data & REG_B_SET) { /* update cmos to when the rtc was stopping */ if (rtc_running(s)) { @@ -475,7 +485,11 @@ static void cmos_ioport_write(void *opaque, hwaddr add= r, qemu_irq_lower(s->irq); } s->cmos_data[RTC_REG_B] =3D data; - periodic_timer_update(s, qemu_clock_get_ns(rtc_clock)); + + if (update_periodic_timer) { + periodic_timer_update(s, qemu_clock_get_ns(rtc_clock)); + } + check_update_timer(s); break; case RTC_REG_C: --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193030693520.2112192386968; Fri, 19 May 2017 04:23:50 -0700 (PDT) Received: from localhost ([::1]:57934 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBg0a-0006GE-7n for importer@patchew.org; Fri, 19 May 2017 07:23:48 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49313) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyE-0004GV-F1 for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyC-0000tZ-Ht for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:22 -0400 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:33789) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyC-0000t1-8T for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:20 -0400 Received: by mail-wm0-x242.google.com with SMTP id b84so1791794wmh.0 for ; Fri, 19 May 2017 04:21:20 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=KHQFnnfRU4aj5x3+Aex7iEYcfgRRSUJDqZu4ep4ltuM=; b=KIBzDZyCqEJLpXbxb6d6C2hxDFuIHA2WEDd2nEOyWbS9t801/yHmc6F0/HBuQbV2kr Qq0TMvMi7vU8XJbZJoSv3J3SUGYNboRWQg4Wr4aTRJMNnlMnMO4E2Q0K5syeK2MODWE0 BoOKHPU7wvTGxaypiCJAFmjdBx2y/j42MdvxvZ4rHiNp2PCx5jOYIpR116xjtPKowvPi R7z2ZZcKmWavVNxOhWr9+no12JYybChNe44FY0/P6tq2bq146L0gKjMRrUwM2Q1us97t jRssTtli86jGHICfEOPSR+lEmzDBHsxBKZ7OxJus0xB4FwZitqM2M7XEX+Y50BrBa2Si SV9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=KHQFnnfRU4aj5x3+Aex7iEYcfgRRSUJDqZu4ep4ltuM=; b=iJtVcpaBti+4Ch4YsVIJGxjYu4Vmty1RFckbPtph9l+bKlpfr/Lpzb1MvSnGyFY6OZ nHMer1w+K8JCVR/yOPzvFbr6rzSsdMyFXXuht2TmEfWeIpNp90i9qzx73rAMKZwaqrnI m5BaJHvNOlUTgib8xARdBabTeOEPIkuuLPA4gnl/5kN0zW0+Uiw2e/WcpvLyyIRJJhUj pjxqs2mD56SL2jrmXWuECA/a00HQmSMGMfIIYPNF+7GHRMEfdT+dMHw7OGCRw56iuZDR j13O4NO7FPg5/w+B+IKyraVk5UwmiJep18xvlXP+0BO2+AKsGbf4I7q0tx/RLjZ1d3+F jVhg== X-Gm-Message-State: AODbwcAtg4DQrUEMjKpdq2Z/xOG2lme04qPEJ6mBZGCif7q14h4LA6xD UY/IOV+eQygexgwkYig= X-Received: by 10.28.129.201 with SMTP id c192mr17187353wmd.0.1495192878874; Fri, 19 May 2017 04:21:18 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:20:54 +0200 Message-Id: <1495192872-27667-3-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::242 Subject: [Qemu-devel] [PULL 02/20] mc146818rtc: precisely count the clock for periodic timer X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Xiao Guangrong , Tai Yunfang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Tai Yunfang There are two issues in current code: 1) If the period is changed by re-configuring RegA, the coalesced irq will be scaled to reflect the new period, however, it calculates the new interrupt number like this: s->irq_coalesced =3D (s->irq_coalesced * s->period) / period; There are some clocks will be lost if they are not enough to be squeezed to a single new period that will cause the VM clock slower In order to fix the issue, we calculate the interrupt window based on the precise clock rather than period, then the clocks lost during period is scaled can be compensated properly 2) If periodic_timer_update() is called due to RegA reconfiguration, i.e, the period is updated, current time is not the start point for the next periodic timer, instead, which should start from the last interrupt, otherwise, the clock in VM will become slow This patch takes the clocks from last interrupt to current clock into account and compensates the clocks for the next interrupt, especially if a complete interrupt was lost in this window, the time can be caught up by LOST_TICK_POLICY_SLEW Signed-off-by: Tai Yunfang Signed-off-by: Xiao Guangrong Message-Id: <20170510083259.3900-3-xiaoguangrong@tencent.com> Signed-off-by: Paolo Bonzini --- hw/timer/mc146818rtc.c | 120 +++++++++++++++++++++++++++++++++++++++------= ---- 1 file changed, 97 insertions(+), 23 deletions(-) diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c index 7d78391..aeb60cc 100644 --- a/hw/timer/mc146818rtc.c +++ b/hw/timer/mc146818rtc.c @@ -146,31 +146,100 @@ static void rtc_coalesced_timer(void *opaque) } #endif =20 -/* handle periodic timer */ -static void periodic_timer_update(RTCState *s, int64_t current_time) +static uint32_t rtc_periodic_clock_ticks(RTCState *s) { - int period_code, period; - int64_t cur_clock, next_irq_clock; + int period_code; + + if (!(s->cmos_data[RTC_REG_B] & REG_B_PIE)) { + return 0; + } =20 period_code =3D s->cmos_data[RTC_REG_A] & 0x0f; - if (period_code !=3D 0 - && (s->cmos_data[RTC_REG_B] & REG_B_PIE)) { - if (period_code <=3D 2) - period_code +=3D 7; - /* period in 32 Khz cycles */ - period =3D 1 << (period_code - 1); -#ifdef TARGET_I386 - if (period !=3D s->period) { - s->irq_coalesced =3D (s->irq_coalesced * s->period) / period; - DPRINTF_C("cmos: coalesced irqs scaled to %d\n", s->irq_coales= ced); - } - s->period =3D period; -#endif + if (!period_code) { + return 0; + } + + if (period_code <=3D 2) { + period_code +=3D 7; + } + + /* period in 32 Khz cycles */ + return 1 << (period_code - 1); +} + +/* + * handle periodic timer. @old_period indicates the periodic timer update + * is just due to period adjustment. + */ +static void +periodic_timer_update(RTCState *s, int64_t current_time, uint32_t old_peri= od) +{ + uint32_t period; + int64_t cur_clock, next_irq_clock, lost_clock =3D 0; + + period =3D rtc_periodic_clock_ticks(s); + + if (period) { /* compute 32 khz clock */ cur_clock =3D muldiv64(current_time, RTC_CLOCK_RATE, NANOSECONDS_PER_SECOND); =20 - next_irq_clock =3D (cur_clock & ~(period - 1)) + period; + /* + * if the periodic timer's update is due to period re-configuration, + * we should count the clock since last interrupt. + */ + if (old_period) { + int64_t last_periodic_clock, next_periodic_clock; + + next_periodic_clock =3D muldiv64(s->next_periodic_time, + RTC_CLOCK_RATE, NANOSECONDS_PER_SECOND= ); + last_periodic_clock =3D next_periodic_clock - old_period; + lost_clock =3D cur_clock - last_periodic_clock; + assert(lost_clock >=3D 0); + } + +#ifdef TARGET_I386 + /* + * s->irq_coalesced can change for two reasons: + * + * a) if one or more periodic timer interrupts have been lost, + * lost_clock will be more that a period. + * + * b) when the period may be reconfigured, we expect the OS to + * treat delayed tick as the new period. So, when switching + * from a shorter to a longer period, scale down the missing, + * because the OS will treat past delayed ticks as longer + * (leftovers are put back into lost_clock). When switching + * to a shorter period, scale up the missing ticks since the + * OS handler will treat past delayed ticks as shorter. + */ + if (s->lost_tick_policy =3D=3D LOST_TICK_POLICY_SLEW) { + uint32_t old_irq_coalesced =3D s->irq_coalesced; + + s->period =3D period; + lost_clock +=3D old_irq_coalesced * old_period; + s->irq_coalesced =3D lost_clock / s->period; + lost_clock %=3D s->period; + if (old_irq_coalesced !=3D s->irq_coalesced || + old_period !=3D s->period) { + DPRINTF_C("cmos: coalesced irqs scaled from %d to %d, " + "period scaled from %d to %d\n", old_irq_coalesc= ed, + s->irq_coalesced, old_period, s->period); + rtc_coalesced_timer_update(s); + } + } else +#endif + { + /* + * no way to compensate the interrupt if LOST_TICK_POLICY_SLEW + * is not used, we should make the time progress anyway. + */ + lost_clock =3D MIN(lost_clock, period); + } + + assert(lost_clock >=3D 0 && lost_clock <=3D period); + + next_irq_clock =3D cur_clock + period - lost_clock; s->next_periodic_time =3D muldiv64(next_irq_clock, NANOSECONDS_PER= _SECOND, RTC_CLOCK_RATE) + 1; timer_mod(s->periodic_timer, s->next_periodic_time); @@ -186,7 +255,7 @@ static void rtc_periodic_timer(void *opaque) { RTCState *s =3D opaque; =20 - periodic_timer_update(s, s->next_periodic_time); + periodic_timer_update(s, s->next_periodic_time, 0); s->cmos_data[RTC_REG_C] |=3D REG_C_PF; if (s->cmos_data[RTC_REG_B] & REG_B_PIE) { s->cmos_data[RTC_REG_C] |=3D REG_C_IRQF; @@ -391,6 +460,7 @@ static void cmos_ioport_write(void *opaque, hwaddr addr, uint64_t data, unsigned size) { RTCState *s =3D opaque; + uint32_t old_period; bool update_periodic_timer; =20 if ((addr & 1) =3D=3D 0) { @@ -425,6 +495,7 @@ static void cmos_ioport_write(void *opaque, hwaddr addr, break; case RTC_REG_A: update_periodic_timer =3D (s->cmos_data[RTC_REG_A] ^ data) & 0= x0f; + old_period =3D rtc_periodic_clock_ticks(s); =20 if ((data & 0x60) =3D=3D 0x60) { if (rtc_running(s)) { @@ -450,7 +521,8 @@ static void cmos_ioport_write(void *opaque, hwaddr addr, (s->cmos_data[RTC_REG_A] & REG_A_UIP); =20 if (update_periodic_timer) { - periodic_timer_update(s, qemu_clock_get_ns(rtc_clock)); + periodic_timer_update(s, qemu_clock_get_ns(rtc_clock), + old_period); } =20 check_update_timer(s); @@ -458,6 +530,7 @@ static void cmos_ioport_write(void *opaque, hwaddr addr, case RTC_REG_B: update_periodic_timer =3D (s->cmos_data[RTC_REG_B] ^ data) & REG_B_PIE; + old_period =3D rtc_periodic_clock_ticks(s); =20 if (data & REG_B_SET) { /* update cmos to when the rtc was stopping */ @@ -487,7 +560,8 @@ static void cmos_ioport_write(void *opaque, hwaddr addr, s->cmos_data[RTC_REG_B] =3D data; =20 if (update_periodic_timer) { - periodic_timer_update(s, qemu_clock_get_ns(rtc_clock)); + periodic_timer_update(s, qemu_clock_get_ns(rtc_clock), + old_period); } =20 check_update_timer(s); @@ -757,7 +831,7 @@ static int rtc_post_load(void *opaque, int version_id) uint64_t now =3D qemu_clock_get_ns(rtc_clock); if (now < s->next_periodic_time || now > (s->next_periodic_time + get_max_clock_jump())) { - periodic_timer_update(s, qemu_clock_get_ns(rtc_clock)); + periodic_timer_update(s, qemu_clock_get_ns(rtc_clock), 0); } } =20 @@ -822,7 +896,7 @@ static void rtc_notify_clock_reset(Notifier *notifier, = void *data) int64_t now =3D *(int64_t *)data; =20 rtc_set_date_from_host(ISA_DEVICE(s)); - periodic_timer_update(s, now); + periodic_timer_update(s, now, 0); check_update_timer(s); #ifdef TARGET_I386 if (s->lost_tick_policy =3D=3D LOST_TICK_POLICY_SLEW) { --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495192993419651.4876701140312; Fri, 19 May 2017 04:23:13 -0700 (PDT) Received: from localhost ([::1]:57931 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfzy-0005jP-2m for importer@patchew.org; Fri, 19 May 2017 07:23:10 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49312) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyE-0004GT-Ev for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyC-0000tj-Tr for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:22 -0400 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:33964) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyC-0000tB-Nh for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:20 -0400 Received: by mail-wm0-x242.google.com with SMTP id d127so17622096wmf.1 for ; Fri, 19 May 2017 04:21:20 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=Exg2syP81gDmcrVEGxGRINRbbz4o0JJUZuq7hDAN3Rw=; b=eGczM2M64TSnG/Q/9AIQIS3PpI0PF8YQHiX8eBu+ZFh9m1//4gm9jyMK3MnXWE9c3G 1XuGxH6JfQlyhOerx8Yi0t1ZZvtZQqm8PN3eI5Jn89WC0wJNHOmEZs4Bwu4yl2LstbVV qRU431ScFzQhkMX/YQO/OyC7059m/Oxwe488/gHFic/hXmKJUxeItGW9gFH8gtNEudLC 5kR6nnRo1QBUfrornv0WdYID9lQRcsXXi92Je9xvYyk2huPmHu3zn5j3uj/0+k7NNTP1 v7ZkSbOkpKCKYyeeMsmZvw4ESrimyV5TJcxHv1jYAI4cDxxN9Wd38Zt6sKx3O8I92KPd QIZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=Exg2syP81gDmcrVEGxGRINRbbz4o0JJUZuq7hDAN3Rw=; b=oOB8xfJFASDZ3Xho7jM9mw/ChOzLv4tfHZBz6yEAXDNJm/hBOLnm7IJP6uZ00DeY6Z RPrvMh75TH2l8qSvvTzB5tfwNTdBqDG8R/5C+B5i4mqUnav2OhZPaHCfS6j0xhGQ+n0O 0ee5Wq2LKM3364b9qhxGKhoPvoFR94uGuBRpU2B7WalJsUG4sl22+rIU1ufUMkh66J6C 5mZx+XzyBZW+E4yAuiwcPH70q6vC1tRNb7yxGfYsC+KK+Oyrn+rQ8UrX92yQGg6c2X3Q 1YyAcKxW8rM2kuhVS/EbrSB2KT/TV3dmYvhza8BqmhW99KmIQb/sBDC80Jcf8wjMX1c7 gtFQ== X-Gm-Message-State: AODbwcBP8dKkqEiWUK6w+5/SiFOq1qQtSRY5okwx0l/cYWkZk49TkqvG 5/EYQpsCYt7xhQ== X-Received: by 10.28.130.196 with SMTP id e187mr5899407wmd.24.1495192879819; Fri, 19 May 2017 04:21:19 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:20:55 +0200 Message-Id: <1495192872-27667-4-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::242 Subject: [Qemu-devel] [PULL 03/20] mc146818rtc: ensure LOST_TICK_POLICY_SLEW is only enabled on TARGET_I386 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Xiao Guangrong Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Xiao Guangrong Any tick policy specified on other platforms rather on TARGET_I386 will fall back to LOST_TICK_POLICY_DISCARD silently, this patch makes sure only TARGET_I386 can enable LOST_TICK_POLICY_SLEW After that, we can enable LOST_TICK_POLICY_SLEW in the common code which need not use '#ifdef TARGET_I386' to make these code be x86 specific anymore Signed-off-by: Xiao Guangrong Message-Id: <20170510083259.3900-4-xiaoguangrong@tencent.com> Signed-off-by: Paolo Bonzini --- hw/timer/mc146818rtc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c index aeb60cc..4870a72 100644 --- a/hw/timer/mc146818rtc.c +++ b/hw/timer/mc146818rtc.c @@ -974,19 +974,19 @@ static void rtc_realizefn(DeviceState *dev, Error **e= rrp) =20 rtc_set_date_from_host(isadev); =20 -#ifdef TARGET_I386 switch (s->lost_tick_policy) { +#ifdef TARGET_I386 case LOST_TICK_POLICY_SLEW: s->coalesced_timer =3D timer_new_ns(rtc_clock, rtc_coalesced_timer, s); break; +#endif case LOST_TICK_POLICY_DISCARD: break; default: error_setg(errp, "Invalid lost tick policy."); return; } -#endif =20 s->periodic_timer =3D timer_new_ns(rtc_clock, rtc_periodic_timer, s); s->update_timer =3D timer_new_ns(rtc_clock, rtc_update_timer, s); --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193176314757.5312625253741; Fri, 19 May 2017 04:26:16 -0700 (PDT) Received: from localhost ([::1]:57947 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBg2w-0008Vh-HC for importer@patchew.org; Fri, 19 May 2017 07:26:14 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49342) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyF-0004HN-HX for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyE-0000uD-9T for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:23 -0400 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:32768) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyE-0000u0-3J for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:22 -0400 Received: by mail-wm0-x242.google.com with SMTP id b84so1792004wmh.0 for ; Fri, 19 May 2017 04:21:22 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=5EYOBR43m1sK1N5wwDP+npsjedy09nV2p3ruO/nJHEQ=; b=Bugw1IFKsTu3jzI13p7zzz+AE9qXr8wFHkfQuqoxUedpRZA5uLDiC+EFiwjCUIqPG6 hcDshOubGenjQkT+9wgd8GnF2OxLZRmhhTPEb8uKnWDgK2kk7g4FjJNgpxcFp+fjX2vd XQ4Rb+HHWNnYgBmY1DPSCY42ZuLCq7azk7z9NiGLc6BU9/zaj5B3HpCtAZYm+pZ3u112 wNPgRGsE1zSqYhbq1bn2PNGmeXVNx/K6wnSbNZ3J5j4muSVQO6WO1/uWS9Oo5aPzQYIq 2mamnmeP+iwbFUgcDicKOoQambPgJgPxBOmbgN0hZRB/7hZ2+QO8XTV/yM16NlY4TTKC UarA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=5EYOBR43m1sK1N5wwDP+npsjedy09nV2p3ruO/nJHEQ=; b=uYEUx0igXtYenHv0ahYhMQCR9kBCLOPg3e3q9zVs8rZ/DttuRwD/L+/0gZpGwv0CeJ 8xfqce3SZ6e0q7tdI5pqgk/W3TmNzriqC7oG4J02AAq0tcQIIoz3T/HqHU8ucMnQYRef 9H8x27dbzjUKb33d4Jlck8MrP2o+0MmayglIo2vt5viL/Kf/whF4QAn93uU156RnlDdX Hb6ZiDKJMnqTsjaq373mXnzXOywCE79mzc9/8sur4E0ArQn8yvO5ymietNfVTPXZREeL 2vdVcWD258n1aSc3ry0s8KWilJ236F41VVSre2Ggyl8d/fVNaGBAMfKSvdB/xeZrkgMI yyOA== X-Gm-Message-State: AODbwcBl3Nx601F2STSMkujbd2Qm3i7rqGueGX9JPil9su2fYyo3bjFj IwmJ65eM1+mO2Q== X-Received: by 10.28.27.197 with SMTP id b188mr6597359wmb.61.1495192881189; Fri, 19 May 2017 04:21:21 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:20:56 +0200 Message-Id: <1495192872-27667-5-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::242 Subject: [Qemu-devel] [PULL 04/20] mc146818rtc: drop unnecessary '#ifdef TARGET_I386' X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Xiao Guangrong Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Xiao Guangrong If the code purely depends on LOST_TICK_POLICY_SLEW, we can simply drop '#ifdef TARGET_I386' as only x86 can enable this tick policy Signed-off-by: Xiao Guangrong Message-Id: <20170510083259.3900-5-xiaoguangrong@tencent.com> Signed-off-by: Paolo Bonzini --- hw/timer/mc146818rtc.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c index 4870a72..f9d6181 100644 --- a/hw/timer/mc146818rtc.c +++ b/hw/timer/mc146818rtc.c @@ -112,7 +112,6 @@ static uint64_t get_guest_rtc_ns(RTCState *s) guest_clock - s->last_update + s->offset; } =20 -#ifdef TARGET_I386 static void rtc_coalesced_timer_update(RTCState *s) { if (s->irq_coalesced =3D=3D 0) { @@ -126,6 +125,7 @@ static void rtc_coalesced_timer_update(RTCState *s) } } =20 +#ifdef TARGET_I386 static void rtc_coalesced_timer(void *opaque) { RTCState *s =3D opaque; @@ -198,7 +198,6 @@ periodic_timer_update(RTCState *s, int64_t current_time= , uint32_t old_period) assert(lost_clock >=3D 0); } =20 -#ifdef TARGET_I386 /* * s->irq_coalesced can change for two reasons: * @@ -227,9 +226,7 @@ periodic_timer_update(RTCState *s, int64_t current_time= , uint32_t old_period) s->irq_coalesced, old_period, s->period); rtc_coalesced_timer_update(s); } - } else -#endif - { + } else { /* * no way to compensate the interrupt if LOST_TICK_POLICY_SLEW * is not used, we should make the time progress anyway. @@ -244,9 +241,7 @@ periodic_timer_update(RTCState *s, int64_t current_time= , uint32_t old_period) RTC_CLOCK_RATE) + 1; timer_mod(s->periodic_timer, s->next_periodic_time); } else { -#ifdef TARGET_I386 s->irq_coalesced =3D 0; -#endif timer_del(s->periodic_timer); } } @@ -835,13 +830,11 @@ static int rtc_post_load(void *opaque, int version_id) } } =20 -#ifdef TARGET_I386 if (version_id >=3D 2) { if (s->lost_tick_policy =3D=3D LOST_TICK_POLICY_SLEW) { rtc_coalesced_timer_update(s); } } -#endif return 0; } =20 @@ -898,11 +891,10 @@ static void rtc_notify_clock_reset(Notifier *notifier= , void *data) rtc_set_date_from_host(ISA_DEVICE(s)); periodic_timer_update(s, now, 0); check_update_timer(s); -#ifdef TARGET_I386 + if (s->lost_tick_policy =3D=3D LOST_TICK_POLICY_SLEW) { rtc_coalesced_timer_update(s); } -#endif } =20 /* set CMOS shutdown status register (index 0xF) as S3_resume(0xFE) @@ -923,12 +915,10 @@ static void rtc_reset(void *opaque) =20 qemu_irq_lower(s->irq); =20 -#ifdef TARGET_I386 if (s->lost_tick_policy =3D=3D LOST_TICK_POLICY_SLEW) { s->irq_coalesced =3D 0; s->irq_reinject_on_ack_count =3D 0; =09 } -#endif } =20 static const MemoryRegionOps cmos_ops =3D { --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193324751989.2844473844607; Fri, 19 May 2017 04:28:44 -0700 (PDT) Received: from localhost ([::1]:57957 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBg5K-0002FW-RY for importer@patchew.org; Fri, 19 May 2017 07:28:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49358) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyG-0004IA-F0 for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyF-0000ur-Cj for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:24 -0400 Received: from mail-wm0-x243.google.com ([2a00:1450:400c:c09::243]:35857) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyF-0000uQ-3M for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:23 -0400 Received: by mail-wm0-x243.google.com with SMTP id k15so16379174wmh.3 for ; Fri, 19 May 2017 04:21:23 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=bB57iMqXIRrgbYpCdy9hkUQfa/px3wD/S4cjQQoGCno=; b=RVTPq9gOkWA+nKwN4lMIVZTXNVMFzwKL24M/QJDukwKN0En+agQdLELLkw6F+wYR4F RAFPL52l3/IeYvk9nkZMWQ+WsjjngnUonwQT8pEdE1zeCgyYchLUbYeYI9dnlzYI9rdc iniz9fLGJAy79nfOnDgDxk1jLSC56lQiQDZAalNOtsulPxOUaDnbDjKkLi7rB6erZsLZ 9OQ3x1rglB6ss7gw1MNxc8tJ3ku8adnwjh+ZGSNFmT1ynL+i1weEAZuCsAU35IawdOou ZjLRVjL6672OKKoeB5x5fN3BDN8LcIF35dKRFA7ckkbBe6Y8zMHk+XPW61QnqRjMo6db byaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=bB57iMqXIRrgbYpCdy9hkUQfa/px3wD/S4cjQQoGCno=; b=GwDPMbAi+zZ4JbBLmAhusSv9iKikHK4FamtuquFxC+DVmNw2ul7MZpPcWh2ky7vt0C fXapEee3DMXU+TSxm9LPFTs6JzQyxdq6+zJzyfP0FkX82nj7ojpiBvrDDZjGrH+CWpTI +7B7U0DqVUAbmLosCXK4Ao6u9I8h+NSMWAMWRp/4TQt+qLjd3rz6BZHPEwUzcd72id5F FrX8law1QMlUjno/HX1R2LqIltwJ055S+PgTZHhCJsRiqi3GZHs7F2X2mxsnHxWIVzRv dyHyqaAhixU+dg5klgw3yjgATpUZa2WS/Z1acN48ZtOZPjugTlqHhHdvKBmmzZjy7vDB wcpw== X-Gm-Message-State: AODbwcCIXQHHE+Hjnmn27zI7uHDioSl0SrqWtqGDUcfslnfFL1pLxi2Z n+HLUpHB3MXCmA== X-Received: by 10.28.109.195 with SMTP id b64mr6250847wmi.46.1495192882128; Fri, 19 May 2017 04:21:22 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:20:57 +0200 Message-Id: <1495192872-27667-6-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::243 Subject: [Qemu-devel] [PULL 05/20] mc146818rtc: embrace all x86 specific code X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Xiao Guangrong Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Xiao Guangrong Introduce a function, rtc_policy_slew_deliver_irq(), which delivers irq if LOST_TICK_POLICY_SLEW is used, as which is only supported on x86, other platforms call it will trigger a assert After that, we can move the x86 specific code to the common place Signed-off-by: Xiao Guangrong Message-Id: <20170510083259.3900-6-xiaoguangrong@tencent.com> Signed-off-by: Paolo Bonzini --- hw/timer/mc146818rtc.c | 60 ++++++++++++++++++++++++++--------------------= ---- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c index f9d6181..542cd09 100644 --- a/hw/timer/mc146818rtc.c +++ b/hw/timer/mc146818rtc.c @@ -125,17 +125,34 @@ static void rtc_coalesced_timer_update(RTCState *s) } } =20 +static QLIST_HEAD(, RTCState) rtc_devices =3D + QLIST_HEAD_INITIALIZER(rtc_devices); + #ifdef TARGET_I386 +void qmp_rtc_reset_reinjection(Error **errp) +{ + RTCState *s; + + QLIST_FOREACH(s, &rtc_devices, link) { + s->irq_coalesced =3D 0; + } +} + +static bool rtc_policy_slew_deliver_irq(RTCState *s) +{ + apic_reset_irq_delivered(); + qemu_irq_raise(s->irq); + return apic_get_irq_delivered(); +} + static void rtc_coalesced_timer(void *opaque) { RTCState *s =3D opaque; =20 if (s->irq_coalesced !=3D 0) { - apic_reset_irq_delivered(); s->cmos_data[RTC_REG_C] |=3D 0xc0; DPRINTF_C("cmos: injecting from timer\n"); - qemu_irq_raise(s->irq); - if (apic_get_irq_delivered()) { + if (rtc_policy_slew_deliver_irq(s)) { s->irq_coalesced--; DPRINTF_C("cmos: coalesced irqs decreased to %d\n", s->irq_coalesced); @@ -144,6 +161,12 @@ static void rtc_coalesced_timer(void *opaque) =20 rtc_coalesced_timer_update(s); } +#else +static bool rtc_policy_slew_deliver_irq(RTCState *s) +{ + assert(0); + return false; +} #endif =20 static uint32_t rtc_periodic_clock_ticks(RTCState *s) @@ -254,21 +277,17 @@ static void rtc_periodic_timer(void *opaque) s->cmos_data[RTC_REG_C] |=3D REG_C_PF; if (s->cmos_data[RTC_REG_B] & REG_B_PIE) { s->cmos_data[RTC_REG_C] |=3D REG_C_IRQF; -#ifdef TARGET_I386 if (s->lost_tick_policy =3D=3D LOST_TICK_POLICY_SLEW) { if (s->irq_reinject_on_ack_count >=3D RTC_REINJECT_ON_ACK_COUN= T) - s->irq_reinject_on_ack_count =3D 0; =09 - apic_reset_irq_delivered(); - qemu_irq_raise(s->irq); - if (!apic_get_irq_delivered()) { + s->irq_reinject_on_ack_count =3D 0; + if (!rtc_policy_slew_deliver_irq(s)) { s->irq_coalesced++; rtc_coalesced_timer_update(s); DPRINTF_C("cmos: coalesced irqs increased to %d\n", s->irq_coalesced); } } else -#endif - qemu_irq_raise(s->irq); + qemu_irq_raise(s->irq); } } =20 @@ -612,20 +631,6 @@ static void rtc_get_time(RTCState *s, struct tm *tm) rtc_from_bcd(s, s->cmos_data[RTC_CENTURY]) * 100 - 1900; } =20 -static QLIST_HEAD(, RTCState) rtc_devices =3D - QLIST_HEAD_INITIALIZER(rtc_devices); - -#ifdef TARGET_I386 -void qmp_rtc_reset_reinjection(Error **errp) -{ - RTCState *s; - - QLIST_FOREACH(s, &rtc_devices, link) { - s->irq_coalesced =3D 0; - } -} -#endif - static void rtc_set_time(RTCState *s) { struct tm tm; @@ -745,22 +750,19 @@ static uint64_t cmos_ioport_read(void *opaque, hwaddr= addr, if (ret & (REG_C_UF | REG_C_AF)) { check_update_timer(s); } -#ifdef TARGET_I386 + if(s->irq_coalesced && (s->cmos_data[RTC_REG_B] & REG_B_PIE) && s->irq_reinject_on_ack_count < RTC_REINJECT_ON_ACK_COU= NT) { s->irq_reinject_on_ack_count++; s->cmos_data[RTC_REG_C] |=3D REG_C_IRQF | REG_C_PF; - apic_reset_irq_delivered(); DPRINTF_C("cmos: injecting on ack\n"); - qemu_irq_raise(s->irq); - if (apic_get_irq_delivered()) { + if (rtc_policy_slew_deliver_irq(s)) { s->irq_coalesced--; DPRINTF_C("cmos: coalesced irqs decreased to %d\n", s->irq_coalesced); } } -#endif break; default: ret =3D s->cmos_data[s->cmos_index]; --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193472342153.42011771341333; Fri, 19 May 2017 04:31:12 -0700 (PDT) Received: from localhost ([::1]:57971 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBg7i-0004Vo-VO for importer@patchew.org; Fri, 19 May 2017 07:31:11 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49367) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyH-0004Is-8d for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyG-0000vO-Df for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:25 -0400 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:33971) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyG-0000v8-7L for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:24 -0400 Received: by mail-wm0-x242.google.com with SMTP id d127so17622354wmf.1 for ; Fri, 19 May 2017 04:21:24 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=VRLkBkIM3K6/EBaPJYuFtJbkpOauMi+BElKrOXPQuB0=; b=Re9qd5BLLCIvfF7zQjoygQH80HjVNecmiT8ue5sTVDCTCQTl2Iy1czFOn/tCTyl/mH XrPb2393Y0Qg1hg0HRbZGgUgxJDLlG3SAOCfdArCkaGg96wzN2eD00syKRW9iw/c+rmP GOnQmmfgAvN7pt6DqtEMbPm7/3R518FWACI6z+L6ARBB1+BTaYkTwPqjYEaZbrcwk+0m 39/71hespMXsVwrqe14+zZ9Gz/WcAS2cYxWJawCZ2ycnVL+iv9VqlaSvzc/suDp+KUJX 8VwOeAsX1MFt7o8ii1mmlwN7EUFUWKJHcgZd+G+Apm4Wyb6OV0rY/0z8AlkS3mpWjtbV r35g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=VRLkBkIM3K6/EBaPJYuFtJbkpOauMi+BElKrOXPQuB0=; b=IGvUS3RkbXZybPVTCWy/vWdKnz1Vy/0nsf3Z8pwR24qZPQD0KnAwHMnxeQMcmSBCVy uItk0VXqZdXf1Be9mUipzwUXra4iBd9b1tRHn85ijVSH+xYuAdmPkLVceBH8Fjcb9O0E ofT/WZ1mGYbiI9I93OrS7LQX8cU19e97SOe4HtfHP2Emp9evgVryPgKnkjY8yiuUn4Rc 9koGIt79RBhdRAKbfi/P3f8UpDkaKwWbGNSRhXCaSFlLKr44FGfuBvVQAyT/6YZsP+tQ Xi3edUUBMMq4OgPKqKG6QAm5jpo6a+4h9OAzI1NsAyp1GxohZaaa0KOl/9x0tW+QKrgF yuQw== X-Gm-Message-State: AODbwcD14un7c4bhw7YsFM8hAJ0Iy6pMbMBZRtlbLj2xiyMllcO2wyif NRPsbuNJCBjNHaJdmgY= X-Received: by 10.28.182.70 with SMTP id g67mr6473391wmf.139.1495192883024; Fri, 19 May 2017 04:21:23 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:20:58 +0200 Message-Id: <1495192872-27667-7-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::242 Subject: [Qemu-devel] [PULL 06/20] kvm: irqchip: trace changes on msi add/remove X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Xu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Peter Xu It'll be nice to know which virq belongs to which device/vector when adding msi routes, so adding two more parameters for the add trace. Meanwhile, releasing virq has no tracing before. Add one for it. Signed-off-by: Peter Xu Message-Id: <1494309644-18743-2-git-send-email-peterx@redhat.com> Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Paolo Bonzini --- kvm-all.c | 4 +++- trace-events | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/kvm-all.c b/kvm-all.c index 90b8573..2598b1f 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -1144,6 +1144,7 @@ void kvm_irqchip_release_virq(KVMState *s, int virq) } clear_gsi(s, virq); kvm_arch_release_virq_post(virq); + trace_kvm_irqchip_release_virq(virq); } =20 static unsigned int kvm_hash_msi(uint32_t data) @@ -1287,7 +1288,8 @@ int kvm_irqchip_add_msi_route(KVMState *s, int vector= , PCIDevice *dev) return -EINVAL; } =20 - trace_kvm_irqchip_add_msi_route(virq); + trace_kvm_irqchip_add_msi_route(dev ? dev->name : (char *)"N/A", + vector, virq); =20 kvm_add_routing_entry(s, &kroute); kvm_arch_add_msi_route_post(&kroute, vector, dev); diff --git a/trace-events b/trace-events index e582d63..f01ec05 100644 --- a/trace-events +++ b/trace-events @@ -69,8 +69,9 @@ kvm_device_ioctl(int fd, int type, void *arg) "dev fd %d,= type 0x%x, arg %p" kvm_failed_reg_get(uint64_t id, const char *msg) "Warning: Unable to retri= eve ONEREG %" PRIu64 " from KVM: %s" kvm_failed_reg_set(uint64_t id, const char *msg) "Warning: Unable to set O= NEREG %" PRIu64 " to KVM: %s" kvm_irqchip_commit_routes(void) "" -kvm_irqchip_add_msi_route(int virq) "Adding MSI route virq=3D%d" +kvm_irqchip_add_msi_route(char *name, int vector, int virq) "dev %s vector= %d virq %d" kvm_irqchip_update_msi_route(int virq) "Updating MSI route virq=3D%d" +kvm_irqchip_release_virq(int virq) "virq %d" =20 # TCG related tracing (mostly disabled by default) # cpu-exec.c --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193193926246.87884984004882; Fri, 19 May 2017 04:26:33 -0700 (PDT) Received: from localhost ([::1]:57950 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBg3E-0000JD-HB for importer@patchew.org; Fri, 19 May 2017 07:26:32 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49380) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyI-0004K6-Bg for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyH-0000vs-FS for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:26 -0400 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]:33971) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyH-0000vY-9O for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:25 -0400 Received: by mail-wm0-x244.google.com with SMTP id d127so17622474wmf.1 for ; Fri, 19 May 2017 04:21:25 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=5HIVcRC7sTaQ4oyVWeVogPL27OYQ23z1XhMRTjFdMXM=; b=IXB+Kv3nuz8FHtdKE3UESvxrkpYOdH9GUWQ55ggUNrwVm/jSwDtJUsJa2mFcgDPqkN E9n4M4lHqP7ypA1XBZ1M7VaFAfJTTvDd14zOnFpC1I+Ul4l+5xw+HmmiBrGFtrfd9qcr 76xz3uMbOSVdBaBiLQsAzmqLP+ux97TP+ZiS9pNbXdxHZOgyHxGORW2IbbkDKvNhGMzg EbGkbCuZwEbEnjqkUJNgxwhmzKX6Fxs2NVTRve2l8nTZ0S75zqn9P0FZztBW2iajsbk0 0GyDGKEnazWGb1DQzIIXkT4SMoQOq2gTOuUr8K6xx7ndDVorwMR5yiMzmgVADoZ4pant SbIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=5HIVcRC7sTaQ4oyVWeVogPL27OYQ23z1XhMRTjFdMXM=; b=Km48HKgmVXBAlClK7+fOjEkt9c1Db0kTRKSisuF2HcR2/NZFvlPr+jC+4/jHkPn2Me hKzWl4wSC+xadks6PpeXRiH94zbYwvKf7d1ybqgFoSmUrmwoYZevMPwstOmTzx56OmGS HWW8pRJYTdXQrxLUQpDpzYdHIAjZmARY/H0TA/cEIJk5bMiM/8Yfvm38HH237o+A1P03 dmxGoPcKW4i8LGt0SyE6YNF0SSBvJxlVqLN/c/ZNv7PDNtleahZW2eFcY6Fzyhw2h28m 3pNEqmUBVDrOUgkgKhFTkLudpqlYJB526UhAp2qVpAWUUFdtY3Lo15Fezkq2ie5tUayR suUw== X-Gm-Message-State: AODbwcD3d2kmC3YxcH9oeeCscOzGQKndTXeA0qeoWHeY40HT/ghL08Xm j643o1Rl5U5YFosOSrQ= X-Received: by 10.28.148.200 with SMTP id w191mr2128056wmd.0.1495192883978; Fri, 19 May 2017 04:21:23 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:20:59 +0200 Message-Id: <1495192872-27667-8-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::244 Subject: [Qemu-devel] [PULL 07/20] msix: trace control bit write op X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Xu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Peter Xu Meanwhile, abstract a function to detect msix masked bit. Signed-off-by: Peter Xu Message-Id: <1494309644-18743-3-git-send-email-peterx@redhat.com> Acked-by: Michael S. Tsirkin Reviewed-by: Michael S. Tsirkin Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Paolo Bonzini --- hw/pci/msix.c | 11 +++++++++-- hw/pci/trace-events | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/hw/pci/msix.c b/hw/pci/msix.c index bb54e8b..fc5fe51 100644 --- a/hw/pci/msix.c +++ b/hw/pci/msix.c @@ -22,6 +22,7 @@ #include "hw/xen/xen.h" #include "qemu/range.h" #include "qapi/error.h" +#include "trace.h" =20 #define MSIX_CAP_LENGTH 12 =20 @@ -130,10 +131,14 @@ static void msix_handle_mask_update(PCIDevice *dev, i= nt vector, bool was_masked) } } =20 +static bool msix_masked(PCIDevice *dev) +{ + return dev->config[dev->msix_cap + MSIX_CONTROL_OFFSET] & MSIX_MASKALL= _MASK; +} + static void msix_update_function_masked(PCIDevice *dev) { - dev->msix_function_masked =3D !msix_enabled(dev) || - (dev->config[dev->msix_cap + MSIX_CONTROL_OFFSET] & MSIX_MASKALL_M= ASK); + dev->msix_function_masked =3D !msix_enabled(dev) || msix_masked(dev); } =20 /* Handle MSI-X capability config write. */ @@ -148,6 +153,8 @@ void msix_write_config(PCIDevice *dev, uint32_t addr, return; } =20 + trace_msix_write_config(dev->name, msix_enabled(dev), msix_masked(dev)= ); + was_masked =3D dev->msix_function_masked; msix_update_function_masked(dev); =20 diff --git a/hw/pci/trace-events b/hw/pci/trace-events index 2b9cf24..83c8f5a 100644 --- a/hw/pci/trace-events +++ b/hw/pci/trace-events @@ -7,3 +7,6 @@ pci_update_mappings_add(void *d, uint32_t bus, uint32_t slo= t, uint32_t func, int # hw/pci/pci_host.c pci_cfg_read(const char *dev, unsigned devid, unsigned fnid, unsigned offs= , unsigned val) "%s %02u:%u @0x%x -> 0x%x" pci_cfg_write(const char *dev, unsigned devid, unsigned fnid, unsigned off= s, unsigned val) "%s %02u:%u @0x%x <- 0x%x" + +# hw/pci/msix.c +msix_write_config(char *name, bool enabled, bool masked) "dev %s enabled %= d masked %d" --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193344112662.393227750647; Fri, 19 May 2017 04:29:04 -0700 (PDT) Received: from localhost ([::1]:57958 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBg5a-0002a1-V3 for importer@patchew.org; Fri, 19 May 2017 07:28:59 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49390) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyJ-0004LM-CJ for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyI-0000wE-AT for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:27 -0400 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]:32772) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyI-0000vy-3X for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:26 -0400 Received: by mail-wm0-x244.google.com with SMTP id b84so1792230wmh.0 for ; Fri, 19 May 2017 04:21:26 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=T6bvJg/zc/9Mpl3ah40Cn4ahjkiLMrxR5IZSt98CIm8=; b=hEzhN0B+RofqsOYq4Xj74TvGtnaDNsftyPQaya2i7S8VhzQoOOeVYX82VvmOByzyVm zX4M8QsgB0R8tg8HiOzfEt9Sx+p/v5mZE+s4VbLg3fN1gmxRvnut2lVHSxzTq6oqHzbT ANxTq792L3GZqrB+atUuqfHQuV/fMvFYVRrVt95LDRw7tJqNQAprqn2sjlr/lf8UqjTL Qp5NkrutvmugtT1lv4Xp49dUEG0SKeTaMKRrcK3eGPX1g04U23FvFBoqwzu6ri2iIkei 2zskcKANlWNHskJaOMoOZ19DMTbz185uIyoUWn81MABXVT3tqKoECjudzlREPF3C6/8Q JkZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=T6bvJg/zc/9Mpl3ah40Cn4ahjkiLMrxR5IZSt98CIm8=; b=de1TTTMri88bKqjIynGdRZ5Mb55Q6sV83SaA8G178yajP4XxDjRWoOBNneMGmCLyox tsQKzsWbtkftTI8qbJBK/T4eRUlAfFRnHHIzgzyBUNeO78ij629Rme2Qh5qhpqa9pbQr nmEUCuBuzOxcys7P2FpRdFLUkkMHMXuUAX59aAqCa9A52Y6Gq/ixUKSBRzlrFUiBvv00 sHmT00K1enaxalpTDnjZg4UCPzFHfTU67AAjAVGetkEGpna8b0qTrztjl9ArJrBxxmTF WahGtrHVpgvagWUpD+TASHkAysc5MrOl5958IElZVzP4wGrQJj9fSAKmkbioYTFFSG7A 4a7Q== X-Gm-Message-State: AODbwcD48odIdcSmNN/anGeNsJjGSXLeu/3bjl7jDts81GrOZlHV9Q84 PnLQ+JHQyn74L8HLdDQ= X-Received: by 10.28.214.211 with SMTP id n202mr5924522wmg.105.1495192884933; Fri, 19 May 2017 04:21:24 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:21:00 +0200 Message-Id: <1495192872-27667-9-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::244 Subject: [Qemu-devel] [PULL 08/20] kvm: irqchip: skip update msi when disabled X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Xu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Peter Xu It's possible that one device kept its irqfd/virq there even when MSI/MSIX was disabled globally for that device. One example is virtio-net-pci (see commit f1d0f15a6 and virtio_pci_vq_vector_mask()). It is used as a fast path to avoid allocate/release irqfd/virq frequently when guest enables/disables MSIX. However, this fast path brought a problem to msi_route_list, that the device MSIRouteEntry is still dangling there even if MSIX disabled - then we cannot know which message to fetch, even if we can, the messages are meaningless. In this case, we can just simply ignore this entry. It's safe, since when MSIX is enabled again, we'll rebuild them no matter what. Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=3D1448813 Signed-off-by: Peter Xu Message-Id: <1494309644-18743-4-git-send-email-peterx@redhat.com> Signed-off-by: Paolo Bonzini --- target/i386/kvm.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/target/i386/kvm.c b/target/i386/kvm.c index 011d4a5..82c72d2 100644 --- a/target/i386/kvm.c +++ b/target/i386/kvm.c @@ -43,6 +43,7 @@ #include "standard-headers/asm-x86/hyperv.h" #include "hw/pci/pci.h" #include "hw/pci/msi.h" +#include "hw/pci/msix.h" #include "migration/blocker.h" #include "exec/memattrs.h" #include "trace.h" @@ -3510,12 +3511,17 @@ static void kvm_update_msi_routes_all(void *private= , bool global, int cnt =3D 0; MSIRouteEntry *entry; MSIMessage msg; + PCIDevice *dev; + /* TODO: explicit route update */ QLIST_FOREACH(entry, &msi_route_list, list) { cnt++; - msg =3D pci_get_msi_message(entry->dev, entry->vector); - kvm_irqchip_update_msi_route(kvm_state, entry->virq, - msg, entry->dev); + dev =3D entry->dev; + if (!msix_enabled(dev) && !msi_enabled(dev)) { + continue; + } + msg =3D pci_get_msi_message(dev, entry->vector); + kvm_irqchip_update_msi_route(kvm_state, entry->virq, msg, dev); } kvm_irqchip_commit_routes(kvm_state); trace_kvm_x86_update_msi_routes(cnt); --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 149519363528998.2032859646747; Fri, 19 May 2017 04:33:55 -0700 (PDT) Received: from localhost ([::1]:57979 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBgAL-0006cI-BJ for importer@patchew.org; Fri, 19 May 2017 07:33:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49401) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyK-0004MI-E5 for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyJ-0000wr-Jg for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:28 -0400 Received: from mail-wm0-x243.google.com ([2a00:1450:400c:c09::243]:32775) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyJ-0000wU-Cu for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:27 -0400 Received: by mail-wm0-x243.google.com with SMTP id b84so1792395wmh.0 for ; Fri, 19 May 2017 04:21:27 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=TZMqk6n7j+WhSqyyd48UWmTami0aU/3mA9UHgvRN250=; b=Nv6JA5Agm+JMAZTvq5SbcWPwbds3zj/px0JWwjs1dANsNWZONdq/jQuJQ4o5e6lQTu 44T6aFeZ/ES5uUTXBo+LbQDm9X0zB2nJKrD2Z9gCREsoH8esmonJdiIKm1/6GJMW/kcq nyWGhJewSXukD3k/u8E+39sSHOW063RB9zmKjdrpHdKI3pPUm8LzJFeUYGjZuGSnt1rZ WUhwkHGtt/hOMvY69r3n1Fn16R5qeJo4Bp+r6Ky6VPNvdCpQXg6MGqw96EcULnNj/8An JUXit1kVwnp7W0iyBs8qV/GwgPXtfFYomd4wz5iDi1UMx+nuiqPxNI58lgOf6M1Z5Zpw XmBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=TZMqk6n7j+WhSqyyd48UWmTami0aU/3mA9UHgvRN250=; b=DOvpfdtRxhqIfqqqh5ZN0c46WLzOYloEv73rZvBL9mVOKZV6jTzYXVsY+ye2lsT1Dy HuEt5QYa1GsfU4v2if7xWl2eS+F1pUCg0DIBfBlDNroqcQZWEnaZHqNQnBXjB7tArvxW sMJIA3ZfRNmBPATRwHQQo8n9odzgtOHsnTMcdrTqxToYk/eilQ7cGrxPgDZ5fMDR5nU+ m5rdhbiTo9p1W5SbEWtsn8JYOYkQZBzrhCwe20tyjllomjKwE9vZCzj8O21aBNuqXMhK i6dxOhjibT1mK3Ta5cnFOLRgtEoyr+33qvgE2zuSAUz9CagjyTziBIIHwF5Tda1RVE7r Vi2Q== X-Gm-Message-State: AODbwcDeoFIgDdCMiRRk10XjILfDCAt/Nd0iBQxAEa03N73eOo51RTkr hf/+3qliIdRF4YvAwfs= X-Received: by 10.28.220.138 with SMTP id t132mr6639288wmg.140.1495192886209; Fri, 19 May 2017 04:21:26 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:21:01 +0200 Message-Id: <1495192872-27667-10-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::243 Subject: [Qemu-devel] [PULL 09/20] Check the return value of fcntl in qemu_set_cloexec X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, Stefano Stabellini , groug@kaod.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Stefano Stabellini Assert that the return value is not an error. This issue was found by Coverity. CID: 1374831 Signed-off-by: Stefano Stabellini CC: groug@kaod.org CC: pbonzini@redhat.com CC: Eric Blake Message-Id: <1494356693-13190-2-git-send-email-sstabellini@kernel.org> Signed-off-by: Paolo Bonzini --- util/oslib-posix.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/util/oslib-posix.c b/util/oslib-posix.c index 4d9189e..16894ad 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -182,7 +182,9 @@ void qemu_set_cloexec(int fd) { int f; f =3D fcntl(fd, F_GETFD); - fcntl(fd, F_SETFD, f | FD_CLOEXEC); + assert(f !=3D -1); + f =3D fcntl(fd, F_SETFD, f | FD_CLOEXEC); + assert(f !=3D -1); } =20 /* --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193489845918.2306002793156; Fri, 19 May 2017 04:31:29 -0700 (PDT) Received: from localhost ([::1]:57973 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBg80-0004j8-3H for importer@patchew.org; Fri, 19 May 2017 07:31:28 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49427) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyO-0004QW-Ez for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyK-0000xH-HN for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:32 -0400 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]:35866) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyK-0000wz-Am for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:28 -0400 Received: by mail-wm0-x244.google.com with SMTP id k15so16379729wmh.3 for ; Fri, 19 May 2017 04:21:28 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=7FklvMGoS+ej8kkZ7T1Y1DMkbeEOlzaVTdLv/Zbimjs=; b=CGlyQDQDVEMwbGWU2GL2DQPL3GmeR2SQHn7rIzVkuzV4BLRjpMaJ20z7Fr83lhqJVk q9640KGHzWYd0mswJlW8yzDBTnU1f9e+5O8Y8mgvpbTagQ3/Siu6dbViV5M2SccyaNEg k6Tuf2LJCFrRfnQdO4LrCaCRr//O8YdOFJps7sfqCEyF1CiylWBuHxvEEWGRQsRKjbWD mNHgISsmEkL44OmWT5xjOKpD8WZNQDkNW/cvKAWSOn5puoPNgM2fgZX5++pGAGeT5MgK WSHqAB6ETKTVQkcbKprWSgIZYhVXGPrZwTIV1p6OAkJpf32Oj8W1Z1XBn6aTkm0fytAQ ahDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=7FklvMGoS+ej8kkZ7T1Y1DMkbeEOlzaVTdLv/Zbimjs=; b=LkiTwtkDzL+0cRxq5nRr7UpIu0pNKYDsGeTJZHP5og5Rf56DOvWVk0vn2TCFIvm4xh zN24oYrlJQa96zVhf9xUTW2VetVaa58SlBPxzcY6PlbaFdz1rfkYKUi1kVsZzCb1jEqg QYljTHvpHSww8vYhSLPxow3Zc16g0GN8vCoKjldxmAIXkJ4NlP10S2HR21YL1B6g8XKE +rfVzYV1qAbsvH+laZyu6fogKtcKokmVkYTH1+mx4e53YB7sVApmpMM0FLQEdp7H2JMG FvBanLSWtQEGFbX6503KAcWZG8XVt3Mfy9VbtnKKckNvQHbkEZQRfR2WzFZ2jxbEyFPB kT7Q== X-Gm-Message-State: AODbwcBrJ36ANwtFo93ZLRinrGrf29zfbCXEaL8YCtQ7DI9P0hABWmwA d6ZVgCNB6cveoNEkr1k= X-Received: by 10.28.130.196 with SMTP id e187mr5899814wmd.24.1495192887129; Fri, 19 May 2017 04:21:27 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:21:02 +0200 Message-Id: <1495192872-27667-11-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::244 Subject: [Qemu-devel] [PULL 10/20] nbd: strict nbd_wr_syncv X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Vladimir Sementsov-Ogievskiy Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Vladimir Sementsov-Ogievskiy nbd_wr_syncv is called either from coroutine or from client negotiation code, when socket is in blocking mode. So, -EAGAIN is impossible. Furthermore, EAGAIN is confusing, as, what to read/write again? With EAGAIN as a return code we don't know how much data is already read or written by the function, so in case of EAGAIN the whole communication is broken. Signed-off-by: Vladimir Sementsov-Ogievskiy Message-Id: <20170516094533.6160-2-vsementsov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- nbd/common.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/nbd/common.c b/nbd/common.c index dccbb8e..4db45b3 100644 --- a/nbd/common.c +++ b/nbd/common.c @@ -20,6 +20,10 @@ #include "qapi/error.h" #include "nbd-internal.h" =20 +/* nbd_wr_syncv + * The function may be called from coroutine or from non-coroutine context. + * When called from non-coroutine context @ioc must be in blocking mode. + */ ssize_t nbd_wr_syncv(QIOChannel *ioc, struct iovec *iov, size_t niov, @@ -42,11 +46,8 @@ ssize_t nbd_wr_syncv(QIOChannel *ioc, len =3D qio_channel_writev(ioc, local_iov, nlocal_iov, &local_= err); } if (len =3D=3D QIO_CHANNEL_ERR_BLOCK) { - if (qemu_in_coroutine()) { - qio_channel_yield(ioc, do_read ? G_IO_IN : G_IO_OUT); - } else { - return -EAGAIN; - } + assert(qemu_in_coroutine()); + qio_channel_yield(ioc, do_read ? G_IO_IN : G_IO_OUT); continue; } if (len < 0) { --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193277405741.7374820389534; Fri, 19 May 2017 04:27:57 -0700 (PDT) Received: from localhost ([::1]:57956 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBg4Y-0001Tx-PQ for importer@patchew.org; Fri, 19 May 2017 07:27:54 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49456) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyP-0004Rm-Om for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyN-0000xu-08 for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:33 -0400 Received: from mail-wr0-x232.google.com ([2a00:1450:400c:c0c::232]:34400) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyM-0000xb-Iv for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:30 -0400 Received: by mail-wr0-x232.google.com with SMTP id l9so15305146wre.1 for ; Fri, 19 May 2017 04:21:30 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=QrNzrpSR1bq3AscMlLyH0Q6d5t8UgEcta/OhRYB6NQU=; b=PXXf02l5wnfJBMqLdw64xGw0GxvHv5VlSeCr/cGojATzMsMnLmNAWBg6YgkWYFD7IE KKLA3v1VpYZr3noN1gcEBVj+NcIO5YOpUdh6zrNDrX3kDemH2/HET4QK4taIyY+opO5V Nvep2hdbd/3b283z8Wy4PnXyOgguR6wODM6PrjIqCYldewkspDuOhIPA0oa0+zG43sq4 r6FYQA8VJOUtlzehZM074yCqk1k3XowTgnMcUp+ko2CvbOR4XQewLTKTH8GAR70g8p0/ b9LXvWJrJSyBINYOuKl0sOaHuynz/mfBE5iLb7MiRHGMzYmQzZXIojnjQRcmb63S9vGm v2VQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=QrNzrpSR1bq3AscMlLyH0Q6d5t8UgEcta/OhRYB6NQU=; b=EGkrz57Q2ZK9q0IxoutIJstDCvke0BoG9tqA8YY15TymiBKmfSi6SMWmTJKFF05vXc gDwcPutnCOMobmQyySG93ehdPft5fgSmbAUFFHCL1qkOheZgQp83D2q/ZToxxQpT0n1X hxn2wwKPFRsEIpATsb9KlgOUieAOP1seBDXnCvfILl0DyRr3iimXx+2URrNy7TYDPtBy LL0kXGTzfSe814H0t5l1NmCsaIBgXEhpcMr7uwmwl0h4noK8ly1vInTTp+bGGaIgYolL n1S59PP66v5IOYnHY4bGQPQb45ky6SN0AMTxalQHVVrX1IEALQYrpGNiylC33TC/39tu CShA== X-Gm-Message-State: AODbwcD1rHTqB9dxwXAUXNWK3Ws2yQ7suLa0V1uMPS+VvKmcHDc7yV1v V5dq8T3ll3gwWd5Evro= X-Received: by 10.223.147.225 with SMTP id 88mr2511300wrp.74.1495192889129; Fri, 19 May 2017 04:21:29 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:21:03 +0200 Message-Id: <1495192872-27667-12-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::232 Subject: [Qemu-devel] [PULL 11/20] nbd: read_sync and friends: return 0 on success X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Vladimir Sementsov-Ogievskiy Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Vladimir Sementsov-Ogievskiy functions read_sync, drop_sync, write_sync, and also nbd_negotiate_write, nbd_negotiate_read, nbd_negotiate_drop_sync returns number of processed bytes. But what this number can be, except requested number of bytes? Actually, underlying nbd_wr_syncv function returns a value >=3D 0 and !=3D requested_bytes only on eof on read operation. So, firstly, it is impossible on write (let's add an assert) and on read it actually means, that communication is broken (except nbd_receive_reply, see below). Most of callers operate like this: if (func(..., size) !=3D size) { /* error path */ } , i.e.: 1. They are not interested in partial success 2. Extra duplications in code (especially bad are duplications of magic numbers) 3. User doesn't see actual error message, as return code is lost. (this patch doesn't fix this point, but it makes fixing easier) Several callers handles ret >=3D 0 and !=3D requested-size separately, by just returning EINVAL in this case. This patch makes read_sync and friends return EINVAL in this case, so final behavior is the same. And only one caller - nbd_receive_reply() does something not so obvious. It returns EINVAL for ret > 0 and !=3D requested-size, like previous group, but for ret =3D=3D 0 it returns 0. The only caller of nbd_receive_reply() - nbd_read_reply_entry() handles ret =3D=3D 0 in the same way as ret < 0, so for now it doesn't matter. However, in following commits error path handling will be improved and we'll need to distinguish success from fail in this case too. So, this patch adds separate helper for this case - read_sync_eof. Signed-off-by: Vladimir Sementsov-Ogievskiy Message-Id: <20170516094533.6160-3-vsementsov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- nbd/client.c | 63 ++++++++++++++++------------------------ nbd/nbd-internal.h | 34 +++++++++++++++++++--- nbd/server.c | 84 +++++++++++++++++++++-----------------------------= ---- 3 files changed, 88 insertions(+), 93 deletions(-) diff --git a/nbd/client.c b/nbd/client.c index a58fb02..6b74a62 100644 --- a/nbd/client.c +++ b/nbd/client.c @@ -86,9 +86,9 @@ static QTAILQ_HEAD(, NBDExport) exports =3D QTAILQ_HEAD_I= NITIALIZER(exports); =20 */ =20 -/* Discard length bytes from channel. Return -errno on failure, or - * the amount of bytes consumed. */ -static ssize_t drop_sync(QIOChannel *ioc, size_t size) +/* Discard length bytes from channel. Return -errno on failure and 0 on + * success*/ +static int drop_sync(QIOChannel *ioc, size_t size) { ssize_t ret =3D 0; char small[1024]; @@ -96,14 +96,13 @@ static ssize_t drop_sync(QIOChannel *ioc, size_t size) =20 buffer =3D sizeof(small) >=3D size ? small : g_malloc(MIN(65536, size)= ); while (size > 0) { - ssize_t count =3D read_sync(ioc, buffer, MIN(65536, size)); + ssize_t count =3D MIN(65536, size); + ret =3D read_sync(ioc, buffer, MIN(65536, size)); =20 - if (count <=3D 0) { + if (ret < 0) { goto cleanup; } - assert(count <=3D size); size -=3D count; - ret +=3D count; } =20 cleanup: @@ -136,12 +135,12 @@ static int nbd_send_option_request(QIOChannel *ioc, u= int32_t opt, stl_be_p(&req.option, opt); stl_be_p(&req.length, len); =20 - if (write_sync(ioc, &req, sizeof(req)) !=3D sizeof(req)) { + if (write_sync(ioc, &req, sizeof(req)) < 0) { error_setg(errp, "Failed to send option request header"); return -1; } =20 - if (len && write_sync(ioc, (char *) data, len) !=3D len) { + if (len && write_sync(ioc, (char *) data, len) < 0) { error_setg(errp, "Failed to send option request data"); return -1; } @@ -170,7 +169,7 @@ static int nbd_receive_option_reply(QIOChannel *ioc, ui= nt32_t opt, nbd_opt_reply *reply, Error **errp) { QEMU_BUILD_BUG_ON(sizeof(*reply) !=3D 20); - if (read_sync(ioc, reply, sizeof(*reply)) !=3D sizeof(*reply)) { + if (read_sync(ioc, reply, sizeof(*reply)) < 0) { error_setg(errp, "failed to read option reply"); nbd_send_opt_abort(ioc); return -1; @@ -219,7 +218,7 @@ static int nbd_handle_reply_err(QIOChannel *ioc, nbd_op= t_reply *reply, goto cleanup; } msg =3D g_malloc(reply->length + 1); - if (read_sync(ioc, msg, reply->length) !=3D reply->length) { + if (read_sync(ioc, msg, reply->length) < 0) { error_setg(errp, "failed to read option error message"); goto cleanup; } @@ -321,7 +320,7 @@ static int nbd_receive_list(QIOChannel *ioc, const char= *want, bool *match, nbd_send_opt_abort(ioc); return -1; } - if (read_sync(ioc, &namelen, sizeof(namelen)) !=3D sizeof(namelen)) { + if (read_sync(ioc, &namelen, sizeof(namelen)) < 0) { error_setg(errp, "failed to read option name length"); nbd_send_opt_abort(ioc); return -1; @@ -334,7 +333,7 @@ static int nbd_receive_list(QIOChannel *ioc, const char= *want, bool *match, return -1; } if (namelen !=3D strlen(want)) { - if (drop_sync(ioc, len) !=3D len) { + if (drop_sync(ioc, len) < 0) { error_setg(errp, "failed to skip export name with wrong length= "); nbd_send_opt_abort(ioc); return -1; @@ -343,14 +342,14 @@ static int nbd_receive_list(QIOChannel *ioc, const ch= ar *want, bool *match, } =20 assert(namelen < sizeof(name)); - if (read_sync(ioc, name, namelen) !=3D namelen) { + if (read_sync(ioc, name, namelen) < 0) { error_setg(errp, "failed to read export name"); nbd_send_opt_abort(ioc); return -1; } name[namelen] =3D '\0'; len -=3D namelen; - if (drop_sync(ioc, len) !=3D len) { + if (drop_sync(ioc, len) < 0) { error_setg(errp, "failed to read export description"); nbd_send_opt_abort(ioc); return -1; @@ -477,7 +476,7 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *= name, uint16_t *flags, goto fail; } =20 - if (read_sync(ioc, buf, 8) !=3D 8) { + if (read_sync(ioc, buf, 8) < 0) { error_setg(errp, "Failed to read data"); goto fail; } @@ -503,7 +502,7 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *= name, uint16_t *flags, goto fail; } =20 - if (read_sync(ioc, &magic, sizeof(magic)) !=3D sizeof(magic)) { + if (read_sync(ioc, &magic, sizeof(magic)) < 0) { error_setg(errp, "Failed to read magic"); goto fail; } @@ -515,8 +514,7 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *= name, uint16_t *flags, uint16_t globalflags; bool fixedNewStyle =3D false; =20 - if (read_sync(ioc, &globalflags, sizeof(globalflags)) !=3D - sizeof(globalflags)) { + if (read_sync(ioc, &globalflags, sizeof(globalflags)) < 0) { error_setg(errp, "Failed to read server flags"); goto fail; } @@ -534,8 +532,7 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *= name, uint16_t *flags, } /* client requested flags */ clientflags =3D cpu_to_be32(clientflags); - if (write_sync(ioc, &clientflags, sizeof(clientflags)) !=3D - sizeof(clientflags)) { + if (write_sync(ioc, &clientflags, sizeof(clientflags)) < 0) { error_setg(errp, "Failed to send clientflags field"); goto fail; } @@ -573,13 +570,13 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char= *name, uint16_t *flags, } =20 /* Read the response */ - if (read_sync(ioc, &s, sizeof(s)) !=3D sizeof(s)) { + if (read_sync(ioc, &s, sizeof(s)) < 0) { error_setg(errp, "Failed to read export length"); goto fail; } *size =3D be64_to_cpu(s); =20 - if (read_sync(ioc, flags, sizeof(*flags)) !=3D sizeof(*flags)) { + if (read_sync(ioc, flags, sizeof(*flags)) < 0) { error_setg(errp, "Failed to read export flags"); goto fail; } @@ -596,14 +593,14 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char= *name, uint16_t *flags, goto fail; } =20 - if (read_sync(ioc, &s, sizeof(s)) !=3D sizeof(s)) { + if (read_sync(ioc, &s, sizeof(s)) < 0) { error_setg(errp, "Failed to read export length"); goto fail; } *size =3D be64_to_cpu(s); TRACE("Size is %" PRIu64, *size); =20 - if (read_sync(ioc, &oldflags, sizeof(oldflags)) !=3D sizeof(oldfla= gs)) { + if (read_sync(ioc, &oldflags, sizeof(oldflags)) < 0) { error_setg(errp, "Failed to read export flags"); goto fail; } @@ -619,7 +616,7 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *= name, uint16_t *flags, } =20 TRACE("Size is %" PRIu64 ", export flags %" PRIx16, *size, *flags); - if (zeroes && drop_sync(ioc, 124) !=3D 124) { + if (zeroes && drop_sync(ioc, 124) < 0) { error_setg(errp, "Failed to read reserved block"); goto fail; } @@ -744,7 +741,6 @@ int nbd_disconnect(int fd) ssize_t nbd_send_request(QIOChannel *ioc, NBDRequest *request) { uint8_t buf[NBD_REQUEST_SIZE]; - ssize_t ret; =20 TRACE("Sending request to server: " "{ .from =3D %" PRIu64", .len =3D %" PRIu32 ", .handle =3D %" PR= Iu64 @@ -759,16 +755,7 @@ ssize_t nbd_send_request(QIOChannel *ioc, NBDRequest *= request) stq_be_p(buf + 16, request->from); stl_be_p(buf + 24, request->len); =20 - ret =3D write_sync(ioc, buf, sizeof(buf)); - if (ret < 0) { - return ret; - } - - if (ret !=3D sizeof(buf)) { - LOG("writing to socket failed"); - return -EINVAL; - } - return 0; + return write_sync(ioc, buf, sizeof(buf)); } =20 ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *reply) @@ -777,7 +764,7 @@ ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *re= ply) uint32_t magic; ssize_t ret; =20 - ret =3D read_sync(ioc, buf, sizeof(buf)); + ret =3D read_sync_eof(ioc, buf, sizeof(buf)); if (ret <=3D 0) { return ret; } diff --git a/nbd/nbd-internal.h b/nbd/nbd-internal.h index f43d990..e6bbc7c 100644 --- a/nbd/nbd-internal.h +++ b/nbd/nbd-internal.h @@ -94,7 +94,13 @@ #define NBD_ENOSPC 28 #define NBD_ESHUTDOWN 108 =20 -static inline ssize_t read_sync(QIOChannel *ioc, void *buffer, size_t size) +/* read_sync_eof + * Tries to read @size bytes from @ioc. Returns number of bytes actually r= ead. + * May return a value >=3D 0 and < size only on EOF, i.e. when iteratively= called + * qio_channel_readv() returns 0. So, there are no needs to call read_sync= _eof + * iteratively. + */ +static inline ssize_t read_sync_eof(QIOChannel *ioc, void *buffer, size_t = size) { struct iovec iov =3D { .iov_base =3D buffer, .iov_len =3D size }; /* Sockets are kept in blocking mode in the negotiation phase. After @@ -105,12 +111,32 @@ static inline ssize_t read_sync(QIOChannel *ioc, void= *buffer, size_t size) return nbd_wr_syncv(ioc, &iov, 1, size, true); } =20 -static inline ssize_t write_sync(QIOChannel *ioc, const void *buffer, - size_t size) +/* read_sync + * Reads @size bytes from @ioc. Returns 0 on success. + */ +static inline int read_sync(QIOChannel *ioc, void *buffer, size_t size) +{ + ssize_t ret =3D read_sync_eof(ioc, buffer, size); + + if (ret >=3D 0 && ret !=3D size) { + ret =3D -EINVAL; + } + + return ret < 0 ? ret : 0; +} + +/* write_sync + * Writes @size bytes to @ioc. Returns 0 on success. + */ +static inline int write_sync(QIOChannel *ioc, const void *buffer, size_t s= ize) { struct iovec iov =3D { .iov_base =3D (void *) buffer, .iov_len =3D siz= e }; =20 - return nbd_wr_syncv(ioc, &iov, 1, size, false); + ssize_t ret =3D nbd_wr_syncv(ioc, &iov, 1, size, false); + + assert(ret < 0 || ret =3D=3D size); + + return ret < 0 ? ret : 0; } =20 struct NBDTLSHandshakeData { diff --git a/nbd/server.c b/nbd/server.c index 924a1fe..1e1096c 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -112,7 +112,7 @@ static gboolean nbd_negotiate_continue(QIOChannel *ioc, return TRUE; } =20 -static ssize_t nbd_negotiate_read(QIOChannel *ioc, void *buffer, size_t si= ze) +static int nbd_negotiate_read(QIOChannel *ioc, void *buffer, size_t size) { ssize_t ret; guint watch; @@ -130,8 +130,7 @@ static ssize_t nbd_negotiate_read(QIOChannel *ioc, void= *buffer, size_t size) =20 } =20 -static ssize_t nbd_negotiate_write(QIOChannel *ioc, const void *buffer, - size_t size) +static int nbd_negotiate_write(QIOChannel *ioc, const void *buffer, size_t= size) { ssize_t ret; guint watch; @@ -148,24 +147,24 @@ static ssize_t nbd_negotiate_write(QIOChannel *ioc, c= onst void *buffer, return ret; } =20 -static ssize_t nbd_negotiate_drop_sync(QIOChannel *ioc, size_t size) +static int nbd_negotiate_drop_sync(QIOChannel *ioc, size_t size) { - ssize_t ret, dropped =3D size; + ssize_t ret; uint8_t *buffer =3D g_malloc(MIN(65536, size)); =20 while (size > 0) { - ret =3D nbd_negotiate_read(ioc, buffer, MIN(65536, size)); + size_t count =3D MIN(65536, size); + ret =3D nbd_negotiate_read(ioc, buffer, count); if (ret < 0) { g_free(buffer); return ret; } =20 - assert(ret <=3D size); - size -=3D ret; + size -=3D count; } =20 g_free(buffer); - return dropped; + return 0; } =20 /* Basic flow for negotiation @@ -206,22 +205,22 @@ static int nbd_negotiate_send_rep_len(QIOChannel *ioc= , uint32_t type, type, opt, len); =20 magic =3D cpu_to_be64(NBD_REP_MAGIC); - if (nbd_negotiate_write(ioc, &magic, sizeof(magic)) !=3D sizeof(magic)= ) { + if (nbd_negotiate_write(ioc, &magic, sizeof(magic)) < 0) { LOG("write failed (rep magic)"); return -EINVAL; } opt =3D cpu_to_be32(opt); - if (nbd_negotiate_write(ioc, &opt, sizeof(opt)) !=3D sizeof(opt)) { + if (nbd_negotiate_write(ioc, &opt, sizeof(opt)) < 0) { LOG("write failed (rep opt)"); return -EINVAL; } type =3D cpu_to_be32(type); - if (nbd_negotiate_write(ioc, &type, sizeof(type)) !=3D sizeof(type)) { + if (nbd_negotiate_write(ioc, &type, sizeof(type)) < 0) { LOG("write failed (rep type)"); return -EINVAL; } len =3D cpu_to_be32(len); - if (nbd_negotiate_write(ioc, &len, sizeof(len)) !=3D sizeof(len)) { + if (nbd_negotiate_write(ioc, &len, sizeof(len)) < 0) { LOG("write failed (rep data length)"); return -EINVAL; } @@ -256,7 +255,7 @@ nbd_negotiate_send_rep_err(QIOChannel *ioc, uint32_t ty= pe, if (ret < 0) { goto out; } - if (nbd_negotiate_write(ioc, msg, len) !=3D len) { + if (nbd_negotiate_write(ioc, msg, len) < 0) { LOG("write failed (error message)"); ret =3D -EIO; } else { @@ -287,15 +286,15 @@ static int nbd_negotiate_send_rep_list(QIOChannel *io= c, NBDExport *exp) } =20 len =3D cpu_to_be32(name_len); - if (nbd_negotiate_write(ioc, &len, sizeof(len)) !=3D sizeof(len)) { + if (nbd_negotiate_write(ioc, &len, sizeof(len)) < 0) { LOG("write failed (name length)"); return -EINVAL; } - if (nbd_negotiate_write(ioc, name, name_len) !=3D name_len) { + if (nbd_negotiate_write(ioc, name, name_len) < 0) { LOG("write failed (name buffer)"); return -EINVAL; } - if (nbd_negotiate_write(ioc, desc, desc_len) !=3D desc_len) { + if (nbd_negotiate_write(ioc, desc, desc_len) < 0) { LOG("write failed (description buffer)"); return -EINVAL; } @@ -309,7 +308,7 @@ static int nbd_negotiate_handle_list(NBDClient *client,= uint32_t length) NBDExport *exp; =20 if (length) { - if (nbd_negotiate_drop_sync(client->ioc, length) !=3D length) { + if (nbd_negotiate_drop_sync(client->ioc, length) < 0) { return -EIO; } return nbd_negotiate_send_rep_err(client->ioc, @@ -340,7 +339,7 @@ static int nbd_negotiate_handle_export_name(NBDClient *= client, uint32_t length) LOG("Bad length received"); goto fail; } - if (nbd_negotiate_read(client->ioc, name, length) !=3D length) { + if (nbd_negotiate_read(client->ioc, name, length) < 0) { LOG("read failed"); goto fail; } @@ -373,7 +372,7 @@ static QIOChannel *nbd_negotiate_handle_starttls(NBDCli= ent *client, TRACE("Setting up TLS"); ioc =3D client->ioc; if (length) { - if (nbd_negotiate_drop_sync(ioc, length) !=3D length) { + if (nbd_negotiate_drop_sync(ioc, length) < 0) { return NULL; } nbd_negotiate_send_rep_err(ioc, NBD_REP_ERR_INVALID, NBD_OPT_START= TLS, @@ -437,8 +436,7 @@ static int nbd_negotiate_options(NBDClient *client) ... Rest of request */ =20 - if (nbd_negotiate_read(client->ioc, &flags, sizeof(flags)) !=3D - sizeof(flags)) { + if (nbd_negotiate_read(client->ioc, &flags, sizeof(flags)) < 0) { LOG("read failed"); return -EIO; } @@ -464,8 +462,7 @@ static int nbd_negotiate_options(NBDClient *client) uint32_t clientflags, length; uint64_t magic; =20 - if (nbd_negotiate_read(client->ioc, &magic, sizeof(magic)) !=3D - sizeof(magic)) { + if (nbd_negotiate_read(client->ioc, &magic, sizeof(magic)) < 0) { LOG("read failed"); return -EINVAL; } @@ -476,14 +473,14 @@ static int nbd_negotiate_options(NBDClient *client) } =20 if (nbd_negotiate_read(client->ioc, &clientflags, - sizeof(clientflags)) !=3D sizeof(clientflag= s)) { + sizeof(clientflags)) < 0) + { LOG("read failed"); return -EINVAL; } clientflags =3D be32_to_cpu(clientflags); =20 - if (nbd_negotiate_read(client->ioc, &length, sizeof(length)) !=3D - sizeof(length)) { + if (nbd_negotiate_read(client->ioc, &length, sizeof(length)) < 0) { LOG("read failed"); return -EINVAL; } @@ -513,7 +510,7 @@ static int nbd_negotiate_options(NBDClient *client) return -EINVAL; =20 default: - if (nbd_negotiate_drop_sync(client->ioc, length) !=3D leng= th) { + if (nbd_negotiate_drop_sync(client->ioc, length) < 0) { return -EIO; } ret =3D nbd_negotiate_send_rep_err(client->ioc, @@ -551,7 +548,7 @@ static int nbd_negotiate_options(NBDClient *client) return nbd_negotiate_handle_export_name(client, length); =20 case NBD_OPT_STARTTLS: - if (nbd_negotiate_drop_sync(client->ioc, length) !=3D leng= th) { + if (nbd_negotiate_drop_sync(client->ioc, length) < 0) { return -EIO; } if (client->tlscreds) { @@ -570,7 +567,7 @@ static int nbd_negotiate_options(NBDClient *client) } break; default: - if (nbd_negotiate_drop_sync(client->ioc, length) !=3D leng= th) { + if (nbd_negotiate_drop_sync(client->ioc, length) < 0) { return -EIO; } ret =3D nbd_negotiate_send_rep_err(client->ioc, @@ -659,12 +656,12 @@ static coroutine_fn int nbd_negotiate(NBDClientNewDat= a *data) TRACE("TLS cannot be enabled with oldstyle protocol"); goto fail; } - if (nbd_negotiate_write(client->ioc, buf, sizeof(buf)) !=3D sizeof= (buf)) { + if (nbd_negotiate_write(client->ioc, buf, sizeof(buf)) < 0) { LOG("write failed"); goto fail; } } else { - if (nbd_negotiate_write(client->ioc, buf, 18) !=3D 18) { + if (nbd_negotiate_write(client->ioc, buf, 18) < 0) { LOG("write failed"); goto fail; } @@ -679,7 +676,7 @@ static coroutine_fn int nbd_negotiate(NBDClientNewData = *data) stq_be_p(buf + 18, client->exp->size); stw_be_p(buf + 26, client->exp->nbdflags | myflags); len =3D client->no_zeroes ? 10 : sizeof(buf) - 18; - if (nbd_negotiate_write(client->ioc, buf + 18, len) !=3D len) { + if (nbd_negotiate_write(client->ioc, buf + 18, len) < 0) { LOG("write failed"); goto fail; } @@ -702,11 +699,6 @@ static ssize_t nbd_receive_request(QIOChannel *ioc, NB= DRequest *request) return ret; } =20 - if (ret !=3D sizeof(buf)) { - LOG("read failed"); - return -EINVAL; - } - /* Request [ 0 .. 3] magic (NBD_REQUEST_MAGIC) [ 4 .. 5] flags (NBD_CMD_FLAG_FUA, ...) @@ -737,7 +729,6 @@ static ssize_t nbd_receive_request(QIOChannel *ioc, NBD= Request *request) static ssize_t nbd_send_reply(QIOChannel *ioc, NBDReply *reply) { uint8_t buf[NBD_REPLY_SIZE]; - ssize_t ret; =20 reply->error =3D system_errno_to_nbd_errno(reply->error); =20 @@ -754,16 +745,7 @@ static ssize_t nbd_send_reply(QIOChannel *ioc, NBDRepl= y *reply) stl_be_p(buf + 4, reply->error); stq_be_p(buf + 8, reply->handle); =20 - ret =3D write_sync(ioc, buf, sizeof(buf)); - if (ret < 0) { - return ret; - } - - if (ret !=3D sizeof(buf)) { - LOG("writing to socket failed"); - return -EINVAL; - } - return 0; + return write_sync(ioc, buf, sizeof(buf)); } =20 #define MAX_NBD_REQUESTS 16 @@ -1067,7 +1049,7 @@ static ssize_t nbd_co_send_reply(NBDRequestData *req,= NBDReply *reply, rc =3D nbd_send_reply(client->ioc, reply); if (rc >=3D 0) { ret =3D write_sync(client->ioc, req->data, len); - if (ret !=3D len) { + if (ret < 0) { rc =3D -EIO; } } @@ -1141,7 +1123,7 @@ static ssize_t nbd_co_receive_request(NBDRequestData = *req, if (request->type =3D=3D NBD_CMD_WRITE) { TRACE("Reading %" PRIu32 " byte(s)", request->len); =20 - if (read_sync(client->ioc, req->data, request->len) !=3D request->= len) { + if (read_sync(client->ioc, req->data, request->len) < 0) { LOG("reading from socket failed"); rc =3D -EIO; goto out; --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193203469309.06850256615564; Fri, 19 May 2017 04:26:43 -0700 (PDT) Received: from localhost ([::1]:57952 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBg3N-0000Qd-S6 for importer@patchew.org; Fri, 19 May 2017 07:26:41 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49429) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyO-0004Qk-KO for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyN-0000y5-JS for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:32 -0400 Received: from mail-wm0-x22c.google.com ([2a00:1450:400c:c09::22c]:36068) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyN-0000xk-A3 for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:31 -0400 Received: by mail-wm0-x22c.google.com with SMTP id 70so77499235wmq.1 for ; Fri, 19 May 2017 04:21:31 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=/5AiP0aM3qct8OzdTV7PqSQeeDXpgUAaU1BRwwc8rqs=; b=t8NxWJqb+4eCEVve/Z9ozty3p0D5jEmhkn1fWPEJTT11Bxx36wzOxNvJUJsMOPt4K4 2vLdM3xpc4bwzer81HK74a2b73xpRUbyg3PlpoGDMRoUNVdgWpH6anyouF8wqE2wXSK3 HhmXKU49wpPGRNxt4ElNL+1w3+6O+4fE9/YEvbIy9SVXa6HIjBAP10JeEok3hkiBZN8e IB1QpoRMb+WwtToqGgkDqJItCLWm2mZZVq0mW+H1WayS3EijVGdRVyfl/zYW61jUMaQ2 +5Y7Ze/I5n/cxBUlscJE2CAe1zt94QVt9bfUGzmrFUfND91LkCtb6CVct8XYGlMJidwg lgNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=/5AiP0aM3qct8OzdTV7PqSQeeDXpgUAaU1BRwwc8rqs=; b=sfW6JIbmIXu2U+vCEVIq4UjrZXv2HeCaLhFdCJSMmKj8dMOlFW1I2DFB9k+Mzr6tEC uKYFfsEhDHa1YQDdpWP1VjzMnBOzzU6E8YE6BeXJkmCSw4l9m2MKnKJL3PnD9uXyjLzU L1tIfdRCmDUbE7DFoMn0pW3PpNJ9gDgSpr3OlQ7UTLS5yZgIyfXb6tgYOrjJSvb+U7c7 ktt/cZy93kKyMRYaeNhtIaAE2veaCPRpfEGc8ZY22uD+ZCZ8T8KqmqC1Y4u4RvGGjODX v4fo5ODDPFZvvVBj1uRUYx+jh8Z5cpyEEJuzM6BQYO/zw1CTx7g60Ao/RmfcivfBZxOK ORaA== X-Gm-Message-State: AODbwcD74WHTCl8fdtteIKrCBwXIDyDRgVxMukGWjZABfqwDOapIV0Ju a+lHKCMgLgTYAQ== X-Received: by 10.28.126.210 with SMTP id z201mr5926122wmc.75.1495192890109; Fri, 19 May 2017 04:21:30 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:21:04 +0200 Message-Id: <1495192872-27667-13-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::22c Subject: [Qemu-devel] [PULL 12/20] nbd: add errp parameter to nbd_wr_syncv() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Vladimir Sementsov-Ogievskiy Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Vladimir Sementsov-Ogievskiy Will be used in following patch to provide actual error message in some cases. Signed-off-by: Vladimir Sementsov-Ogievskiy Message-Id: <20170516094533.6160-4-vsementsov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- block/nbd-client.c | 4 ++-- include/block/nbd.h | 3 ++- nbd/common.c | 12 +++++------- nbd/nbd-internal.h | 4 ++-- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/block/nbd-client.c b/block/nbd-client.c index 1e2952f..538d95e 100644 --- a/block/nbd-client.c +++ b/block/nbd-client.c @@ -136,7 +136,7 @@ static int nbd_co_send_request(BlockDriverState *bs, rc =3D nbd_send_request(s->ioc, request); if (rc >=3D 0) { ret =3D nbd_wr_syncv(s->ioc, qiov->iov, qiov->niov, request->l= en, - false); + false, NULL); if (ret !=3D request->len) { rc =3D -EIO; } @@ -165,7 +165,7 @@ static void nbd_co_receive_reply(NBDClientSession *s, } else { if (qiov && reply->error =3D=3D 0) { ret =3D nbd_wr_syncv(s->ioc, qiov->iov, qiov->niov, request->l= en, - true); + true, NULL); if (ret !=3D request->len) { reply->error =3D EIO; } diff --git a/include/block/nbd.h b/include/block/nbd.h index 0ed0775..9d385ea 100644 --- a/include/block/nbd.h +++ b/include/block/nbd.h @@ -127,7 +127,8 @@ ssize_t nbd_wr_syncv(QIOChannel *ioc, struct iovec *iov, size_t niov, size_t length, - bool do_read); + bool do_read, + Error **errp); int nbd_receive_negotiate(QIOChannel *ioc, const char *name, uint16_t *fla= gs, QCryptoTLSCreds *tlscreds, const char *hostname, QIOChannel **outioc, diff --git a/nbd/common.c b/nbd/common.c index 4db45b3..bd81637 100644 --- a/nbd/common.c +++ b/nbd/common.c @@ -28,10 +28,10 @@ ssize_t nbd_wr_syncv(QIOChannel *ioc, struct iovec *iov, size_t niov, size_t length, - bool do_read) + bool do_read, + Error **errp) { ssize_t done =3D 0; - Error *local_err =3D NULL; struct iovec *local_iov =3D g_new(struct iovec, niov); struct iovec *local_iov_head =3D local_iov; unsigned int nlocal_iov =3D niov; @@ -41,19 +41,17 @@ ssize_t nbd_wr_syncv(QIOChannel *ioc, while (nlocal_iov > 0) { ssize_t len; if (do_read) { - len =3D qio_channel_readv(ioc, local_iov, nlocal_iov, &local_e= rr); + len =3D qio_channel_readv(ioc, local_iov, nlocal_iov, errp); } else { - len =3D qio_channel_writev(ioc, local_iov, nlocal_iov, &local_= err); + len =3D qio_channel_writev(ioc, local_iov, nlocal_iov, errp); } if (len =3D=3D QIO_CHANNEL_ERR_BLOCK) { + /* errp should not be set */ assert(qemu_in_coroutine()); qio_channel_yield(ioc, do_read ? G_IO_IN : G_IO_OUT); continue; } if (len < 0) { - TRACE("I/O error: %s", error_get_pretty(local_err)); - error_free(local_err); - /* XXX handle Error objects */ done =3D -EIO; goto cleanup; } diff --git a/nbd/nbd-internal.h b/nbd/nbd-internal.h index e6bbc7c..1d479fe 100644 --- a/nbd/nbd-internal.h +++ b/nbd/nbd-internal.h @@ -108,7 +108,7 @@ static inline ssize_t read_sync_eof(QIOChannel *ioc, vo= id *buffer, size_t size) * our request/reply. Synchronization is done with recv_coroutine, so * that this is coroutine-safe. */ - return nbd_wr_syncv(ioc, &iov, 1, size, true); + return nbd_wr_syncv(ioc, &iov, 1, size, true, NULL); } =20 /* read_sync @@ -132,7 +132,7 @@ static inline int write_sync(QIOChannel *ioc, const voi= d *buffer, size_t size) { struct iovec iov =3D { .iov_base =3D (void *) buffer, .iov_len =3D siz= e }; =20 - ssize_t ret =3D nbd_wr_syncv(ioc, &iov, 1, size, false); + ssize_t ret =3D nbd_wr_syncv(ioc, &iov, 1, size, false, NULL); =20 assert(ret < 0 || ret =3D=3D size); =20 --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 149519335206263.02067481116649; Fri, 19 May 2017 04:29:12 -0700 (PDT) Received: from localhost ([::1]:57960 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBg5m-0002lS-Ka for importer@patchew.org; Fri, 19 May 2017 07:29:10 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49475) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyQ-0004Se-EQ for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyO-0000yd-PG for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:34 -0400 Received: from mail-wr0-x236.google.com ([2a00:1450:400c:c0c::236]:35422) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyO-0000y9-Ez for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:32 -0400 Received: by mail-wr0-x236.google.com with SMTP id z52so15314206wrc.2 for ; Fri, 19 May 2017 04:21:32 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=LinIVzC/iJYGzbYu2yoDUljFlDDyXfOFA4I+gecpsxE=; b=h5jKoZmYzHKJg3rt6d7JhnkfwEuXnT4DxeyW7IrFa4eWSC2nEl/h6PWoq1ck7ie7Hs +HqDZeLiceVm6VAL8tfDkuyBzNJkzrt3os0Fr5qrNg7aM5PeCnQNGP5fyhA8NoZ8BKyL +tf3IKGW/gO/iaAHbVI+VjldyZiq5H0tYJpyTif2WKTNz8cMOgXlZ37MQM2AFQF+tXQV qabpGbInAnkVFnu0vkJjxj6gicm+EQmpQyssb/g9vy5Zyl0Vvvkar0/oxN2UrG7rmNrI Wa9VVcVp9nEcJeuwhwhtA9a5L1eZ1qNqMF9EiA9ocLeI+r/B7wPUO9uNnww+MtfEDnr5 NDWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=LinIVzC/iJYGzbYu2yoDUljFlDDyXfOFA4I+gecpsxE=; b=fuiqmSF6LRMthNPGa14Dp5PwNqKxZc66gEoYLF+qYXM1WzmA06XZVORonCBX0ZD679 c4hpF4Yevt4e4bC3ccB5UYA7sJPkHBeTYTGY/buUBHkGGuWwNm04Esg2kZMeHp4Z6tbS idDCjO4MfvlNmV+i2UULptv8rdKQp1jdtvy6tu1VcJnTw4EFK3I1mcLCBHcseYDUwGu1 lkiguyLpyfg26HpEbVNAnVrElhw6jP4WlHWF0RZrRFdiSOOf50ewW4dT8Kwfkm7shEQn PePBPZeFfljXxCZn2PaBnQiFOkSTK+iPhbJEw+qX3OpXW++ZbzmXrQQ6Bbpff7Hac/gu QzpA== X-Gm-Message-State: AODbwcC76Qw1d0OcgzBew6Y8A6yawwIJGt2vDzWYUCU6oAjEoJ24XKIm NEa/JTQNHh4GCQ== X-Received: by 10.223.135.130 with SMTP id b2mr2542428wrb.48.1495192891327; Fri, 19 May 2017 04:21:31 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:21:05 +0200 Message-Id: <1495192872-27667-14-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::236 Subject: [Qemu-devel] [PULL 13/20] nbd: add errp to read_sync, write_sync and drop_sync X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Vladimir Sementsov-Ogievskiy Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Vladimir Sementsov-Ogievskiy There a lot of calls of these functions, which already have errp, which they are filling themselves. On the other hand, nbd_wr_syncv has errp parameter too, so it would be great to connect them. Signed-off-by: Vladimir Sementsov-Ogievskiy Message-Id: <20170516094533.6160-5-vsementsov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- nbd/client.c | 76 +++++++++++++++++++++++++++-----------------------= ---- nbd/nbd-internal.h | 16 +++++++----- nbd/server.c | 12 ++++----- 3 files changed, 54 insertions(+), 50 deletions(-) diff --git a/nbd/client.c b/nbd/client.c index 6b74a62..f102375 100644 --- a/nbd/client.c +++ b/nbd/client.c @@ -88,7 +88,7 @@ static QTAILQ_HEAD(, NBDExport) exports =3D QTAILQ_HEAD_I= NITIALIZER(exports); =20 /* Discard length bytes from channel. Return -errno on failure and 0 on * success*/ -static int drop_sync(QIOChannel *ioc, size_t size) +static int drop_sync(QIOChannel *ioc, size_t size, Error **errp) { ssize_t ret =3D 0; char small[1024]; @@ -97,7 +97,7 @@ static int drop_sync(QIOChannel *ioc, size_t size) buffer =3D sizeof(small) >=3D size ? small : g_malloc(MIN(65536, size)= ); while (size > 0) { ssize_t count =3D MIN(65536, size); - ret =3D read_sync(ioc, buffer, MIN(65536, size)); + ret =3D read_sync(ioc, buffer, MIN(65536, size), errp); =20 if (ret < 0) { goto cleanup; @@ -135,13 +135,13 @@ static int nbd_send_option_request(QIOChannel *ioc, u= int32_t opt, stl_be_p(&req.option, opt); stl_be_p(&req.length, len); =20 - if (write_sync(ioc, &req, sizeof(req)) < 0) { - error_setg(errp, "Failed to send option request header"); + if (write_sync(ioc, &req, sizeof(req), errp) < 0) { + error_prepend(errp, "Failed to send option request header"); return -1; } =20 - if (len && write_sync(ioc, (char *) data, len) < 0) { - error_setg(errp, "Failed to send option request data"); + if (len && write_sync(ioc, (char *) data, len, errp) < 0) { + error_prepend(errp, "Failed to send option request data"); return -1; } =20 @@ -169,8 +169,8 @@ static int nbd_receive_option_reply(QIOChannel *ioc, ui= nt32_t opt, nbd_opt_reply *reply, Error **errp) { QEMU_BUILD_BUG_ON(sizeof(*reply) !=3D 20); - if (read_sync(ioc, reply, sizeof(*reply)) < 0) { - error_setg(errp, "failed to read option reply"); + if (read_sync(ioc, reply, sizeof(*reply), errp) < 0) { + error_prepend(errp, "failed to read option reply"); nbd_send_opt_abort(ioc); return -1; } @@ -218,8 +218,8 @@ static int nbd_handle_reply_err(QIOChannel *ioc, nbd_op= t_reply *reply, goto cleanup; } msg =3D g_malloc(reply->length + 1); - if (read_sync(ioc, msg, reply->length) < 0) { - error_setg(errp, "failed to read option error message"); + if (read_sync(ioc, msg, reply->length, errp) < 0) { + error_prepend(errp, "failed to read option error message"); goto cleanup; } msg[reply->length] =3D '\0'; @@ -320,8 +320,8 @@ static int nbd_receive_list(QIOChannel *ioc, const char= *want, bool *match, nbd_send_opt_abort(ioc); return -1; } - if (read_sync(ioc, &namelen, sizeof(namelen)) < 0) { - error_setg(errp, "failed to read option name length"); + if (read_sync(ioc, &namelen, sizeof(namelen), errp) < 0) { + error_prepend(errp, "failed to read option name length"); nbd_send_opt_abort(ioc); return -1; } @@ -333,8 +333,8 @@ static int nbd_receive_list(QIOChannel *ioc, const char= *want, bool *match, return -1; } if (namelen !=3D strlen(want)) { - if (drop_sync(ioc, len) < 0) { - error_setg(errp, "failed to skip export name with wrong length= "); + if (drop_sync(ioc, len, errp) < 0) { + error_prepend(errp, "failed to skip export name with wrong len= gth"); nbd_send_opt_abort(ioc); return -1; } @@ -342,15 +342,15 @@ static int nbd_receive_list(QIOChannel *ioc, const ch= ar *want, bool *match, } =20 assert(namelen < sizeof(name)); - if (read_sync(ioc, name, namelen) < 0) { - error_setg(errp, "failed to read export name"); + if (read_sync(ioc, name, namelen, errp) < 0) { + error_prepend(errp, "failed to read export name"); nbd_send_opt_abort(ioc); return -1; } name[namelen] =3D '\0'; len -=3D namelen; - if (drop_sync(ioc, len) < 0) { - error_setg(errp, "failed to read export description"); + if (drop_sync(ioc, len, errp) < 0) { + error_prepend(errp, "failed to read export description"); nbd_send_opt_abort(ioc); return -1; } @@ -476,8 +476,8 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *= name, uint16_t *flags, goto fail; } =20 - if (read_sync(ioc, buf, 8) < 0) { - error_setg(errp, "Failed to read data"); + if (read_sync(ioc, buf, 8, errp) < 0) { + error_prepend(errp, "Failed to read data"); goto fail; } =20 @@ -502,8 +502,8 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *= name, uint16_t *flags, goto fail; } =20 - if (read_sync(ioc, &magic, sizeof(magic)) < 0) { - error_setg(errp, "Failed to read magic"); + if (read_sync(ioc, &magic, sizeof(magic), errp) < 0) { + error_prepend(errp, "Failed to read magic"); goto fail; } magic =3D be64_to_cpu(magic); @@ -514,8 +514,8 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *= name, uint16_t *flags, uint16_t globalflags; bool fixedNewStyle =3D false; =20 - if (read_sync(ioc, &globalflags, sizeof(globalflags)) < 0) { - error_setg(errp, "Failed to read server flags"); + if (read_sync(ioc, &globalflags, sizeof(globalflags), errp) < 0) { + error_prepend(errp, "Failed to read server flags"); goto fail; } globalflags =3D be16_to_cpu(globalflags); @@ -532,8 +532,8 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *= name, uint16_t *flags, } /* client requested flags */ clientflags =3D cpu_to_be32(clientflags); - if (write_sync(ioc, &clientflags, sizeof(clientflags)) < 0) { - error_setg(errp, "Failed to send clientflags field"); + if (write_sync(ioc, &clientflags, sizeof(clientflags), errp) < 0) { + error_prepend(errp, "Failed to send clientflags field"); goto fail; } if (tlscreds) { @@ -570,14 +570,14 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char= *name, uint16_t *flags, } =20 /* Read the response */ - if (read_sync(ioc, &s, sizeof(s)) < 0) { - error_setg(errp, "Failed to read export length"); + if (read_sync(ioc, &s, sizeof(s), errp) < 0) { + error_prepend(errp, "Failed to read export length"); goto fail; } *size =3D be64_to_cpu(s); =20 - if (read_sync(ioc, flags, sizeof(*flags)) < 0) { - error_setg(errp, "Failed to read export flags"); + if (read_sync(ioc, flags, sizeof(*flags), errp) < 0) { + error_prepend(errp, "Failed to read export flags"); goto fail; } be16_to_cpus(flags); @@ -593,15 +593,15 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char= *name, uint16_t *flags, goto fail; } =20 - if (read_sync(ioc, &s, sizeof(s)) < 0) { - error_setg(errp, "Failed to read export length"); + if (read_sync(ioc, &s, sizeof(s), errp) < 0) { + error_prepend(errp, "Failed to read export length"); goto fail; } *size =3D be64_to_cpu(s); TRACE("Size is %" PRIu64, *size); =20 - if (read_sync(ioc, &oldflags, sizeof(oldflags)) < 0) { - error_setg(errp, "Failed to read export flags"); + if (read_sync(ioc, &oldflags, sizeof(oldflags), errp) < 0) { + error_prepend(errp, "Failed to read export flags"); goto fail; } be32_to_cpus(&oldflags); @@ -616,8 +616,8 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *= name, uint16_t *flags, } =20 TRACE("Size is %" PRIu64 ", export flags %" PRIx16, *size, *flags); - if (zeroes && drop_sync(ioc, 124) < 0) { - error_setg(errp, "Failed to read reserved block"); + if (zeroes && drop_sync(ioc, 124, errp) < 0) { + error_prepend(errp, "Failed to read reserved block"); goto fail; } rc =3D 0; @@ -755,7 +755,7 @@ ssize_t nbd_send_request(QIOChannel *ioc, NBDRequest *r= equest) stq_be_p(buf + 16, request->from); stl_be_p(buf + 24, request->len); =20 - return write_sync(ioc, buf, sizeof(buf)); + return write_sync(ioc, buf, sizeof(buf), NULL); } =20 ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *reply) @@ -764,7 +764,7 @@ ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *re= ply) uint32_t magic; ssize_t ret; =20 - ret =3D read_sync_eof(ioc, buf, sizeof(buf)); + ret =3D read_sync_eof(ioc, buf, sizeof(buf), NULL); if (ret <=3D 0) { return ret; } diff --git a/nbd/nbd-internal.h b/nbd/nbd-internal.h index 1d479fe..d607164 100644 --- a/nbd/nbd-internal.h +++ b/nbd/nbd-internal.h @@ -100,7 +100,8 @@ * qio_channel_readv() returns 0. So, there are no needs to call read_sync= _eof * iteratively. */ -static inline ssize_t read_sync_eof(QIOChannel *ioc, void *buffer, size_t = size) +static inline ssize_t read_sync_eof(QIOChannel *ioc, void *buffer, size_t = size, + Error **errp) { struct iovec iov =3D { .iov_base =3D buffer, .iov_len =3D size }; /* Sockets are kept in blocking mode in the negotiation phase. After @@ -108,18 +109,20 @@ static inline ssize_t read_sync_eof(QIOChannel *ioc, = void *buffer, size_t size) * our request/reply. Synchronization is done with recv_coroutine, so * that this is coroutine-safe. */ - return nbd_wr_syncv(ioc, &iov, 1, size, true, NULL); + return nbd_wr_syncv(ioc, &iov, 1, size, true, errp); } =20 /* read_sync * Reads @size bytes from @ioc. Returns 0 on success. */ -static inline int read_sync(QIOChannel *ioc, void *buffer, size_t size) +static inline int read_sync(QIOChannel *ioc, void *buffer, size_t size, + Error **errp) { - ssize_t ret =3D read_sync_eof(ioc, buffer, size); + ssize_t ret =3D read_sync_eof(ioc, buffer, size, errp); =20 if (ret >=3D 0 && ret !=3D size) { ret =3D -EINVAL; + error_setg(errp, "End of file"); } =20 return ret < 0 ? ret : 0; @@ -128,11 +131,12 @@ static inline int read_sync(QIOChannel *ioc, void *bu= ffer, size_t size) /* write_sync * Writes @size bytes to @ioc. Returns 0 on success. */ -static inline int write_sync(QIOChannel *ioc, const void *buffer, size_t s= ize) +static inline int write_sync(QIOChannel *ioc, const void *buffer, size_t s= ize, + Error **errp) { struct iovec iov =3D { .iov_base =3D (void *) buffer, .iov_len =3D siz= e }; =20 - ssize_t ret =3D nbd_wr_syncv(ioc, &iov, 1, size, false, NULL); + ssize_t ret =3D nbd_wr_syncv(ioc, &iov, 1, size, false, errp); =20 assert(ret < 0 || ret =3D=3D size); =20 diff --git a/nbd/server.c b/nbd/server.c index 1e1096c..ee59e5d 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -124,7 +124,7 @@ static int nbd_negotiate_read(QIOChannel *ioc, void *bu= ffer, size_t size) nbd_negotiate_continue, qemu_coroutine_self(), NULL); - ret =3D read_sync(ioc, buffer, size); + ret =3D read_sync(ioc, buffer, size, NULL); g_source_remove(watch); return ret; =20 @@ -142,7 +142,7 @@ static int nbd_negotiate_write(QIOChannel *ioc, const v= oid *buffer, size_t size) nbd_negotiate_continue, qemu_coroutine_self(), NULL); - ret =3D write_sync(ioc, buffer, size); + ret =3D write_sync(ioc, buffer, size, NULL); g_source_remove(watch); return ret; } @@ -694,7 +694,7 @@ static ssize_t nbd_receive_request(QIOChannel *ioc, NBD= Request *request) uint32_t magic; ssize_t ret; =20 - ret =3D read_sync(ioc, buf, sizeof(buf)); + ret =3D read_sync(ioc, buf, sizeof(buf), NULL); if (ret < 0) { return ret; } @@ -745,7 +745,7 @@ static ssize_t nbd_send_reply(QIOChannel *ioc, NBDReply= *reply) stl_be_p(buf + 4, reply->error); stq_be_p(buf + 8, reply->handle); =20 - return write_sync(ioc, buf, sizeof(buf)); + return write_sync(ioc, buf, sizeof(buf), NULL); } =20 #define MAX_NBD_REQUESTS 16 @@ -1048,7 +1048,7 @@ static ssize_t nbd_co_send_reply(NBDRequestData *req,= NBDReply *reply, qio_channel_set_cork(client->ioc, true); rc =3D nbd_send_reply(client->ioc, reply); if (rc >=3D 0) { - ret =3D write_sync(client->ioc, req->data, len); + ret =3D write_sync(client->ioc, req->data, len, NULL); if (ret < 0) { rc =3D -EIO; } @@ -1123,7 +1123,7 @@ static ssize_t nbd_co_receive_request(NBDRequestData = *req, if (request->type =3D=3D NBD_CMD_WRITE) { TRACE("Reading %" PRIu32 " byte(s)", request->len); =20 - if (read_sync(client->ioc, req->data, request->len) < 0) { + if (read_sync(client->ioc, req->data, request->len, NULL) < 0) { LOG("reading from socket failed"); rc =3D -EIO; goto out; --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193657006866.5361029935451; Fri, 19 May 2017 04:34:17 -0700 (PDT) Received: from localhost ([::1]:57981 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBgAf-0006sC-FR for importer@patchew.org; Fri, 19 May 2017 07:34:13 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49477) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyQ-0004T2-Ns for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyP-0000z2-Hs for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:34 -0400 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]:35472) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyP-0000yV-8p for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:33 -0400 Received: by mail-wm0-x244.google.com with SMTP id v4so17703986wmb.2 for ; Fri, 19 May 2017 04:21:33 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=+vRc/k5TUu6B+dl5rCHeczEqKhDP2miAJ0F2frxRREg=; b=nFN+BLee6IFNNxYbW0UR72aH/UPvXniONhChChUv9sL4eewQANHoZtoxN+lMPRnToS trfavpuS+pTy6tZXlh4swy1SiyKOjduena8fbKHI0T0ZAQMDajU2k0+AJ5eYwcUxml30 cuw5i7pxwVOtw7cbrOlDbLa79BxSCPJOi0PKbgCacjBFF4cnWz3IqHQ6XFNDpBjriifh LElRjTNrEAsdUZHG1T8HQi6qy67GAodIvo/kpNP06baAOQ0ARPmNXr5SmqRk70Z8WECU xC1usiUi5+iT3AkrMpneiL+BNJwrrW5qpJpPs4MeKr0Wow/6ut8HZ4A6L+xjpNILMTGX Nvwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=+vRc/k5TUu6B+dl5rCHeczEqKhDP2miAJ0F2frxRREg=; b=oVDNoA1VFPxokRNK07gAomQgCMNkN0L5hWXcejumS+4wVb6swiuHQXt3a/90uZPmWx QLKmMXrzokEPp9aiNtxYBSG7rEhUntMCMry6EsrSHAFEkp+Vo6w08Q+xggI+BzjmR5y3 Un1N/RVRdB4mWsAe+5+15OjTyX46DnriHzcYjNMSPgHVFPwuUYXnFUZJuZ054KAaHQrO wN4JDQviYVzdhHVSj/SUi/lolvdizUl1sXcJEhJDKvmsF4TEkR833nITHnZrgbqiKeK3 TrxSeCaTnJuyYj1OaAYHsEQaCSJd9JrkvVIz7L6xINvNYHLrFnXjLAr6JjBDmLajo/DD 4MNA== X-Gm-Message-State: AODbwcDljvIbKWN8jchsf02USd7eVTdENEYsbYZiLr4W2LfT6d4V+twi s1jzOmdu+zRK3g== X-Received: by 10.28.41.66 with SMTP id p63mr5435953wmp.88.1495192892298; Fri, 19 May 2017 04:21:32 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:21:06 +0200 Message-Id: <1495192872-27667-15-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::244 Subject: [Qemu-devel] [PULL 14/20] nbd/client.c: use errp instead of LOG X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Vladimir Sementsov-Ogievskiy Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Vladimir Sementsov-Ogievskiy Move to modern errp scheme from just LOGging errors. Signed-off-by: Vladimir Sementsov-Ogievskiy Message-Id: <20170516094533.6160-6-vsementsov@virtuozzo.com> Signed-off-by: Paolo Bonzini --- block/nbd-client.c | 7 ++++++- include/block/nbd.h | 5 +++-- nbd/client.c | 30 +++++++++++++++++------------- qemu-nbd.c | 3 ++- 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/block/nbd-client.c b/block/nbd-client.c index 538d95e..073032b 100644 --- a/block/nbd-client.c +++ b/block/nbd-client.c @@ -28,6 +28,7 @@ */ =20 #include "qemu/osdep.h" +#include "qapi/error.h" #include "nbd-client.h" =20 #define HANDLE_TO_INDEX(bs, handle) ((handle) ^ ((uint64_t)(intptr_t)bs)) @@ -70,10 +71,14 @@ static coroutine_fn void nbd_read_reply_entry(void *opa= que) NBDClientSession *s =3D opaque; uint64_t i; int ret; + Error *local_err; =20 for (;;) { assert(s->reply.handle =3D=3D 0); - ret =3D nbd_receive_reply(s->ioc, &s->reply); + ret =3D nbd_receive_reply(s->ioc, &s->reply, &local_err); + if (ret < 0) { + error_report_err(local_err); + } if (ret <=3D 0) { break; } diff --git a/include/block/nbd.h b/include/block/nbd.h index 9d385ea..416257a 100644 --- a/include/block/nbd.h +++ b/include/block/nbd.h @@ -133,9 +133,10 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char = *name, uint16_t *flags, QCryptoTLSCreds *tlscreds, const char *hostname, QIOChannel **outioc, off_t *size, Error **errp); -int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t flags, off_t size); +int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t flags, off_t size, + Error **errp); ssize_t nbd_send_request(QIOChannel *ioc, NBDRequest *request); -ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *reply); +ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *reply, Error **errp); int nbd_client(int fd); int nbd_disconnect(int fd); =20 diff --git a/nbd/client.c b/nbd/client.c index f102375..595d99e 100644 --- a/nbd/client.c +++ b/nbd/client.c @@ -627,11 +627,13 @@ fail: } =20 #ifdef __linux__ -int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t flags, off_t size) +int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t flags, off_t size, + Error **errp) { unsigned long sectors =3D size / BDRV_SECTOR_SIZE; if (size / BDRV_SECTOR_SIZE !=3D sectors) { - LOG("Export size %lld too large for 32-bit kernel", (long long) si= ze); + error_setg(errp, "Export size %lld too large for 32-bit kernel", + (long long) size); return -E2BIG; } =20 @@ -639,7 +641,7 @@ int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t f= lags, off_t size) =20 if (ioctl(fd, NBD_SET_SOCK, (unsigned long) sioc->fd) < 0) { int serrno =3D errno; - LOG("Failed to set NBD socket"); + error_setg(errp, "Failed to set NBD socket"); return -serrno; } =20 @@ -647,7 +649,7 @@ int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t f= lags, off_t size) =20 if (ioctl(fd, NBD_SET_BLKSIZE, (unsigned long)BDRV_SECTOR_SIZE) < 0) { int serrno =3D errno; - LOG("Failed setting NBD block size"); + error_setg(errp, "Failed setting NBD block size"); return -serrno; } =20 @@ -659,7 +661,7 @@ int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t f= lags, off_t size) =20 if (ioctl(fd, NBD_SET_SIZE_BLOCKS, sectors) < 0) { int serrno =3D errno; - LOG("Failed setting size (in blocks)"); + error_setg(errp, "Failed setting size (in blocks)"); return -serrno; } =20 @@ -670,12 +672,12 @@ int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t= flags, off_t size) =20 if (ioctl(fd, BLKROSET, (unsigned long) &read_only) < 0) { int serrno =3D errno; - LOG("Failed setting read-only attribute"); + error_setg(errp, "Failed setting read-only attribute"); return -serrno; } } else { int serrno =3D errno; - LOG("Failed setting flags"); + error_setg(errp, "Failed setting flags"); return -serrno; } } @@ -723,8 +725,10 @@ int nbd_disconnect(int fd) } =20 #else -int nbd_init(int fd, QIOChannelSocket *ioc, uint16_t flags, off_t size) +int nbd_init(int fd, QIOChannelSocket *ioc, uint16_t flags, off_t size, + Error **errp) { + error_setg(errp, "nbd_init is only supported on Linux"); return -ENOTSUP; } =20 @@ -758,19 +762,19 @@ ssize_t nbd_send_request(QIOChannel *ioc, NBDRequest = *request) return write_sync(ioc, buf, sizeof(buf), NULL); } =20 -ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *reply) +ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *reply, Error **errp) { uint8_t buf[NBD_REPLY_SIZE]; uint32_t magic; ssize_t ret; =20 - ret =3D read_sync_eof(ioc, buf, sizeof(buf), NULL); + ret =3D read_sync_eof(ioc, buf, sizeof(buf), errp); if (ret <=3D 0) { return ret; } =20 if (ret !=3D sizeof(buf)) { - LOG("read failed"); + error_setg(errp, "read failed"); return -EINVAL; } =20 @@ -788,7 +792,7 @@ ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *re= ply) =20 if (reply->error =3D=3D ESHUTDOWN) { /* This works even on mingw which lacks a native ESHUTDOWN */ - LOG("server shutting down"); + error_setg(errp, "server shutting down"); return -EINVAL; } TRACE("Got reply: { magic =3D 0x%" PRIx32 ", .error =3D % " PRId32 @@ -796,7 +800,7 @@ ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *re= ply) magic, reply->error, reply->handle); =20 if (magic !=3D NBD_REPLY_MAGIC) { - LOG("invalid magic (got 0x%" PRIx32 ")", magic); + error_setg(errp, "invalid magic (got 0x%" PRIx32 ")", magic); return -EINVAL; } return sizeof(buf); diff --git a/qemu-nbd.c b/qemu-nbd.c index b7ab86b..f60842f 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -288,8 +288,9 @@ static void *nbd_client_thread(void *arg) goto out_socket; } =20 - ret =3D nbd_init(fd, sioc, nbdflags, size); + ret =3D nbd_init(fd, sioc, nbdflags, size, &local_error); if (ret < 0) { + error_report_err(local_error); goto out_fd; } =20 --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193424287953.2749580705229; Fri, 19 May 2017 04:30:24 -0700 (PDT) Received: from localhost ([::1]:57964 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBg6x-0003n9-0j for importer@patchew.org; Fri, 19 May 2017 07:30:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49493) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyS-0004UM-0j for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyQ-0000zm-QX for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:36 -0400 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]:32788) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyQ-0000zN-Jk for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:34 -0400 Received: by mail-wm0-x241.google.com with SMTP id b84so1793111wmh.0 for ; Fri, 19 May 2017 04:21:34 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=31lvrrUuhrxHk+N3/PDiYZZ7iLkDPuTr10cSDKl06pc=; b=Q+M1l1DCmCe0rNINCkpc4Xu5yT9dem7prU00b+xuZ50Ayi27Pjk8jPnRKJ+XBL9Pvs g27aSO+ATP46Fow6RA9G1CcIFawihHm+CgsCV+ULWq9XaKoJPjhLjxIrUeP96V3OX8Zp fvrxrxrVcPuAZt/HqzCmfUvF0GvE2vEWTlfXGhpW1Iz1VXzPAHFxNMhgr2KT8geuTHty 8ykqRkiWpH6dP15ZTFA+t7l/9ovjmzoW477bOvzVV/f7afr9CjLlogZj/3eLVrg/vP05 ZCO7s47tV2+ECTfv0DgprAMPFDWy/zldJtfS7NZibVRmm6k+UzzcxgGO1665+zCbDIxC jgVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=31lvrrUuhrxHk+N3/PDiYZZ7iLkDPuTr10cSDKl06pc=; b=SeQIPyFj6UqnLLGMw3EGmuaAoxF8nNKTAdBevsRBrKoN7P13+uT0QfSUhydlQZLqDl JEPadiUZ/4/HbFfSORyBinAG67Cw2Oop8PAJsdBO41MZTzW1oiRxhvJcZ7H9rdEoM48L 8cpyYW0r9kimbt3SbwtKhshKSCg5irqS0sMptLZZH/cLG3imwERIc57km/0cD/wTA8Id OF6neAoI6icQd5VWVdxZ/ofQOu9k9cKwdYbu+hL2/H2H64p+bpTJH0MwVf1HU9vlbo9J TLIsVE+/+unkhQj6OyKf9HElpJTjurRFiJESqE3noKHY3sBjKGEK+hKOBY99r91o3pPG Oh/g== X-Gm-Message-State: AODbwcASIMVZ8hF2XFVvdCce/4Cnfrj1fJdMgcwrms72drv9umMgx+iC D3RmBuJU8nfUjaoTJDA= X-Received: by 10.28.127.82 with SMTP id a79mr17062758wmd.50.1495192893292; Fri, 19 May 2017 04:21:33 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:21:07 +0200 Message-Id: <1495192872-27667-16-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::241 Subject: [Qemu-devel] [PULL 15/20] exec: simplify phys_page_find() params X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Xu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Peter Xu It really only plays with the dispatchers, so the parameter list does not need that complexity. This helps for readability at least. Signed-off-by: Peter Xu Message-Id: <1494838260-30439-2-git-send-email-peterx@redhat.com> Reviewed-by: David Gibson Signed-off-by: Paolo Bonzini --- exec.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/exec.c b/exec.c index 96e3ac9..29633cd 100644 --- a/exec.c +++ b/exec.c @@ -373,10 +373,11 @@ static inline bool section_covers_addr(const MemoryRe= gionSection *section, int128_getlo(section->size), addr); } =20 -static MemoryRegionSection *phys_page_find(PhysPageEntry lp, hwaddr addr, - Node *nodes, MemoryRegionSectio= n *sections) +static MemoryRegionSection *phys_page_find(AddressSpaceDispatch *d, hwaddr= addr) { - PhysPageEntry *p; + PhysPageEntry lp =3D d->phys_map, *p; + Node *nodes =3D d->map.nodes; + MemoryRegionSection *sections =3D d->map.sections; hwaddr index =3D addr >> TARGET_PAGE_BITS; int i; =20 @@ -414,8 +415,7 @@ static MemoryRegionSection *address_space_lookup_region= (AddressSpaceDispatch *d, section_covers_addr(section, addr)) { update =3D false; } else { - section =3D phys_page_find(d->phys_map, addr, d->map.nodes, - d->map.sections); + section =3D phys_page_find(d, addr); update =3D true; } if (resolve_subpage && section->mr->subpage) { @@ -1283,8 +1283,7 @@ static void register_subpage(AddressSpaceDispatch *d,= MemoryRegionSection *secti subpage_t *subpage; hwaddr base =3D section->offset_within_address_space & TARGET_PAGE_MASK; - MemoryRegionSection *existing =3D phys_page_find(d->phys_map, base, - d->map.nodes, d->map.se= ctions); + MemoryRegionSection *existing =3D phys_page_find(d, base); MemoryRegionSection subsection =3D { .offset_within_address_space =3D base, .size =3D int128_make64(TARGET_PAGE_SIZE), --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193584905825.7991127125063; Fri, 19 May 2017 04:33:04 -0700 (PDT) Received: from localhost ([::1]:57978 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBg9X-0005wW-CV for importer@patchew.org; Fri, 19 May 2017 07:33:03 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49505) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyS-0004VB-L8 for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyR-0000zz-J7 for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:36 -0400 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:33997) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyR-0000zi-DK; Fri, 19 May 2017 07:21:35 -0400 Received: by mail-wm0-x242.google.com with SMTP id d127so17623458wmf.1; Fri, 19 May 2017 04:21:35 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=rZPd2EpwCr0E+hKxm3dgk1klNysbub8Vv+9emWkUwIQ=; b=u4mrVZfjQW9CTb82VKhp8lL9vz/cd+r0Rac6fETQ+wFFSOujM4IWs57+yPLvGEWm/2 ZZ6RXKt7yYGemzFzE7dW1WGNdzAFkex1IdclxTHFXfx9/m27X9UYM7Pz1n/+KCHH3GXN q/lhI06wiUmPU2/IcSsgrkOPmzcws2fuYdnQBve7baddpBWJPUmuhy2rsUmQnCzrjkT1 bOKQQD6fMDJ8AuAAvpgYVIogmbwXqWGLDrBwuI+gnWQ3T1t5lNV5JxFvxAYJb+db4lNW fZP7VuAvKWVA06yxj/dvy/Eh8bDIYwV6NsHDRb6zg0A+V3Q+uekbaSlZ4cCmOMMqGoWX 18Ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=rZPd2EpwCr0E+hKxm3dgk1klNysbub8Vv+9emWkUwIQ=; b=SFsQdbAIuAjj8ET2Hk7tdW06YLn+On3+ai9c3jIY81TrAp/aJZc2pbJ6fh2ij9jDWU UofKDxa0Kh7hYtK4PeHHs3UtEOt6mz5hgwk+T0qQTTTBQKy3o9KkV5w0Oq3lUWaSxTJO a+cALSGwKst2lI7410wed9HTPhqi6kzlKTFgOILEuLlIPL40VIxWmUXMhwMLF2gQZ/bN JvtltBgYlY16WHmBgE5sS2rP7fob19LuZTcQ3wqmxKT1Em/0QC5BKOXqKzpdSDGWwwst G/BH0eYczAWOIXLFTvOnZfGaEG0fEQydQnKb/yMsJbC8JrGmeC+QsiBXji8E5PXzRliE g9rQ== X-Gm-Message-State: AODbwcCfyc9r3PAzh6fM9sHoBbFpclP2u/4tmnJ+c+pXd0ZFBW9uFaBl jc6Qnda26AcVtNspvGc= X-Received: by 10.28.63.209 with SMTP id m200mr16910104wma.45.1495192894229; Fri, 19 May 2017 04:21:34 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:21:08 +0200 Message-Id: <1495192872-27667-17-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::242 Subject: [Qemu-devel] [PULL 16/20] virtio-scsi: Unset hotplug handler when unrealize X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , qemu-stable@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Fam Zheng This matches the qbus_set_hotplug_handler in realize, and it releases the final reference to the embedded VirtIODevice so that it is properly finalized. A use-after-free is fixed with this patch, indirectly: virtio_device_instance_finalize wasn't called at hot-unplug, and the vdev->listener would be a dangling pointer in the global and the per address space listener list. See also RHBZ 1449031. Cc: qemu-stable@nongnu.org Signed-off-by: Fam Zheng Message-Id: <20170518102808.30046-1-famz@redhat.com> Signed-off-by: Paolo Bonzini --- hw/scsi/virtio-scsi.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c index 46a3e3f..f46f06d 100644 --- a/hw/scsi/virtio-scsi.c +++ b/hw/scsi/virtio-scsi.c @@ -918,6 +918,9 @@ void virtio_scsi_common_unrealize(DeviceState *dev, Err= or **errp) =20 static void virtio_scsi_device_unrealize(DeviceState *dev, Error **errp) { + VirtIOSCSI *s =3D VIRTIO_SCSI(dev); + + qbus_set_hotplug_handler(BUS(&s->bus), NULL, &error_abort); virtio_scsi_common_unrealize(dev, errp); } =20 --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193756080362.57083103938555; Fri, 19 May 2017 04:35:56 -0700 (PDT) Received: from localhost ([::1]:57994 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBgCI-0008QX-Ka for importer@patchew.org; Fri, 19 May 2017 07:35:54 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49562) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyV-0004YE-Aj for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyT-00010Y-0l for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:39 -0400 Received: from mail-wm0-x22b.google.com ([2a00:1450:400c:c09::22b]:37858) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyS-000108-MW for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:36 -0400 Received: by mail-wm0-x22b.google.com with SMTP id d127so83229484wmf.0 for ; Fri, 19 May 2017 04:21:36 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=AohvSQnWiLOc1AowXaKG7PR/KpwlzqO92wwPScu9hBQ=; b=Adm8a6LSyKmRxMwiSENUznxgnW7OxygqiIYLZEOj8tvaqXuXchrhal6wNSlxQZ9uEE lP06/EltM8ffLIf3w0yAv7PRke/neB9lr72ZXFu0dbuIf/JnCF/5hGKeuX3dswZP+sKD qubXuLfIS1f3iUa0Uf4CQCBeT5q3/1v6H2A6yGNWBrRv3rSHWigqoErtxmTV0AqCXKeS HUl68UY+DBzXd+Mu+QvoEzOKASbVWEMRznr2wpHHjTsLYWvNGj4U/f6QwdTDz3KO0U/g QHWGh2CJ/BvOeG6pJOOsj8yHmIfBIZGP/be5f+0gnEjxGDG3DDAhKH75fvqpAVHkedaH 8aOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=AohvSQnWiLOc1AowXaKG7PR/KpwlzqO92wwPScu9hBQ=; b=fpFUgwWEXnGVtzTX6UdUUf+34Ciy2S1N4kdM6YtQwsQXMrxOUL8zGKItrp5nbho1dt ZCDn57qkN5Q9Ue+Be5f0srypeDumtxPf/VTU/VJxVwwGbSJajvQMBy2rvvfe8PT2MJ8z LUYZ9xJMw8aGgIdiPGnpfcw5XtaHXyzgHtW7tIVEtwd6zBCwIabifklM3x/1JnlmCOnQ lXdd9G6Hxqv/BKagEjoLqCR98DNDUpo3Y0YWwGdXHnLqJPHytC1vd+/FTXAPdW8hQ7JN 2G0SHVMAU1u0uVerCSdRs3fxfXX7FHY2LMEWPHpoDEXEIXmfGxK+8da/0B8ccxUZjEgB +KYQ== X-Gm-Message-State: AODbwcBPAyBKbB/DQXAggE8DPOKOzD+XGIQsWxhztMAXjOetzf3sL3CC dekeJfeAEd5dqw== X-Received: by 10.28.71.201 with SMTP id m70mr18496652wmi.89.1495192895512; Fri, 19 May 2017 04:21:35 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:21:09 +0200 Message-Id: <1495192872-27667-18-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::22b Subject: [Qemu-devel] [PULL 17/20] vhost-user-scsi: Introduce vhost-user-scsi host device X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Felipe Franciosi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Felipe Franciosi This commit introduces a vhost-user device for SCSI. This is based on the existing vhost-scsi implementation, but done over vhost-user instead. It also uses a chardev to connect to the backend. Unlike vhost-scsi (today), VMs using vhost-user-scsi can be live migrated. To use it, start Qemu with a command line equivalent to: qemu-system-x86_64 \ -chardev socket,id=3Dvus0,path=3D/tmp/vus.sock \ -device vhost-user-scsi-pci,chardev=3Dvus0,bus=3Dpci.0,addr=3D... A separate commit presents a sample application linked with libiscsi to provide a backend for vhost-user-scsi. Signed-off-by: Felipe Franciosi Message-Id: <1488479153-21203-4-git-send-email-felipe@nutanix.com> --- .gitignore | 1 + default-configs/pci.mak | 1 + default-configs/s390x-softmmu.mak | 1 + hw/scsi/Makefile.objs | 1 + hw/scsi/vhost-user-scsi.c | 215 ++++++++++++++++++++++++++++++++= ++++ hw/virtio/virtio-pci.c | 54 +++++++++ hw/virtio/virtio-pci.h | 11 ++ include/hw/virtio/vhost-user-scsi.h | 35 ++++++ include/hw/virtio/virtio-scsi.h | 3 + 9 files changed, 322 insertions(+) create mode 100644 hw/scsi/vhost-user-scsi.c create mode 100644 include/hw/virtio/vhost-user-scsi.h diff --git a/.gitignore b/.gitignore index 55a001e..fa96bd2 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ /qemu-version.h.tmp /module_block.h /vscclient +/vhost-user-scsi /fsdev/virtfs-proxy-helper *.[1-9] *.a diff --git a/default-configs/pci.mak b/default-configs/pci.mak index 60dc651..ada9c6f 100644 --- a/default-configs/pci.mak +++ b/default-configs/pci.mak @@ -42,3 +42,4 @@ CONFIG_VGA=3Dy CONFIG_VGA_PCI=3Dy CONFIG_IVSHMEM=3D$(CONFIG_EVENTFD) CONFIG_ROCKER=3Dy +CONFIG_VHOST_USER_SCSI=3D$(CONFIG_POSIX) diff --git a/default-configs/s390x-softmmu.mak b/default-configs/s390x-soft= mmu.mak index 9615a48..9a0b6d9 100644 --- a/default-configs/s390x-softmmu.mak +++ b/default-configs/s390x-softmmu.mak @@ -1,5 +1,6 @@ CONFIG_PCI=3Dy CONFIG_VIRTIO_PCI=3Dy +CONFIG_VHOST_USER_SCSI=3Dy CONFIG_VIRTIO=3Dy CONFIG_SCLPCONSOLE=3Dy CONFIG_TERMINAL3270=3Dy diff --git a/hw/scsi/Makefile.objs b/hw/scsi/Makefile.objs index 54d8754..b188f72 100644 --- a/hw/scsi/Makefile.objs +++ b/hw/scsi/Makefile.objs @@ -11,4 +11,5 @@ obj-$(CONFIG_PSERIES) +=3D spapr_vscsi.o ifeq ($(CONFIG_VIRTIO),y) obj-y +=3D virtio-scsi.o virtio-scsi-dataplane.o obj-$(CONFIG_VHOST_SCSI) +=3D vhost-scsi-common.o vhost-scsi.o +obj-$(CONFIG_VHOST_USER_SCSI) +=3D vhost-scsi-common.o vhost-user-scsi.o endif diff --git a/hw/scsi/vhost-user-scsi.c b/hw/scsi/vhost-user-scsi.c new file mode 100644 index 0000000..694a637 --- /dev/null +++ b/hw/scsi/vhost-user-scsi.c @@ -0,0 +1,215 @@ +/* + * vhost-user-scsi host device + * + * Copyright (c) 2016 Nutanix Inc. All rights reserved. + * + * Author: + * Felipe Franciosi + * + * This work is largely based on the "vhost-scsi" implementation by: + * Stefan Hajnoczi + * Nicholas Bellinger + * + * This work is licensed under the terms of the GNU LGPL, version 2 or lat= er. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qemu/osdep.h" +#include "migration/vmstate.h" +#include "qapi/error.h" +#include "qemu/error-report.h" +#include "qemu/typedefs.h" +#include "qom/object.h" +#include "hw/fw-path-provider.h" +#include "hw/qdev-core.h" +#include "hw/virtio/vhost.h" +#include "hw/virtio/vhost-backend.h" +#include "hw/virtio/vhost-user-scsi.h" +#include "hw/virtio/virtio.h" +#include "hw/virtio/virtio-access.h" +#include "sysemu/char.h" + +/* Features supported by the host application */ +static const int user_feature_bits[] =3D { + VIRTIO_F_NOTIFY_ON_EMPTY, + VIRTIO_RING_F_INDIRECT_DESC, + VIRTIO_RING_F_EVENT_IDX, + VIRTIO_SCSI_F_HOTPLUG, + VHOST_INVALID_FEATURE_BIT +}; + +static void vhost_user_scsi_set_status(VirtIODevice *vdev, uint8_t status) +{ + VHostUserSCSI *s =3D (VHostUserSCSI *)vdev; + VHostSCSICommon *vsc =3D VHOST_SCSI_COMMON(s); + bool start =3D (status & VIRTIO_CONFIG_S_DRIVER_OK) && vdev->vm_runnin= g; + + if (vsc->dev.started =3D=3D start) { + return; + } + + if (start) { + int ret; + + ret =3D vhost_scsi_common_start(vsc); + if (ret < 0) { + error_report("unable to start vhost-user-scsi: %s", strerror(-= ret)); + exit(1); + } + } else { + vhost_scsi_common_stop(vsc); + } +} + +static void vhost_dummy_handle_output(VirtIODevice *vdev, VirtQueue *vq) +{ +} + +static void vhost_user_scsi_save(QEMUFile *f, void *opaque) +{ + VirtIODevice *vdev =3D VIRTIO_DEVICE(opaque); + virtio_save(vdev, f); +} + +static int vhost_user_scsi_load(QEMUFile *f, void *opaque, int version_id) +{ + VirtIODevice *vdev =3D VIRTIO_DEVICE(opaque); + return virtio_load(vdev, f, version_id); +} + +static void vhost_user_scsi_realize(DeviceState *dev, Error **errp) +{ + VirtIOSCSICommon *vs =3D VIRTIO_SCSI_COMMON(dev); + VHostUserSCSI *s =3D VHOST_USER_SCSI(dev); + VHostSCSICommon *vsc =3D VHOST_SCSI_COMMON(s); + static int vhost_user_scsi_id; + Error *err =3D NULL; + int ret; + + if (!vs->conf.chardev.chr) { + error_setg(errp, "vhost-user-scsi: missing chardev"); + return; + } + + virtio_scsi_common_realize(dev, vhost_dummy_handle_output, + vhost_dummy_handle_output, + vhost_dummy_handle_output, &err); + if (err !=3D NULL) { + error_propagate(errp, err); + return; + } + + vsc->dev.nvqs =3D 2 + vs->conf.num_queues; + vsc->dev.vqs =3D g_new(struct vhost_virtqueue, vsc->dev.nvqs); + vsc->dev.vq_index =3D 0; + vsc->dev.backend_features =3D 0; + + ret =3D vhost_dev_init(&vsc->dev, (void *)&vs->conf.chardev, + VHOST_BACKEND_TYPE_USER, 0); + if (ret < 0) { + error_setg(errp, "vhost-user-scsi: vhost initialization failed: %s= ", + strerror(-ret)); + return; + } + + /* Channel and lun both are 0 for bootable vhost-user-scsi disk */ + vsc->channel =3D 0; + vsc->lun =3D 0; + vsc->target =3D vs->conf.boot_tpgt; + + register_savevm(dev, "vhost-user-scsi", vhost_user_scsi_id++, 1, + vhost_user_scsi_save, vhost_user_scsi_load, s); +} + +static void vhost_user_scsi_unrealize(DeviceState *dev, Error **errp) +{ + VirtIODevice *vdev =3D VIRTIO_DEVICE(dev); + VHostUserSCSI *s =3D VHOST_USER_SCSI(dev); + VHostSCSICommon *vsc =3D VHOST_SCSI_COMMON(s); + + /* This will stop the vhost backend. */ + vhost_user_scsi_set_status(vdev, 0); + + vhost_dev_cleanup(&vsc->dev); + g_free(vsc->dev.vqs); + + virtio_scsi_common_unrealize(dev, errp); +} + +static uint64_t vhost_user_scsi_get_features(VirtIODevice *vdev, + uint64_t features, Error **er= rp) +{ + VHostUserSCSI *s =3D VHOST_USER_SCSI(vdev); + + // Turn on predefined features supported by this device + features |=3D s->host_features; + + return vhost_scsi_common_get_features(vdev, features, errp); +} + +static Property vhost_user_scsi_properties[] =3D { + DEFINE_PROP_CHR("chardev", VirtIOSCSICommon, conf.chardev), + DEFINE_PROP_UINT32("boot_tpgt", VirtIOSCSICommon, conf.boot_tpgt, 0), + DEFINE_PROP_UINT32("num_queues", VirtIOSCSICommon, conf.num_queues, 1), + DEFINE_PROP_UINT32("max_sectors", VirtIOSCSICommon, conf.max_sectors, + 0xFFFF), + DEFINE_PROP_UINT32("cmd_per_lun", VirtIOSCSICommon, conf.cmd_per_lun, = 128), + DEFINE_PROP_BIT64("hotplug", VHostUserSCSI, host_features, + VIRTIO_SCSI_F_HOTPLUG, + true), + DEFINE_PROP_BIT64("param_change", VHostUserSCSI, host_features, + VIRTIO_SCSI_F_CHANGE, + true), + DEFINE_PROP_END_OF_LIST(), +}; + +static void vhost_user_scsi_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + VirtioDeviceClass *vdc =3D VIRTIO_DEVICE_CLASS(klass); + FWPathProviderClass *fwc =3D FW_PATH_PROVIDER_CLASS(klass); + + dc->props =3D vhost_user_scsi_properties; + set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); + vdc->realize =3D vhost_user_scsi_realize; + vdc->unrealize =3D vhost_user_scsi_unrealize; + vdc->get_features =3D vhost_user_scsi_get_features; + vdc->set_config =3D vhost_scsi_common_set_config; + vdc->set_status =3D vhost_user_scsi_set_status; + fwc->get_dev_path =3D vhost_scsi_common_get_fw_dev_path; +} + +static void vhost_user_scsi_instance_init(Object *obj) +{ + VirtIOSCSICommon *vs =3D VIRTIO_SCSI_COMMON(obj); + VHostSCSICommon *vsc =3D VHOST_SCSI_COMMON(obj); + + vsc->feature_bits =3D user_feature_bits; + + // Add the bootindex property for this object + device_add_bootindex_property(obj, &vsc->bootindex, "bootindex", NULL, + DEVICE(vsc), NULL); + + // Set boot index according the the device config + object_property_set_int(obj, vs->conf.bootindex, "bootindex", NULL); +} + +static const TypeInfo vhost_user_scsi_info =3D { + .name =3D TYPE_VHOST_USER_SCSI, + .parent =3D TYPE_VHOST_SCSI_COMMON, + .instance_size =3D sizeof(VHostUserSCSI), + .class_init =3D vhost_user_scsi_class_init, + .instance_init =3D vhost_user_scsi_instance_init, + .interfaces =3D (InterfaceInfo[]) { + { TYPE_FW_PATH_PROVIDER }, + { } + }, +}; + +static void virtio_register_types(void) +{ + type_register_static(&vhost_user_scsi_info); +} + +type_init(virtio_register_types) diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index f9b7244..d52faeb 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -2135,6 +2135,59 @@ static const TypeInfo vhost_scsi_pci_info =3D { }; #endif =20 +/* vhost-user-scsi-pci */ +static Property vhost_user_scsi_pci_properties[] =3D { + DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, + DEV_NVECTORS_UNSPECIFIED), + DEFINE_PROP_END_OF_LIST(), +}; + +static void vhost_user_scsi_pci_realize(VirtIOPCIProxy *vpci_dev, Error **= errp) +{ + VHostUserSCSIPCI *dev =3D VHOST_USER_SCSI_PCI(vpci_dev); + DeviceState *vdev =3D DEVICE(&dev->vdev); + VirtIOSCSICommon *vs =3D VIRTIO_SCSI_COMMON(vdev); + + if (vpci_dev->nvectors =3D=3D DEV_NVECTORS_UNSPECIFIED) { + vpci_dev->nvectors =3D vs->conf.num_queues + 3; + } + + qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus)); + object_property_set_bool(OBJECT(vdev), true, "realized", errp); +} + +static void vhost_user_scsi_pci_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + VirtioPCIClass *k =3D VIRTIO_PCI_CLASS(klass); + PCIDeviceClass *pcidev_k =3D PCI_DEVICE_CLASS(klass); + k->realize =3D vhost_user_scsi_pci_realize; + set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); + dc->props =3D vhost_user_scsi_pci_properties; + pcidev_k->vendor_id =3D PCI_VENDOR_ID_REDHAT_QUMRANET; + pcidev_k->device_id =3D PCI_DEVICE_ID_VIRTIO_SCSI; + pcidev_k->revision =3D 0x00; + pcidev_k->class_id =3D PCI_CLASS_STORAGE_SCSI; +} + +static void vhost_user_scsi_pci_instance_init(Object *obj) +{ + VHostUserSCSIPCI *dev =3D VHOST_USER_SCSI_PCI(obj); + + virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), + TYPE_VHOST_USER_SCSI); + object_property_add_alias(obj, "bootindex", OBJECT(&dev->vdev), + "bootindex", &error_abort); +} + +static const TypeInfo vhost_user_scsi_pci_info =3D { + .name =3D TYPE_VHOST_USER_SCSI_PCI, + .parent =3D TYPE_VIRTIO_PCI, + .instance_size =3D sizeof(VHostUserSCSIPCI), + .instance_init =3D vhost_user_scsi_pci_instance_init, + .class_init =3D vhost_user_scsi_pci_class_init, +}; + /* vhost-vsock-pci */ =20 #ifdef CONFIG_VHOST_VSOCK @@ -2612,6 +2665,7 @@ static void virtio_pci_register_types(void) #ifdef CONFIG_VHOST_SCSI type_register_static(&vhost_scsi_pci_info); #endif + type_register_static(&vhost_user_scsi_pci_info); #ifdef CONFIG_VHOST_VSOCK type_register_static(&vhost_vsock_pci_info); #endif diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h index b095dfc..69f5959 100644 --- a/hw/virtio/virtio-pci.h +++ b/hw/virtio/virtio-pci.h @@ -26,6 +26,7 @@ #include "hw/virtio/virtio-input.h" #include "hw/virtio/virtio-gpu.h" #include "hw/virtio/virtio-crypto.h" +#include "hw/virtio/vhost-user-scsi.h" =20 #ifdef CONFIG_VIRTFS #include "hw/9pfs/virtio-9p.h" @@ -44,6 +45,7 @@ typedef struct VirtIOBalloonPCI VirtIOBalloonPCI; typedef struct VirtIOSerialPCI VirtIOSerialPCI; typedef struct VirtIONetPCI VirtIONetPCI; typedef struct VHostSCSIPCI VHostSCSIPCI; +typedef struct VHostUserSCSIPCI VHostUserSCSIPCI; typedef struct VirtIORngPCI VirtIORngPCI; typedef struct VirtIOInputPCI VirtIOInputPCI; typedef struct VirtIOInputHIDPCI VirtIOInputHIDPCI; @@ -230,6 +232,15 @@ struct VHostSCSIPCI { }; #endif =20 +#define TYPE_VHOST_USER_SCSI_PCI "vhost-user-scsi-pci" +#define VHOST_USER_SCSI_PCI(obj) \ + OBJECT_CHECK(VHostUserSCSIPCI, (obj), TYPE_VHOST_USER_SCSI_PCI) + +struct VHostUserSCSIPCI { + VirtIOPCIProxy parent_obj; + VHostUserSCSI vdev; +}; + /* * virtio-blk-pci: This extends VirtioPCIProxy. */ diff --git a/include/hw/virtio/vhost-user-scsi.h b/include/hw/virtio/vhost-= user-scsi.h new file mode 100644 index 0000000..01861f7 --- /dev/null +++ b/include/hw/virtio/vhost-user-scsi.h @@ -0,0 +1,35 @@ +/* + * vhost-user-scsi host device + * + * Copyright (c) 2016 Nutanix Inc. All rights reserved. + * + * Author: + * Felipe Franciosi + * + * This file is largely based on "vhost-scsi.h" by: + * Stefan Hajnoczi + * + * This work is licensed under the terms of the GNU LGPL, version 2 or lat= er. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef VHOST_USER_SCSI_H +#define VHOST_USER_SCSI_H + +#include "qemu-common.h" +#include "hw/qdev.h" +#include "hw/virtio/virtio-scsi.h" +#include "hw/virtio/vhost.h" +#include "hw/virtio/vhost-scsi-common.h" + +#define TYPE_VHOST_USER_SCSI "vhost-user-scsi" +#define VHOST_USER_SCSI(obj) \ + OBJECT_CHECK(VHostUserSCSI, (obj), TYPE_VHOST_USER_SCSI) + +typedef struct VHostUserSCSI { + VHostSCSICommon parent_obj; + uint64_t host_features; +} VHostUserSCSI; + +#endif /* VHOST_USER_SCSI_H */ diff --git a/include/hw/virtio/virtio-scsi.h b/include/hw/virtio/virtio-scs= i.h index eac2013..3827e95 100644 --- a/include/hw/virtio/virtio-scsi.h +++ b/include/hw/virtio/virtio-scsi.h @@ -21,6 +21,7 @@ #include "hw/virtio/virtio.h" #include "hw/pci/pci.h" #include "hw/scsi/scsi.h" +#include "sysemu/char.h" #include "sysemu/iothread.h" =20 #define TYPE_VIRTIO_SCSI_COMMON "virtio-scsi-common" @@ -53,6 +54,8 @@ struct VirtIOSCSIConf { char *vhostfd; char *wwpn; #endif + CharBackend chardev; + int32_t bootindex; uint32_t boot_tpgt; IOThread *iothread; }; --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193743262165.04804127035572; Fri, 19 May 2017 04:35:43 -0700 (PDT) Received: from localhost ([::1]:57993 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBgC5-0008H1-D9 for importer@patchew.org; Fri, 19 May 2017 07:35:41 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49590) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyY-0004cJ-Gd for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyU-00011g-KH for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:42 -0400 Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]:34993) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyU-00010o-7v for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:38 -0400 Received: by mail-wr0-x242.google.com with SMTP id g12so2624376wrg.2 for ; Fri, 19 May 2017 04:21:38 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=sN8zPoBCmb4mxLPDgxFnWszLZtp9IHg1PVtNwgMqOJA=; b=diPWTaypQcYjpfsChcKriyJKv3pVzDm7flc468q7JIVySwIL0nM+M9adsCI8+54pBt LEZfFbsUd+2m0eOKh0T3Lyv9H2hGLehGdKM7CElL6zhCtHgMC5Yo0aFRgLH6poe5tbWX cEx5L65dLTub04GJ27raQlQmmmOdUeOn+sX4JUBAjLiW29SYCZT1/lXL0nxT+L19XwR6 hT+THFfGkoW/SF3f7gpR/kEPQ65vo32zjM2Bk+/A+AW/YaYopsP7xtWXlp/kyOWHiAot JzPc2MLZzBm7iYOX2Qcan6Opad0DRo1Wui+JSF9olXao6mwrtRxTM9lcbmgu3lcNyn63 onew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=sN8zPoBCmb4mxLPDgxFnWszLZtp9IHg1PVtNwgMqOJA=; b=roMIQ0Z1dOZe2icyYNjAWdKxs6Ftq9A0ABDU3/CK3Chcq7Kpe7tH2NeVkf/JXVx6r9 6oxPdcUT8whrMAerJsx8FvxBfV9L0C65sgza9EYtAur695VvBFt8ngNWN33ahTYhWq+U MYeCqvfdNNfu4xMWW14O/Xp2QAYGLC0EMZlawyszptzuQs/MHt6SvLA+D4kt/hJWti0q 5QHmAxwr2n09sD1mRVIfk4EKp0kuXnFoBkjZzZkzejE6CX3QYtGF3+uoXWX36ItWHAtW LiQPB47NhgExqqJVf9KfXYaTPBVXPgZ/C1dAaUVCVxUFagR4U5PVqG07jePEA1jhJMc9 yI4A== X-Gm-Message-State: AODbwcCcCXSzSeSzEZyoCumqTV3jTrH9pZfVYMW29XPGGJbSe0eVayXp P5sPmroadOSrXA== X-Received: by 10.223.147.228 with SMTP id 91mr2498808wrp.47.1495192896905; Fri, 19 May 2017 04:21:36 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:21:10 +0200 Message-Id: <1495192872-27667-19-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::242 Subject: [Qemu-devel] [PULL 18/20] vhost-user-scsi: Introduce a vhost-user-scsi sample application X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Felipe Franciosi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Felipe Franciosi This commit introduces a vhost-user-scsi backend sample application. It must be linked with libiscsi and libvhost-user. To use it, compile with: $ make vhost-user-scsi And run as follows: $ ./vhost-user-scsi -u vus.sock -i iscsi://uri_to_target/ $ qemu-system-x86_64 --enable-kvm -m 512 \ -object memory-backend-file,id=3Dmem,size=3D512m,share=3Don,mem-path= =3Dguestmem \ -numa node,memdev=3Dmem \ -chardev socket,id=3Dvhost-user-scsi,path=3Dvus.sock \ -device vhost-user-scsi-pci,chardev=3Dvhost-user-scsi \ The application is currently limited at one LUN only and it processes requests synchronously (therefore only achieving QD1). The purpose of the code is to show how a backend can be implemented and to test the vhost-user-scsi Qemu implementation. If a different instance of this vhost-user-scsi application is executed at a remote host, a VM can be live migrated to such a host. Signed-off-by: Felipe Franciosi Message-Id: <1488479153-21203-5-git-send-email-felipe@nutanix.com> --- Makefile | 3 + Makefile.objs | 4 + contrib/vhost-user-scsi/Makefile.objs | 1 + contrib/vhost-user-scsi/vhost-user-scsi.c | 886 ++++++++++++++++++++++++++= ++++ 4 files changed, 894 insertions(+) create mode 100644 contrib/vhost-user-scsi/Makefile.objs create mode 100644 contrib/vhost-user-scsi/vhost-user-scsi.c diff --git a/Makefile b/Makefile index c830d7a..e14988d 100644 --- a/Makefile +++ b/Makefile @@ -269,6 +269,7 @@ dummy :=3D $(call unnest-vars,, \ ivshmem-client-obj-y \ ivshmem-server-obj-y \ libvhost-user-obj-y \ + vhost-user-scsi-obj-y \ qga-vss-dll-obj-y \ block-obj-y \ block-obj-m \ @@ -473,6 +474,8 @@ ivshmem-client$(EXESUF): $(ivshmem-client-obj-y) $(COMM= ON_LDADDS) $(call LINK, $^) ivshmem-server$(EXESUF): $(ivshmem-server-obj-y) $(COMMON_LDADDS) $(call LINK, $^) +vhost-user-scsi$(EXESUF): $(vhost-user-scsi-obj-y) + $(call LINK, $^) =20 module_block.h: $(SRC_PATH)/scripts/modules/module_block.py config-host.mak $(call quiet-command,$(PYTHON) $< $@ \ diff --git a/Makefile.objs b/Makefile.objs index 2100845..1fa9450 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -112,6 +112,10 @@ qga-vss-dll-obj-y =3D qga/ ivshmem-client-obj-y =3D contrib/ivshmem-client/ ivshmem-server-obj-y =3D contrib/ivshmem-server/ libvhost-user-obj-y =3D contrib/libvhost-user/ +vhost-user-scsi.o-cflags :=3D $(LIBISCSI_CFLAGS) +vhost-user-scsi.o-libs :=3D $(LIBISCSI_LIBS) +vhost-user-scsi-obj-y =3D contrib/vhost-user-scsi/ +vhost-user-scsi-obj-y +=3D contrib/libvhost-user/libvhost-user.o =20 ###################################################################### trace-events-subdirs =3D diff --git a/contrib/vhost-user-scsi/Makefile.objs b/contrib/vhost-user-scs= i/Makefile.objs new file mode 100644 index 0000000..e83a38a --- /dev/null +++ b/contrib/vhost-user-scsi/Makefile.objs @@ -0,0 +1 @@ +vhost-user-scsi-obj-y =3D vhost-user-scsi.o diff --git a/contrib/vhost-user-scsi/vhost-user-scsi.c b/contrib/vhost-user= -scsi/vhost-user-scsi.c new file mode 100644 index 0000000..e41bad0 --- /dev/null +++ b/contrib/vhost-user-scsi/vhost-user-scsi.c @@ -0,0 +1,886 @@ +/* + * vhost-user-scsi sample application + * + * Copyright (c) 2016 Nutanix Inc. All rights reserved. + * + * Author: + * Felipe Franciosi + * + * This work is licensed under the terms of the GNU GPL, version 2 only. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "contrib/libvhost-user/libvhost-user.h" +#include "hw/virtio/virtio-scsi.h" +#include "iscsi/iscsi.h" + +#include + +/* Small compat shim from glib 2.32 */ +#ifndef G_SOURCE_CONTINUE +#define G_SOURCE_CONTINUE TRUE +#endif +#ifndef G_SOURCE_REMOVE +#define G_SOURCE_REMOVE FALSE +#endif + +//#define VUS_DEBUG 1 + +/** Log helpers **/ + +#define PPRE \ + struct timespec ts; \ + char timebuf[64]; \ + struct tm tm; \ + (void)clock_gettime(CLOCK_REALTIME, &ts); \ + (void)strftime(timebuf, 64, "%Y%m%d %T", gmtime_r(&ts.tv_sec, &tm)) + +#define PEXT(lvl, msg, ...) do { \ + PPRE; \ + fprintf(stderr, "%s.%06ld " lvl ": %s:%s():%d: " msg "\n", \ + timebuf, ts.tv_nsec/1000, \ + __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \ +} while(0) + +#define PNOR(lvl, msg, ...) do { \ + PPRE; \ + fprintf(stderr, "%s.%06ld " lvl ": " msg "\n", \ + timebuf, ts.tv_nsec/1000, ## __VA_ARGS__); \ +} while(0); + +#ifdef VUS_DEBUG +#define PDBG(msg, ...) PEXT("DBG", msg, ## __VA_ARGS__) +#define PERR(msg, ...) PEXT("ERR", msg, ## __VA_ARGS__) +#define PLOG(msg, ...) PEXT("LOG", msg, ## __VA_ARGS__) +#else +#define PDBG(msg, ...) { } +#define PERR(msg, ...) PNOR("ERR", msg, ## __VA_ARGS__) +#define PLOG(msg, ...) PNOR("LOG", msg, ## __VA_ARGS__) +#endif + +/** vhost-user-scsi specific definitions **/ + +#define VUS_MAX_LUNS 1 // Only 1 lun supported today +#define VUS_MAX_DEVS 1 // Only 1 devices supported today + +#define VUS_ISCSI_INITIATOR "iqn.2016-11.com.nutanix:vhost-user-scsi" + +typedef struct iscsi_lun { + struct iscsi_context *iscsi_ctx; + int iscsi_lun; +} iscsi_lun_t; + +typedef struct vhost_scsi_dev { + VuDev vu_dev; + int server_sock; + GMainLoop *loop; + GTree *fdmap; // maps fd to gsource context id + iscsi_lun_t luns[VUS_MAX_LUNS]; +} vhost_scsi_dev_t; + +static vhost_scsi_dev_t *vhost_scsi_devs[VUS_MAX_DEVS]; + +/** glib event loop integration for libvhost-user and misc callbacks **/ + +typedef struct vus_gsrc { + GSource parent; + vhost_scsi_dev_t *vdev_scsi; + GPollFD gfd; + vu_watch_cb vu_cb; +} vus_gsrc_t; + +static gint vus_fdmap_compare(gconstpointer a, gconstpointer b) +{ + if (b > a) return 1; + if (b < a) return -1; + return 0; +} + +static gboolean vus_gsrc_prepare(GSource *src, gint *timeout) +{ + assert(timeout); + + *timeout =3D -1; + return FALSE; +} + +static gboolean vus_gsrc_check(GSource *src) +{ + vus_gsrc_t *vus_src =3D (vus_gsrc_t *)src; + + assert(vus_src); + + return vus_src->gfd.revents & vus_src->gfd.events; +} + +static gboolean vus_gsrc_dispatch(GSource *src, GSourceFunc cb, gpointer d= ata) +{ + vhost_scsi_dev_t *vdev_scsi; + vus_gsrc_t *vus_src =3D (vus_gsrc_t *)src; + + assert(vus_src); + assert(!(vus_src->vu_cb && cb)); + + vdev_scsi =3D vus_src->vdev_scsi; + + assert(vdev_scsi); + + if (vus_src->vu_cb) { + int vu_evt =3D 0; + + if (vus_src->gfd.events & G_IO_IN) vu_evt |=3D VU_WATCH_IN; + if (vus_src->gfd.events & G_IO_OUT) vu_evt |=3D VU_WATCH_OUT; + if (vus_src->gfd.events & G_IO_PRI) vu_evt |=3D VU_WATCH_PRI; + if (vus_src->gfd.events & G_IO_ERR) vu_evt |=3D VU_WATCH_ERR; + if (vus_src->gfd.events & G_IO_HUP) vu_evt |=3D VU_WATCH_HUP; + + vus_src->vu_cb(&vdev_scsi->vu_dev, vu_evt, data); + + return G_SOURCE_CONTINUE; + } + + if (cb) { + return cb(data); + } + + return G_SOURCE_CONTINUE; +} + +static GSourceFuncs vus_gsrc_funcs =3D { + vus_gsrc_prepare, + vus_gsrc_check, + vus_gsrc_dispatch, + NULL +}; + +static int vus_gsrc_new(vhost_scsi_dev_t *vdev_scsi, int fd, GIOCondition = cond, + vu_watch_cb vu_cb, GSourceFunc gsrc_cb, gpointer d= ata) +{ + GSource *vus_gsrc; + vus_gsrc_t *vus_src; + guint id; + + assert(vdev_scsi); + assert(fd >=3D 0); + assert(vu_cb || gsrc_cb); + assert(!(vu_cb && gsrc_cb)); + + vus_gsrc =3D g_source_new(&vus_gsrc_funcs, sizeof(vus_gsrc_t)); + if (!vus_gsrc) { + PERR("Error creating GSource for new watch"); + return -1; + } + vus_src =3D (vus_gsrc_t *)vus_gsrc; + + vus_src->vdev_scsi =3D vdev_scsi; + vus_src->gfd.fd =3D fd; + vus_src->gfd.events =3D cond; + vus_src->vu_cb =3D vu_cb; + + g_source_add_poll(vus_gsrc, &vus_src->gfd); + g_source_set_callback(vus_gsrc, gsrc_cb, data, NULL); + id =3D g_source_attach(vus_gsrc, NULL); + assert(id); + g_source_unref(vus_gsrc); + + g_tree_insert(vdev_scsi->fdmap, (gpointer)(uintptr_t)fd, + (gpointer)(uintptr_t)id); + + return 0; +} + +/* from libiscsi's scsi-lowlevel.h ** + * + * nb. We can't directly include scsi-lowlevel.h due to a namespace confli= ct: + * Qemu's scsi.h also defines "SCSI_XFER_NONE". + */ + +#define SCSI_CDB_MAX_SIZE 16 + +struct scsi_iovector { + struct scsi_iovec *iov; + int niov; + int nalloc; + size_t offset; + int consumed; +}; + +struct scsi_allocated_memory { + struct scsi_allocated_memory *next; + char buf[0]; +}; + +struct scsi_data { + int size; + unsigned char *data; +}; + +enum scsi_sense_key { + SCSI_SENSE_NO_SENSE =3D 0x00, + SCSI_SENSE_RECOVERED_ERROR =3D 0x01, + SCSI_SENSE_NOT_READY =3D 0x02, + SCSI_SENSE_MEDIUM_ERROR =3D 0x03, + SCSI_SENSE_HARDWARE_ERROR =3D 0x04, + SCSI_SENSE_ILLEGAL_REQUEST =3D 0x05, + SCSI_SENSE_UNIT_ATTENTION =3D 0x06, + SCSI_SENSE_DATA_PROTECTION =3D 0x07, + SCSI_SENSE_BLANK_CHECK =3D 0x08, + SCSI_SENSE_VENDOR_SPECIFIC =3D 0x09, + SCSI_SENSE_COPY_ABORTED =3D 0x0a, + SCSI_SENSE_COMMAND_ABORTED =3D 0x0b, + SCSI_SENSE_OBSOLETE_ERROR_CODE =3D 0x0c, + SCSI_SENSE_OVERFLOW_COMMAND =3D 0x0d, + SCSI_SENSE_MISCOMPARE =3D 0x0e +}; + +struct scsi_sense { + unsigned char error_type; + enum scsi_sense_key key; + int ascq; + unsigned sense_specific:1; + unsigned ill_param_in_cdb:1; + unsigned bit_pointer_valid:1; + unsigned char bit_pointer; + uint16_t field_pointer; +}; + +enum scsi_residual { + SCSI_RESIDUAL_NO_RESIDUAL =3D 0, + SCSI_RESIDUAL_UNDERFLOW, + SCSI_RESIDUAL_OVERFLOW +}; + +struct scsi_task { + int status; + int cdb_size; + int xfer_dir; + int expxferlen; + unsigned char cdb[SCSI_CDB_MAX_SIZE]; + enum scsi_residual residual_status; + size_t residual; + struct scsi_sense sense; + struct scsi_data datain; + struct scsi_allocated_memory *mem; + void *ptr; + + uint32_t itt; + uint32_t cmdsn; + uint32_t lun; + + struct scsi_iovector iovector_in; + struct scsi_iovector iovector_out; +}; + +/** libiscsi integration **/ + +static int iscsi_add_lun(iscsi_lun_t *lun, char *iscsi_uri) { + struct iscsi_url *iscsi_url; + struct iscsi_context *iscsi_ctx; + int ret =3D 0; + + assert(lun); + assert(iscsi_uri); + + iscsi_ctx =3D iscsi_create_context(VUS_ISCSI_INITIATOR); + if (!iscsi_ctx) { + PERR("Unable to create iSCSI context"); + return -1; + } + + iscsi_url =3D iscsi_parse_full_url(iscsi_ctx, iscsi_uri); + if (!iscsi_url) { + PERR("Unable to parse iSCSI URL: %s", iscsi_get_error(iscsi_ctx)); + goto fail; + } + + iscsi_set_session_type(iscsi_ctx, ISCSI_SESSION_NORMAL); + iscsi_set_header_digest(iscsi_ctx, ISCSI_HEADER_DIGEST_NONE_CRC32C); + if (iscsi_full_connect_sync(iscsi_ctx, iscsi_url->portal, iscsi_url->l= un)) { + PERR("Unable to login to iSCSI portal: %s", iscsi_get_error(iscsi_= ctx)); + goto fail; + } + + lun->iscsi_ctx =3D iscsi_ctx; + lun->iscsi_lun =3D iscsi_url->lun; + + PDBG("Context %p created for lun 0: %s", iscsi_ctx, iscsi_uri); + +out: + if (iscsi_url) { + iscsi_destroy_url(iscsi_url); + } + return ret; + +fail: + (void)iscsi_destroy_context(iscsi_ctx); + ret =3D -1; + goto out; +} + +static struct scsi_task *scsi_task_new(int cdb_len, uint8_t *cdb, int dir, + int xfer_len) { + struct scsi_task *task; + + assert(cdb_len > 0); + assert(cdb); + + task =3D calloc(1, sizeof(struct scsi_task)); + if (!task) { + PERR("Error allocating task: %s", strerror(errno)); + return NULL; + } + + memcpy(task->cdb, cdb, cdb_len); + task->cdb_size =3D cdb_len; + task->xfer_dir =3D dir; + task->expxferlen =3D xfer_len; + + return task; +} + +static int get_cdb_len(uint8_t *cdb) { + assert(cdb); + + switch (cdb[0] >> 5) { + case 0: return 6; + case 1: /* fall through */ + case 2: return 10; + case 4: return 16; + case 5: return 12; + } + PERR("Unable to determine cdb len (0x%02hhX)", cdb[0]>>5); + return -1; +} + +static int handle_cmd_sync(struct iscsi_context *ctx, + VirtIOSCSICmdReq *req, + struct iovec *out, unsigned int out_len, + VirtIOSCSICmdResp *rsp, + struct iovec *in, unsigned int in_len) { + struct scsi_task *task; + uint32_t dir; + uint32_t len; + int cdb_len; + int i; + + assert(ctx); + assert(req); + assert(rsp); + + if (!((!req->lun[1]) && (req->lun[2] =3D=3D 0x40) && (!req->lun[3]))) { + // Ignore anything different than target=3D0, lun=3D0 + PDBG("Ignoring unconnected lun (0x%hhX, 0x%hhX)", + req->lun[1], req->lun[3]); + rsp->status =3D SCSI_STATUS_CHECK_CONDITION; + memset(rsp->sense, 0, sizeof(rsp->sense)); + rsp->sense_len =3D 18; + rsp->sense[0] =3D 0x70; + rsp->sense[2] =3D SCSI_SENSE_ILLEGAL_REQUEST; + rsp->sense[7] =3D 10; + rsp->sense[12] =3D 0x24; + + return 0; + } + + cdb_len =3D get_cdb_len(req->cdb); + if (cdb_len =3D=3D -1) { + return -1; + } + + len =3D 0; + if (!out_len && !in_len) { + dir =3D SCSI_XFER_NONE; + } else if (out_len) { + dir =3D SCSI_XFER_TO_DEV; + for (i=3D0; icdb, dir, len); + if (!task) { + PERR("Unable to create iscsi task"); + return -1; + } + + if (dir =3D=3D SCSI_XFER_TO_DEV) { + task->iovector_out.iov =3D (struct scsi_iovec *)out; + task->iovector_out.niov =3D out_len; + } else if (dir =3D=3D SCSI_XFER_FROM_DEV) { + task->iovector_in.iov =3D (struct scsi_iovec *)in; + task->iovector_in.niov =3D in_len; + } + + PDBG("Sending iscsi cmd (cdb_len=3D%d, dir=3D%d, task=3D%p)", + cdb_len, dir, task); + if (!iscsi_scsi_command_sync(ctx, 0, task, NULL)) { + PERR("Error serving SCSI command"); + free(task); + return -1; + } + + memset(rsp, 0, sizeof(*rsp)); + + rsp->status =3D task->status; + rsp->resid =3D task->residual; + + if (task->status =3D=3D SCSI_STATUS_CHECK_CONDITION) { + rsp->response =3D VIRTIO_SCSI_S_FAILURE; + rsp->sense_len =3D task->datain.size - 2; + memcpy(rsp->sense, &task->datain.data[2], rsp->sense_len); + } + + free(task); + + PDBG("Filled in rsp: status=3D%hhX, resid=3D%u, response=3D%hhX, sense= _len=3D%u", + rsp->status, rsp->resid, rsp->response, rsp->sense_len); + + return 0; +} + +/** libvhost-user callbacks **/ + +static vhost_scsi_dev_t *vdev_scsi_find_by_vu(VuDev *vu_dev); + +static void vus_panic_cb(VuDev *vu_dev, const char *buf) { + vhost_scsi_dev_t *vdev_scsi; + + assert(vu_dev); + + vdev_scsi =3D vdev_scsi_find_by_vu(vu_dev); + + if (buf) { + PERR("vu_panic: %s", buf); + } + + if (vdev_scsi) { + assert(vdev_scsi->loop); + g_main_loop_quit(vdev_scsi->loop); + } +} + +static void vus_add_watch_cb(VuDev *vu_dev, int fd, int vu_evt, vu_watch_c= b cb, + void *pvt) { + vhost_scsi_dev_t *vdev_scsi; + gushort conds =3D 0; + guint id; + + assert(vu_dev); + assert(fd >=3D 0); + assert(cb); + + vdev_scsi =3D vdev_scsi_find_by_vu(vu_dev); + if (!vdev_scsi) { + vus_panic_cb(vu_dev, NULL); + return; + } + + id =3D (guint)(uintptr_t)g_tree_lookup(vdev_scsi->fdmap, + (gpointer)(uintptr_t)fd); + if (id) { + GSource *vus_src =3D g_main_context_find_source_by_id(NULL, id); + assert(vus_src); + g_source_destroy(vus_src); + (void)g_tree_remove(vdev_scsi->fdmap, (gpointer)(uintptr_t)fd); + } + + if (vu_evt & VU_WATCH_IN) conds |=3D G_IO_IN; + if (vu_evt & VU_WATCH_OUT) conds |=3D G_IO_OUT; + if (vu_evt & VU_WATCH_PRI) conds |=3D G_IO_PRI; + if (vu_evt & VU_WATCH_ERR) conds |=3D G_IO_ERR; + if (vu_evt & VU_WATCH_HUP) conds |=3D G_IO_HUP; + + if (vus_gsrc_new(vdev_scsi, fd, conds, cb, NULL, pvt)) { + vus_panic_cb(vu_dev, NULL); + } +} + +static void vus_del_watch_cb(VuDev *vu_dev, int fd) { + vhost_scsi_dev_t *vdev_scsi; + guint id; + + assert(vu_dev); + assert(fd >=3D 0); + + vdev_scsi =3D vdev_scsi_find_by_vu(vu_dev); + if (!vdev_scsi) { + vus_panic_cb(vu_dev, NULL); + return; + } + + id =3D (guint)(uintptr_t)g_tree_lookup(vdev_scsi->fdmap, + (gpointer)(uintptr_t)fd); + if (id) { + GSource *vus_src =3D g_main_context_find_source_by_id(NULL, id); + assert(vus_src); + g_source_destroy(vus_src); + (void)g_tree_remove(vdev_scsi->fdmap, (gpointer)(uintptr_t)fd); + } +} + +static void vus_proc_ctl(VuDev *vu_dev, int idx) { + /* Control VQ not implemented */ +} + +static void vus_proc_evt(VuDev *vu_dev, int idx) { + /* Event VQ not implemented */ +} + +static void vus_proc_req(VuDev *vu_dev, int idx) { + vhost_scsi_dev_t *vdev_scsi; + VuVirtq *vq; + + assert(vu_dev); + + vdev_scsi =3D vdev_scsi_find_by_vu(vu_dev); + if (!vdev_scsi) { + vus_panic_cb(vu_dev, NULL); + return; + } + + if ((idx < 0) || (idx >=3D VHOST_MAX_NR_VIRTQUEUE)) { + PERR("VQ Index out of range: %d", idx); + vus_panic_cb(vu_dev, NULL); + return; + } + + vq =3D vu_get_queue(vu_dev, idx); + if (!vq) { + PERR("Error fetching VQ (dev=3D%p, idx=3D%d)", vu_dev, idx); + vus_panic_cb(vu_dev, NULL); + return; + } + + PDBG("Got kicked on vq[%d]@%p", idx, vq); + + while(1) { + VuVirtqElement *elem; + VirtIOSCSICmdReq *req; + VirtIOSCSICmdResp *rsp; + + elem =3D vu_queue_pop(vu_dev, vq, sizeof(VuVirtqElement)); + if (!elem) { + PDBG("No more elements pending on vq[%d]@%p", idx, vq); + break; + } + PDBG("Popped elem@%p", elem); + + assert(!((elem->out_num > 1) && (elem->in_num > 1))); + assert((elem->out_num > 0) && (elem->in_num > 0)); + + if (elem->out_sg[0].iov_len < sizeof(VirtIOSCSICmdReq)) { + PERR("Invalid virtio-scsi req header"); + vus_panic_cb(vu_dev, NULL); + break; + } + req =3D (VirtIOSCSICmdReq *)elem->out_sg[0].iov_base; + + if (elem->in_sg[0].iov_len < sizeof(VirtIOSCSICmdResp)) { + PERR("Invalid virtio-scsi rsp header"); + vus_panic_cb(vu_dev, NULL); + break; + } + rsp =3D (VirtIOSCSICmdResp *)elem->in_sg[0].iov_base; + + if (handle_cmd_sync(vdev_scsi->luns[0].iscsi_ctx, + req, &elem->out_sg[1], elem->out_num-1, + rsp, &elem->in_sg[1], elem->in_num-1) !=3D 0) { + vus_panic_cb(vu_dev, NULL); + break; + } + + vu_queue_push(vu_dev, vq, elem, 0); + vu_queue_notify(vu_dev, vq); + + free(elem); + } +} + +static void vus_queue_set_started(VuDev *vu_dev, int idx, bool started) { + VuVirtq *vq; + + assert(vu_dev); + + if ((idx < 0) || (idx >=3D VHOST_MAX_NR_VIRTQUEUE)) { + PERR("VQ Index out of range: %d", idx); + vus_panic_cb(vu_dev, NULL); + return; + } + + vq =3D vu_get_queue(vu_dev, idx); + + switch(idx) { + case 0: + vu_set_queue_handler(vu_dev, vq, started?vus_proc_ctl:NULL); + break; + case 1: + vu_set_queue_handler(vu_dev, vq, started?vus_proc_evt:NULL); + break; + default: + vu_set_queue_handler(vu_dev, vq, started?vus_proc_req:NULL); + } +} + +static const VuDevIface vus_iface =3D { + .queue_set_started =3D vus_queue_set_started, +}; + +static gboolean vus_vhost_cb(gpointer data) { + VuDev *vu_dev =3D (VuDev *)data; + + assert(vu_dev); + + if (!vu_dispatch(vu_dev) !=3D 0) { + PERR("Error processing vhost message"); + vus_panic_cb(vu_dev, NULL); + return G_SOURCE_REMOVE; + } + + return G_SOURCE_CONTINUE; +} + +/** misc helpers **/ + +static int unix_sock_new(char *unix_fn) { + int sock; + struct sockaddr_un un; + size_t len; + + assert(unix_fn); + + sock =3D socket(AF_UNIX, SOCK_STREAM, 0); + if (sock <=3D 0) { + perror("socket"); + return -1; + } + + un.sun_family =3D AF_UNIX; + (void)snprintf(un.sun_path, sizeof(un.sun_path), "%s", unix_fn); + len =3D sizeof(un.sun_family) + strlen(un.sun_path); + + (void)unlink(unix_fn); + if (bind(sock, (struct sockaddr *)&un, len) < 0) { + perror("bind"); + goto fail; + } + + if (listen(sock, 1) < 0) { + perror("listen"); + goto fail; + } + + return sock; + +fail: + (void)close(sock); + + return -1; +} + +/** vhost-user-scsi **/ + +static vhost_scsi_dev_t *vdev_scsi_find_by_vu(VuDev *vu_dev) { + int i; + + assert(vu_dev); + + for (i=3D0; ivu_dev =3D=3D vu_dev) { + return vhost_scsi_devs[i]; + } + } + + PERR("Unknown VuDev %p", vu_dev); + return NULL; +} + +static void vdev_scsi_deinit(vhost_scsi_dev_t *vdev_scsi) { + if (!vdev_scsi) { + return; + } + + if (vdev_scsi->server_sock >=3D 0) { + struct sockaddr_storage ss; + socklen_t sslen =3D sizeof(ss); + + if (getsockname(vdev_scsi->server_sock, (struct sockaddr *)&ss, + &sslen) =3D=3D 0) { + struct sockaddr_un *su =3D (struct sockaddr_un *)&ss; + (void)unlink(su->sun_path); + } + + (void)close(vdev_scsi->server_sock); + vdev_scsi->server_sock =3D -1; + } + + if (vdev_scsi->loop) { + g_main_loop_unref(vdev_scsi->loop); + vdev_scsi->loop =3D NULL; + } +} + +static vhost_scsi_dev_t *vdev_scsi_new(char *unix_fn) { + vhost_scsi_dev_t *vdev_scsi =3D NULL; + + assert(unix_fn); + + vdev_scsi =3D calloc(1, sizeof(vhost_scsi_dev_t)); + if (!vdev_scsi) { + PERR("calloc: %s", strerror(errno)); + return NULL; + } + + vdev_scsi->server_sock =3D unix_sock_new(unix_fn); + if (vdev_scsi->server_sock < 0) { + goto err; + } + + vdev_scsi->loop =3D g_main_loop_new(NULL, FALSE); + if (!vdev_scsi->loop) { + PERR("Error creating glib event loop"); + goto err; + } + + vdev_scsi->fdmap =3D g_tree_new(vus_fdmap_compare); + if (!vdev_scsi->fdmap) { + PERR("Error creating glib tree for fdmap"); + goto err; + } + + return vdev_scsi; + +err: + vdev_scsi_deinit(vdev_scsi); + free(vdev_scsi); + + return NULL; +} + +static int vdev_scsi_add_iscsi_lun(vhost_scsi_dev_t *vdev_scsi, + char *iscsi_uri, uint32_t lun) { + assert(vdev_scsi); + assert(iscsi_uri); + assert(lun < VUS_MAX_LUNS); + + if (vdev_scsi->luns[lun].iscsi_ctx) { + PERR("Lun %d already configured", lun); + return -1; + } + + if (iscsi_add_lun(&vdev_scsi->luns[lun], iscsi_uri) !=3D 0) { + return -1; + } + + return 0; +} + +static int vdev_scsi_run(vhost_scsi_dev_t *vdev_scsi) { + int cli_sock; + int ret =3D 0; + + assert(vdev_scsi); + assert(vdev_scsi->server_sock >=3D 0); + assert(vdev_scsi->loop); + + cli_sock =3D accept(vdev_scsi->server_sock, (void *)0, (void *)0); + if (cli_sock < 0) { + perror("accept"); + return -1; + } + + vu_init(&vdev_scsi->vu_dev, + cli_sock, + vus_panic_cb, + vus_add_watch_cb, + vus_del_watch_cb, + &vus_iface); + + if (vus_gsrc_new(vdev_scsi, cli_sock, G_IO_IN, NULL, vus_vhost_cb, + &vdev_scsi->vu_dev)) { + goto fail; + } + + g_main_loop_run(vdev_scsi->loop); + +out: + vu_deinit(&vdev_scsi->vu_dev); + + return ret; + +fail: + ret =3D -1; + goto out; +} + +int main(int argc, char **argv) +{ + vhost_scsi_dev_t *vdev_scsi =3D NULL; + char *unix_fn =3D NULL; + char *iscsi_uri =3D NULL; + int opt, err =3D EXIT_SUCCESS; + + while ((opt =3D getopt(argc, argv, "u:i:")) !=3D -1) { + switch (opt) { + case 'h': + goto help; + case 'u': + unix_fn =3D strdup(optarg); + break; + case 'i': + iscsi_uri =3D strdup(optarg); + break; + default: + goto help; + } + } + if (!unix_fn || !iscsi_uri) { + goto help; + } + + vdev_scsi =3D vdev_scsi_new(unix_fn); + if (!vdev_scsi) { + goto err; + } + vhost_scsi_devs[0] =3D vdev_scsi; + + if (vdev_scsi_add_iscsi_lun(vdev_scsi, iscsi_uri, 0) !=3D 0) { + goto err; + } + + if (vdev_scsi_run(vdev_scsi) !=3D 0) { + goto err; + } + +out: + if (vdev_scsi) { + vdev_scsi_deinit(vdev_scsi); + free(vdev_scsi); + } + if (unix_fn) { + free(unix_fn); + } + if (iscsi_uri) { + free(iscsi_uri); + } + + return err; + +err: + err =3D EXIT_FAILURE; + goto out; + +help: + fprintf(stderr, "Usage: %s [ -u unix_sock_path -i iscsi_uri ] | [ -h ]= \n", + argv[0]); + fprintf(stderr, " -u path to unix socket\n"); + fprintf(stderr, " -i iscsi uri for lun 0\n"); + fprintf(stderr, " -h print help and quit\n"); + + goto err; +} --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193576506544.8741121790176; Fri, 19 May 2017 04:32:56 -0700 (PDT) Received: from localhost ([::1]:57977 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBg9N-0005nU-TS for importer@patchew.org; Fri, 19 May 2017 07:32:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49591) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyY-0004cK-Gm for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyV-000128-SI for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:42 -0400 Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]:34690) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyV-00011q-ID for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:39 -0400 Received: by mail-wr0-x242.google.com with SMTP id 6so2624583wrb.1 for ; Fri, 19 May 2017 04:21:39 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.36 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=iBJmPStcm6lPB4z9dh0qhtbktFEiddPmcsJOolmhT78=; b=nqXhJgf9+5sL7tgUZ2Pn3ANemqEmOpgB9PpJkUajYJM66x5ap9PXy4lV1Bpqz8ejzB BudSMe5nvwO+LBflKgvqtxbL6lo+85R9J1TzBcXCu3YJEVtqDBYStSh6l8pi2Xn7jhHT 0f3/IkaqGEAowAI7nb3hxwlh6CT1bbxoQ1TAQED34DBMnibLdoL1XIVlS5xSjyXVOB38 K6yaJQxL3j8IKyDgVvd4M5a2spweu6OmrnMd1aaOSTgnVlByVoeo6qhUuhWFfLJqWsay 0VPCMKcTCfjkl8kGwOHBfN981VbAi4ByUrIQ89M5pCp3lBr51AxFf8OyMLCXLCmVw4KT uMuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=iBJmPStcm6lPB4z9dh0qhtbktFEiddPmcsJOolmhT78=; b=opZSIvOlTs0mark9a2yL+GE6fafaTqReBBQG8RzvGFO5jtA+t8f4X580G1BNZgOWNq Rkh8EdpkcCXW8l/n8K/3fVnd8fn4zuTgHrUc5sLGu0yeoydK6fbxa2ajfYUiYv59yH40 RoPenCSXmVzdBIHAX/2BEJL1lzuQAT0ue9xFR9WsLiHNoJziMvrCrelU2LA3Dhs0Q+/a mlB2kPAwQKPBChxlgUD4TQ9s8NnfFb4GXjD3zrqn4blr7yJy76hE+yx/0ciYJ9DOt1h0 mLdrncV7wHzlO+mC8OmKochb6nOH/0OV8BEO1xGALNwSYGpRdgL3VRu8JIsQfIugI1lS +qhw== X-Gm-Message-State: AODbwcAItH6A2ZdaLBmuVOZmwzAZKlUQ6IQqxsQcUWZk/XeDuR4Op9+8 JW/IX/VQ22SoPkSQ4rc= X-Received: by 10.223.135.216 with SMTP id c24mr2613365wrc.109.1495192898335; Fri, 19 May 2017 04:21:38 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:21:11 +0200 Message-Id: <1495192872-27667-20-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::242 Subject: [Qemu-devel] [PULL 19/20] target/i386: enable A20 automatically in system management mode X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Ignore env->a20_mask when running in system management mode. Reported-by: Anthony Xu Signed-off-by: Paolo Bonzini Message-Id: <1494502528-12670-1-git-send-email-pbonzini@redhat.com> Signed-off-by: Paolo Bonzini --- target/i386/arch_memory_mapping.c | 18 +++++++++-------- target/i386/cpu.h | 9 +++++++++ target/i386/helper.c | 42 +++++++++++++++++++++--------------= ---- 3 files changed, 42 insertions(+), 27 deletions(-) diff --git a/target/i386/arch_memory_mapping.c b/target/i386/arch_memory_ma= pping.c index 826aee5..647cff2 100644 --- a/target/i386/arch_memory_mapping.c +++ b/target/i386/arch_memory_mapping.c @@ -272,25 +272,27 @@ void x86_cpu_get_memory_mapping(CPUState *cs, MemoryM= appingList *list, { X86CPU *cpu =3D X86_CPU(cs); CPUX86State *env =3D &cpu->env; + int32_t a20_mask; =20 if (!cpu_paging_enabled(cs)) { /* paging is disabled */ return; } =20 + a20_mask =3D x86_get_a20_mask(env); if (env->cr[4] & CR4_PAE_MASK) { #ifdef TARGET_X86_64 if (env->hflags & HF_LMA_MASK) { if (env->cr[4] & CR4_LA57_MASK) { hwaddr pml5e_addr; =20 - pml5e_addr =3D (env->cr[3] & PLM4_ADDR_MASK) & env->a20_ma= sk; - walk_pml5e(list, cs->as, pml5e_addr, env->a20_mask); + pml5e_addr =3D (env->cr[3] & PLM4_ADDR_MASK) & a20_mask; + walk_pml5e(list, cs->as, pml5e_addr, a20_mask); } else { hwaddr pml4e_addr; =20 - pml4e_addr =3D (env->cr[3] & PLM4_ADDR_MASK) & env->a20_ma= sk; - walk_pml4e(list, cs->as, pml4e_addr, env->a20_mask, + pml4e_addr =3D (env->cr[3] & PLM4_ADDR_MASK) & a20_mask; + walk_pml4e(list, cs->as, pml4e_addr, a20_mask, 0xffffULL << 48); } } else @@ -298,16 +300,16 @@ void x86_cpu_get_memory_mapping(CPUState *cs, MemoryM= appingList *list, { hwaddr pdpe_addr; =20 - pdpe_addr =3D (env->cr[3] & ~0x1f) & env->a20_mask; - walk_pdpe2(list, cs->as, pdpe_addr, env->a20_mask); + pdpe_addr =3D (env->cr[3] & ~0x1f) & a20_mask; + walk_pdpe2(list, cs->as, pdpe_addr, a20_mask); } } else { hwaddr pde_addr; bool pse; =20 - pde_addr =3D (env->cr[3] & ~0xfff) & env->a20_mask; + pde_addr =3D (env->cr[3] & ~0xfff) & a20_mask; pse =3D !!(env->cr[4] & CR4_PSE_MASK); - walk_pde2(list, cs->as, pde_addr, env->a20_mask, pse); + walk_pde2(list, cs->as, pde_addr, a20_mask, pse); } } =20 diff --git a/target/i386/cpu.h b/target/i386/cpu.h index c4602ca..32a3a0c 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1624,6 +1624,15 @@ static inline MemTxAttrs cpu_get_mem_attrs(CPUX86Sta= te *env) return ((MemTxAttrs) { .secure =3D (env->hflags & HF_SMM_MASK) !=3D 0 = }); } =20 +static inline int32_t x86_get_a20_mask(CPUX86State *env) +{ + if (env->hflags & HF_SMM_MASK) { + return -1; + } else { + return env->a20_mask; + } +} + /* fpu_helper.c */ void cpu_set_mxcsr(CPUX86State *env, uint32_t val); void cpu_set_fpuc(CPUX86State *env, uint16_t val); diff --git a/target/i386/helper.c b/target/i386/helper.c index f11cac6..6c16e7c 100644 --- a/target/i386/helper.c +++ b/target/i386/helper.c @@ -724,6 +724,7 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr, X86CPU *cpu =3D X86_CPU(cs); CPUX86State *env =3D &cpu->env; uint64_t ptep, pte; + int32_t a20_mask; target_ulong pde_addr, pte_addr; int error_code =3D 0; int is_dirty, prot, page_size, is_write, is_user; @@ -739,6 +740,7 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr, #endif is_write =3D is_write1 & 1; =20 + a20_mask =3D x86_get_a20_mask(env); if (!(env->cr[0] & CR0_PG_MASK)) { pte =3D addr; #ifdef TARGET_X86_64 @@ -777,7 +779,7 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr, =20 if (la57) { pml5e_addr =3D ((env->cr[3] & ~0xfff) + - (((addr >> 48) & 0x1ff) << 3)) & env->a20_mask; + (((addr >> 48) & 0x1ff) << 3)) & a20_mask; pml5e =3D x86_ldq_phys(cs, pml5e_addr); if (!(pml5e & PG_PRESENT_MASK)) { goto do_fault; @@ -796,7 +798,7 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr, } =20 pml4e_addr =3D ((pml5e & PG_ADDRESS_MASK) + - (((addr >> 39) & 0x1ff) << 3)) & env->a20_mask; + (((addr >> 39) & 0x1ff) << 3)) & a20_mask; pml4e =3D x86_ldq_phys(cs, pml4e_addr); if (!(pml4e & PG_PRESENT_MASK)) { goto do_fault; @@ -810,7 +812,7 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr, } ptep &=3D pml4e ^ PG_NX_MASK; pdpe_addr =3D ((pml4e & PG_ADDRESS_MASK) + (((addr >> 30) & 0x= 1ff) << 3)) & - env->a20_mask; + a20_mask; pdpe =3D x86_ldq_phys(cs, pdpe_addr); if (!(pdpe & PG_PRESENT_MASK)) { goto do_fault; @@ -835,7 +837,7 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr, { /* XXX: load them when cr3 is loaded ? */ pdpe_addr =3D ((env->cr[3] & ~0x1f) + ((addr >> 27) & 0x18)) & - env->a20_mask; + a20_mask; pdpe =3D x86_ldq_phys(cs, pdpe_addr); if (!(pdpe & PG_PRESENT_MASK)) { goto do_fault; @@ -848,7 +850,7 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr, } =20 pde_addr =3D ((pdpe & PG_ADDRESS_MASK) + (((addr >> 21) & 0x1ff) <= < 3)) & - env->a20_mask; + a20_mask; pde =3D x86_ldq_phys(cs, pde_addr); if (!(pde & PG_PRESENT_MASK)) { goto do_fault; @@ -870,7 +872,7 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr, x86_stl_phys_notdirty(cs, pde_addr, pde); } pte_addr =3D ((pde & PG_ADDRESS_MASK) + (((addr >> 12) & 0x1ff) <<= 3)) & - env->a20_mask; + a20_mask; pte =3D x86_ldq_phys(cs, pte_addr); if (!(pte & PG_PRESENT_MASK)) { goto do_fault; @@ -886,7 +888,7 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr, =20 /* page directory entry */ pde_addr =3D ((env->cr[3] & ~0xfff) + ((addr >> 20) & 0xffc)) & - env->a20_mask; + a20_mask; pde =3D x86_ldl_phys(cs, pde_addr); if (!(pde & PG_PRESENT_MASK)) { goto do_fault; @@ -913,7 +915,7 @@ int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr, =20 /* page directory entry */ pte_addr =3D ((pde & ~0xfff) + ((addr >> 10) & 0xffc)) & - env->a20_mask; + a20_mask; pte =3D x86_ldl_phys(cs, pte_addr); if (!(pte & PG_PRESENT_MASK)) { goto do_fault; @@ -992,7 +994,7 @@ do_check_protect_pse36: } =20 do_mapping: - pte =3D pte & env->a20_mask; + pte =3D pte & a20_mask; =20 /* align to page_size */ pte &=3D PG_ADDRESS_MASK & ~(page_size - 1); @@ -1039,11 +1041,13 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, va= ddr addr) CPUX86State *env =3D &cpu->env; target_ulong pde_addr, pte_addr; uint64_t pte; + int32_t a20_mask; uint32_t page_offset; int page_size; =20 + a20_mask =3D x86_get_a20_mask(env); if (!(env->cr[0] & CR0_PG_MASK)) { - pte =3D addr & env->a20_mask; + pte =3D addr & a20_mask; page_size =3D 4096; } else if (env->cr[4] & CR4_PAE_MASK) { target_ulong pdpe_addr; @@ -1064,7 +1068,7 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vadd= r addr) =20 if (la57) { pml5e_addr =3D ((env->cr[3] & ~0xfff) + - (((addr >> 48) & 0x1ff) << 3)) & env->a20_mask; + (((addr >> 48) & 0x1ff) << 3)) & a20_mask; pml5e =3D x86_ldq_phys(cs, pml5e_addr); if (!(pml5e & PG_PRESENT_MASK)) { return -1; @@ -1074,13 +1078,13 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, va= ddr addr) } =20 pml4e_addr =3D ((pml5e & PG_ADDRESS_MASK) + - (((addr >> 39) & 0x1ff) << 3)) & env->a20_mask; + (((addr >> 39) & 0x1ff) << 3)) & a20_mask; pml4e =3D x86_ldq_phys(cs, pml4e_addr); if (!(pml4e & PG_PRESENT_MASK)) { return -1; } pdpe_addr =3D ((pml4e & PG_ADDRESS_MASK) + - (((addr >> 30) & 0x1ff) << 3)) & env->a20_mask; + (((addr >> 30) & 0x1ff) << 3)) & a20_mask; pdpe =3D x86_ldq_phys(cs, pdpe_addr); if (!(pdpe & PG_PRESENT_MASK)) { return -1; @@ -1095,14 +1099,14 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, va= ddr addr) #endif { pdpe_addr =3D ((env->cr[3] & ~0x1f) + ((addr >> 27) & 0x18)) & - env->a20_mask; + a20_mask; pdpe =3D x86_ldq_phys(cs, pdpe_addr); if (!(pdpe & PG_PRESENT_MASK)) return -1; } =20 pde_addr =3D ((pdpe & PG_ADDRESS_MASK) + - (((addr >> 21) & 0x1ff) << 3)) & env->a20_mask; + (((addr >> 21) & 0x1ff) << 3)) & a20_mask; pde =3D x86_ldq_phys(cs, pde_addr); if (!(pde & PG_PRESENT_MASK)) { return -1; @@ -1114,7 +1118,7 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vadd= r addr) } else { /* 4 KB page */ pte_addr =3D ((pde & PG_ADDRESS_MASK) + - (((addr >> 12) & 0x1ff) << 3)) & env->a20_mask; + (((addr >> 12) & 0x1ff) << 3)) & a20_mask; page_size =3D 4096; pte =3D x86_ldq_phys(cs, pte_addr); } @@ -1125,7 +1129,7 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vadd= r addr) uint32_t pde; =20 /* page directory entry */ - pde_addr =3D ((env->cr[3] & ~0xfff) + ((addr >> 20) & 0xffc)) & en= v->a20_mask; + pde_addr =3D ((env->cr[3] & ~0xfff) + ((addr >> 20) & 0xffc)) & a2= 0_mask; pde =3D x86_ldl_phys(cs, pde_addr); if (!(pde & PG_PRESENT_MASK)) return -1; @@ -1134,14 +1138,14 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, va= ddr addr) page_size =3D 4096 * 1024; } else { /* page directory entry */ - pte_addr =3D ((pde & ~0xfff) + ((addr >> 10) & 0xffc)) & env->= a20_mask; + pte_addr =3D ((pde & ~0xfff) + ((addr >> 10) & 0xffc)) & a20_m= ask; pte =3D x86_ldl_phys(cs, pte_addr); if (!(pte & PG_PRESENT_MASK)) { return -1; } page_size =3D 4096; } - pte =3D pte & env->a20_mask; + pte =3D pte & a20_mask; } =20 #ifdef TARGET_X86_64 --=20 1.8.3.1 From nobody Tue Apr 30 03:45:15 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495193819432422.1452603086311; Fri, 19 May 2017 04:36:59 -0700 (PDT) Received: from localhost ([::1]:57996 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBgDJ-0000nu-Oc for importer@patchew.org; Fri, 19 May 2017 07:36:57 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49592) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dBfyY-0004cL-Gt for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dBfyW-00013d-Uo for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:42 -0400 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]:34693) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dBfyW-00012C-Kq for qemu-devel@nongnu.org; Fri, 19 May 2017 07:21:40 -0400 Received: by mail-wr0-x244.google.com with SMTP id 6so2624743wrb.1 for ; Fri, 19 May 2017 04:21:40 -0700 (PDT) Received: from 640k.lan (94-39-157-43.adsl-ull.clienti.tiscali.it. [94.39.157.43]) by smtp.gmail.com with ESMTPSA id v65sm2640095wmv.5.2017.05.19.04.21.38 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2017 04:21:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=Pnv+zsxCNBeXYDXyLwGkmxfbK/Imy/bNzOzuuv57NLQ=; b=n3FGU6ohEi1w2vLVV8gJdgKawG0me3UfSpFPwsQpUvNkM7Zn9YrYQ/OqKdr17NzoLx H3oi+LVy+eLmIafPZVqBy7BjuxGA7eXnVZ140s31qKn7vS2G6GjLyjdP/HmW9y2wMZCO /7xazO6AMbBTtruNENyy6ghVU+6c3j70I5OuIoU/nmcgrb1pnMAPolykvRWYo55CH1vV 12a9zX0d+J95dRKlgGRS8yjHznjb8sYQOfbhdjQlo5JCZD7wyFKOzCNcsefZj1Sy98VR OkoPKZaGgEVpDPuGxuG5zzHtq9iQOubk2jK196rH6B1jA8FqqbGDg03Tcv5FTR8Ln6bR NkHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=Pnv+zsxCNBeXYDXyLwGkmxfbK/Imy/bNzOzuuv57NLQ=; b=lyq1E8A2DSl8OPe8/LOlTM9K9pJ1QLk/azBrxuoIYNiFHUvoGVaWpIuXEA3GOmQj2Z 0XaONE2HRNJ8ClAJJYXP0SUMNeGmDTZFkaTjSG8Tn29oTj8ObcqLVXbBnkinMQ0egpKA QN5QSJ/5VSvmX1yQzgbMcAe5vy8oD+DmYANIjBQ7NglMl2D03PPYrlsiVar1m+o6nlLs i9RkzNy50DjSTqdXLr+j5sooHWEDi9bmvnkianySpNl5UUIqzI+qowGAXWJv6VYBQD1n UvMi5A7TTbaXK4L6PI9TxYEdIsCOFmlny15XS+Hq0bdCGBJ4G34yD35ItYdJguatFr2x zz7Q== X-Gm-Message-State: AODbwcCnYVAD/8JL8YUI6vCAxgHzz/h4RxCFXP/Ry8fA6HFvs/xky8k2 vjUphYt08rdWEmJ1eus= X-Received: by 10.223.153.116 with SMTP id x107mr2631194wrb.55.1495192899340; Fri, 19 May 2017 04:21:39 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 19 May 2017 13:21:12 +0200 Message-Id: <1495192872-27667-21-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> References: <1495192872-27667-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::244 Subject: [Qemu-devel] [PULL 20/20] target/i386: use multiple CPU AddressSpaces X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This speeds up SMM switches. Later on it may remove the need to take the BQL, and it may also allow to reuse code between TCG and KVM. Signed-off-by: Paolo Bonzini --- target/i386/cpu.c | 15 +++++++++----- target/i386/cpu.h | 11 +++++++++- target/i386/helper.c | 54 ++++++++++++++++++++++++--------------------= ---- target/i386/machine.c | 4 ---- target/i386/smm_helper.c | 18 ---------------- 5 files changed, 47 insertions(+), 55 deletions(-) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index a41d595..a638832 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -3239,7 +3239,7 @@ static void x86_cpu_machine_done(Notifier *n, void *u= nused) cpu->smram =3D g_new(MemoryRegion, 1); memory_region_init_alias(cpu->smram, OBJECT(cpu), "smram", smram, 0, 1ull << 32); - memory_region_set_enabled(cpu->smram, false); + memory_region_set_enabled(cpu->smram, true); memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->smra= m, 1); } } @@ -3619,7 +3619,9 @@ static void x86_cpu_realizefn(DeviceState *dev, Error= **errp) =20 #ifndef CONFIG_USER_ONLY if (tcg_enabled()) { - AddressSpace *newas =3D g_new(AddressSpace, 1); + AddressSpace *as_normal =3D address_space_init_shareable(cs->memor= y, + "cpu-memory= "); + AddressSpace *as_smm =3D g_new(AddressSpace, 1); =20 cpu->cpu_as_mem =3D g_new(MemoryRegion, 1); cpu->cpu_as_root =3D g_new(MemoryRegion, 1); @@ -3635,9 +3637,11 @@ static void x86_cpu_realizefn(DeviceState *dev, Erro= r **errp) get_system_memory(), 0, ~0ull); memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->cpu_= as_mem, 0); memory_region_set_enabled(cpu->cpu_as_mem, true); - address_space_init(newas, cpu->cpu_as_root, "CPU"); - cs->num_ases =3D 1; - cpu_address_space_init(cs, newas, 0); + address_space_init(as_smm, cpu->cpu_as_root, "CPU"); + + cs->num_ases =3D 2; + cpu_address_space_init(cs, as_normal, 0); + cpu_address_space_init(cs, as_smm, 1); =20 /* ... SMRAM with higher priority, linked from /machine/smram. */ cpu->machine_done.notify =3D x86_cpu_machine_done; @@ -4053,6 +4057,7 @@ static void x86_cpu_common_class_init(ObjectClass *oc= , void *data) #ifdef CONFIG_USER_ONLY cc->handle_mmu_fault =3D x86_cpu_handle_mmu_fault; #else + cc->asidx_from_attrs =3D x86_asidx_from_attrs; cc->get_memory_mapping =3D x86_cpu_get_memory_mapping; cc->get_phys_page_debug =3D x86_cpu_get_phys_page_debug; cc->write_elf64_note =3D x86_cpu_write_elf64_note; diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 32a3a0c..c2e081c 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1450,6 +1450,16 @@ int x86_cpu_handle_mmu_fault(CPUState *cpu, vaddr ad= dr, void x86_cpu_set_a20(X86CPU *cpu, int a20_state); =20 #ifndef CONFIG_USER_ONLY +static inline int x86_asidx_from_attrs(CPUState *cs, MemTxAttrs attrs) +{ + return !!attrs.secure; +} + +static inline AddressSpace *cpu_addressspace(CPUState *cs, MemTxAttrs attr= s) +{ + return cpu_get_address_space(cs, cpu_asidx_from_attrs(cs, attrs)); +} + uint8_t x86_ldub_phys(CPUState *cs, hwaddr addr); uint32_t x86_lduw_phys(CPUState *cs, hwaddr addr); uint32_t x86_ldl_phys(CPUState *cs, hwaddr addr); @@ -1652,7 +1662,6 @@ void do_interrupt_x86_hardirq(CPUX86State *env, int i= ntno, int is_hw); =20 /* smm_helper.c */ void do_smm_enter(X86CPU *cpu); -void cpu_smm_update(X86CPU *cpu); =20 /* apic.c */ void cpu_report_tpr_access(CPUX86State *env, TPRAccess access); diff --git a/target/i386/helper.c b/target/i386/helper.c index 6c16e7c..d0daa1f 100644 --- a/target/i386/helper.c +++ b/target/i386/helper.c @@ -1403,89 +1403,89 @@ uint8_t x86_ldub_phys(CPUState *cs, hwaddr addr) { X86CPU *cpu =3D X86_CPU(cs); CPUX86State *env =3D &cpu->env; + MemTxAttrs attrs =3D cpu_get_mem_attrs(env); + AddressSpace *as =3D cpu_addressspace(cs, attrs); =20 - return address_space_ldub(cs->as, addr, - cpu_get_mem_attrs(env), - NULL); + return address_space_ldub(as, addr, attrs, NULL); } =20 uint32_t x86_lduw_phys(CPUState *cs, hwaddr addr) { X86CPU *cpu =3D X86_CPU(cs); CPUX86State *env =3D &cpu->env; + MemTxAttrs attrs =3D cpu_get_mem_attrs(env); + AddressSpace *as =3D cpu_addressspace(cs, attrs); =20 - return address_space_lduw(cs->as, addr, - cpu_get_mem_attrs(env), - NULL); + return address_space_lduw(as, addr, attrs, NULL); } =20 uint32_t x86_ldl_phys(CPUState *cs, hwaddr addr) { X86CPU *cpu =3D X86_CPU(cs); CPUX86State *env =3D &cpu->env; + MemTxAttrs attrs =3D cpu_get_mem_attrs(env); + AddressSpace *as =3D cpu_addressspace(cs, attrs); =20 - return address_space_ldl(cs->as, addr, - cpu_get_mem_attrs(env), - NULL); + return address_space_ldl(as, addr, attrs, NULL); } =20 uint64_t x86_ldq_phys(CPUState *cs, hwaddr addr) { X86CPU *cpu =3D X86_CPU(cs); CPUX86State *env =3D &cpu->env; + MemTxAttrs attrs =3D cpu_get_mem_attrs(env); + AddressSpace *as =3D cpu_addressspace(cs, attrs); =20 - return address_space_ldq(cs->as, addr, - cpu_get_mem_attrs(env), - NULL); + return address_space_ldq(as, addr, attrs, NULL); } =20 void x86_stb_phys(CPUState *cs, hwaddr addr, uint8_t val) { X86CPU *cpu =3D X86_CPU(cs); CPUX86State *env =3D &cpu->env; + MemTxAttrs attrs =3D cpu_get_mem_attrs(env); + AddressSpace *as =3D cpu_addressspace(cs, attrs); =20 - address_space_stb(cs->as, addr, val, - cpu_get_mem_attrs(env), - NULL); + address_space_stb(as, addr, val, attrs, NULL); } =20 void x86_stl_phys_notdirty(CPUState *cs, hwaddr addr, uint32_t val) { X86CPU *cpu =3D X86_CPU(cs); CPUX86State *env =3D &cpu->env; + MemTxAttrs attrs =3D cpu_get_mem_attrs(env); + AddressSpace *as =3D cpu_addressspace(cs, attrs); =20 - address_space_stl_notdirty(cs->as, addr, val, - cpu_get_mem_attrs(env), - NULL); + address_space_stl_notdirty(as, addr, val, attrs, NULL); } =20 void x86_stw_phys(CPUState *cs, hwaddr addr, uint32_t val) { X86CPU *cpu =3D X86_CPU(cs); CPUX86State *env =3D &cpu->env; + MemTxAttrs attrs =3D cpu_get_mem_attrs(env); + AddressSpace *as =3D cpu_addressspace(cs, attrs); =20 - address_space_stw(cs->as, addr, val, - cpu_get_mem_attrs(env), - NULL); + address_space_stw(as, addr, val, attrs, NULL); } =20 void x86_stl_phys(CPUState *cs, hwaddr addr, uint32_t val) { X86CPU *cpu =3D X86_CPU(cs); CPUX86State *env =3D &cpu->env; + MemTxAttrs attrs =3D cpu_get_mem_attrs(env); + AddressSpace *as =3D cpu_addressspace(cs, attrs); =20 - address_space_stl(cs->as, addr, val, - cpu_get_mem_attrs(env), - NULL); + address_space_stl(as, addr, val, attrs, NULL); } =20 void x86_stq_phys(CPUState *cs, hwaddr addr, uint64_t val) { X86CPU *cpu =3D X86_CPU(cs); CPUX86State *env =3D &cpu->env; + MemTxAttrs attrs =3D cpu_get_mem_attrs(env); + AddressSpace *as =3D cpu_addressspace(cs, attrs); =20 - address_space_stq(cs->as, addr, val, - cpu_get_mem_attrs(env), - NULL); + address_space_stq(as, addr, val, attrs, NULL); } #endif diff --git a/target/i386/machine.c b/target/i386/machine.c index 3cb2729..8c7a822 100644 --- a/target/i386/machine.c +++ b/target/i386/machine.c @@ -274,10 +274,6 @@ static int cpu_post_load(void *opaque, int version_id) cpu_x86_update_dr7(env, dr7); } tlb_flush(cs); - - if (tcg_enabled()) { - cpu_smm_update(cpu); - } return 0; } =20 diff --git a/target/i386/smm_helper.c b/target/i386/smm_helper.c index f051a77..90621e5 100644 --- a/target/i386/smm_helper.c +++ b/target/i386/smm_helper.c @@ -43,19 +43,6 @@ void helper_rsm(CPUX86State *env) #define SMM_REVISION_ID 0x00020000 #endif =20 -/* Called with iothread lock taken */ -void cpu_smm_update(X86CPU *cpu) -{ - CPUX86State *env =3D &cpu->env; - bool smm_enabled =3D (env->hflags & HF_SMM_MASK); - - g_assert(qemu_mutex_iothread_locked()); - - if (cpu->smram) { - memory_region_set_enabled(cpu->smram, smm_enabled); - } -} - void do_smm_enter(X86CPU *cpu) { CPUX86State *env =3D &cpu->env; @@ -73,7 +60,6 @@ void do_smm_enter(X86CPU *cpu) } else { env->hflags2 |=3D HF2_NMI_MASK; } - cpu_smm_update(cpu); =20 sm_state =3D env->smbase + 0x8000; =20 @@ -338,10 +324,6 @@ void helper_rsm(CPUX86State *env) env->hflags2 &=3D ~HF2_SMM_INSIDE_NMI_MASK; env->hflags &=3D ~HF_SMM_MASK; =20 - qemu_mutex_lock_iothread(); - cpu_smm_update(cpu); - qemu_mutex_unlock_iothread(); - qemu_log_mask(CPU_LOG_INT, "SMM: after RSM\n"); log_cpu_state_mask(CPU_LOG_INT, CPU(cpu), CPU_DUMP_CCOP); } --=20 1.8.3.1