Merge patch series "can: raw: optimize the sizes of struct uniqframe and struct raw_sock"

Vincent Mailhol <mailhol@kernel.org> says:

A few bytes can be shaved out of can raw's struct uniqframe and struct
raw_sock.

Patch #1 reorders struct uniqframe fields to save 8 bytes.

Patch #2 and #3 modify struct raw_sock to use bitfields and to reorder
its fields to save 24 bytes in total.

Link: https://patch.msgid.link/20250917-can-raw-repack-v2-0-395e8b3a4437@kernel.org
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
Marc Kleine-Budde 2025-09-19 20:57:14 +02:00
commit c0b595230c

View File

@ -75,31 +75,31 @@ MODULE_ALIAS("can-proto-1");
*/
struct uniqframe {
int skbcnt;
const struct sk_buff *skb;
int skbcnt;
unsigned int join_rx_count;
};
struct raw_sock {
struct sock sk;
int bound;
int ifindex;
struct net_device *dev;
netdevice_tracker dev_tracker;
struct list_head notifier;
int loopback;
int recv_own_msgs;
int fd_frames;
int xl_frames;
int ifindex;
unsigned int bound:1;
unsigned int loopback:1;
unsigned int recv_own_msgs:1;
unsigned int fd_frames:1;
unsigned int xl_frames:1;
unsigned int join_filters:1;
struct can_raw_vcid_options raw_vcid_opts;
canid_t tx_vcid_shifted;
canid_t rx_vcid_shifted;
canid_t rx_vcid_mask_shifted;
int join_filters;
can_err_mask_t err_mask;
int count; /* number of active filters */
struct can_filter dfilter; /* default/single filter */
struct can_filter *filter; /* pointer to filter(s) */
can_err_mask_t err_mask;
struct uniqframe __percpu *uniq;
};
@ -560,8 +560,8 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
struct can_filter sfilter; /* single filter */
struct net_device *dev = NULL;
can_err_mask_t err_mask = 0;
int fd_frames;
int count = 0;
int flag;
int err = 0;
if (level != SOL_CAN_RAW)
@ -682,44 +682,48 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
break;
case CAN_RAW_LOOPBACK:
if (optlen != sizeof(ro->loopback))
if (optlen != sizeof(flag))
return -EINVAL;
if (copy_from_sockptr(&ro->loopback, optval, optlen))
if (copy_from_sockptr(&flag, optval, optlen))
return -EFAULT;
ro->loopback = !!flag;
break;
case CAN_RAW_RECV_OWN_MSGS:
if (optlen != sizeof(ro->recv_own_msgs))
if (optlen != sizeof(flag))
return -EINVAL;
if (copy_from_sockptr(&ro->recv_own_msgs, optval, optlen))
if (copy_from_sockptr(&flag, optval, optlen))
return -EFAULT;
ro->recv_own_msgs = !!flag;
break;
case CAN_RAW_FD_FRAMES:
if (optlen != sizeof(fd_frames))
if (optlen != sizeof(flag))
return -EINVAL;
if (copy_from_sockptr(&fd_frames, optval, optlen))
if (copy_from_sockptr(&flag, optval, optlen))
return -EFAULT;
/* Enabling CAN XL includes CAN FD */
if (ro->xl_frames && !fd_frames)
if (ro->xl_frames && !flag)
return -EINVAL;
ro->fd_frames = fd_frames;
ro->fd_frames = !!flag;
break;
case CAN_RAW_XL_FRAMES:
if (optlen != sizeof(ro->xl_frames))
if (optlen != sizeof(flag))
return -EINVAL;
if (copy_from_sockptr(&ro->xl_frames, optval, optlen))
if (copy_from_sockptr(&flag, optval, optlen))
return -EFAULT;
ro->xl_frames = !!flag;
/* Enabling CAN XL includes CAN FD */
if (ro->xl_frames)
ro->fd_frames = ro->xl_frames;
@ -739,12 +743,13 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
break;
case CAN_RAW_JOIN_FILTERS:
if (optlen != sizeof(ro->join_filters))
if (optlen != sizeof(flag))
return -EINVAL;
if (copy_from_sockptr(&ro->join_filters, optval, optlen))
if (copy_from_sockptr(&flag, optval, optlen))
return -EFAULT;
ro->join_filters = !!flag;
break;
default:
@ -758,6 +763,7 @@ static int raw_getsockopt(struct socket *sock, int level, int optname,
{
struct sock *sk = sock->sk;
struct raw_sock *ro = raw_sk(sk);
int flag;
int len;
void *val;
@ -806,25 +812,29 @@ static int raw_getsockopt(struct socket *sock, int level, int optname,
case CAN_RAW_LOOPBACK:
if (len > sizeof(int))
len = sizeof(int);
val = &ro->loopback;
flag = ro->loopback;
val = &flag;
break;
case CAN_RAW_RECV_OWN_MSGS:
if (len > sizeof(int))
len = sizeof(int);
val = &ro->recv_own_msgs;
flag = ro->recv_own_msgs;
val = &flag;
break;
case CAN_RAW_FD_FRAMES:
if (len > sizeof(int))
len = sizeof(int);
val = &ro->fd_frames;
flag = ro->fd_frames;
val = &flag;
break;
case CAN_RAW_XL_FRAMES:
if (len > sizeof(int))
len = sizeof(int);
val = &ro->xl_frames;
flag = ro->xl_frames;
val = &flag;
break;
case CAN_RAW_XL_VCID_OPTS: {
@ -849,7 +859,8 @@ static int raw_getsockopt(struct socket *sock, int level, int optname,
case CAN_RAW_JOIN_FILTERS:
if (len > sizeof(int))
len = sizeof(int);
val = &ro->join_filters;
flag = ro->join_filters;
val = &flag;
break;
default: