Whamcloud - gitweb
LU-16937 utils: avoid lctl shmget() if not needed 26/51526/2
authorAndreas Dilger <adilger@whamcloud.com>
Fri, 30 Jun 2023 19:41:23 +0000 (13:41 -0600)
committerOleg Drokin <green@whamcloud.com>
Fri, 14 Jul 2023 03:10:28 +0000 (03:10 +0000)
lctl is dynamically allocating an IPC shared memory segment
during every startup, even though it is only needed for a
small number of uncommon debug commands:

    shmget(IPC_PRIVATE, 65680, 0600)        = 196641
    shmat(196641, NULL, 0)                  = 0x7f752b1c5000
    shmctl(196641, IPC_RMID, NULL)          = 0

This setup can be moved to sub-commands that actually need it.

Signed-off-by: Andreas Dilger <adilger@whamcloud.com>
Change-Id: I41c790ce7cba2d9c48c1ec06eb23eb94aa548242
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/51526
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Reviewed-by: Timothy Day <timday@amazon.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/utils/obd.c

index e1e1513..b7c808a 100644 (file)
@@ -305,6 +305,9 @@ static int shmem_setup(void)
        int rc;
        int shmid;
 
+       if (shared_data)
+               return 0;
+
        /* Create new segment */
        shmid = shmget(IPC_PRIVATE, sizeof(*shared_data), 0600);
        if (shmid == -1) {
@@ -655,6 +658,10 @@ int jt_opt_threads(int argc, char **argv)
                       argv[0], threads, argv[3], cmdstr);
        }
 
+       rc = shmem_setup();
+       if (rc)
+               return rc;
+
        shmem_reset(threads);
 
        sigemptyset(&sigset);
@@ -1178,6 +1185,10 @@ int jt_obd_md_common(int argc, char **argv, int cmd)
        }
 
 #ifdef MAX_THREADS
+       rc = shmem_setup();
+       if (rc)
+               return rc;
+
        if (thread) {
                shmem_lock();
                /* threads interleave */
@@ -1408,6 +1419,10 @@ int jt_obd_create(int argc, char **argv)
        next_time.tv_sec -= verbose;
 
        ostid_set_seq_echo(&data.ioc_obdo1.o_oi);
+       rc = shmem_setup();
+       if (rc)
+               return rc;
+
        for (i = 1, next_count = verbose; i <= count && shmem_running(); i++) {
                /*
                 * base_id is 1 so we don't need to worry about it being
@@ -1562,6 +1577,10 @@ int jt_obd_test_setattr(int argc, char **argv)
                       (uintmax_t)objid, ctime(&start.tv_sec));
 
        ostid_set_seq_echo(&data.ioc_obdo1.o_oi);
+       rc = shmem_setup();
+       if (rc)
+               return rc;
+
        for (i = 1, next_count = verbose; i <= count && shmem_running(); i++) {
                if (objid > OBIF_MAX_OID) {
                        fprintf(stderr, "errr: %s: invalid objid '%llu'\n",
@@ -1654,6 +1673,10 @@ int jt_obd_destroy(int argc, char **argv)
        next_time.tv_sec -= verbose;
 
        ostid_set_seq_echo(&data.ioc_obdo1.o_oi);
+       rc = shmem_setup();
+       if (rc)
+               return rc;
+
        for (i = 1, next_count = verbose; i <= count && shmem_running();
             i++, id++) {
                if (id > OBIF_MAX_OID) {
@@ -1846,6 +1869,10 @@ int jt_obd_test_getattr(int argc, char **argv)
                       (uintmax_t)objid, ctime(&start.tv_sec));
 
        ostid_set_seq_echo(&data.ioc_obdo1.o_oi);
+       rc = shmem_setup();
+       if (rc)
+               return rc;
+
        for (i = 1, next_count = verbose; i <= count && shmem_running(); i++) {
                if (objid > OBIF_MAX_OID) {
                        fprintf(stderr, "errr: %s: invalid objid '%llu'\n",
@@ -2035,6 +2062,10 @@ int jt_obd_test_brw(int argc, char **argv)
        stride = len;
 
 #ifdef MAX_THREADS
+       rc = shmem_setup();
+       if (rc)
+               return rc;
+
        if (thread) {
                shmem_lock();
                if (nthr_per_obj != 0) {
@@ -3145,9 +3176,6 @@ static void signal_server(int sig)
 
 int obd_initialize(int argc, char **argv)
 {
-       if (shmem_setup() != 0)
-               return -1;
-
        register_ioc_dev(OBD_DEV_ID, OBD_DEV_PATH);
 
        return 0;