1*453b329bSJens Axboe // SPDX-License-Identifier: GPL-2.0 2*453b329bSJens Axboe #ifndef IOU_FILE_TABLE_H 3*453b329bSJens Axboe #define IOU_FILE_TABLE_H 4*453b329bSJens Axboe 5*453b329bSJens Axboe struct io_ring_ctx; 6*453b329bSJens Axboe 7*453b329bSJens Axboe /* 8*453b329bSJens Axboe * FFS_SCM is only available on 64-bit archs, for 32-bit we just define it as 0 9*453b329bSJens Axboe * and define IO_URING_SCM_ALL. For this case, we use SCM for all files as we 10*453b329bSJens Axboe * can't safely always dereference the file when the task has exited and ring 11*453b329bSJens Axboe * cleanup is done. If a file is tracked and part of SCM, then unix gc on 12*453b329bSJens Axboe * process exit may reap it before __io_sqe_files_unregister() is run. 13*453b329bSJens Axboe */ 14*453b329bSJens Axboe #define FFS_NOWAIT 0x1UL 15*453b329bSJens Axboe #define FFS_ISREG 0x2UL 16*453b329bSJens Axboe #if defined(CONFIG_64BIT) 17*453b329bSJens Axboe #define FFS_SCM 0x4UL 18*453b329bSJens Axboe #else 19*453b329bSJens Axboe #define IO_URING_SCM_ALL 20*453b329bSJens Axboe #define FFS_SCM 0x0UL 21*453b329bSJens Axboe #endif 22*453b329bSJens Axboe #define FFS_MASK ~(FFS_NOWAIT|FFS_ISREG|FFS_SCM) 23*453b329bSJens Axboe 24*453b329bSJens Axboe struct io_fixed_file { 25*453b329bSJens Axboe /* file * with additional FFS_* flags */ 26*453b329bSJens Axboe unsigned long file_ptr; 27*453b329bSJens Axboe }; 28*453b329bSJens Axboe 29*453b329bSJens Axboe struct io_file_table { 30*453b329bSJens Axboe struct io_fixed_file *files; 31*453b329bSJens Axboe unsigned long *bitmap; 32*453b329bSJens Axboe unsigned int alloc_hint; 33*453b329bSJens Axboe }; 34*453b329bSJens Axboe 35*453b329bSJens Axboe bool io_alloc_file_tables(struct io_file_table *table, unsigned nr_files); 36*453b329bSJens Axboe void io_free_file_tables(struct io_file_table *table); 37*453b329bSJens Axboe int io_file_bitmap_get(struct io_ring_ctx *ctx); 38*453b329bSJens Axboe 39*453b329bSJens Axboe static inline void io_file_bitmap_clear(struct io_file_table *table, int bit) 40*453b329bSJens Axboe { 41*453b329bSJens Axboe __clear_bit(bit, table->bitmap); 42*453b329bSJens Axboe table->alloc_hint = bit; 43*453b329bSJens Axboe } 44*453b329bSJens Axboe 45*453b329bSJens Axboe static inline void io_file_bitmap_set(struct io_file_table *table, int bit) 46*453b329bSJens Axboe { 47*453b329bSJens Axboe WARN_ON_ONCE(test_bit(bit, table->bitmap)); 48*453b329bSJens Axboe __set_bit(bit, table->bitmap); 49*453b329bSJens Axboe table->alloc_hint = bit + 1; 50*453b329bSJens Axboe } 51*453b329bSJens Axboe 52*453b329bSJens Axboe static inline struct io_fixed_file * 53*453b329bSJens Axboe io_fixed_file_slot(struct io_file_table *table, unsigned i) 54*453b329bSJens Axboe { 55*453b329bSJens Axboe return &table->files[i]; 56*453b329bSJens Axboe } 57*453b329bSJens Axboe 58*453b329bSJens Axboe #endif 59