mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 03:24:19 +02:00
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:
commit
c0b595230c
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user