[DTrace-devel] [PATCH v2 13/16 was 11/12] Abort if provider population fails for any provider

Kris Van Hees kris.van.hees at oracle.com
Fri Jan 12 21:18:57 UTC 2024


On Fri, Jan 12, 2024 at 02:42:21PM -0500, Eugene Loh via DTrace-devel wrote:
> Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
> 
> Just curious:
> 
> *)   ip lockstat sched:  They do not seem to need any changes and they get
> no changes, yet their copyright years are updated. Intentional?

Ah, that is true.  I went through all providers but forgot I didn't have to
change those three.  Will remove the copyright year change.

> *)  fbt rawtp sdt syscall:  If fopen() fails, we return 0 rather than -1. 
> Intentional?  Or should they return -1?

Yes, that is intentional.  Not being able to read the source file for probes
is not a fatal error.

> On 1/12/24 01:04, Kris Van Hees via DTrace-devel wrote:
> > Signed-off-by: Kris Van Hees<kris.van.hees at oracle.com>
> > ---
> >   libdtrace/dt_open.c          |  5 ++++-
> >   libdtrace/dt_prov_cpc.c      |  8 +++++---
> >   libdtrace/dt_prov_dtrace.c   |  4 ++--
> >   libdtrace/dt_prov_fbt.c      |  4 ++--
> >   libdtrace/dt_prov_ip.c       |  2 +-
> >   libdtrace/dt_prov_lockstat.c |  2 +-
> >   libdtrace/dt_prov_proc.c     |  2 +-
> >   libdtrace/dt_prov_profile.c  |  4 ++--
> >   libdtrace/dt_prov_rawtp.c    |  4 ++--
> >   libdtrace/dt_prov_sched.c    |  2 +-
> >   libdtrace/dt_prov_sdt.c      |  4 ++--
> >   libdtrace/dt_prov_syscall.c  |  4 ++--
> >   libdtrace/dt_prov_uprobe.c   | 16 ++++++++++------
> >   libdtrace/dt_provider.c      | 18 +++++++++++-------
> >   libdtrace/dt_provider_sdt.c  |  6 +++---
> >   15 files changed, 49 insertions(+), 36 deletions(-)
> > 
> > diff --git a/libdtrace/dt_open.c b/libdtrace/dt_open.c
> > index c5bbab1a..0be0ce9d 100644
> > --- a/libdtrace/dt_open.c
> > +++ b/libdtrace/dt_open.c
> > @@ -1,6 +1,6 @@
> >   /*
> >    * Oracle Linux DTrace.
> > - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved.
> >    * Licensed under the Universal Permissive License v 1.0 as shown at
> >    *http://oss.oracle.com/licenses/upl.
> >    */
> > @@ -1208,6 +1208,9 @@ dtrace_init(dtrace_hdl_t *dtp)
> >   		int	n;
> >   		n = dt_providers[i]->populate(dtp);
> > +		if (n < 0)
> > +			return -1;		/* errno is already set */
> > +
> >   		dt_dprintf("loaded %d probes for %s\n", n,
> >   			   dt_providers[i]->name);
> >   	}
> > diff --git a/libdtrace/dt_prov_cpc.c b/libdtrace/dt_prov_cpc.c
> > index 4062eaa6..3bb1aaa2 100644
> > --- a/libdtrace/dt_prov_cpc.c
> > +++ b/libdtrace/dt_prov_cpc.c
> > @@ -1,6 +1,6 @@
> >   /*
> >    * Oracle Linux DTrace.
> > - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
> >    * Licensed under the Universal Permissive License v 1.0 as shown at
> >    *http://oss.oracle.com/licenses/upl.
> >    *
> > @@ -82,13 +82,15 @@ static int populate(dtrace_hdl_t *dtp)
> >   	dt_provider_t	*prv;
> >   	if (listp == NULL)
> > -		return 0;
> > +		return dt_set_errno(dtp, EDT_NOMEM);
> >   	prv = dt_provider_create(dtp, prvname, &dt_cpc, &pattr, listp);
> > +	if (prv == NULL)
> > +		return -1;			/* errno already set */
> >   	/* incidentally, pfm_strerror(pfm_initialize()) describes the error */
> >   	if (pfm_initialize() != PFM_SUCCESS)
> > -		return 0;
> > +		return dt_set_errno(dtp, EDT_ERRABORT);
> >   	/* loop over PMUs (FWIW, ipmu=PFM_PMU_PERF_EVENT is among them) */
> >   	for (pfm_pmu_t ipmu = PFM_PMU_NONE; ipmu < PFM_PMU_MAX; ipmu ++) {
> > diff --git a/libdtrace/dt_prov_dtrace.c b/libdtrace/dt_prov_dtrace.c
> > index 47427455..5b40038c 100644
> > --- a/libdtrace/dt_prov_dtrace.c
> > +++ b/libdtrace/dt_prov_dtrace.c
> > @@ -1,6 +1,6 @@
> >   /*
> >    * Oracle Linux DTrace.
> > - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
> >    * Licensed under the Universal Permissive License v 1.0 as shown at
> >    *http://oss.oracle.com/licenses/upl.
> >    *
> > @@ -42,7 +42,7 @@ static int populate(dtrace_hdl_t *dtp)
> >   	prv = dt_provider_create(dtp, prvname, &dt_dtrace, &pattr, NULL);
> >   	if (prv == NULL)
> > -		return 0;
> > +		return -1;			/* errno already set */
> >   	prp = dt_tp_probe_insert(dtp, prv, prvname, modname, funname, "BEGIN");
> >   	if (prp) {
> > diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
> > index 92ac4ec4..ff9cfec5 100644
> > --- a/libdtrace/dt_prov_fbt.c
> > +++ b/libdtrace/dt_prov_fbt.c
> > @@ -1,6 +1,6 @@
> >   /*
> >    * Oracle Linux DTrace.
> > - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
> >    * Licensed under the Universal Permissive License v 1.0 as shown at
> >    *http://oss.oracle.com/licenses/upl.
> >    *
> > @@ -71,7 +71,7 @@ static int populate(dtrace_hdl_t *dtp)
> >   	prv = dt_provider_create(dtp, prvname, &dt_fbt, &pattr, NULL);
> >   	if (prv == NULL)
> > -		return 0;
> > +		return -1;			/* errno already set */
> >   	f = fopen(PROBE_LIST, "r");
> >   	if (f == NULL)
> > diff --git a/libdtrace/dt_prov_ip.c b/libdtrace/dt_prov_ip.c
> > index 03e929b6..7d2a8dee 100644
> > --- a/libdtrace/dt_prov_ip.c
> > +++ b/libdtrace/dt_prov_ip.c
> > @@ -1,6 +1,6 @@
> >   /*
> >    * Oracle Linux DTrace.
> > - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
> >    * Licensed under the Universal Permissive License v 1.0 as shown at
> >    *http://oss.oracle.com/licenses/upl.
> >    *
> > diff --git a/libdtrace/dt_prov_lockstat.c b/libdtrace/dt_prov_lockstat.c
> > index 5e81094a..1a64a8bd 100644
> > --- a/libdtrace/dt_prov_lockstat.c
> > +++ b/libdtrace/dt_prov_lockstat.c
> > @@ -1,6 +1,6 @@
> >   /*
> >    * Oracle Linux DTrace.
> > - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
> >    * Licensed under the Universal Permissive License v 1.0 as shown at
> >    *http://oss.oracle.com/licenses/upl.
> >    *
> > diff --git a/libdtrace/dt_prov_proc.c b/libdtrace/dt_prov_proc.c
> > index b59aa6a3..8ff8e105 100644
> > --- a/libdtrace/dt_prov_proc.c
> > +++ b/libdtrace/dt_prov_proc.c
> > @@ -123,7 +123,7 @@ static int populate(dtrace_hdl_t *dtp)
> >   	prv = dt_provider_create(dtp, prvname, &dt_proc, &pattr, NULL);
> >   	if (prv == NULL)
> > -		return 0;
> > +		return -1;			/* errno already set */
> >   	/*
> >   	 * Create "proc" probes based on the probe_args list.  Since each probe
> > diff --git a/libdtrace/dt_prov_profile.c b/libdtrace/dt_prov_profile.c
> > index 16345d32..72156f5d 100644
> > --- a/libdtrace/dt_prov_profile.c
> > +++ b/libdtrace/dt_prov_profile.c
> > @@ -1,6 +1,6 @@
> >   /*
> >    * Oracle Linux DTrace.
> > - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
> >    * Licensed under the Universal Permissive License v 1.0 as shown at
> >    *http://oss.oracle.com/licenses/upl.
> >    *
> > @@ -78,7 +78,7 @@ static int populate(dtrace_hdl_t *dtp)
> >   	prv = dt_provider_create(dtp, prvname, &dt_profile, &pattr, NULL);
> >   	if (prv == NULL)
> > -		return 0;
> > +		return -1;			/* errno already set */
> >   	for (i = 0; i < ARRAY_SIZE(profile_n); i++) {
> >   		snprintf(buf, sizeof(buf), PREFIX_PROFILE "%d", profile_n[i]);
> > diff --git a/libdtrace/dt_prov_rawtp.c b/libdtrace/dt_prov_rawtp.c
> > index 67c94f10..c604fa3c 100644
> > --- a/libdtrace/dt_prov_rawtp.c
> > +++ b/libdtrace/dt_prov_rawtp.c
> > @@ -1,6 +1,6 @@
> >   /*
> >    * Oracle Linux DTrace.
> > - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
> >    * Licensed under the Universal Permissive License v 1.0 as shown at
> >    *http://oss.oracle.com/licenses/upl.
> >    *
> > @@ -73,7 +73,7 @@ static int populate(dtrace_hdl_t *dtp)
> >   	prv = dt_provider_create(dtp, prvname, &dt_rawtp, &pattr, NULL);
> >   	if (prv == NULL)
> > -		return 0;
> > +		return -1;			/* errno already set */
> >   	f = fopen(PROBE_LIST, "r");
> >   	if (f == NULL)
> > diff --git a/libdtrace/dt_prov_sched.c b/libdtrace/dt_prov_sched.c
> > index 8703c936..6d6f2679 100644
> > --- a/libdtrace/dt_prov_sched.c
> > +++ b/libdtrace/dt_prov_sched.c
> > @@ -1,6 +1,6 @@
> >   /*
> >    * Oracle Linux DTrace.
> > - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
> >    * Licensed under the Universal Permissive License v 1.0 as shown at
> >    *http://oss.oracle.com/licenses/upl.
> >    *
> > diff --git a/libdtrace/dt_prov_sdt.c b/libdtrace/dt_prov_sdt.c
> > index 8690fc47..7742ffac 100644
> > --- a/libdtrace/dt_prov_sdt.c
> > +++ b/libdtrace/dt_prov_sdt.c
> > @@ -1,6 +1,6 @@
> >   /*
> >    * Oracle Linux DTrace.
> > - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
> >    * Licensed under the Universal Permissive License v 1.0 as shown at
> >    *http://oss.oracle.com/licenses/upl.
> >    *
> > @@ -70,7 +70,7 @@ static int populate(dtrace_hdl_t *dtp)
> >   	prv = dt_provider_create(dtp, prvname, &dt_sdt, &pattr, NULL);
> >   	if (prv == NULL)
> > -		return 0;
> > +		return -1;			/* errno already set */
> >   	f = fopen(PROBE_LIST, "r");
> >   	if (f == NULL)
> > diff --git a/libdtrace/dt_prov_syscall.c b/libdtrace/dt_prov_syscall.c
> > index d2f2aac1..9e048ae5 100644
> > --- a/libdtrace/dt_prov_syscall.c
> > +++ b/libdtrace/dt_prov_syscall.c
> > @@ -1,6 +1,6 @@
> >   /*
> >    * Oracle Linux DTrace.
> > - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
> >    * Licensed under the Universal Permissive License v 1.0 as shown at
> >    *http://oss.oracle.com/licenses/upl.
> >    *
> > @@ -77,7 +77,7 @@ static int populate(dtrace_hdl_t *dtp)
> >   	prv = dt_provider_create(dtp, prvname, &dt_syscall, &pattr, NULL);
> >   	if (prv == NULL)
> > -		return 0;
> > +		return -1;			/* errno already set */
> >   	f = fopen(PROBE_LIST, "r");
> >   	if (f == NULL)
> > diff --git a/libdtrace/dt_prov_uprobe.c b/libdtrace/dt_prov_uprobe.c
> > index 5dc5c75c..6c3b004f 100644
> > --- a/libdtrace/dt_prov_uprobe.c
> > +++ b/libdtrace/dt_prov_uprobe.c
> > @@ -1,6 +1,6 @@
> >   /*
> >    * Oracle Linux DTrace.
> > - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
> >    * Licensed under the Universal Permissive License v 1.0 as shown at
> >    *http://oss.oracle.com/licenses/upl.
> >    *
> > @@ -62,11 +62,15 @@ dt_provimpl_t	dt_usdt;
> >   static int populate(dtrace_hdl_t *dtp)
> >   {
> > -	dt_provider_create(dtp, dt_uprobe.name, &dt_uprobe, &pattr, NULL);
> > -	dt_provider_create(dtp, dt_uprobe_is_enabled.name,
> > -			   &dt_uprobe_is_enabled, &pattr, NULL);
> > -	dt_provider_create(dtp, dt_pid.name, &dt_pid, &pattr, NULL);
> > -	dt_provider_create(dtp, dt_usdt.name, &dt_usdt, &pattr, NULL);
> > +	if (dt_provider_create(dtp, dt_uprobe.name, &dt_uprobe, &pattr,
> > +			       NULL) == NULL ||
> > +	    dt_provider_create(dtp, dt_uprobe_is_enabled.name,
> > +			       &dt_uprobe_is_enabled, &pattr, NULL) == NULL ||
> > +	    dt_provider_create(dtp, dt_pid.name, &dt_pid, &pattr,
> > +			       NULL) == NULL ||
> > +	    dt_provider_create(dtp, dt_usdt.name, &dt_usdt, &pattr,
> > +			       NULL) == NULL)
> > +		return -1;			/* errno already set */
> >   	return 0;
> >   }
> > diff --git a/libdtrace/dt_provider.c b/libdtrace/dt_provider.c
> > index b601c31a..8cfef0ba 100644
> > --- a/libdtrace/dt_provider.c
> > +++ b/libdtrace/dt_provider.c
> > @@ -1,6 +1,6 @@
> >   /*
> >    * Oracle Linux DTrace.
> > - * Copyright (c) 2006, 2023, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2006, 2024, Oracle and/or its affiliates. All rights reserved.
> >    * Licensed under the Universal Permissive License v 1.0 as shown at
> >    *http://oss.oracle.com/licenses/upl.
> >    */
> > @@ -100,7 +100,7 @@ dt_provider_create(dtrace_hdl_t *dtp, const char *name,
> >   	dt_provider_t *pvp;
> >   	if ((pvp = dt_zalloc(dtp, sizeof(dt_provider_t))) == NULL)
> > -		return NULL;
> > +		goto nomem;
> >   	strlcpy(pvp->desc.dtvd_name, name, DTRACE_PROVNAMELEN);
> >   	pvp->impl = impl;
> > @@ -110,15 +110,19 @@ dt_provider_create(dtrace_hdl_t *dtp, const char *name,
> >   	pvp->prv_data = datap;
> >   	dt_dprintf("creating provider %s\n", name);
> > -	if (pvp->pv_probes == NULL) {
> > -		dt_free(dtp, pvp);
> > -		dt_set_errno(dtp, EDT_NOMEM);
> > -		return NULL;
> > -	}
> > +	if (pvp->pv_probes == NULL)
> > +		goto nomem;
> >   	memcpy(&pvp->desc.dtvd_attr, pattr, sizeof(dtrace_pattr_t));
> >   	return dt_provider_insert(dtp, pvp);
> > +
> > +nomem:
> > +	if (pvp)
> > +		dt_free(dtp, pvp);
> > +
> > +	dt_set_errno(dtp, EDT_NOMEM);
> > +	return NULL;
> >   }
> >   int
> > diff --git a/libdtrace/dt_provider_sdt.c b/libdtrace/dt_provider_sdt.c
> > index 823e9b2a..a81668fb 100644
> > --- a/libdtrace/dt_provider_sdt.c
> > +++ b/libdtrace/dt_provider_sdt.c
> > @@ -1,6 +1,6 @@
> >   /*
> >    * Oracle Linux DTrace.
> > - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
> > + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
> >    * Licensed under the Universal Permissive License v 1.0 as shown at
> >    *http://oss.oracle.com/licenses/upl.
> >    *
> > @@ -34,13 +34,13 @@ dt_sdt_populate(dtrace_hdl_t *dtp, const char *prvname, const char *modname,
> >   	sdp = dt_alloc(dtp, sizeof(sdt_data_t));
> >   	if (sdp == NULL)
> > -		return 0;
> > +		return dt_set_errno(dtp, EDT_NOMEM);
> >   	sdp->probes = probes;
> >   	sdp->probe_args = probe_args;
> >   	prv = dt_provider_create(dtp, prvname, ops, pattr, sdp);
> >   	if (prv == NULL)
> > -		return 0;
> > +		return -1;			/* errno already set */
> >   	/*
> >   	 * Create SDT probes based on the probe_args list.  Since each probe
> > -- 2.42.0 _______________________________________________ DTrace-devel
> > mailing list DTrace-devel at oss.oracle.com
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list