Received: by 10.213.65.68 with SMTP id h4csp306595imn; Fri, 16 Mar 2018 03:53:24 -0700 (PDT) X-Google-Smtp-Source: AG47ELuYH6xMD2KcZbT/qCRaR56gVUJmrD0Td5mFzWTwhvd0envxpW4lyfBfNKHZ4YumDzwM7aqD X-Received: by 10.98.69.76 with SMTP id s73mr1209324pfa.31.1521197604082; Fri, 16 Mar 2018 03:53:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521197604; cv=none; d=google.com; s=arc-20160816; b=j5xrljN1DVJjyqeNBr9Y3o33TFp+TOcjgbuHmF0oHjmI63C8Xi59D+g3MGxQHYr3Oi T2rRdhBNDMPThA/h1BbHWMlgOLBUeBE9IS3TttJEVqyxCqOeRXvo/m8L7Xhbt56EBKNZ QgtFsg7lItN04QE+r2jsGJo4hpYDMFgozlbLHRnCcdkt8F9SwidTMcjuesRgPrKMXHEE TsSPOGWZCfwupz6iHs1XCt7wkeYgHh4hn869C0SxBxmPXA0NKYu0Irdenxe1SJlaAZ7W 0nM5lUkHrsbHLjVGxQ0EiEIxx/yFqCH6YRxvG4+UiDATOBv0fpHxGnx5zrpwIq8z6izG K04w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-language :content-transfer-encoding:in-reply-to:mime-version:user-agent:date :message-id:from:references:to:subject:dkim-signature :arc-authentication-results; bh=dQFU2+iP+c3Wv2aHJNEpo30ysq0NMsNB9t3BtdyE0EQ=; b=hK90/srqBDdDdOBOwBb/yGWMZ37Wtlpl6OPVDwBsaVTn8Ba0mNNiZGsJ2WA83ez1C7 ApPqBh3qde9XrV6wjDH7OFdBAOgLKX+HJ9tghMqlfUIUJVX69qmo3kfk/ikWm4Q1pEBV MN2vrIu0KfW2x1n1wKmXqLxBoJRtcUbe8XzqxlOGCO78Q5tOClYT4LMELfdkFVnmLWiJ FB+g6bNm4BATHGcN9Pq504HFboLw+7R0kDvTgtNbWQ3Rc5PhtU3TFKJiHUK48K1TADk9 bo+0nvzVe7nYOLb9hm7q+S1IBGBwqhY6QtWXAfLPo5el1GDZziuRgntxGxdn4UdzbQAv fHvA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=vPWQdJWG; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p14si3731807pgr.674.2018.03.16.03.53.09; Fri, 16 Mar 2018 03:53:24 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=vPWQdJWG; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753465AbeCPKwO (ORCPT + 99 others); Fri, 16 Mar 2018 06:52:14 -0400 Received: from mail-lf0-f43.google.com ([209.85.215.43]:43023 "EHLO mail-lf0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753019AbeCPKwN (ORCPT ); Fri, 16 Mar 2018 06:52:13 -0400 Received: by mail-lf0-f43.google.com with SMTP id g13-v6so3708186lfe.10 for ; Fri, 16 Mar 2018 03:52:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-transfer-encoding:content-language; bh=dQFU2+iP+c3Wv2aHJNEpo30ysq0NMsNB9t3BtdyE0EQ=; b=vPWQdJWGH/tfAjtzBJRNW65M/SjVa1T54opwuUu58wPb1fBlE/d80G/fV/6etL+WSC 1sQJQTW8X6rYnslq8rZIC8dzOCbdgjW/xKYWLICGeLOrWPLesTSeVrrCOAgyZ0y3qM9l 3izzJfmI7xChGLIsromR8+qLxCSfyqYeSUXeVu5HREhuriLbWcV7bzp9BQ8+QqZfn4jg a3hWuIP2KH/BejSEx8eWVYsOMRGDdg57G7r/YBfFZNbSPmZREe+uQB5VFx1KMUXSHo4N cKMlWT9ki48IhbnyhvPK7Ba1KU472d0SfMDSNb4XTgrQMpBXvvFrucAeOhb/KkLMyAdX IlcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=dQFU2+iP+c3Wv2aHJNEpo30ysq0NMsNB9t3BtdyE0EQ=; b=LC6s2acPdDUQU7FOysGMfeGD18gWbHMpT8SO4J6L5aNj5taPzDVuvcVE2ihH9/HwTl ZYsJ24Jo309GJwIg+fN6V9FxyiwBoVqDCZINh8V5m+oCfD/3FzlgpVenWG2LUkePXlcb a/ttJABffhJlsvtwuFLUk6IbUJFCYK9tv+HayqrlpDCky4CrP//g6pijqNDvjoY65KJD BiUzAl/KC1PNXAq+aPG6DV1ZsjB0jgp4lO8c3bdmw7yq/QNsdV1dJfwLUrGD1kGRWvLZ XFZ8HdXyAYp0YOsQL1cBgx9bwCVFpYAP29z69CAPFdAY82k5uwXGUNsdsI7hDH+K53AH rHzw== X-Gm-Message-State: AElRT7FIZLK2FJ5NqBStvs1zcWOqYkcSlUCVFcaieiYGhSNjsnvgq0bj XLZhbyuGw8SsDkQZtNB72P4= X-Received: by 10.46.45.18 with SMTP id t18mr1070519ljt.48.1521197531588; Fri, 16 Mar 2018 03:52:11 -0700 (PDT) Received: from [10.17.182.9] (ll-74.141.223.85.sovam.net.ua. [85.223.141.74]) by smtp.gmail.com with ESMTPSA id x26-v6sm1702783lfb.16.2018.03.16.03.52.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Mar 2018 03:52:10 -0700 (PDT) Subject: Re: [PATCH RESEND v2 1/2] drm/xen-front: Add support for Xen PV display frontend To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, airlied@linux.ie, daniel.vetter@intel.com, seanpaul@chromium.org, gustavo@padovan.org, jgross@suse.com, boris.ostrovsky@oracle.com, konrad.wilk@oracle.com, Oleksandr Andrushchenko References: <1520958066-22875-1-git-send-email-andr2000@gmail.com> <1520958066-22875-2-git-send-email-andr2000@gmail.com> <20180316082330.GF25297@phenom.ffwll.local> From: Oleksandr Andrushchenko Message-ID: Date: Fri, 16 Mar 2018 12:52:09 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <20180316082330.GF25297@phenom.ffwll.local> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, Daniel! Sorry, if I strip the patch too much below. On 03/16/2018 10:23 AM, Daniel Vetter wrote: > > S-o-b line went missing here :-) will restore it back ;) > > I've read through it, 2 actual review comments (around hot-unplug and > around the error recovery for failed flips), a few bikesheds, but looks > all reasonable to me. And much easier to read as one big patch (it's just > 3k). > > One more thing I'd do as a follow-up (don't rewrite everything, this is > close to merge, better to get it in first): You have a lot of indirections > and function calls across sources files. That's kinda ok if you have a > huge driver with 100+k lines of code where you have to split things up. > But for a small driver like yours here it's a bit overkill. will review and try to rework after the driver is in > > Personally I'd merge at least the xen backend stuff into the corresponding > kms code, but that's up to you. I prefer to have it in smaller chunks and all related code at one place, so it is easier to maintain. That is why I didn't plumb frontend <-> backend code right into the KMS code. > And as mentioned, if you decide to do > that, a follow-up patch (once this has merged) is perfectly fine. Ok, after the merge > -Daniel > >> +int xen_drm_front_dbuf_create_from_sgt(struct xen_drm_front_info *front_info, >> + uint64_t dbuf_cookie, uint32_t width, uint32_t height, >> + uint32_t bpp, uint64_t size, struct sg_table *sgt) >> +{ >> + return be_dbuf_create_int(front_info, dbuf_cookie, width, height, >> + bpp, size, NULL, sgt); >> +} >> + >> +int xen_drm_front_dbuf_create_from_pages(struct xen_drm_front_info *front_info, >> + uint64_t dbuf_cookie, uint32_t width, uint32_t height, >> + uint32_t bpp, uint64_t size, struct page **pages) >> +{ >> + return be_dbuf_create_int(front_info, dbuf_cookie, width, height, >> + bpp, size, pages, NULL); >> +} > The above two wrappers seem a bit much, just to set sgt = NULL or pages = > NULL in one of them. I'd drop them, but that's a bikeshed so feel free to > ignore. I had that the way you say in some of the previous implementations, but finally decided to have these dummy wrappers: seems to be cleaner this way >> +static void displback_disconnect(struct xen_drm_front_info *front_info) >> +{ >> + bool removed = true; >> + >> + if (front_info->drm_pdev) { >> + if (xen_drm_front_drv_is_used(front_info->drm_pdev)) { >> + DRM_WARN("DRM driver still in use, deferring removal\n"); >> + removed = false; >> + } else >> + xen_drv_remove_internal(front_info); > Ok this logic here is fishy, since you're open-coding the drm unplug > infrastructure, but slightly differently and slightyl racy. If you have a > driver where your underlying "hw" (well it's virtual here, but same idea) > can disappear any time while userspace is still using the drm driver, you > need to use the drm_dev_unplug() function and related code. > drm_dev_unplug() works like drm_dev_unregister, except for the hotplug > case. > > Then you also have to guard all the driver entry points where you do > access the backchannel using drm_dev_is_unplugged() (I've seen a few of > those already). Then you can rip out all the logic here and the xen_drm_front_drv_is_used() helper. Will rework it with drm_dev_unplug, thank you > I thought there's some patches from Noralf in-flight that improved the > docs on this, I need to check > >> +#define XEN_DRM_NUM_VIDEO_MODES 1 >> +#define XEN_DRM_CRTC_VREFRESH_HZ 60 >> + >> +static int connector_get_modes(struct drm_connector *connector) >> +{ >> + struct xen_drm_front_drm_pipeline *pipeline = >> + to_xen_drm_pipeline(connector); >> + struct drm_display_mode *mode; >> + struct videomode videomode; >> + int width, height; >> + >> + mode = drm_mode_create(connector->dev); >> + if (!mode) >> + return 0; >> + >> + memset(&videomode, 0, sizeof(videomode)); >> + videomode.hactive = pipeline->width; >> + videomode.vactive = pipeline->height; >> + width = videomode.hactive + videomode.hfront_porch + >> + videomode.hback_porch + videomode.hsync_len; >> + height = videomode.vactive + videomode.vfront_porch + >> + videomode.vback_porch + videomode.vsync_len; >> + videomode.pixelclock = width * height * XEN_DRM_CRTC_VREFRESH_HZ; >> + mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER; >> + >> + drm_display_mode_from_videomode(&videomode, mode); >> + drm_mode_probed_add(connector, mode); >> + return XEN_DRM_NUM_VIDEO_MODES; > Bikeshed: just hardcode this to 1, the #define is imo more confusing. ok, will remove #define > >> + >> + } >> + /* >> + * Send page flip request to the backend *after* we have event cached >> + * above, so on page flip done event from the backend we can >> + * deliver it and there is no race condition between this code and >> + * event from the backend. >> + * If this is not a page flip, e.g. no flip done event from the backend >> + * is expected, then send now. >> + */ >> + if (!display_send_page_flip(pipe, old_plane_state)) >> + xen_drm_front_kms_send_pending_event(pipeline); > The control flow here is a bit confusing. I'd put the call to send out the > event right away in case of a failure to communicate with the backend into > display_send_page_flip() itself. Then drop the bool return value and make > it void, and also push the comment explaining what you do in case of > errors into that function. The reason for having bool for page flip here is that we need to send pending event for display enable/disable, for example. So, I decided to make it this way: 1. page flip handled - handles pending event internally (defers sending until frame done event from the backend) 2. page flip failed - handles externally in case of any page flip related error, e.g. "not handled" cases, either due to backend communication error or whatever else 3. all other cases, but page flip > > That way the error handling and recovery is all neatly tied together in > one place instead of spread around. Well, I tried to keep it all at one place, but as we decided to implement connector hotplug for error delivery it became split. Also, I handle frame done event time-outs there. > Thank you very much for review and comments, Oleksandr