diff mbox

[i-g-t] overlay/intel-gpu-overlay

Message ID 1447850429-8303-1-git-send-email-marius.c.vlad@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Marius Vlad Nov. 18, 2015, 12:40 p.m. UTC
From: Marius Vlad <marius.c.vlad@intel.com>

Use sigaction() instead of signal() and add SIGINT, SIGTERM to close
the overlay window. With this change the overlay window will be
destroyed.

Signed-off-by: Marius Vlad <marius.c.vlad@intel.com>
---
 overlay/overlay.c | 42 ++++++++++++++++++++++++++++++++++++------
 1 file changed, 36 insertions(+), 6 deletions(-)

Comments

Chris Wilson Nov. 18, 2015, 12:59 p.m. UTC | #1
On Wed, Nov 18, 2015 at 02:40:29PM +0200, marius.c.vlad@intel.com wrote:
> From: Marius Vlad <marius.c.vlad@intel.com>
> 
> Use sigaction() instead of signal() and add SIGINT, SIGTERM to close
> the overlay window. With this change the overlay window will be
> destroyed.
> 
> Signed-off-by: Marius Vlad <marius.c.vlad@intel.com>
> ---
>  overlay/overlay.c | 42 ++++++++++++++++++++++++++++++++++++------
>  1 file changed, 36 insertions(+), 6 deletions(-)
> 
> diff --git a/overlay/overlay.c b/overlay/overlay.c
> index 3c0dbb4..48ba67c 100644
> --- a/overlay/overlay.c
> +++ b/overlay/overlay.c
> @@ -804,11 +804,19 @@ static void show_gem_objects(struct overlay_context *ctx, struct overlay_gem_obj
>  
>  static int take_snapshot;
>  
> -static void signal_snapshot(int sig)
> +static void
> +signal_snapshot(int sig, siginfo_t *si, void *__unused)
>  {
>  	take_snapshot = sig;
>  }
>  
> +static void
> +signal_x11_destroy(int sig, siginfo_t *si, void *__unused)
> +{
> +	x11_overlay_stop();

is not signalsafe.

> +	if (ctx.surface == NULL) {
> +		fprintf(stderr, "Failed to create X11 overlay.\n");

Spurious changes.

>  		ctx.surface = x11_window_create(&config, &ctx.width, &ctx.height);
> -	if (ctx.surface == NULL)
> +	}
> +	if (ctx.surface == NULL) {
> +		fprintf(stderr, "Failed to create X11 window.\n");
>  		ctx.surface = kms_overlay_create(&config, &ctx.width, &ctx.height);
> -	if (ctx.surface == NULL)
> +	}
> +	if (ctx.surface == NULL) {
> +		fprintf(stderr, "Failed to create KMS overlay.\n");
>  		return ENXIO;
> +	}
>  
>  	if (daemonize && daemon(0, 0))
>  		return EINVAL;
> @@ -913,7 +930,20 @@ int main(int argc, char **argv)
>  	if (renice && (nice(renice) == -1))
>  		fprintf(stderr, "Could not renice: %s\n", strerror(errno));
>  
> -	signal(SIGUSR1, signal_snapshot);
> +	sa.sa_flags = SA_SIGINFO;
> +	sigemptyset(&sa.sa_mask);
> +	sa.sa_sigaction = &signal_snapshot;
> +
> +	if (sigaction(SIGUSR1, &sa, NULL) == -1) {

Any particular reason for a fondness here for sigaction?
-Chris
Marius Vlad Nov. 18, 2015, 1:51 p.m. UTC | #2
-----Original Message-----
From: Chris Wilson [mailto:chris@chris-wilson.co.uk] 
Sent: Wednesday, November 18, 2015 2:59 PM
To: Vlad, Marius C <marius.c.vlad@intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [Intel-gfx] [PATCH i-g-t] overlay/intel-gpu-overlay

On Wed, Nov 18, 2015 at 02:40:29PM +0200, marius.c.vlad@intel.com wrote:
> From: Marius Vlad <marius.c.vlad@intel.com>
> 
> Use sigaction() instead of signal() and add SIGINT, SIGTERM to close 
> the overlay window. With this change the overlay window will be 
> destroyed.
> 
> Signed-off-by: Marius Vlad <marius.c.vlad@intel.com>
> ---
>  overlay/overlay.c | 42 ++++++++++++++++++++++++++++++++++++------
>  1 file changed, 36 insertions(+), 6 deletions(-)
> 
> diff --git a/overlay/overlay.c b/overlay/overlay.c index 
> 3c0dbb4..48ba67c 100644
> --- a/overlay/overlay.c
> +++ b/overlay/overlay.c
> @@ -804,11 +804,19 @@ static void show_gem_objects(struct 
> overlay_context *ctx, struct overlay_gem_obj
>  
>  static int take_snapshot;
>  
> -static void signal_snapshot(int sig)
> +static void
> +signal_snapshot(int sig, siginfo_t *si, void *__unused)
>  {
>  	take_snapshot = sig;
>  }
>  
> +static void
> +signal_x11_destroy(int sig, siginfo_t *si, void *__unused) {
> +	x11_overlay_stop();

is not signalsafe.

Indeed. Any ideas then? I'm hitting a weird system hang if the overlay window is open
for a period of time (although period ranges to minutes it seems to happen each time). If the window
is closed and process exits I don't see this behavior. This is entirely different bug but meanwhile 
wanted to keep my machine running.

> +	if (ctx.surface == NULL) {
> +		fprintf(stderr, "Failed to create X11 overlay.\n");

Spurious changes.

Right, just debugging. 

>  		ctx.surface = x11_window_create(&config, &ctx.width, &ctx.height);
> -	if (ctx.surface == NULL)
> +	}
> +	if (ctx.surface == NULL) {
> +		fprintf(stderr, "Failed to create X11 window.\n");
>  		ctx.surface = kms_overlay_create(&config, &ctx.width, &ctx.height);
> -	if (ctx.surface == NULL)
> +	}
> +	if (ctx.surface == NULL) {
> +		fprintf(stderr, "Failed to create KMS overlay.\n");
>  		return ENXIO;
> +	}
>  
>  	if (daemonize && daemon(0, 0))
>  		return EINVAL;
> @@ -913,7 +930,20 @@ int main(int argc, char **argv)
>  	if (renice && (nice(renice) == -1))
>  		fprintf(stderr, "Could not renice: %s\n", strerror(errno));
>  
> -	signal(SIGUSR1, signal_snapshot);
> +	sa.sa_flags = SA_SIGINFO;
> +	sigemptyset(&sa.sa_mask);
> +	sa.sa_sigaction = &signal_snapshot;
> +
> +	if (sigaction(SIGUSR1, &sa, NULL) == -1) {

Any particular reason for a fondness here for sigaction?

Well signal(2) states to avoid it and instead use sigaction(). I'm not that fond of it :)

-Chris

--
Chris Wilson, Intel Open Source Technology Centre
Chris Wilson Nov. 18, 2015, 2:01 p.m. UTC | #3
On Wed, Nov 18, 2015 at 01:51:57PM +0000, Vlad, Marius C wrote:
> 
> 
> -----Original Message-----
> From: Chris Wilson [mailto:chris@chris-wilson.co.uk] 
> Sent: Wednesday, November 18, 2015 2:59 PM
> To: Vlad, Marius C <marius.c.vlad@intel.com>
> Cc: intel-gfx@lists.freedesktop.org
> Subject: Re: [Intel-gfx] [PATCH i-g-t] overlay/intel-gpu-overlay
> 
> On Wed, Nov 18, 2015 at 02:40:29PM +0200, marius.c.vlad@intel.com wrote:
> > From: Marius Vlad <marius.c.vlad@intel.com>
> > 
> > Use sigaction() instead of signal() and add SIGINT, SIGTERM to close 
> > the overlay window. With this change the overlay window will be 
> > destroyed.
> > 
> > Signed-off-by: Marius Vlad <marius.c.vlad@intel.com>
> > ---
> >  overlay/overlay.c | 42 ++++++++++++++++++++++++++++++++++++------
> >  1 file changed, 36 insertions(+), 6 deletions(-)
> > 
> > diff --git a/overlay/overlay.c b/overlay/overlay.c index 
> > 3c0dbb4..48ba67c 100644
> > --- a/overlay/overlay.c
> > +++ b/overlay/overlay.c
> > @@ -804,11 +804,19 @@ static void show_gem_objects(struct 
> > overlay_context *ctx, struct overlay_gem_obj
> >  
> >  static int take_snapshot;
> >  
> > -static void signal_snapshot(int sig)
> > +static void
> > +signal_snapshot(int sig, siginfo_t *si, void *__unused)
> >  {
> >  	take_snapshot = sig;
> >  }
> >  
> > +static void
> > +signal_x11_destroy(int sig, siginfo_t *si, void *__unused) {
> > +	x11_overlay_stop();
> 
> is not signalsafe.
> 
> Indeed. Any ideas then? I'm hitting a weird system hang if the overlay window is open
> for a period of time (although period ranges to minutes it seems to happen each time). If the window
> is closed and process exits I don't see this behavior. This is entirely different bug but meanwhile 
> wanted to keep my machine running.

Yes, it is a known hw (on ivb/hsw) issue with concurrent access to
registers. We need the i915 perf interface to avoid it (as then we can
serialise all register access).
-Chris
diff mbox

Patch

diff --git a/overlay/overlay.c b/overlay/overlay.c
index 3c0dbb4..48ba67c 100644
--- a/overlay/overlay.c
+++ b/overlay/overlay.c
@@ -804,11 +804,19 @@  static void show_gem_objects(struct overlay_context *ctx, struct overlay_gem_obj
 
 static int take_snapshot;
 
-static void signal_snapshot(int sig)
+static void
+signal_snapshot(int sig, siginfo_t *si, void *__unused)
 {
 	take_snapshot = sig;
 }
 
+static void
+signal_x11_destroy(int sig, siginfo_t *si, void *__unused)
+{
+	x11_overlay_stop();
+	exit(EXIT_SUCCESS);
+}
+
 static int get_sample_period(struct config *config)
 {
 	const char *value;
@@ -854,6 +862,7 @@  int main(int argc, char **argv)
 	};
 	struct overlay_context ctx;
 	struct config config;
+	struct sigaction sa;
 	int index, sample_period;
 	int daemonize = 1, renice = 0;
 	int i;
@@ -898,14 +907,22 @@  int main(int argc, char **argv)
 	ctx.width = 640;
 	ctx.height = 236;
 	ctx.surface = NULL;
-	if (ctx.surface == NULL)
+
+	if (ctx.surface == NULL) {
 		ctx.surface = x11_overlay_create(&config, &ctx.width, &ctx.height);
-	if (ctx.surface == NULL)
+	}
+	if (ctx.surface == NULL) {
+		fprintf(stderr, "Failed to create X11 overlay.\n");
 		ctx.surface = x11_window_create(&config, &ctx.width, &ctx.height);
-	if (ctx.surface == NULL)
+	}
+	if (ctx.surface == NULL) {
+		fprintf(stderr, "Failed to create X11 window.\n");
 		ctx.surface = kms_overlay_create(&config, &ctx.width, &ctx.height);
-	if (ctx.surface == NULL)
+	}
+	if (ctx.surface == NULL) {
+		fprintf(stderr, "Failed to create KMS overlay.\n");
 		return ENXIO;
+	}
 
 	if (daemonize && daemon(0, 0))
 		return EINVAL;
@@ -913,7 +930,20 @@  int main(int argc, char **argv)
 	if (renice && (nice(renice) == -1))
 		fprintf(stderr, "Could not renice: %s\n", strerror(errno));
 
-	signal(SIGUSR1, signal_snapshot);
+	sa.sa_flags = SA_SIGINFO;
+	sigemptyset(&sa.sa_mask);
+	sa.sa_sigaction = &signal_snapshot;
+
+	if (sigaction(SIGUSR1, &sa, NULL) == -1) {
+		x11_overlay_stop();
+		return EXIT_FAILURE;
+	}
+
+	sa.sa_sigaction = &signal_x11_destroy;
+	if (sigaction(SIGINT | SIGTERM, &sa, NULL) == -1) {
+		x11_overlay_stop();
+		return EXIT_FAILURE;
+	}
 
 	debugfs_init();