elf obj load: skip zero-sized sections early

2010-06-25 Thread Andriy Gapon

Proposed patch skips zero sized sections without going into trouble of
allocating section entry (progtab), doing zero-sized memory allocs and copies.
I observe that sometimes zero-sized set_pcpu sections are produced in module
objects, maybe when a module doesn't create any per cpu data of its one, but
references external pcpu data.  Not sure.

Main goal of this patch is to play nice with external debugging tools (e.g.
kgdb) which ignore zero-sized sections outright.  Current code effectively
ignores but may apply their alignment to the next non-zero section if its
required alignment is smaller.  So the patch should get rid of that side effect
as well as do some very tiny resource conservation.

This work is based on np@'s investigation and original patch:
http://lists.freebsd.org/pipermail/freebsd-hackers/2009-November/030093.html

diff --git a/sys/boot/common/load_elf_obj.c b/sys/boot/common/load_elf_obj.c
index 4b3aaea..6f3b349 100644
--- a/sys/boot/common/load_elf_obj.c
+++ b/sys/boot/common/load_elf_obj.c
@@ -221,6 +221,8 @@ __elfN(obj_loadimage)(struct preloaded_file *fp, elf_file_t
ef, u_int64_t off)
for (i = 0; i  hdr-e_shnum; i++)
shdr[i].sh_addr = 0;
for (i = 0; i  hdr-e_shnum; i++) {
+   if (shdr[i].sh_size == 0)
+   continue;
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
case SHT_NOBITS:
diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c
index a337fd0..b0df57d 100644
--- a/sys/kern/link_elf_obj.c
+++ b/sys/kern/link_elf_obj.c
@@ -555,6 +555,8 @@ link_elf_load_file(linker_class_t cls, const char *filename,
symtabindex = -1;
symstrindex = -1;
for (i = 0; i  hdr-e_shnum; i++) {
+   if (shdr[i].sh_size == 0)
+   continue;
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
case SHT_NOBITS:
@@ -677,6 +679,8 @@ link_elf_load_file(linker_class_t cls, const char *filename,
/* Size up code/data(progbits) and bss(nobits). */
alignmask = 0;
for (i = 0; i  hdr-e_shnum; i++) {
+   if (shdr[i].sh_size == 0)
+   continue;
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
case SHT_NOBITS:
@@ -737,6 +741,8 @@ link_elf_load_file(linker_class_t cls, const char *filename,
ra = 0;
alignmask = 0;
for (i = 0; i  hdr-e_shnum; i++) {
+   if (shdr[i].sh_size == 0)
+   continue;
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
case SHT_NOBITS:

-- 
Andriy Gapon
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: using cupsd instead of base lpr [was Re: [HEADS UP] Kernel modules don't work properly in FreeBSD 8.1-RC1 (solved)]

2010-06-25 Thread Gary Jennejohn
On Thu, 24 Jun 2010 09:54:45 -0700
Ted Faber fa...@isi.edu wrote:

 On Thu, Jun 24, 2010 at 08:29:57AM -0700, Ted Faber wrote:
  On Thu, Jun 24, 2010 at 09:40:00AM +0100, Tom Evans wrote:
   I also have this in make.conf:
   CUPS_OVERWRITE_BASE=yes
   WITHOUT_LPR=yes
   
   which print/cups-base uses to do make any lpr related binaries in
   /usr/bin non-executable, so they are skipped over and the cups
   specific ones in /usr/loca/bin are used instead. WITHOUT_LPR just
   stops LPR being built by buildworld.
  
  The clear winner, and one I was unaware of.
  
  Thanks, Tom.
 
 CUPS_OVERWRITE_BASE seems to do an odd thing.  It doesn't install the
 cups binaries in /usr/bin, but it does do a chmod  on everything it
 replaces in /usr/bin .  For example
 
 praxis:~$ ls -l /usr/bin/lpr
 -r-sr-sr-x  1 root  daemon  29876 Jun 24 09:16 /usr/bin/lpr
 # portupgrade -f cups-base-1.4.3
 praxis:~$ ls -l /usr/bin/lpr
 --  1 root  daemon  29876 Jun 24 09:16 /usr/bin/lpr
 
 I'll still use it, but interesting behavior.
 

IMO if you're going to make the binaries in base non-executable you might
just as well delete them.

But CUPS_OVERWRITE_BASE does have the advantage that it works without
(active) user intervention.

--
Gary Jennejohn
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: amd64 kernel modules: mapping sections to addresses

2010-06-25 Thread Andriy Gapon

Here's a patch that is supposed to do the right thing for dtrace.
Perhaps I should have put the new code under __amd64__, but I decided to go more
generic and check for module's ELF type (ET_REL).

Reviews and testing are welcome!

diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_impl.h
b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_impl.h
index 6bcc5bc..a712d24 100644
--- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_impl.h
+++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_impl.h
@@ -137,6 +137,7 @@ typedef struct dt_module {
dt_idhash_t *dm_extern; /* external symbol definitions */
 #if !defined(sun)
caddr_t dm_reloc_offset;/* Symbol relocation offset. */
+   uintptr_t *dm_sec_offsets;
 #endif
 } dt_module_t;

diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c
b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c
index af17501..d33fb95 100644
--- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c
+++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c
@@ -83,6 +83,14 @@ dt_module_syminit32(dt_module_t *dmp)
uint_t i, n = dmp-dm_nsymelems;
uint_t asrsv = 0;

+#if defined(__FreeBSD__)
+   GElf_Ehdr ehdr;
+   int is_elf_obj;
+
+   gelf_getehdr(dmp-dm_elf, ehdr);
+   is_elf_obj = (ehdr.e_type == ET_REL);
+#endif
+
for (i = 0; i  n; i++, sym++) {
const char *name = base + sym-st_name;
uchar_t type = ELF32_ST_TYPE(sym-st_info);
@@ -97,8 +105,12 @@ dt_module_syminit32(dt_module_t *dmp)
(ELF32_ST_BIND(sym-st_info) != STB_LOCAL || sym-st_size)) 
{
asrsv++; /* reserve space in the address map */

-#if !defined(sun)
+#if defined(__FreeBSD__)
sym-st_value += (Elf_Addr) dmp-dm_reloc_offset;
+   if (is_elf_obj  sym-st_shndx != SHN_UNDEF 
+   sym-st_shndx  ehdr.e_shnum)
+   sym-st_value +=
+   dmp-dm_sec_offsets[sym-st_shndx];
 #endif
}

@@ -117,6 +129,14 @@ dt_module_syminit64(dt_module_t *dmp)
uint_t i, n = dmp-dm_nsymelems;
uint_t asrsv = 0;

+#if defined(__FreeBSD__)
+   GElf_Ehdr ehdr;
+   int is_elf_obj;
+
+   gelf_getehdr(dmp-dm_elf, ehdr);
+   is_elf_obj = (ehdr.e_type == ET_REL);
+#endif
+
for (i = 0; i  n; i++, sym++) {
const char *name = base + sym-st_name;
uchar_t type = ELF64_ST_TYPE(sym-st_info);
@@ -130,9 +150,12 @@ dt_module_syminit64(dt_module_t *dmp)
if (sym-st_value != 0 
(ELF64_ST_BIND(sym-st_info) != STB_LOCAL || sym-st_size)) 
{
asrsv++; /* reserve space in the address map */
-
-#if !defined(sun)
+#if defined(__FreeBSD__)
sym-st_value += (Elf_Addr) dmp-dm_reloc_offset;
+   if (is_elf_obj  sym-st_shndx != SHN_UNDEF 
+   sym-st_shndx  ehdr.e_shnum)
+   sym-st_value +=
+   dmp-dm_sec_offsets[sym-st_shndx];
 #endif
}

@@ -722,7 +745,12 @@ dt_module_unload(dtrace_hdl_t *dtp, dt_module_t *dmp)
free(dmp-dm_asmap);
dmp-dm_asmap = NULL;
}
-
+#if defined(__FreeBSD__)
+   if (dmp-dm_sec_offsets != NULL) {
+   free(dmp-dm_sec_offsets);
+   dmp-dm_sec_offsets = NULL;
+   }
+#endif
dmp-dm_symfree = 0;
dmp-dm_nsymbuckets = 0;
dmp-dm_nsymelems = 0;
@@ -846,9 +874,12 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat
*k_stat)
(void) snprintf(fname, sizeof (fname),
%s/%s/object, OBJFS_ROOT, name);
 #else
+   GElf_Ehdr ehdr;
GElf_Phdr ph;
char name[MAXPATHLEN];
+   uintptr_t mapbase, alignmask;
int i = 0;
+   int is_elf_obj;

(void) strlcpy(name, k_stat-name, sizeof(name));
(void) strlcpy(fname, k_stat-pathname, sizeof(fname));
@@ -893,7 +924,20 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat
*k_stat)
dt_module_destroy(dtp, dmp);
return;
}
-
+#if defined(__FreeBSD__)
+   mapbase = (uintptr_t)k_stat-address;
+   gelf_getehdr(dmp-dm_elf, ehdr);
+   is_elf_obj = (ehdr.e_type == ET_REL);
+   if (is_elf_obj) {
+   dmp-dm_sec_offsets =
+   malloc(ehdr.e_shnum * sizeof(*dmp-dm_sec_offsets));
+   if (dmp-dm_sec_offsets == NULL) {
+   dt_dprintf(failed to allocate memory\n);
+   dt_module_destroy(dtp, dmp);
+   return;
+   }
+   }
+#endif
/*
 * Iterate over the section headers locating various sections of
 * interest and use their attributes to flesh out the dt_module_t.
@@ -902,7 +946,19 @@ dt_module_update(dtrace_hdl_t 

hg convert stopped working

2010-06-25 Thread Daniel Braniss
Hi,
probably wrong place to ask, but I great minds lurk here :-)

I have been mirroing FreeBSD via svn since last summer,
svnsync sync file:///cs/svn/freebsd/base
then converting to mercurial
hg convert ... file:///cs/svn/freebsd/base ${HG_HOME}/bsd/stable/8 ...
since I can better track local changes, all worked nice till someone
- probably me, while upgrading firefox, screwed up svn - it happens :-)
So I upgraded svn, and now my svnsync worked again, but mercurial stopped
working, so upgarded mercurial, but it's still not working:

Traceback (most recent call last):
  File /usr/local/lib/python2.6/site-packages/hgext/convert/hg.py, line 223, 
in __init__
self.repo = hg.repository(self.ui, path)
  File /usr/local/lib/python2.6/site-packages/mercurial/hg.py, line 82, in 
repository
repo = _lookup(path).instance(ui, path, create)
  File /usr/local/lib/python2.6/site-packages/mercurial/localrepo.py, line 
2223, in instance
return localrepository(ui, util.drop_scheme('file', path), create)
  File /usr/local/lib/python2.6/site-packages/mercurial/localrepo.py, line 
62, in __init__
raise error.RepoError(_(repository %s not found) % path)
RepoError: repository /cs/svn/freebsd/base not found

but /cs/svn/freebsd/base is ok:

ls -lsd /cs/svn/freebsd/base
4 drwxr-xr-x  6 svn  svn  4096 Jun  7  2008 /cs/svn/freebsd/base

any help will be much appreciated,
thanks,
danny


___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: Help with some makefile hackery

2010-06-25 Thread Patrick Mahan

Dag-Erling,

I am using option 3 below.  I have the following in my
shell:

amd64-kernel.sh
#!/bin/sh
trap exit 1 1 2 3 15

export SRCROOT=`pwd -P`
export MAKEOBJDIRPREFIX=$SRCROOT/../amd64/obj
export SRCCONF=$SRCROOT/src.conf  # Use our private copy
export SECKNOB=-DPRIVATE
KERNCONF=TCONF

make NO_CLEAN=yes NO_PROFILE=yes NO_MODULES=yes KERNCONF=$KERNCONF buildkernel || 
exit 1

...


In the top-level makefile I have the following label:

src-kernel: src-kernel-tools
cd src; ./amd64-kernel.sh 21 | tee build_amd64_kernel.log

If there is a build failure with the kernel, it can be seen in the
file 'build_amd64_kernel.log'.  However, the top-level make file just
continues on to the next label as if no error occurs.

The reason we are using shell scripts is because of the environment
variables that need to be defined and some other house-keeping
stuff that I did not include in the above example.  Also, I wanted
scripts so the developer could just build individual groups
without resorting to building everything.

Thanks,

Patrick

Dag-Erling Smørgrav wrote:

Patrick Mahan ma...@mahan.org writes:

My issue is that if there is a build failure at any point, the
status does not seem to be propagated upward.  For example, if
the kernel fails to build due to incorrect code, the script
machine-kernel64.sh stops (verifable by examining the logfile),
however, the make will continue to the next target, src-world,
and continue building.  How do I propagate the status up to the
top-level make?


Your shell script needs to exit with a non-zero status if it fails.
There are several ways to do this.  For instance, if your shell script
looks like this:

  #!/bin/sh
  make TARGET=amd64 kernel-toolchain

you can:

 - prefix make with exec: sh will exec make instead of running it in
   a subshell, and the exit status will be whatever make returns.

 - add the following line at the bottom:

 exit $?

   which causes the shell script to exit with the same exit status as
   the last command it ran, in this case make.

 - append || exit 1 to the the make command line; this will cause
   the script to exit immediately with status 1 if make fails, otherwise
   it will continue (in case you want to do something else if make
   succeeds)

 - wrap the make command line in an if statement, which allows you do
   additional work depending on the outcome, and end the failure case
   with exit 1 or similar

 - insert the following line at any point between the shebang and the
   make command line:

 set -e

   this will cause sh to terminate the script immediately with a
   non-zero exit status if any command after the set line fails.

However, I don't see the point of using shell scripts in the first
place...

DES


___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: Help with some makefile hackery

2010-06-25 Thread Dag-Erling Smørgrav
Patrick Mahan ma...@mahan.org writes:
 In the top-level makefile I have the following label:

 src-kernel: src-kernel-tools
   cd src; ./amd64-kernel.sh 21 | tee build_amd64_kernel.log

 If there is a build failure with the kernel, it can be seen in the
 file 'build_amd64_kernel.log'.  However, the top-level make file just
 continues on to the next label as if no error occurs.

Make looks at tee's exit status, not the script's.

DES
-- 
Dag-Erling Smørgrav - d...@des.no
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: Help with some makefile hackery

2010-06-25 Thread Jilles Tjoelker
On Tue, Jun 22, 2010 at 11:18:43PM -0700, Patrick Mahan wrote:
 src-kern-tools:
  cd src; ./machine-kernel-toolchain.sh 21 | tee logfile

The pipeline will return the status of 'tee' which is almost always 0.
The exit status of the build script is ignored.

A simple fix is store the status in a file and refer to that afterwards.
Another fix uses a separate file descriptor to pass through the status,
like
  { st=$(
{
  { ./kernel-toolchain.sh 21 3- 4-; echo $? 3; } | tee logfile 4
} 31)
  } 41
but this is fairly complicated.

The issue can be sidestepped entirely by sending the output to a file
only; a developer can use tail -f to follow the build if necessary.

-- 
Jilles Tjoelker
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


What is the exected behavior with the NMI button?

2010-06-25 Thread Sean Bruno
While trying to get a deadlock sorted out in the GPROF code, I attempted
to use this fancy shmancy NMI button on my Dell server.

I noted that, not unlike the goggles, it did nothing once the system was
deadlocked.  I noted that when the system was running normally, an NMI
log message would be spewed to the console.

What is supposed to happen in these two cases when we toggle the NMI
button?

Sean

___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: What is the exected behavior with the NMI button?

2010-06-25 Thread Sean Bruno
On Fri, 2010-06-25 at 07:17 -0700, Sean Bruno wrote:
 While trying to get a deadlock sorted out in the GPROF code, I attempted
 to use this fancy shmancy NMI button on my Dell server.
 
 I noted that, not unlike the goggles, it did nothing once the system was
 deadlocked.  I noted that when the system was running normally, an NMI
 log message would be spewed to the console.


In the event you don't get the goggles reference.

http://www.youtube.com/watch?v=OqfOxm_1BE0

Sean


___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: Help with some makefile hackery

2010-06-25 Thread Patrick Mahan


Oy vey!

Good point!  Not something I had considered (but should have).  Is there
a way to propogate that status through the pipe?  I am using 'tee' so
that the master build (which invokes the top-level make) can also see
the make output.  But going back and reading the man page on 'sh' shows
me that on a pipline, the status is the status of the *last* command.

Maybe I should do this instead?

src-kernel: src-kernel-tools
cd src; ./amd64-kernel.sh 21  build_amd64_kernel.log; \
tail -f build_amd64_kernel.log

It is not too clear if the status is the last one in a compound command.

I will give that a try.

Thanks,

Patrick

Dag-Erling Smørgrav wrote:

Patrick Mahan ma...@mahan.org writes:

In the top-level makefile I have the following label:

src-kernel: src-kernel-tools
cd src; ./amd64-kernel.sh 21 | tee build_amd64_kernel.log

If there is a build failure with the kernel, it can be seen in the
file 'build_amd64_kernel.log'.  However, the top-level make file just
continues on to the next label as if no error occurs.


Make looks at tee's exit status, not the script's.

DES


___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: Help with some makefile hackery

2010-06-25 Thread Patrick Mahan

Jilles,

Thanks for the more complicated example.  I am always interested in
shell hacks like these, especially when they involve interesting uses
of file I/O redirection.

The tee is there so that the master build package (a perl script)
that builds not only my groups sources but other sources as well
is required to provide make 'output' for the master build log.

How is the status handled on compound commands?

   ./amd64-kernel.sh 21  build.log; tail -f build.log

would that obscure the exit status of the shell script as well? The
man page is not really clear on this.

Thanks,

Patrick

Jilles Tjoelker wrote:

On Tue, Jun 22, 2010 at 11:18:43PM -0700, Patrick Mahan wrote:

src-kern-tools:
 cd src; ./machine-kernel-toolchain.sh 21 | tee logfile


The pipeline will return the status of 'tee' which is almost always 0.
The exit status of the build script is ignored.

A simple fix is store the status in a file and refer to that afterwards.
Another fix uses a separate file descriptor to pass through the status,
like
  { st=$(
{
  { ./kernel-toolchain.sh 21 3- 4-; echo $? 3; } | tee logfile 4
} 31)
  } 41
but this is fairly complicated.

The issue can be sidestepped entirely by sending the output to a file
only; a developer can use tail -f to follow the build if necessary.


___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


[RFC] mtree improvements

2010-06-25 Thread David Naylor
Hi,

I've created a patch that increases the performance of mtree.  This is of 
particular use during a port install.  In an extreme case I have experienced a 
~20% increase [1].  

For a full discussion see PR bin/143732.  This arose out of [2] where I 
experienced the increase.  

For your convenience I have attached the patch.  

Please review this patch and if it is acceptable, commit it.  

Regards,

David

1] http://markmail.org/message/iju3l6hyv7s7emrb
2] http://markmail.org/message/gfztjpszl5dozzii

--- /usr/src/usr.sbin/mtree/verify.c	2010-02-07 15:07:28.0 +0200
+++ verify.c	2010-02-07 15:04:10.0 +0200
@@ -50,17 +50,23 @@
 static NODE *root;
 static char path[MAXPATHLEN];
 
-static void	miss(NODE *, char *);
+static int	miss(NODE *, char *);
+static int	check(NODE *, char *);
 static int	vwalk(void);
 
 int
 mtree_verifyspec(FILE *fi)
 {
-	int rval;
+	int rval = 0;
 
 	root = mtree_readspec(fi);
-	rval = vwalk();
-	miss(root, path);
+	/*
+	 * No need to walk entire tree if we are only updating the structure
+	 * and extra files are ignored.
+	 */
+	if (!(uflag  eflag))
+		rval = vwalk();
+	rval |= miss(root, path);
 	return (rval);
 }
 
@@ -155,15 +161,47 @@
 	return (rval);
 }
 
-static void
+static int
+check(NODE *p, char *tail)
+{
+	FTSENT fts;
+	struct stat fts_stat;
+
+	strcpy(tail, p-name);
+
+	/*
+	 * It is assumed that compare() only requires fts_accpath and fts_statp
+	 * fields in the FTSENT structure.
+	 */
+	fts.fts_accpath = path;
+	fts.fts_statp = fts_stat;
+
+	if (stat(path, fts.fts_statp))
+		return (0);
+
+	p-flags |= F_VISIT;
+	if ((p-flags  F_NOCHANGE) == 0  compare(p-name, p, fts))
+		return (MISMATCHEXIT);
+	else
+		return (0);
+
+	/*
+	 * tail is not restored to '\0' as the next time tail (or path) is used
+	 * is with a strcpy (thus overriding the '\0').  See +19 lines below.
+	 */
+}
+
+static int
 miss(NODE *p, char *tail)
 {
 	int create;
 	char *tp;
 	const char *type, *what;
-	int serr;
+	int serr, rval = 0;
 
 	for (; p; p = p-next) {
+		if (uflag  eflag)
+			rval |= check(p, tail);
 		if (p-flags  F_OPT  !(p-flags  F_VISIT))
 			continue;
 		if (p-type != F_DIR  (dflag || p-flags  F_VISIT))
@@ -256,4 +294,5 @@
 			(void)printf(%s: file flags not set: %s\n,
 			path, strerror(errno));
 	}
+	return (rval);
 }




signature.asc
Description: This is a digitally signed message part.


Re: [RFC] mtree improvements

2010-06-25 Thread Garrett Cooper
On Fri, Jun 25, 2010 at 9:52 AM, David Naylor naylor.b.da...@gmail.com wrote:
 Hi,

 I've created a patch that increases the performance of mtree.  This is of
 particular use during a port install.  In an extreme case I have experienced a
 ~20% increase [1].

 For a full discussion see PR bin/143732.  This arose out of [2] where I
 experienced the increase.

 For your convenience I have attached the patch.

 Please review this patch and if it is acceptable, commit it.

 Regards,

 David

 1] http://markmail.org/message/iju3l6hyv7s7emrb
 2] http://markmail.org/message/gfztjpszl5dozzii

Hmm... this has other interesting applications other than just ports,
but unfortunately pkg_install won't really feel as much of a
performance boost (because it uses mtree -e -U when +MTREE exists in
the package).

Comments follow.
Thanks!
-Garrett

--- /usr/src/usr.sbin/mtree/verify.c2010-02-07 15:07:28.0 +0200
+++ verify.c2010-02-07 15:04:10.0 +0200
@@ -50,17 +50,23 @@
 static NODE *root;
 static char path[MAXPATHLEN];

-static voidmiss(NODE *, char *);
+static int miss(NODE *, char *);
+static int check(NODE *, char *);
 static int vwalk(void);

 int
 mtree_verifyspec(FILE *fi)
 {
-   int rval;
+   int rval = 0;

root = mtree_readspec(fi);
-   rval = vwalk();
-   miss(root, path);
+   /*
+* No need to walk entire tree if we are only updating the structure
+* and extra files are ignored.
+*/
+   if (!(uflag  eflag))
+   rval = vwalk();

gcooper This is where the performance boost is coming from as you're
not walking the directory tree, correct?

+   rval |= miss(root, path);
return (rval);
 }

@@ -155,15 +161,47 @@
return (rval);
 }

-static void
+static int
+check(NODE *p, char *tail)
+{
+   FTSENT fts;
+   struct stat fts_stat;
+
+   strcpy(tail, p-name);

gcooper Dangerous. Please use strlcpy with appropriate bounds.

+   /*
+* It is assumed that compare() only requires fts_accpath and fts_statp
+* fields in the FTSENT structure.
+*/
+   fts.fts_accpath = path;
+   fts.fts_statp = fts_stat;
+
+   if (stat(path, fts.fts_statp))
+   return (0);

gcooper What about symlink functionality? lstat(2)?

+   p-flags |= F_VISIT;
+   if ((p-flags  F_NOCHANGE) == 0  compare(p-name, p, fts))
+   return (MISMATCHEXIT);
+   else
+   return (0);
+
+   /*
+* tail is not restored to '\0' as the next time tail (or path) is used
+* is with a strcpy (thus overriding the '\0').  See +19 lines below.
+*/
+}
+
+static int
 miss(NODE *p, char *tail)
 {
int create;
char *tp;
const char *type, *what;
-   int serr;
+   int serr, rval = 0;

gcooper This isn't correct as per-style(9). Please do:
gcooper
gcooper int rval = 0;
gcooper int serr;
gcooper
gcooper This reduces diff churn and is more style(9)-istically correct.

for (; p; p = p-next) {
+   if (uflag  eflag)
+   rval |= check(p, tail);
if (p-flags  F_OPT  !(p-flags  F_VISIT))
continue;
if (p-type != F_DIR  (dflag || p-flags  F_VISIT))
@@ -256,4 +294,5 @@
(void)printf(%s: file flags not set: %s\n,
path, strerror(errno));
}
+   return (rval);
 }
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


PCI Express and drivers

2010-06-25 Thread Christopher Bowman
I have a Xilinx PCI Express board that has an on board PCIe interface
macro.  I intend to have an address space with memory and another with my
devices control registers.  I wish to program this board under FreeBSD.  It
would seem to me that the way to do this would be to write a driver that
would allow me to map these two address spaces into a user process which
could then directly interact with the device.  In my case my board doesn't
really support multiple users, and it doesn't really seem to make sense to
me to put a lot of code in the kernel to create some sort of interface to
allow multiple processes to interact with my device via some sort of syscall
which would impose a lot of overhead in any case.  By mapping the address
ranges into a user process I can write user programs to drive the board
without having to recompile and reboot the kernel each time I make a change,
plus if I do something stupid and crash my user space process it shouldn't
bring down the whole kernel.  Am I thinking about this wrong?  Is there some
place I can go to read up on what I should be doing?  If I am thinking about
this correctly, then how does one map device memory into a user space
process?  How does one make sure that only one process has such a mapping?
Thanks
Christopher
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: Help with some makefile hackery

2010-06-25 Thread Dag-Erling Smørgrav
Patrick Mahan ma...@mahan.org writes:
 Maybe I should do this instead?

 src-kernel: src-kernel-tools
   cd src; ./amd64-kernel.sh 21  build_amd64_kernel.log; \
   tail -f build_amd64_kernel.log

 It is not too clear if the status is the last one in a compound
 command.

This won't work, because tail won't start until the build is done.  You
should just pass the file name as an argument to your script and handle
it there.

DES
-- 
Dag-Erling Smørgrav - d...@des.no
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: [RFC] mtree improvements

2010-06-25 Thread David Naylor
On Friday 25 June 2010 20:01:42 Garrett Cooper wrote:
 On Fri, Jun 25, 2010 at 9:52 AM, David Naylor naylor.b.da...@gmail.com 
wrote:
  Hi,
  
  I've created a patch that increases the performance of mtree.  This is of
  particular use during a port install.  In an extreme case I have
  experienced a ~20% increase [1].
  
  For a full discussion see PR bin/143732.  This arose out of [2] where I
  experienced the increase.
  
  For your convenience I have attached the patch.
  
  Please review this patch and if it is acceptable, commit it.
  
  Regards,
  
  David
  
  1] http://markmail.org/message/iju3l6hyv7s7emrb
  2] http://markmail.org/message/gfztjpszl5dozzii
 
 Hmm... this has other interesting applications other than just ports,
 but unfortunately pkg_install won't really feel as much of a
 performance boost (because it uses mtree -e -U when +MTREE exists in
 the package).
 
 Comments follow.
 Thanks!
 -Garrett

I've included some more changes.  I do not think -[uU] needs to be set when 
skipping vwalk.  I also move sflag so it will get called even if eflag is set 
(bug in my patch).  

I'm not sure sflag will produce the same results as check() and vwalk() may 
call compare() in different orders?  Will this impact on crc?

 --- /usr/src/usr.sbin/mtree/verify.c  2010-02-07 15:07:28.0 +0200
 +++ verify.c  2010-02-07 15:04:10.0 +0200
 @@ -50,17 +50,23 @@
  static NODE *root;
  static char path[MAXPATHLEN];
 
 -static void  miss(NODE *, char *);
 +static int   miss(NODE *, char *);
 +static int   check(NODE *, char *);
  static int   vwalk(void);
 
  int
  mtree_verifyspec(FILE *fi)
  {
 - int rval;
 + int rval = 0;
 
   root = mtree_readspec(fi);
 - rval = vwalk();
 - miss(root, path);
 + /*
 +  * No need to walk entire tree if we are only updating the structure
 +  * and extra files are ignored.
 +  */
 + if (!(uflag  eflag))
 + rval = vwalk();
 
 gcooper This is where the performance boost is coming from as you're
 not walking the directory tree, correct?

Yes, if an update is requested without reporting extra files.  In some cases 
with a well populated /usr/local (and a slowish HDD) it could take some time.  

I think it is possible to even use this optimisation if uflag is not set?  

 + rval |= miss(root, path);
   return (rval);
  }
 
 @@ -155,15 +161,47 @@
   return (rval);
  }
 
 -static void
 +static int
 +check(NODE *p, char *tail)
 +{
 + FTSENT fts;
 + struct stat fts_stat;
 +
 + strcpy(tail, p-name);
 
 gcooper Dangerous. Please use strlcpy with appropriate bounds.

This is the same code used in miss.c:171.  

It appears the code assumes that a path a mtree file describes will not exceed 
MAXPATHLEN and does not check to see if the buffer overflows.  I could create a 
patch to fix that.  Perhaps a separate patch?

 + /*
 +  * It is assumed that compare() only requires fts_accpath and fts_statp
 +  * fields in the FTSENT structure.
 +  */
 + fts.fts_accpath = path;
 + fts.fts_statp = fts_stat;
 +
 + if (stat(path, fts.fts_statp))
 + return (0);
 
 gcooper What about symlink functionality? lstat(2)?

Fixed.  This should now be consistent with fts_read.  

 + p-flags |= F_VISIT;
 + if ((p-flags  F_NOCHANGE) == 0  compare(p-name, p, fts))
 + return (MISMATCHEXIT);
 + else
 + return (0);
 +
 + /*
 +  * tail is not restored to '\0' as the next time tail (or path) is used
 +  * is with a strcpy (thus overriding the '\0').  See +19 lines below.
 +  */
 +}
 +
 +static int
  miss(NODE *p, char *tail)
  {
   int create;
   char *tp;
   const char *type, *what;
 - int serr;
 + int serr, rval = 0;
 
 gcooper This isn't correct as per-style(9). Please do:
 gcooper
 gcooper int rval = 0;
 gcooper int serr;
 gcooper
 gcooper This reduces diff churn and is more style(9)-istically correct.

I didn't know that.  Good point.  

   for (; p; p = p-next) {
 + if (uflag  eflag)
 + rval |= check(p, tail);
   if (p-flags  F_OPT  !(p-flags  F_VISIT))
   continue;
   if (p-type != F_DIR  (dflag || p-flags  F_VISIT))
 @@ -256,4 +294,5 @@
   (void)printf(%s: file flags not set: %s\n,
   path, strerror(errno));
   }
 + return (rval);
  }
--- mtree/verify.c	2010-05-27 13:47:20.0 +0200
+++ verify.c	2010-06-25 22:04:40.0 +0200
@@ -50,17 +50,25 @@
 static NODE *root;
 static char path[MAXPATHLEN];
 
-static void	miss(NODE *, char *);
+static int	miss(NODE *, char *);
+static int	check(NODE *, char *);
 static int	vwalk(void);
 
 int
 mtree_verifyspec(FILE *fi)
 {
-	int rval;
+	int rval = 0;
 
 	root = mtree_readspec(fi);
-	rval = vwalk();
-	miss(root, path);
+	/* No need to walk tree if we are ignoring extra files. */
+	if (!eflag)
+		rval = vwalk();
+	rval |= miss(root, 

Re: I need reply in Embedded FreeBSD Kernel Theme

2010-06-25 Thread Mohammed Farrag
hi sorry for being late in reply but I had some problems in the last week. I
hope u still remeber what I was talking about :)
@chargen
Thanx for ur reply.
Embedded computer systems permeate all aspects of our daily lives.
Alarm clocks, coffee makers, digital watches, cell phones, and automobiles
are just a few of the devices that make use of embedded systems. The
design and development of such systems is unique, because the design
constraints are different for each system.
I supposed a new design for reducing the size of the kernel to be able to
work in such an environment which has some constraints make it does not have
the ability to get large memory, large storage devices or others.
/

as far as your document goes:
We will unload all the drivers that indicated with zeros in the module
metadata file. That would make the OS to be a few of Megabytes.

unload? what is the logic here?

I'm sorry but what is the real gain here,
//
The configuration file is dependent on the kernel (which is included as a
compiled kernel). If I unload these unneeded drivers, I decrease the size of
the compiled kernel So it will have the ability to work in more constrained
environment and that is suitable to work for Operating Systems for small
chips for embedded systems.

As the Internet grew, the requirements of embedded systems also began to
grow in complexity. In addition to solving classic embedded systems
problems, system designers were required to add connectivity for sending and
receiving data or providing an automated method for software upgrades.
Rather than increase the development effort, system designers have moved
toward using third-party hardware and evaluating open source software.
Thanx Chargen
@ andrew
Thanx for your reply. I appreciate your effort to download the document.
Regarding the uploading of the document to that site, I am sorry for that
but I tried to attach it with the email but it was refused because its size
was too large. I did not send it in the text part because the text format
and tables will be lost.
I am sorry for that.

//
///

After a couple of quick readings, I'm not sure I correctly understand what
you plan to achieve. It sounds like you are trying to achive something like
hardware specific dynamic module loading (like in Solaris, for example), but
then it also sounds like you are trying to build a kernel based on a
generated config which somehow involves building a tiny binary hardware
profile built from POST data.

Are you compiling a kernel at some point rather than just generating a
loader.conf for modules in order to minimise the running size?

This approach will combine the two both. It will build a kernel based on a
generated config which somehow involves building a tiny binary hardware
profile built from POST data.  It also will use hardware specific dynamic
module loading because I don't have to load all the drivers for devices
connected to the machine. I will use this dynamic module loading at the
start-up only not at the run time because some considerations of the
embedded systems for chips not being to load modules and change how to work
at run time. that would make power problems.


I was most confused by


 We will unload all the drivers that indicated with zeros in the
 module metadata file. That would make the OS to be a
 few of Megabytes.


Whether you are compiling a kernel for the (chosen) hardware based on a
generated kernel or loader config, I don't see a sensible case in which you
would ever need to unload any driver.
///
yeah I know it is not sensible but I wrote it as a result of what I supposed
before so it has no meaning. just a result to clarify what I reduced here.

Thanx for ur sympathy and I will be glad to send you my next file to get ur
comments about.





As much fun as it is spending hours manually tweaking and testing a kernel
config for each system and deciding what modules to use, I like the idea of
a one time guided process based on accurately identified hardware to build
an optimal kernel, so I hope that's what you're proposing.
//
Actually, I am deciding many time guided process based on accurately
identified hardware to build an optimal kernel because I think this is more
dynamic for considerations of changing the purpose of the embedded system. I
mean sometimes u may need to perform deterministic operation in this boot so
u do not have to load all drivers which there will be a lot of unneeded
drivers of them at this boot process. I will determine the dependencies to
provide optimal kernel.
Thanx Andrew

@ Matt
Thanx for ur reply Matt.

Re: PCI Express and drivers

2010-06-25 Thread Daniel O'Connor

On 26/06/2010, at 3:01, Christopher Bowman wrote:
 I have a Xilinx PCI Express board that has an on board PCIe interface
 macro.  I intend to have an address space with memory and another with my
 devices control registers.  I wish to program this board under FreeBSD.  It
 would seem to me that the way to do this would be to write a driver that
 would allow me to map these two address spaces into a user process which
 could then directly interact with the device.  In my case my board doesn't
 really support multiple users, and it doesn't really seem to make sense to
 me to put a lot of code in the kernel to create some sort of interface to
 allow multiple processes to interact with my device via some sort of syscall
 which would impose a lot of overhead in any case.  By mapping the address
 ranges into a user process I can write user programs to drive the board
 without having to recompile and reboot the kernel each time I make a change,
 plus if I do something stupid and crash my user space process it shouldn't
 bring down the whole kernel.  Am I thinking about this wrong?  Is there some
 place I can go to read up on what I should be doing?  If I am thinking about
 this correctly, then how does one map device memory into a user space
 process?  How does one make sure that only one process has such a mapping?

You could use mmap() I think,

For a driver I maintain I did the following -
 /* Magic sauce stolen from src/sys/pci/xrpu.c via phk
  * http://www.mail-archive.com/freebsd-hackers%40freebsd.org/msg11729.html
  */
  *paddr = rman_get_start(sc-g_membase.reshandle) + offset;

g_membase is..
struct resource *reshandle; /* Resource handle */
bus_space_tag_t sc_st;  /* bus space tag */
bus_space_handle_t  sc_sh;  /* bus space handle */

PS what board are you using? :)

--
Daniel O'Connor software and network engineer
for Genesis Software - http://www.gsoft.com.au
The nice thing about standards is that there
are so many of them to choose from.
  -- Andrew Tanenbaum
GPG Fingerprint - 5596 B766 97C0 0E94 4347 295E E593 DC20 7B3F CE8C






___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


Re: I need reply in Embedded FreeBSD Kernel Theme

2010-06-25 Thread Matt Thyer
On 24 June 2010 11:06, Mohammed Farrag mfar...@freebsd.org wrote:
 @ Matt
 Thanx for ur reply Matt.
 /
 FreeBSD is already a very modular system and the traditional way (a
 traditional way) to build for embedded systems is to follow the
 NanoBSD build method (tools included in the source tree) with a
 stripped down kernel in which you only load the modules your hardware
 requires using the FreeBSD loader (or after the initial boot).
 
 yeah I read about that. My mentor suggested that before and my idea is very
 close to NanoBSD but I don't know if the freebsd loader will load the moduls
 based on the hardware requirements or user requirements. I will be glad to
 reply me.

Modules are loaded by the user adding entries to /boot/loader.conf.
e.g. if_sis_load=YES.
That example will load the sis driver for the Silicon Image network
interfaces on my Soekris net4801 board as I have removed almost
everything in my kernel and just load the modules I require.

Some modules will automatically load when another driver requires them.

FreeBSD does not try to discover and reconfigure your hardware at boot
time like the kudzu utility in Linux.
Instead it will attach to the hardware for which you have drivers in
your kernel or for which you have told the loader to load modules for.
___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org