Hi Mahesh, Please see my comments with [Ramesh] inline.
Thanks, Ramesh. On 11/29/2016 4:07 PM, [email protected] wrote: > osaf/libs/core/leap/os_defs.c | 20 ++++++++++++++++++-- > 1 files changed, 18 insertions(+), 2 deletions(-) > > > Issue : > > If OSAF_CKPT_SHM_ALLOC_GUARANTEE is NOT set and SHM is 100% used in system , > pnd Segmentation fault (core dumped) at LEAP memcpy(). > > Fix : > > Now LEAP library ensures shm free space before writing > This may degrade some performance of cpsv , if OSAF_CKPT_SHM_ALLOC_GUARANTEE > is set, > cpsv give natural performance. > > diff --git a/osaf/libs/core/leap/os_defs.c b/osaf/libs/core/leap/os_defs.c > --- a/osaf/libs/core/leap/os_defs.c > +++ b/osaf/libs/core/leap/os_defs.c > @@ -38,6 +38,7 @@ > #include <sys/types.h> > #include <sys/mman.h> > #include <sys/stat.h> > +#include <sys/statvfs.h> > #include <time.h> > #include <fcntl.h> > #include <errno.h> > @@ -771,6 +772,7 @@ uint32_t ncs_os_posix_shm(NCS_OS_POSIX_S > int32_t ret_flag; > uint64_t shm_size; > char shm_name[PATH_MAX]; > + struct statvfs statsvfs; > > switch (req->type) { > case NCS_OS_POSIX_SHM_REQ_OPEN: /* opens and mmaps */ > @@ -792,7 +794,7 @@ uint32_t ncs_os_posix_shm(NCS_OS_POSIX_S > if (req->info.open.o_fd < 0) { > return NCSCC_RC_FAILURE; > } else { > - if (req->info.open.ensures_space == true) { > + if (req->ensures_space == true) { > if (posix_fallocate(req->info.open.o_fd, 0, > shm_size) != 0) { > LOG_ER("posix_shm:posix_fallocate > failed() with errno: %d \n", errno); > return NCSCC_RC_FAILURE; > @@ -855,8 +857,22 @@ uint32_t ncs_os_posix_shm(NCS_OS_POSIX_S > break; > > case NCS_OS_POSIX_SHM_REQ_WRITE: > + if (req->ensures_space == false) { > + /* Check for the available shared memory space */ [Ramesh]: Probably better to define an environment variable for /dev/shm, to accommodate user defined disk space path etc. Can fix this later too. > + if (statvfs("/dev/shm", &statsvfs) != 0) { > + syslog(LOG_ERR, "statvfs failed to get file > system statistics with errno value %d\n", errno); > + return NCSCC_RC_FAILURE; > + } > + > + /* Checking whether sufficient shared memory is > available to write the data, to be safer side ffree reduced to 1 block size */ [Ramesh]: As per the above comment, please do (statvfs.f_bfree-1)*statsvfs.f_frsize. > + if (req->info.write.i_write_size > (statsvfs.f_bfree * > statsvfs.f_frsize)) { > + syslog(LOG_ERR, "Insufficient shared memory > space (%ld) available to write the data of size: %ld \n", > + (statsvfs.f_bfree * > statsvfs.f_frsize), req->info.write.i_write_size); > + return NCSCC_RC_FAILURE; > + } > + } > memcpy((void *)((char *)req->info.write.i_addr + > req->info.write.i_offset), req->info.write.i_from_buff, > - req->info.write.i_write_size); > + req->info.write.i_write_size); > break; > > default: ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
