Uploaded image for project: 'Lustre'
  1. Lustre
  2. LU-6324

CLASSERT(sizeof(struct osd_thread_info) <= PAGE_SIZE) fails for some configs

Details

    • Bug
    • Resolution: Fixed
    • Major
    • Lustre 2.8.0
    • Lustre 2.8.0
    • None
    • 3
    • 17696

    Description

      I am unable to build v2_7_50_0-10-g56875fd (LU-3680 osd: reduce osd_thread_info in ldiskfs osd, http://review.whamcloud.com/9726) due to the added CLASSERT() in osd_mod_init() and the that fact that I enable several CONFIG_DEBUG_*.

      struct osd_thread_info {
              const struct lu_env  *     oti_env;              /*     0     8 */
              struct dentry              oti_obj_dentry;       /*     8   256 */
              /* --- cacheline 4 boundary (256 bytes) was 8 bytes ago --- */
              struct dentry              oti_child_dentry;     /*   264   256 */
              /* --- cacheline 8 boundary (512 bytes) was 8 bytes ago --- */
              struct dentry              oti_it_dentry;        /*   520   256 */
              /* --- cacheline 12 boundary (768 bytes) was 8 bytes ago --- */
              union {
                      struct file        oti_file;             /*         304 */
                      struct kstatfs     oti_ksfs;             /*         120 */
              };                                               /*   776   304 */
              /* --- cacheline 16 boundary (1024 bytes) was 56 bytes ago --- */
              struct htree_lock *        oti_hlock;            /*  1080     8 */
              /* --- cacheline 17 boundary (1088 bytes) --- */
              struct lu_fid              oti_fid;              /*  1088    16 */
              struct lu_fid              oti_fid2;             /*  1104    16 */
              struct lu_fid              oti_fid3;             /*  1120    16 */
              struct osd_inode_id        oti_id;               /*  1136     8 */
              struct osd_inode_id        oti_id2;              /*  1144     8 */
              /* --- cacheline 18 boundary (1152 bytes) --- */
              struct osd_inode_id        oti_id3;              /*  1152     8 */
              struct ost_id              oti_ostid;            /*  1160    16 */
              struct timespec            oti_time;             /*  1176    16 */
              struct lustre_capa_key     oti_capa_key;         /*  1192    72 */
              /* --- cacheline 19 boundary (1216 bytes) was 48 bytes ago --- */
              struct lustre_capa         oti_capa;             /*  1264   120 */
              /* --- cacheline 21 boundary (1344 bytes) was 40 bytes ago --- */
              struct osd_device *        oti_dev;              /*  1384     8 */
              void *                     oti_it_ea_buf;        /*  1392     8 */
              unsigned int               oti_it_ea_buf_used:1; /*  1400:31  4 */
      
              /* XXX 31 bits hole, try to pack */
              /* XXX 4 bytes hole, try to pack */
      
              /* --- cacheline 22 boundary (1408 bytes) --- */
              struct iam_iterator        oti_idx_it;           /*  1408   312 */
              /* --- cacheline 26 boundary (1664 bytes) was 56 bytes ago --- */
              union {
                      char               oti_name[48];         /*          48 */
                      char               oti_it_ipd[816];      /*         816 */
                      long long int      oti_alignment_lieutenant; /*           8 */
              };                                               /*  1720   816 */
              /* --- cacheline 39 boundary (2496 bytes) was 40 bytes ago --- */
              union {
                      char               oti_idx_ipd[816];     /*         816 */
                      long long int      oti_alignment_lieutenant_colonel; /*           8 */
              };                                               /*  2536   816 */
              /* --- cacheline 52 boundary (3328 bytes) was 24 bytes ago --- */
              struct osd_idmap_cache     oti_cache;            /*  3352    32 */
              int                        oti_r_locks;          /*  3384     4 */
              int                        oti_w_locks;          /*  3388     4 */
              /* --- cacheline 53 boundary (3392 bytes) --- */
              int                        oti_txns;             /*  3392     4 */
      
              /* XXX 4 bytes hole, try to pack */
      
              struct lu_buf              oti_buf;              /*  3400    16 */
              struct lu_buf              oti_big_buf;          /*  3416    16 */
              union {
                      struct lustre_mdt_attrs oti_mdt_attrs;   /*          24 */
                      char               oti_mdt_attrs_old[64]; /*          64 */
                      struct filter_fid_old oti_ff;            /*          32 */
                      struct filter_fid  oti_ff_new;           /*          16 */
              };                                               /*  3432    64 */
              /* --- cacheline 54 boundary (3456 bytes) was 40 bytes ago --- */
              struct osd_iobuf           oti_iobuf;            /*  3496   184 */
      
              /* XXX last struct has 4 bytes of padding */
      
              /* --- cacheline 57 boundary (3648 bytes) was 32 bytes ago --- */
              struct inode *             oti_inode;            /*  3680     8 */
              char                       oti_ldp[32];          /*  3688    32 */
              /* --- cacheline 58 boundary (3712 bytes) was 8 bytes ago --- */
              char                       oti_ldp2[32];         /*  3720    32 */
              union {
                      struct if_dqblk    oti_dqblk;            /*          72 */
                      struct if_dqinfo   oti_dqinfo;           /*          24 */
              };                                               /*  3752    72 */
              /* --- cacheline 59 boundary (3776 bytes) was 48 bytes ago --- */
              struct lquota_id_info      oti_qi;               /*  3824    48 */
      
              /* XXX last struct has 7 bytes of padding */
      
              /* --- cacheline 60 boundary (3840 bytes) was 32 bytes ago --- */
              struct lquota_trans        oti_quota_trans;      /*  3872   200 */
              /* --- cacheline 63 boundary (4032 bytes) was 40 bytes ago --- */
              union lquota_rec           oti_quota_rec;        /*  4072    32 */
              /* --- cacheline 64 boundary (4096 bytes) was 8 bytes ago --- */
              __u64                      oti_quota_id;         /*  4104     8 */
              struct lu_seq_range        oti_seq_range;        /*  4112    24 */
              short unsigned int         oti_declare_ops[11];  /*  4136    22 */
              short unsigned int         oti_declare_ops_rb[11]; /*  4158    22 */
              /* --- cacheline 65 boundary (4160 bytes) was 20 bytes ago --- */
              short unsigned int         oti_declare_ops_cred[11]; /*  4180    22 */
              bool                       oti_rollback;         /*  4202     1 */
      
              /* size: 4208, cachelines: 66, members: 43 */
              /* sum members: 4195, holes: 2, sum holes: 8 */
              /* bit holes: 1, sum bit holes: 31 bits */
              /* padding: 5 */
              /* paddings: 2, sum paddings: 11 */
              /* last cacheline: 48 bytes */
      };
      

      My config is attached.

      Attachments

        Issue Links

          Activity

            [LU-6324] CLASSERT(sizeof(struct osd_thread_info) <= PAGE_SIZE) fails for some configs
            green Oleg Drokin added a comment - - edited

            This is not the real reason for blown up structure sizes.

            I have all of those set and my struct size is still about 3500

            [green@intelbox lustre-release]$ grep CONFIG_DEBUG_MUTEXES ~/bk/linux-2.6.32-504.3.3.el6-debug/.config
            CONFIG_DEBUG_MUTEXES=y
            [green@intelbox lustre-release]$ grep CONFIG_DEBUG_SPINLOCK ~/bk/linux-2.6.32-504.3.3.el6-debug/.config
            CONFIG_DEBUG_SPINLOCK=y
            CONFIG_DEBUG_SPINLOCK_SLEEP=y
            Reading symbols from /home/green/git/lustre-release/lustre/osd-ldiskfs/osd_ldiskfs.ko...done.
            (gdb) p sizeof(struct osd_thread_info)
            $1 = 3576
            

            The culprit must be something else

            green Oleg Drokin added a comment - - edited This is not the real reason for blown up structure sizes. I have all of those set and my struct size is still about 3500 [green@intelbox lustre-release]$ grep CONFIG_DEBUG_MUTEXES ~/bk/linux-2.6.32-504.3.3.el6-debug/.config CONFIG_DEBUG_MUTEXES=y [green@intelbox lustre-release]$ grep CONFIG_DEBUG_SPINLOCK ~/bk/linux-2.6.32-504.3.3.el6-debug/.config CONFIG_DEBUG_SPINLOCK=y CONFIG_DEBUG_SPINLOCK_SLEEP=y Reading symbols from /home/green/git/lustre-release/lustre/osd-ldiskfs/osd_ldiskfs.ko...done. (gdb) p sizeof(struct osd_thread_info) $1 = 3576 The culprit must be something else

            John L. Hammond (john.hammond@intel.com) uploaded a new patch: http://review.whamcloud.com/13955
            Subject: LU-6324 osd: allow larger osd_thread_info for debug
            Project: fs/lustre-release
            Branch: master
            Current Patch Set: 1
            Commit: 9d2a721fa5289f788f9c3c718752abe5fb1d8517

            gerrit Gerrit Updater added a comment - John L. Hammond (john.hammond@intel.com) uploaded a new patch: http://review.whamcloud.com/13955 Subject: LU-6324 osd: allow larger osd_thread_info for debug Project: fs/lustre-release Branch: master Current Patch Set: 1 Commit: 9d2a721fa5289f788f9c3c718752abe5fb1d8517

            John, would you mind to put CLASSERT() under #ifndef CONFIG_DEBUG_MUTEXES and #ifndef CONFIG_DEBUG_SPINLOCK please ?

            bzzz Alex Zhuravlev added a comment - John, would you mind to put CLASSERT() under #ifndef CONFIG_DEBUG_MUTEXES and #ifndef CONFIG_DEBUG_SPINLOCK please ?
            jhammond John Hammond added a comment -

            It could also be converted to WARN_ON().

            jhammond John Hammond added a comment - It could also be converted to WARN_ON().

            though I'm fine to disable the check like you suggested.

            bzzz Alex Zhuravlev added a comment - though I'm fine to disable the check like you suggested.

            Andreas, that's possible with http://review.whamcloud.com/#/c/5572/ (capa support removal):

            (gdb) p sizeof(struct lustre_capa_key)
            $1 = 72
            (gdb) p sizeof(struct lustre_capa)
            $2 = 120

            bzzz Alex Zhuravlev added a comment - Andreas, that's possible with http://review.whamcloud.com/#/c/5572/ (capa support removal): (gdb) p sizeof(struct lustre_capa_key) $1 = 72 (gdb) p sizeof(struct lustre_capa) $2 = 120

            It seems unlikely that the struct can shrink by another 112 bytes. It might make sense to find the CONFIG option(s that John has enabled that makes the struct so large compared to the default config from RHEL and put the CLASSERT under #ifndef so that it doesn't trip in that case.

            adilger Andreas Dilger added a comment - It seems unlikely that the struct can shrink by another 112 bytes. It might make sense to find the CONFIG option(s that John has enabled that makes the struct so large compared to the default config from RHEL and put the CLASSERT under #ifndef so that it doesn't trip in that case.

            People

              bzzz Alex Zhuravlev
              jhammond John Hammond
              Votes:
              0 Vote for this issue
              Watchers:
              6 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: