[SSI] openssi ChangeLog,1.261,1.262
Roger Tsang <[email protected]> Tue, 09 Nov 2010 03:04:25 +0000
| Newsgroups | gmane.linux.cluster.ssic.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/ssic-linux/openssi
In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv16477
Modified Files:
Tag: OPENSSI-FC
ChangeLog
Log Message:
update
Index: ChangeLog
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/ChangeLog,v
retrieving revision 1.261
retrieving revision 1.262
diff -u -d -r1.261 -r1.262
--- ChangeLog 29 Aug 2010 17:49:03 -0000 1.261
+++ ChangeLog 9 Nov 2010 03:04:23 -0000 1.262
@@ -1,5 +1,470 @@
2010/??/?? *** Release of OpenSSI 2.0.0rc1 ***
+2010/11/08 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE59
+
+ * MOSIX:
+ - Move last_consider, last_mconsider, pages_i_bring, and load fields in
+ mosix_task structure to memory descriptor since these fields apply to
+ the thread group, not individual threads. Reduce duplication in
+ process descriptor for threads. Reduce related overhead maintaining
+ these fields.
+ - Remove volatile keyword in dflags and stay fields in mosix_task
+ structure. No reason for volatile.
+ - When traversing tasklist use get_task_mm(). Skip PF_BORROWED_MM.
+ - mosix_mem_daemon: remove neutralize_my_load() call. In OpenSSI it not
+ needed for kernel threads.
+
+ * VPROC:
+ - common_data_load_msg, common_data_unload_msg: no longer acquire
+ task_lock when reading/writing to Mosix fields. There is no race
+ since OpenSSI modified balancing algorithm skips processes that are
+ already migrating.
+
+ * Files in ci-linux project were modified (see ci/ChangeLog).
+
+ cluster/ssi/mosixll/balance.c | 72 ++++++++++++++----------
+ cluster/ssi/mosixll/freemem.c | 18 +++---
+ cluster/ssi/mosixll/info.c | 17 +----
+ cluster/ssi/mosixll/kernel.c | 14 +---
+ cluster/ssi/mosixll/load.c | 57 ++++++++-----------
+ cluster/ssi/vproc/rproc_cli_pproc.c | 12 ++--
+ cluster/ssi/vproc/rproc_svr_pproc.c | 10 +--
+ include/cluster/ssi/mosixll/mosixtask.h | 17 +----
+ 8 files changed, 100 insertions(+), 117 deletions(-)
+
+2010/11/08 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE58
+
+ * MOSIX:
+ - ssi_do_decay: fix did not operate on chosen task.
+ - ssi_do_decay: deprecated. consider() no longer requires
+ mosix_task->dctime.
+ - consider: reduce excessive stack usage and useless math.
+ - mosix_calc_process_loads: remove unused code.
+ - mosix_calc_process_loads: no need to test for interrupt context.
+ Caller in process context.
+ - mosix_calc_process_loads: calculate struct mosix_task->load for
+ thread group so that in release_migrations() the thread group's load
+ is accounted for when adjusting home/destination node's load value.
+ OpenSSI migrates the thread group.
+ - release_migrations: clean-up and split CONFIG_SSI code.
+ - memory_badly_required: clean-up and split SSI_BALANCE_MEMORY code.
+ - memory_badly_required: only look at thread group leader's
+ mosix_task->pages_i_bring. OpenSSI migrates the thread group.
+ - mosix_calc_process_loads, mosix_mem_daemon: OpenSSI is only
+ interested in loadlevelable processes. Reduce unnecessary work.
+ - mosix_mem_daemon: call sort_and_age_pages() for thread group leaders
+ only. reduce redundant work. (#ifdef SSI_BALANCE_MEMORY)
+ - run_over_dirty_pages: optimize away pte_really_dirty() call for the
+ common code path.
+ - choose: use KERN_DEBUG log level. (#ifdef DEBUG)
+ - deactivate_task, activate_task: kernel threads no longer call
+ run_on() / run_off(). Kernel threads do not migrate.
+ - Fix incorrect last_mconsider value in struct mosix_task after process
+ migration. time_now() values are cross-node incompatible.
+ - No need to use task_rq_lock() to protect mosix_task->load. Switch to
+ task_lock().
+
+ * MOSIX (#ifdef REXEC_LOADTABLE_FAST):
+ - release_migrations: fix forgot to re-calculate value of altload in
+ loadinfo array. Without recalculating altload other processes were
+ not discouraged from migrating away. Regression introduced in CVS tag
+ OPENSSI-FC-1-9-6-PRE45.
+ - mosix_calc_load: calculate the cached altload using value of newload,
+ not export_load. In other places altload() is passed the value of
+ load field in loadinfo structure and mosix_calc_load() stores the
+ value of newload in load field.
+
+ cluster/ssi/mosixll/balance.c | 244 ++++++------------------
+ cluster/ssi/mosixll/freemem.c | 82 +++-----
+ cluster/ssi/mosixll/info.c | 160 ++++++++-------
+ cluster/ssi/mosixll/kernel.c | 3
+ cluster/ssi/mosixll/load.c | 95 +++++----
+ cluster/ssi/mosixll/service.c | 4
+ cluster/ssi/vproc/rproc_cli_pproc.c | 4
+ cluster/ssi/vproc/rproc_svr_pproc.c | 4
+ include/cluster/gen/rproc_platform.x | 6
+ include/cluster/ssi/mosixll/mosixtask.h | 6
+ kernel/sched.c | 6
+ 11 files changed, 269 insertions(+), 345 deletions(-)
+
+2010/11/08 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE57
+
+ * MOSIX:
+ - consider: don't call kernel_fpu_begin/end(). There are no MMX
+ instructions.
+ - choose, mchoose: only consider thread group leaders. OpenSSI migrates
+ thread group.
+ - choose, consider: calculate thread stats at group level. It was
+ removed in previous checkin. Now that we skip non-thread group
+ leaders it is no longer O(n^2).
+
+ cluster/ssi/mosixll/balance.c | 98 ++++++++++++++++++++--------------
+ cluster/ssi/mosixll/load.c | 4 -
+ cluster/ssi/util/load_level.c | 4 -
+ 3 files changed, 61 insertions(+), 45 deletions(-)
+
+2010/11/08 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE56
+
+ * VPROC:
+ - reopen_unload_msg: add debug messages.
+ - reopen_unload_msg: optimize away sys_close() calls.
+ - common_data_load_msg: optimize away certain fields per
+ common_data_unload_msg().
+ - add_thread_group: obtain number of threads from shared signal
+ reference count instead of traversing list of threads.
+
+ cluster/ssi/vproc/dvp_move.c | 18 ++--
+ cluster/ssi/vproc/rproc_cli_pproc.c | 115 +++++++++++++++-------------
+ cluster/ssi/vproc/rproc_cli_vproc.c | 4
+ cluster/ssi/vproc/rproc_svr_pproc.c | 24 +++--
+ 4 files changed, 91 insertions(+), 70 deletions(-)
+
+2010/10/25 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE55
+
+ - Stop using tasklist_lock in pproc_setattr(), pproc_getattr(),
+ pproc_setctty(), pproc_getctty().
+
+ cluster/ssi/vproc/pproc_subr.c | 51 +++++++++++----------------------
+ 1 files changed, 18 insertions(+), 33 deletions(-)
+
+ * VPROC (#ifdef VPROC_UNLOAD_SETSCHED_SMP):
+ - Revise use of tasklist_lock in common_data_load_msg() /
+ common_data_unload_msg()
+
+ * VPROC (#ifdef PPROC_SETCTTY_SIGLOCK):
+ - In signal_unload_msg() fix BKL extra unlock when RVP_ISRFORK() is
+ true.
+
+ - Fix import_dirs() might sleep in atomic.
+ - import_dirs() function should not always inline.
+
+ - Optimize away multiple current() calls in reopen_unload_msg(),
+ set_global_root(), import_dirs(), export_dirs().
+
+ cluster/ssi/vproc/rproc_cli_pproc.c | 40 +++++---------
+ cluster/ssi/vproc/rproc_svr_pproc.c | 78 +++++++++++++++-------------
+ 2 files changed, 57 insertions(+), 61 deletions(-)
+
+ * CFS Token Architecture:
+ - Generate KERN_WARNING message if REVFUNC() fails in mhtok_giveback().
+ - Optimize away CFSTOK_XLOCKOWNED() test in cfstok_objrevoke().
+ CFSTOK_XLOCK is not held in cfstok_giveback() path.
+
+ cluster/ssi/cfs/cfstok.c | 5 +++++
+ cluster/ssi/token/mhclitok.c | 2 ++
+ 2 files changed, 7 insertions(+)
+
+2010/10/25 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE54
+
+ - Fix BUG at rexecve_server_setup(). This can happen if the process was
+ just migrated and is doing rexecve() for this node. Solution is set
+ PV_MIGRATED pvp_flag so that vproc_giveback() knows delayed dealloc
+ applies and wait for final put_task_struct to touch vp_relse before
+ re-using vproc struct. (#ifdef TASK_HOLD_VPROC)
+ - Remove unnecessary use of write lock on tasklist_lock in
+ migrate_server_setup() and rexecve_server_setup().
+
+ cluster/ssi/util/load_level.c | 26 +++++++++++------------
+ cluster/ssi/vproc/rproc_cli_vproc.c | 20 +++++++----------
+ cluster/ssi/vproc/rproc_server.c | 28 +++++++++++++++++++++++++
+ cluster/ssi/vproc/rproc_server_pproc.c | 7 ------
+ cluster/ssi/vproc/rproc_svr_vproc.c | 6 -----
+ cluster/ssi/vproc/vp_subr.c | 2 -
+ include/linux/dpvproc.h | 3 ++
+ include/linux/vproc.h | 2 -
+ 8 files changed, 55 insertions(+), 39 deletions(-)
+
+ - setup_pid_move() don't signal task if it has blocked all signals
+ except SIGKILL, SIGINT, SIGQUIT so that CFS does not return
+ error -ERESTARTSYS when the task is chosen for migration.
+
+ cluster/ssi/vproc/dvp_move.c | 6 ++++++
+ 1 files changed, 6 insertions(+)
+
+2010/10/25 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE53
+
+ - Hide i_sem flusher. Add new functions set_sem_flusher() and
+ unset_sem_flusher().
+ - When setting sem_flushing() for PFS inode do the same for CFS inode
+ because cfs_writepages() and cfs_wait_on_write_congestion() tests
+ sem_flushing() on CFS inode. (#ifdef CFS_FILE_WRITE_LIVELOCK_FIX)
+
+ cluster/ssi/cfs/proc.c | 37 ++++++++++++++++++++++++++++++++++-
+ cluster/ssi/cfs/vfs.c | 32 ------------------------------
+ cluster/ssi/cfs/write.c | 8 ++++++-
+ include/asm-i386/semaphore.h | 10 +++++++++
+ 4 files changed, 53 insertions(+), 34 deletions(-)
+
+2010/10/25 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE52
+
+ - CFS_PROTO->write/read() avoid use of kmap pools. Remove contention
+ when kmap pool limit is reached as the number of CFS threads grows.
+ - Pre-allocate pagevec during RPC setup only if the pages are not
+ already physically mapped.
+ - Reduce default CFS_SERVER rsize/wsize from 1MB to 64KB.
+
+ cluster/ssi/cfs/proc.c | 54 ++++++++++++
+ cluster/ssi/cfs/read.c | 79 +++++++++++++++++-
+ cluster/ssi/cfs/write.c | 129 ++++++++++++++++++++++--------
+ include/cluster/ssi/cfs/cfs_fs.h | 6 +
+ include/cluster/ssi/cfs/cfs_xdr.h | 4
+ 5 files changed, 231 insertions(+), 41 deletions(-)
+
+2010/10/25 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE51
+
+ - Reduce amount of work in interrupt context.
+ - Offload mosix_snap_load() to bottom half. Actual work is moved to
+ do_mosix_snap_load().
+ - Invoke do_mosix_snap_load() every MF user ticks instead of every
+ system tick.
+ - Move mosix_calc_process_loads() back to mosix_calc_load() which
+ runs in process context in OpenSSI.
+ - Fix compute_freemem() might reset value of exported freemem if below
+ UTIL_TOLERANCE.
+ - In choose() re-adjust bestpri and mintime values since MF appears to
+ be based on USER_HZ. 2.6.11 kernel HZ is 1000.
+ - No longer need acpuse_lock since acpuse value is "constant".
+ - Remove mosix_task->page_allocs. Not used.
+ - Fix invalid mosix_task->load value due to invalid mosix_task->ran
+ that is calculated from load_ticks which is not reset prior the next
+ mosix_task->ran calculation. In OpenSSI mosix_calc_load() resets
+ load_ticks, but mosix_task->ran is calculated many times in another
+ thread before load_ticks is reset. In this fix we use Linux
+ ctime/stime from task_struct instead of load_ticks.
+ - Optimize away runqueue lock if possible in
+ mosix_calc_process_loads().
+ - Change load_left_lock semaphore to spinlock. This lock used to
+ protect other global variables from multiple mosix_calc_load()
+ threads, but we reduced the number of mosix_calc_load() threads to
+ one.
+ - Fix choose() and consider() skipped system CPU time.
+ - Fix update_load_array() filling master_load_array after incrementing
+ load_cnt could race with nm_master_send(). When nm_master_send() lost
+ the race CLMS clients would see incorrect ncpus and speed in loadinfo
+ structure.
+ - Defer Mosix choose() and mchoose() to Linux work queue instead of
+ nsc_async_queue.
+ - Fix mosix_do_add_to_whereto() race with age_balancing(). If
+ age_balancing() won the race wake_up_mosix() could be using stale
+ task struct which might cause memory corruption.
+
+ * Files in ci-linux project were modified (see ci/ChangeLog).
+
+ cluster/ssi/mosixll/balance.c | 316 +++++++++++-------------
+ cluster/ssi/mosixll/freemem.c | 15 -
+ cluster/ssi/mosixll/info.c | 17 -
+ cluster/ssi/mosixll/kernel.c | 15 -
+ cluster/ssi/mosixll/load.c | 246 +++++++++---------
+ cluster/ssi/util/load_level.c | 87 ++++--
+ include/cluster/ssi/mosixll/balance.h | 3
+ include/cluster/ssi/mosixll/defs.h | 4
+ include/cluster/ssi/mosixll/mosixtask.h | 5
+ include/cluster/ssi/mosixll/routines.h | 1
+ 10 files changed, 368 insertions(+), 341 deletions(-)
+
+2010/10/25 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE50
+
+ - Fix cfs_find_actor() might sleep in wait_on_new_inode() while caller
+ holds inode_lock spin lock. wait_on_new_inode() is not required for
+ linux-2.6.11 iget5_locked().
+
+ cluster/ssi/cfs/inode.c | 5 +++++
+ 1 files changed, 5 insertions(+)
+
+2010/10/25 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE49
+
+ * Files in ci-linux project were modified (see ci/ChangeLog).
+
+ * VPROC (#ifdef PROC_LARGE_MAXPIDS):
+ - Refactor ssi_get_tgid_list() to do concurrent async requests and
+ buffer the PIDs list for each node in the cluster.
+ - Revert PROC_MAXPIDS value to 20 (the default in Linux base).
+ filldir() in proc_pid_readdir() stops at around 20 entries.
+ - Reduce VPROC_MAXPIDS value so that internal pid_list[] cache and
+ related proc_readdir_cookie structure fit within one memory page.
+ Reduce memory pressure. Remove large kmalloc() call in
+ proc_pid_readdir().
+ - Fix ssi_get_tgid_list() skips remaining nodes in the cluster if
+ "start_node" in struct proc_root_readdir_cookie is not found in CLMS
+ node list. This can happen when the next node ("start_node") goes
+ down while the system is reading the list of PIDs. Affects userspace
+ accessing procfs and is not in localview mode.
+
+ cluster/ssi/vproc/procfs_subr.c | 285 ++++++++++++++++++++++++++++----
+ fs/proc/base.c | 31 +--
+ 2 files changed, 267 insertions(+), 49 deletions(-)
+
+ * CFS:
+ - In sym_nodenum() test for CLUSTERNODE_THIS instead of 0 when testing
+ value of node_context.
+
+ cluster/ssi/cfs/symlink.c | 2 +-
+ 1 files changed, 1 insertion(+), 1 deletion(-)
+
+2010/10/25 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE48
+
+ * VPROC:
+ - Optimize away unnecessary initialization in pvpsop_get_tgid_list().
+ - Reduce stack usage in ssi_get_tgid_list().
+
+ cluster/ssi/vproc/dvp_pvpsops.c | 10 ++--
+ cluster/ssi/vproc/procfs_subr.c | 72 +++++++++++++++-----------------
+ 2 files changed, 39 insertions(+), 43 deletions(-)
+
+2010/10/25 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE47
+
+ * VPROC (#ifdef TASK_HOLD_VPROC):
+ - Optimize away extra is_loadlevelable() call in ssi_do_execve() path.
+ Affects execve(2) and rexecve(2).
+ - In is_loadlevelable() optimize away vproc_is_loadlevelable() call
+ where applicable.
+
+ * VPROC (#ifdef VPROC_LOCKING_CONTEXT_FIX):
+ - Reduce FLAG LOCK critical section in vpop_setup_vproc_relations().
+ Elements inside FLAG LOCK are already protected by VPROC LOCK. This
+ fix places vproc_is_loadlevelable() outside FLAG LOCK.
+
+ cluster/ssi/util/load_level.c | 34 ++++++++++++++++++++++++----------
+ cluster/ssi/vproc/dvp_vpops.c | 14 ++++++++++----
+ fs/exec.c | 12 +++---------
+ 3 files changed, 37 insertions(+), 23 deletions(-)
+
+2010/10/25 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE46
+
+ * MOSIX:
+ - Do lockless loadinfo[] reads. Reduce contention in various paths.
+ - Upgrade loadinfo_lock read/write spinlock to spinlock.
+ - Re-enable interrupts for loadinfo_lock and whereto_lock. OpenSSI does
+ not acquire these locks in interrupt context.
+ - In memory_balance() allow to kmalloc() to fail. Avoid blocking
+ ics_llunack_daemon.
+ - Optimize away the for-loop in release_migrations().
+
+ * Files in ci-linux project were modified (see ci/ChangeLog).
+
+ cluster/ssi/mosixll/balance.c | 68 ++++++++++++---
+ cluster/ssi/mosixll/info.c | 38 ++++++--
+ cluster/ssi/mosixll/kernel.c | 8 -
+ cluster/ssi/mosixll/load.c | 24 ++---
+ cluster/ssi/util/load_level.c | 115 +++++++++++---------------
+ include/cluster/ssi/mosixll/balance.h | 2
+ 6 files changed, 145 insertions(+), 110 deletions(-)
+
+2010/10/25 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE45
+
+ * VPROC:
+ - In ssi_do_execve() optimize away is_loadlevelable() when the chosen
+ node is the current node.
+
+ * VPROC (#ifdef REXEC_LOADTABLE_FAST):
+ - In __ssi_do_execve() retry on -EREMOTE. There could be other nodes in
+ cluster that are available.
+ - Rename __ssi_do_execve() to __ssi_choose_node().
+ - Convert rexec_loadtable[] array to rexec_loadmap Linux bitmap.
+ - Do lockless rexec_loadmap update. Reduce contention in
+ exec_balance(), rexecve(2) and execve(2).
+ - Remove redundant altload() calculations since the results only change
+ during loadinfo_received() or nm_master_send(). Evaluate altload()
+ and store result in altload element in loadinfo structure.
+
+ cluster/ssi/mosixll/balance.c | 19 +++++
+ cluster/ssi/mosixll/load.c | 13 +++
+ cluster/ssi/util/load_level.c | 78 +++++++++++++----------
+ fs/exec.c | 102 +++++++++++++++++++------------
+ include/cluster/ssi/load_level.h | 7 +-
+ 5 files changed, 144 insertions(+), 75 deletions(-)
+
+2010/10/25 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE44
+
+ * VPROC:
+ - Fix race in capset_capabilities() calling cap_set_all() /
+ cap_set_pg() without holding tasklist_lock. Memory corruption may
+ occur if the race is lost.
+
+ kernel/capability.c | 2 ++
+ 1 files changed, 2 insertions(+)
+
+ * Remote File Block (#ifdef RMTFB_HASH_LOCKLESS):
+ - In rmtfb_newcli() calculate rmtfb_clitbl hash outside critical
+ section.
+ - In rmtfb_newsvr() calculate rmtfb_svrtbl hash outside critical
+ section.
+
+ cluster/ssi/util/rmtfb.c | 11 ++++++++---
+ 1 files changed, 8 insertions(+), 3 deletions(-)
+
+ * SSI devices (#ifdef SSIDEV_POLL_CLI_HASH_TABLE):
+ - In ssidev_poll_cli_alloc() calculate ssidev_pc_list hash outside
+ critical section.
+
+ cluster/ssi/util/ssidev.c | 8 +++++++-
+ 1 files changed, 7 insertions(+), 1 deletion(-)
+
+ * CFS:
+ - hfind() calculate hash value outside critical section.
+
+ * CFS Token Architecture:
+ - Always inline _cfstok_revoke(), process_req(), allocnrrev().
+ - process_req() is renamed to _process_req().
+ - allocnrrev() is renamed to _allocnrrev().
+
+ cluster/ssi/cfs/cfstok.c | 2 +-
+ cluster/ssi/cfs/svrcfs.c | 7 ++++++-
+ cluster/ssi/token/clitok.c | 12 ++++++------
+ include/cluster/ssi/cfs/cfstok.h | 3 ---
+ 4 files changed, 13 insertions(+), 11 deletions(-)
+
+ * VPROC:
+ - Disable Linux pidmap_array[] since it is not used in OpenSSI. Reduce
+ memory usage by 512 KBytes + one page as calculated from
+ PID_MAX_LIMIT of 0x7fffffff.
+
+ kernel/pid.c | 86 +++++++++++++++++++++++++--------------------------
+ 1 files changed, 43 insertions(+), 43 deletions(-)
+
+2010/10/25 rogertsang <[email protected]>
+ * CVS Tags: OPENSSI-FC-1-9-6-PRE43
+
+ * VPROC (#ifdef LOADLEVEL_TABLE_LIST):
+ - Fix missing memory barrier for pvp_loadlevel when writing to
+ /proc/PID/loadlevel.
+
+ cluster/ssi/vproc/procfs_subr.c | 2 ++
+ fs/proc/base.c | 4 ++++
+ include/linux/vproc.h | 2 ++
+ 3 files changed, 8 insertions(+)
+
+2010/09/13 rogertsang <[email protected]>
+ * CVS branch: OPENSSI-CENTOS
+
+ - Reset internal SSI version number in portmap.spec
+ - Upgrade to strace-4.5.16-1.el4_8.11
+
+ - Move UDEV_SETTLE_FILE and UDEVD_SOCK_PATH from /var/run to /dev. Root
+ filesystem is read-only during init, so `udevsettle` won't work and
+ in OpenSSI udevd bind(2) fails.
+
+ udev/Makefile | 2 +-
+ udev/udevd.c | 1 -
+ udev/udevd.h | 2 +-
+ 3 files changed, 2 insertions(+), 3 deletions(-)
+
2010/08/29 rogertsang <[email protected]>
* CVS Tags: OPENSSI-FC-1-9-6-PRE42
------------------------------------------------------------------------------
The Next 800 Companies to Lead America's Growth: New Video Whitepaper
David G. Thomson, author of the best-selling book "Blueprint to a
Billion" shares his insights and actions to help propel your
business during the next growth cycle. Listen Now!
http://p.sf.net/sfu/SAP-dev2dev