Received: by 2002:ac2:464d:0:0:0:0:0 with SMTP id s13csp193451lfo; Tue, 17 May 2022 21:58:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwuRvyaszxAk+k2lHW8GRi7BPb4oLYQfHwOAqrkbu6Og3R1+7wuo4jcgwVhoxficcJn4PSs X-Received: by 2002:a63:dd57:0:b0:3f6:44f:9d72 with SMTP id g23-20020a63dd57000000b003f6044f9d72mr1120656pgj.62.1652849884142; Tue, 17 May 2022 21:58:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652849884; cv=none; d=google.com; s=arc-20160816; b=v9a8QzAMRDfvbcagjhMywdh1OJ/qzOHmBnETRo97Bl142Pxu76wid0VTfOi+yePawJ qEvxTvg7QoV84VC1jNwsmbnpKQ3/YX1f71IcftyRr1OO7YEdMNjis7CdlpFTpa3WZcSX 9qFxI28TOhJSjib/dZQaxflNQPAULS4XqVfF53R4VP3DKZRwJeA1iGilyzRmFK0063qQ 2L3C8jIvFz0fo6wL+X7jXBjsd01aRZ2FUAa4RmX2z1KDYHa/r80CX6fPwgUal+r6y1UO lSj6UavdzW1MYG5EujLI6i1oAjlBaR/K9i9RZyhzUxgLmD51ESFZAZWZHB/Ma7+R+oS2 uP5g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=TcWKc+TaFJg+Z2XnEjHIsM8AhXNeMqxiwb9on4zJjo8=; b=Ndzivzpmn1nfQE26tIJUO+K7NtFZJ9Xmv5Al7tbsupl06E2Dhb2aHv2HxWVOrcniOH k8M3TH4SnlYb3DOxtE8pIhfZtiW6q1T2swWTKUiveSyccYBbOA4t8Nw0+hORwRsWpk1f L5cT6jLAJRp64DOlVJFZb5b2nSSsP2ix5xxS5h9v/R32i2Ivm6CUi2pUh1YNjSrLWSJR 7ERGU1BY7ltRPSypTCir9XS4tczesrb4WKiiNI/X0ReJb9lF8YfnSwvO9qFGY63M7Xym ItgCn21bU6XAh8/2I6dMehM/7hDasSYSzB6FloVZL8jlbqQjs7PJFeKlq3SKuusEaEgB P4Ow== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b="iNQuF/4/"; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id n5-20020a632705000000b003dae95430c8si1128318pgn.866.2022.05.17.21.58.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 May 2022 21:58:04 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b="iNQuF/4/"; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 67F0A14D789; Tue, 17 May 2022 21:07:14 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229615AbiEREGG (ORCPT + 99 others); Wed, 18 May 2022 00:06:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58762 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229689AbiEREFx (ORCPT ); Wed, 18 May 2022 00:05:53 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 28D0313CA19 for ; Tue, 17 May 2022 21:03:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1652846505; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=TcWKc+TaFJg+Z2XnEjHIsM8AhXNeMqxiwb9on4zJjo8=; b=iNQuF/4/ZbNIaoNSofSgowJ6rzhy53HQvvtzRn0x5JdFJkAm166EBT71qElDK8CdaIob9h tXavjUXVQP5D0XIGVtc9A/Yo2em9Rc+dmQWr0FC1yFra6emI6MZijRbO/udKLYoDFqfUDV 2xUhnjAHIyK1ynFGp5LT2biFavqRJk4= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-658-t7Z9i3TwOOek0Q4SOnIMKQ-1; Wed, 18 May 2022 00:01:41 -0400 X-MC-Unique: t7Z9i3TwOOek0Q4SOnIMKQ-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 7D31E185A7B2; Wed, 18 May 2022 04:01:40 +0000 (UTC) Received: from localhost.localdomain (ovpn-14-27.pek2.redhat.com [10.72.14.27]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7CB1D1121314; Wed, 18 May 2022 04:01:33 +0000 (UTC) From: Jason Wang To: mst@redhat.com, jasowang@redhat.com, virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Cc: tglx@linutronix.de, peterz@infradead.org, paulmck@kernel.org, maz@kernel.org, pasic@linux.ibm.com, cohuck@redhat.com, eperezma@redhat.com, lulu@redhat.com, sgarzare@redhat.com, xuanzhuo@linux.alibaba.com, Vineeth Vijayan , Peter Oberparleiter , linux-s390@vger.kernel.org Subject: [PATCH V5 6/9] virtio-ccw: implement synchronize_cbs() Date: Wed, 18 May 2022 11:59:48 +0800 Message-Id: <20220518035951.94220-7-jasowang@redhat.com> In-Reply-To: <20220518035951.94220-1-jasowang@redhat.com> References: <20220518035951.94220-1-jasowang@redhat.com> MIME-Version: 1.0 Content-type: text/plain Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch tries to implement the synchronize_cbs() for ccw. For the vring_interrupt() that is called via virtio_airq_handler(), the synchronization is simply done via the airq_info's lock. For the vring_interrupt() that is called via virtio_ccw_int_handler(), a per device rwlock is introduced ans used in the synchronization method. Cc: Thomas Gleixner Cc: Peter Zijlstra Cc: "Paul E. McKenney" Cc: Marc Zyngier Cc: Halil Pasic Cc: Cornelia Huck Cc: Vineeth Vijayan Cc: Peter Oberparleiter Cc: linux-s390@vger.kernel.org Signed-off-by: Jason Wang --- drivers/s390/virtio/virtio_ccw.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c index d35e7a3f7067..22d36594bcdd 100644 --- a/drivers/s390/virtio/virtio_ccw.c +++ b/drivers/s390/virtio/virtio_ccw.c @@ -62,6 +62,7 @@ struct virtio_ccw_device { unsigned int revision; /* Transport revision */ wait_queue_head_t wait_q; spinlock_t lock; + rwlock_t irq_lock; struct mutex io_lock; /* Serializes I/O requests */ struct list_head virtqueues; bool is_thinint; @@ -984,6 +985,27 @@ static const char *virtio_ccw_bus_name(struct virtio_device *vdev) return dev_name(&vcdev->cdev->dev); } +static void virtio_ccw_synchronize_cbs(struct virtio_device *vdev) +{ + struct virtio_ccw_device *vcdev = to_vc_device(vdev); + struct airq_info *info = vcdev->airq_info; + + if (info) { + /* + * Synchronize with the vring_interrupt() with airq indicator + */ + write_lock_irq(&info->lock); + write_unlock_irq(&info->lock); + } else { + /* + * Synchronize with the vring_interrupt() called by + * virtio_ccw_int_handler(). + */ + write_lock_irq(&vcdev->irq_lock); + write_unlock_irq(&vcdev->irq_lock); + } +} + static const struct virtio_config_ops virtio_ccw_config_ops = { .get_features = virtio_ccw_get_features, .finalize_features = virtio_ccw_finalize_features, @@ -995,6 +1017,7 @@ static const struct virtio_config_ops virtio_ccw_config_ops = { .find_vqs = virtio_ccw_find_vqs, .del_vqs = virtio_ccw_del_vqs, .bus_name = virtio_ccw_bus_name, + .synchronize_cbs = virtio_ccw_synchronize_cbs, }; @@ -1106,6 +1129,8 @@ static void virtio_ccw_int_handler(struct ccw_device *cdev, vcdev->err = -EIO; } virtio_ccw_check_activity(vcdev, activity); + /* Local interrupt should be disabled at this time */ + read_lock(&vcdev->irq_lock); for_each_set_bit(i, indicators(vcdev), sizeof(*indicators(vcdev)) * BITS_PER_BYTE) { /* The bit clear must happen before the vring kick. */ @@ -1114,6 +1139,7 @@ static void virtio_ccw_int_handler(struct ccw_device *cdev, vq = virtio_ccw_vq_by_ind(vcdev, i); vring_interrupt(0, vq); } + read_unlock(&vcdev->irq_lock); if (test_bit(0, indicators2(vcdev))) { virtio_config_changed(&vcdev->vdev); clear_bit(0, indicators2(vcdev)); @@ -1284,6 +1310,7 @@ static int virtio_ccw_online(struct ccw_device *cdev) init_waitqueue_head(&vcdev->wait_q); INIT_LIST_HEAD(&vcdev->virtqueues); spin_lock_init(&vcdev->lock); + rwlock_init(&vcdev->irq_lock); mutex_init(&vcdev->io_lock); spin_lock_irqsave(get_ccwdev_lock(cdev), flags); -- 2.25.1